Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Объявление и инициализация массивов



При объявлении массива можно использовать инициализаторы. Список инициализирующих значений состоит из констант, разделенных запятыми. Весь список должен быть заключен в фигурные скобки. Количество значений в инициализаторе не должно быть больше размера массива. Если значений в инициализаторе меньше, остальным элементам массива присваивается 0. Каждая константа должна иметь тип, совместимый с типом массива.

Пример инициализации массива целых чисел

int a[5]={0, 1, 2, 3, 4};

Если при объявлении массива используется инициализатор, можно не указывать размер массива – подсчет будет произведен компилятором. Массивы, объявленные без указания границы изменения индекса, называют безразмерными.

 

Пример // безразмерные массивы

int a[]={1, 2, 3, 4, 5};

Массивы типа char можно инициализировать строковыми константами.

Пример. Инициализация массива типа char. Поскольку строки заканчиваются символом '\0', граница массива должна быть на единицу больше длины слова. Поэтому для хранения слова " february", состоящего из 8 символов, потребовался массив из 9 элементов.

// инициализация char

char login[8] = {'j', 'a', 'n', 'u', 'a', 'r', 'y', '\0'};

char password[9]=" february";

Пример. Объявление и инициализация строк, содержащих символы кириллицы – на каждый символ в строке нужно 2 байта.

char fio_r[7]=" ФИО";

char Fio_r[]={'Ф', 'И', 'О', '\0'};

Поскольку строка символов является массивом, нельзя присвоить одну строку другой – необходимо выполнить операцию присваивания для каждого элемента. Точно так же нельзя сравнивать строки. Для выполнения этих и других операций со строками можно использовать встроенные функции, объявленные в файле string.h. В частности, присваивание символьных массивов реализуется функцией strcpy(s1, s2), сравнение – функцией strcmp(s1, s2), важнейшая для строк операция склеивания (конкатенация) выполняется функцией strcat(s1, s2), для вычисления длины строки введена функция strlen(s). Поиск в содержимом строки можно выполнить с помощью функций strchr(s, ch) и strstr(s1, s2).

Указатели

 

Указатель – это переменная, содержащая адрес другой переменной. Применяя операцию * (операция разыменования ), получаем значение, записанное по данному адресу. С помощью операции &, примененной к переменной, можно узнать адрес, по которому эта переменная хранится в памяти.

При объявлении указателя также используется *, кроме того, указывается тип данных, на которые ссылается указатель.

Тип_данных *имя_указателя;

Пример. Объявление указателей и обращение к памяти. Значение переменной px – адрес памяти, а *px – данные, записанные по адресу px.

int x=100; // переменная

cout< < " \n x=" < < x;

int* px; // указатель на int

px = & x; // указателю присвоен адрес переменной x

*px =200; /* Изменения значения, записанного по адресу px */

При создании указателя память выделяется только для хранения адреса. Для выделения памяти под данные используется оператор new. Выделение памяти оператором new:

указатель = new Тип

Оператор new выделяет память в количестве, необходимом для хранения данных указанного типа. Указатель в левой части оператора присваивания должен быть указателем на тот же тип данных.

Для динамически размещаемого одномерного массива используется следующая форма оператора new:

p=new type [size]

Для удаления динамически размещаемого одномерного массива исполь-зуется оператор

delete [ ] p;

Пример

int *p;

int i;

p = new int [5]; // выделение памяти для 5 целых

Указатели и массивы

Имя массива является указателем и содержит адрес первого элемента массива. Если, например, w имя массива, то *w – значение первого элемента массива, а обращение w[i] к i-му элементу массива есть сокращенная форма операции с указателями *(w+i).

Пример.

const int N=10;

int w[N]= {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}; // массив из 10 элементов

int *v; // указатель

v=w+5;

cout< < *v; // будет выведено значение 50

 

1. 2.1.7 Использование объектов класса string (строк)

Для того чтобы использовать объекты класса string, необходимо включить соответствующий заголовочный файл:

#include < string>

Пример строки, представленной объектом типа string и инициализированной строкой символов:

#include < string>

string st( " Строка-объект\n" );

Длину строки возвращает функция-член size() (длина не включает завершающий нулевой символ).

cout < < st.size() < < " символов\n";

 

Вторая форма определения строки задает пустую строку:

string st2; // пустая строка

Третья форма конструктора инициализирует объект типа string другим объектом того же типа - строка st3 инициализируется строкой st:

string st3( st );

Копирование строк выполняется с помощью обычной операции присваивания: st2 = st3; // копируем st3 в st2

Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки:

string s1( " hello, " );

string s2( " world\n" );

Можно получить третью строку, состоящую из конкатенации первых двух, таким образом:

string s3 = s1 + s2;

Чтобы добавить s2 в конец s1, следует написать:

s1 += s2;

Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string:

const char *pc = ", ";

string s1( " hello" );

string s2( " world" );

string s3 = s1 + pc + s2 + " \n";

Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string:

string s1;

const char *pc = " a character array";

s1 = pc; // правильно

Обратное преобразование, однако, не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции:

char *str = s1; // ошибка компиляции

Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str():

char *str = s1.c_str(); // почти правильно

Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. Приведенный выше пример инициализации указателя char *str все еще не совсем корректен. c_str() возвращает указатель на константный массив, чтобы предотвратить возможность непосредственной модификации содержимого объекта через этот указатель, имеющий тип

const char *

Правильный вариант инициализации массива символов:

const char *str = s1.c_str(); // правильно

Определение структур

 

Данные различных типов можно объединить под одним именем с помощью структур. Структуры – это составные типы данных, построенные с использованием других типов. Рассмотрим следующее определение структуры:

 

struct Person

{

char name[ 20 ];

char surname[ 20 ];

int age;

};

 

Ключевое слово struct начинает определение структуры. Идентификатор Person – это тег (имя) структуры. Тег структуры используется при объявлении переменных в качестве наименования типа. Имена, объявленные в фигурных скобках, – это элементы (или члены) структуры. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать элементы с одинаковыми именами. Элементы структуры могут быть любого типа. Каждое определение структуры должно заканчиваться точкой с запятой.

Переменные структуры объявляются так же, как и переменные других типов.

Person newPerson, personArray[ 10 ], *personPtr;

Для доступа к элементам структуры (или класса) используются операции доступа к элементам – операция точка (.) и операция стрелка (-> ). Операция точка обращается к элементу структуры (или класса) по имени переменной объекта. Например, чтобы напечатать значение элемента age структуры newPerson, используется оператор:

cout < < newPerson.age < < endl;

Для доступа к элементам структуры с помощью указателя используется операция стрелка. Присвоение указателю personPtr на структуру Person значения

personPtr = new Person[50];

Присваивание элементу структуры age значения 18 personPtr -> age=18;

 

Функции

Для более эффективного управления кодом используется разделение программы на отдельные логические модули – функции. Модульное программирование предполагает:

– объявление функции (создание прототипа), включающее имя функции, тип возвращаемого ею значения и типы формальных параметров функции;

– определение функции, включающее заголовок функции и последовательность операторов, реализующих функцию;

– вызов функции путем указания ее имени и замены формальных параметров значениями (фактическими параметрами).

Пример использования функции.

#include < iostream>

using namespace std;

int sum(int, int); /* Объявление функции sum - прототип */

int main()

{ int a, b, c;

cin > > a > > b;

c=sum(a, b); // Вызов функции

cout < < " \n sum = " < < c;

return 0;

}

int sum(int a, int b)

{ // Определение функции

return a+b;

}

Объявление функции

 

До обработки вызова функции компилятору должно быть известно её имя и типы параметров. Прототип функции является оператором и должен заканчиваться точкой с запятой. В прототипе функции можно не приводить имена параметров, – достаточно указать список типов параметров.

Возвращаемый_тип Имя_функции(список типов_параметров);

 

Можно обойтись и без прототипа функции – если блок определения функции поместить до блока, в котором производится вызов функции.

 

Пример. Блок определения функции предшествует её вызову, поэтому в программе нет объявления функции (прототипа).

 

#include < iostream> using namespace std;

int sum(int a, int b)

{ // Определение функции

return a+b;

}

int main()

{ int a, b, c;

cin > > a > > b;

c=sum(a, b); // Вызов функции

cout < < " \n c = " < < c;

return 0;

}

Использование прототипов позволяет компилятору правильно обрабатывать возвращаемые значения функций, следить за соответствием количества аргументов при вызове функции, корректировать применение типов данных для аргументов функции и пытаться, если это возможно, выполнить приведение типов, в случае несоответствия типов при вызове.

Часто прототипы функций помещают в отдельные файлы– заголовочные файлы (эти файлы имеют расширение.h).

 

Определение функции

Определение начинается с заголовка функции. В отличие от прототипа функции, заголовок не должен заканчиваться точкой с запятой. Кроме того, в заголовке обязательно указываются имена параметров.

Функция должна содержать хотя бы один оператор return – исключением являются функции, у которых тип возвращаемых значений void. Выполнение оператора return завершает работу функции и возвращает управление в вызывающую программу. Синтаксис оператора

return выражение;

Для функции с типом возвращения void оператор return необязателен, но его можно использовать завершения работы функции и возврата в вызывающую программу. В этом случае оператор не содержит возвращаемого значения: return;


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 1591; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.034 с.)
Главная | Случайная страница | Обратная связь