Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

V) Массивы и функции

Правила приведения типов операндов | Явное приведение типа | Как это работает | Проверка – Передача по значению |


Читайте также:
  1. III. B. Функции слова ONE
  2. Other Functions of Money. Другие функции денег
  3. Абстрактные базовые классы и чисто виртуальные функции
  4. Абстрактные базовые классы и чисто виртуальные функции.
  5. Автоматизация поиска информации. Категория «Ссылки и массивы».
  6. Аппроксимация 1s –функции электрона в атоме водорода двумя гауссовыми функциями

 

Массив как целое может быть передан в функцию как параметр. (Детали – отдельно и позже).

Массив (целиком) не может быть возвращен (оператором 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).

mybiblioteka.su - 2015-2024 год. (0.01 сек.)