Читайте также:
|
|
Массив как целое может быть передан в функцию как параметр. (Детали – отдельно и позже).
Массив (целиком) не может быть возвращен (оператором return) из функции. Если нужно вернуть из функции массив, то, в реальности, возвращается указатель на первый элемент массива.
Vi) Строки
Строки (в “С-понимании”) это массивы символов, заканчивающиеся null -байтом (‘\0’). Для манипуляций со строками существует множество перешедших по наследству из языка С функций, таких как strcmp(), strlen(), strcat(), strcpy(), объявленных в заголовочном файле string.h.
Строковый литерал – заключенная в двойные кавычки последовательность символов без явного указания null-символа ‘\0’. Строковый литерал имеет статический класс памяти, он интерпретируется как константный массив символов. Он может использоваться для инициализации символьного массива. В этом случае массив есть просто копия строки. Строковый литерал может быть присвоен указателю char* p. Но в этом случае содержимое по указателю p не считается модифицируемым. Если второй операнд операции вывода << есть указатель на тип char*, указывающий на начало строки, то выводится вся строка. Аналогично, можно использовать операцию ввода >> для ввода строки, но эта строка не должна содержать пробелов.
Подробнее о строках в С++ - позже. См. также теоретический материал, предпосланный лабораторной работе (текстовые файлы и обработка строк) и описание возможностей работы со строками в С++ (<string>) в любом ссылочном руководстве по языку. Здесь же приведем, для справки, только основные сведения.
Стандартная библиотека языка С++ предоставляет программистам строковый тип данных (избавляет от использования массивов символов char[ ]).
Тип данных string можно использовать наряду со стандартными встроенными типами данных. И вы на первый взгляд не будете замечать никаких различий, хотя на самом деле это абстрактный тип данных, созданный на основе объектно-ориентированных возможностей языка С++.
Строковый тип данных позволяет хранить строки переменной длины, причем длину можно менять в процессе выполнения программы. Строковый тип представляет операторы, выполняющие такие операции над строками, как контеканация, присваивание, замещение и др.
Для того, чтобы можно было создавать строковую переменную, необходимо подключить описание этого типа данных из стандартной библиотеки.
#include <iostream>
#include <string>
using namespaсe std;
void main()
{
string name="Ivan"; // объявление, определение, инициализация
string lastname="Pomidorov";
name+="M."+lastname; // конкатенация с присваиванием (накапливающее присваивание)
cout<<"My name is "<<name<<endl; // вывод
}
Используя [ ] можно получить символ из любой позиции
char ch=name[5]; // символы нумеруются с нуля
Лексикографическое сравнение осуществляется с использованием операторов == < <= > >=!=. При лексикографическом сравнении последовательно сравниваются коды символов строки. Те символы считаются "больше", чьи коды "больше"и наоборот.
Кодировка (кодовая таблица) - это однозначное соответствие между целым числом (кодом) и символом. При этом символ - это буква, цифра и другие графические знаки. Кодировки обычно составляют так, что символы следуют в алфавитном порядке и символ 'а' имеет наименьший код, а символ 'z' наибольший. Таким образом, выполняя лексикографическое сравнение можно разместить слова (строки) в алфавитном порядке. Это справедливо и для символов кириллического алфавита. Но не всегда, т.к. существует кодировки, в которой кириллические символы располагаются не в алфавитном порядке. Это кодировка КОИ8, которая обычно используется в операционных системах UNIX. Если вы пишете программу для UNIX, то нужно помнить, что простое лексикографическое сравнение не даст ожидаемого результата и нужно усложнять программу.
В нашем случае (при программировании для DOS или Windows) используются кодировки CP866 и СP1251 лексикографическое сравнение справедливо и дает нужный результат.
Ну и операторы для ввода/вывода строковых переменных >> << работают также как и для переменных других типов. Приведем, также, функции (методы) для работы с “переменными” типа string ( для понимания хорошо бы уже иметь представление о классах ):
Функция | Описание |
Конструкторы | |
string() | конструктор по умолчанию, создает пустую строку |
string(const char* p) | преобразующий конструктор |
string(const string& str, size t pos=0, size t n=npos) | копирующий конструктор (npos обычно равен -1 и указывает, что память не была выделена) |
string(const char* p, size_t n) | копирует n символов, р является базовым адресом |
string(char c, size t n=l) | создает строку из n символов с |
Перегруженные операторы | |
string& operator= (const string& s) | оператор присваивания |
string& operator+= (const string& s) | добавляет строку |
char operator[] (size t pos) const | возвращает символ из позиции pos |
char& operator[] (size t pos) | возвращает ссылку на символ из позиции pos |
Функции-члены | |
string& append(const string& s, size_t pos=0, size t n=npos); | Добавляет n символов начиная от позиции pos |
string& assign(const string& s, size_t pos=0, size_t n=npos); | строковому объекту присваивается n символов, начиная от позиции pos |
string& insert(size_t posl, const string& str, size_t pos2=0, size_t n=npos); | вставляет n символов, полученных из str, начиная с позиции pos2, в строку с позиции posl |
string& remove(size_t pos=0, size_t n=npos); | Удаляются n символов из строки начиная с позиции pos |
string& replace(posl, nl, str, pos2=0, n2=npos); | в неявной строке начиная с позиции posl заменяет nl символов n2 символами из подстроки str с позиции pos2 |
string& replace(pos, n, p, n2); | заменяет n символов в позиции pos используя char* p из n2 символов или char* p до завершающего нуля, или повторяя символ с rep раз |
char get_at (pos) const; | возвращает символ из позиции pos |
void put_at (pos, c); | помещает символ с в позицию pos |
size_t length() const; | возвращает длину строки |
const char* c_str() const; | преобразует строку в традиционное char* представление |
const char* data() const; | возвращает базовый адрес строкового представления |
void resize(n, c); void resize(n); | изменяет строку, делая ее длину равной п; в первой функции в качестве заполняющего символа выступает с, а во второй - символ eos () (end-of-string, конец строки) |
void reserve(size_t res_arg);size_t reserve() const; | выделяет память под строку; первая функция переустанавливает this; вторая возвращает закрытый член res - размер выделенного фрагмента |
size_t copy(p, n, pos=0) const; | п симолов строки, начиная с позиции pos, копируются в char* p |
string substr(pos=0, n=pos) const; | возвращается подстрока из п символов строки |
int compare(const string& str, size_t pos=0, size_t n=npos) const; | сравнивает п символов строки, начиная с позиции pos, со строкой str. Возвращается ноль, если строки равны; в противном случае возвращается положительное или отрицательное целое значение, показывающее, что неявная строка лексикографически больше или меньше чем строка str. |
size_t find (const string& str, size_t pos=0) const; | в строке начиная с позиции pos производится поиск строки str. Если она найдена, возвращается позиция, в которой она начинается; в противном случае возвращается позиция npos |
size_t rfind(str, pos=npos) const; | похоже на find (), но при поиске первого совпадения строка сканируется в обратном направлении |
size_t find_first_of(str, pos=0) const; | производится поиск первого вхождения str начиная с позиции pos |
size_t find_last_of(str, pos=npos) const; | аналогично, но в обратном направлении |
size_t find_first_not_of(str, pos=0) const; | производится поиск первого символа, который не соответствует ни одному из символов str начиная с позиции pos |
size_t find_last_not_of(str, pos=npos) const; | аналогично, но в обратном направлении |
Структуры
Структуры – это агрегатный (составной) тип данных, в котором объединены несколько членов со своими типами данных.
struct node // определяется структурный тип с названием node
{
int data;
node* link;
}; // Не забудьте точку с запятой!
Структурная переменная может быть инициализирована при объявлении:
node a = {3, NULL};
Можно объединить определение структурного типа с созданием переменной этого типа:
struct person{ int key_number; char car[12];} mr_smith, ms_jones, *pwho; // две переменные типа person и указатель
Структура может быть присвоена другой структуре того же типа. Пересылка осуществляется почленно. Если один из членов структуры – указатель, то после выполнения присваивания оба указателя ссылаются на один и тот же адрес памяти. Такое присваивание называется логическим копированием, при этом эти две структуры не являются независимыми (Об этом – позже).
Структурная переменная может передаваться как параметр в функцию или возвращена из функции.
Можно создавать массивы структурных элементов, а элементы структуры сами могут быть структурами или массивами:
typedef struct { string bossname; int numemployees; EmployeeRec staff[Size];} StaffList; void main(){ StaffList Meagresoft; strcpy(Meagresoft.bossname, "Gill,Bates"); int numemployees = Zillion; for (int slave = 0; slave < Size; slave++) { strcpy(Meagresoft.staff[slave].surname, " "); strcpy(Meagresoft.staff[slave].givenname, " "); Meagresoft.staff[slave].hourlywage = 35.0; }}
Доступ к членам структурной переменной выполняется с помощью операций. и ->, называемых селекторами членов, например: mr_smith. key_number и pwho -> car[1], или (*pwho). car[1] (см. приоритеты операций).
Если X – структура, а Y - ее элемент, тогда доступ к Y посредством X.Y, но если X – указатель на структуру, то X->Y
Структурный тип может быть параметризованным типом, тогда речь идет о шаблоне (template) структуры. Например, можно объявить структурный тип node, где параметр – не специфицированный (не определенный заранее) класс T:
template <class T> struct node
{
T info;
node * link;
};
Здесь мы коснулись шаблонов лишь в контексте структурных типов данных, поскольку последние послужили прототипом для введения в С++ концепции классов. В дальнейшем мы вернемся к теме структур и их использования в программировании на С++. О классах и их шаблонах также речь пойдет ниже.
Попутно со структурами, рассмотрим кратко еще две конструкции: битовые поля и объединения.
Дата добавления: 2015-11-16; просмотров: 139 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Ii) Указатели на элементы массива | | | Объединения (union). |