Содержание
-
ЛЕКЦИЯ № 1.Массивы в С++
-
Массив – именованная последовательность областей памяти, хранящих однотипные элементы
-
Синтаксис определения массива без дополнительных спецификаторов и модификаторов
[]; или []; Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void. -
при объявлении массив инициализируется; массив объявлен как формальный параметр функции; массив объявлен как ссылка на массив, явно определенный в другом файле. Например: int a[100]; //массив из 100 элементов целого типа double d[14]; // массив из 14 элементов типа double char s[]="Программирование"; //символьный массив constint t=5, k=8;floatwer[2*t+k]; //массив из 2*t+k элементов вещественного типаintsample[853];/*массив из элементов sample[0], sample[1], sample[2],...,sample[852] типа int*/ равносильно объявлению constintN_max=853;intsample[N_max]; //равносильно объявлению #defineN_max 853...intsample[N_max];
-
Инициализация одномерных массивов
Например: float t[5]={1.0, 4.3, 8.1, 3.0, 6.74}; charb[7]={'П','р','и','в','е','т'};/*в данных примерах длину массива компилятор вычисляет по количеству начальных значений, перечисленных в фигурных скобках*/ intd[10]={1, 2, 3}; chara[10]="Привет";/*в данных примерах определяется значение только заданных переменных d[0],d[1],d[2] и a[0],a[1],...,d[9], остальные элементы не инициализируются*/
-
Пусть необходимо проинициализировать массивы для создания таблицы сообщений об ошибках: char e1[12] = "read error\n"; chare2[13] = "write error\n"; chare3[18] = "cannot open file\n"; Компилятор С++ сам сформирует нужное значение по количеству инициализирующих данных. В нашем случае под массив e2 будет отведено 13 байтов, включая последний байт с нулевым кодом, завершающий каждую строку. Оператор printf("%s имеет длину, равную %d\n",e2,sizeof (e2)); выведет на экран writeerror имеет длину, равную 13
-
Обращение к элементам одномерного массива
Адресация элементов массива осуществляется с помощью индексированного имени. Синтаксис обращения к элементу массива: ИмяМассива[ВыражениеТипаКонстанты]; или ИмяМассива[ЗначениеИндекса];
-
Таким образом, чтобы обратиться к элементу массива, надо указать имя массива и номер элемента в массиве (индекс). Например: a[0] – индекс задается как константа, d[55] – индекс задается как константа, s[i] – индекс задается как переменная, w[4*p] – индекс задается как выражение. Следует помнить, что компилятор в процессе генерации кода задет начальный адрес массива, который в дальнейшем не может быть переопределен. Начальный адрес массива – это адрес первого элемента массива. Вообще в программе начальным адресом массива считается ИмяМассива либо &ИмяМассива[0]. Имя массива считается константой-указателем, ссылающимся на адрес начала массива.
-
Определение размера памяти для одномерных массивов
Массив занимает непрерывную область памяти. Для одномерного массива полный объем занимаемой памяти в байтах вычисляется по формуле: Байты = sizeof(тип) * размер массива Например, пусть одномерный массив A состоит из элементов, расположенных в памяти подряд по возрастанию индексов, и каждый элемент занимает по k байт. Тогда адрес i -того элемента вычисляется по формуле: адрес(A[i]) = адрес(A[0]) + i*k
-
Пример 1. Определение размера памяти одномерного массива.
#include "stdafx.h“ #include using namespace std; #define v 4 #define p 3 int _tmain(intargc, _TCHAR* argv[]){ constint q=4, r=1; inti_mas[10]; int k=sizeof(i_mas); cout
-
doubled_mas[2*q-r]; intw=sizeof(d_mas); cout
-
Результат выполнения программы:
i_mas[10] занимает 40 байт – 4 байта (тип int ) * 10 (количество элементов массива) f_mas[7] = {2.0,4.5,8.3,7.0,1.0} занимает 28 байт – 4 байта (тип float ) * 7 (объявленное количество элементов массива) d_mas[2*q-r] занимает 56 байт – 8 байт (тип double ) * 7 (вычисленное через формулу количество элементов массива) d1_mas[2*v/p] занимает 16 байт – 8 байт (тип double ) * 2 (вычисленное через формулу количество элементов массива) c_mas[]="Программирование" занимает 17 байт – 1 байт (тип char ) * 17 (16 знаков + нулевой байт '\0' )
-
Указатели и одномерные массивы
Поскольку имя массива является указателем, допустимо, например, такое присваивание: intarrаy[25];int *ptr;ptr=array; Здесь указательptr устанавливается на адрес первого элемента массива, причем присваиваниеptr = arrаy можно записать в эквивалентной форме ptr=&arrаy[0].
-
Адрес каждого элемента массива можно получить, используя одно из трех выражений:
А обращение к пятому элементу массива можно записать как: array[4], *( array + 4), *(рtr + 4). Эти операторы вернут пятый элемент массива.
-
Указатели в одномерном массивеПример 2:
#include "stdafx.h " #include using namespace std; int_tmain(intargc, _TCHAR* argv[]){ intarray[10]; int*p; p=&array[0]; /*эквивалентные операции присваивания*/ *array=2; printf("%d\n", array[0]); array[0]=2; printf("%d\n", array[0]); *(array+0)=2; printf("%d\n", array[0]); *p=2; printf("%d\n", array[0]); p[0]=2; printf("%d\n", array[0]); *(p+0)=2; printf("%d\n", array[0]); system("pause"); return0;}
-
Использование элементов массивов в выражениях (операции с элементами массивов)
С элементами объявленного массива можно выполнять все действия, допустимые для обычных переменных этого типа (выше был приведен пример целочисленного массива, т.е. типа int ). Например, возможны операторы присваивания: hours[4] = 34;hours[5] = hours[4]/2; или логические выражения с участием элементов массива: if(number = 40) { ... } Присвоить значения набору элементов массива часто бывает удобно с помощью циклов for или while. Для массивов не допустима операция прямого присваивания.
-
Генерация одномерных массивов
Генерацию массива (массивов) в программе оформляют в виде отдельной функции. Стандартными способами генерация массивов являются: ввод данных с клавиатуры, формирование значений через генератор случайных чисел, вычисление значений по формуле, ввод данных из файла. При этом при формировании значений элементов используют цикл по индексам элементов или арифметические операции с указателем на массив. В данной работе рассмотрим первые три способа генерации массивов ( Примеры 3, 4, 6 ).
-
Вывод одномерных массивов
Одномерные массивы удобно выводить в строку или в столбец в зависимости от задачи ( Пример 3 и 4). Пример 3. /*Генерация целочисленного массива числами с клавиатуры и вывод массива в строку*/ #include "stdafx.h " #include using namespace std; #define max 20 voidgen (intk,int *pp);//прототип функции генерации массива voidout (intk,int x[max]);//прототип функции вывода массива int_tmain(intargc, _TCHAR* argv[]){ inta[max],n,*p; do {
-
printf("\nВведите количество элементов массива n (nmax); //проверка выхода за границы массива p=a; gen(n,p); out(n,a); system("pause"); return 0;} //Описание функции генерации массива с клавиатуры voidgen(intk,int *pp){ /*передача указателя как параметра позволяет вернуть сформированный массив в основную программу*/ inti; printf("\nВведите значения %d элементов массива: \n",k); for (i=0;i
-
}} //Описание функции вывода массива в строку void out (intk,int x[max]){ inti; printf("\nВывод значений %d элементов массива в строку: \n",k); for (i=0;i
-
Пример 4.Описание функции генерации массива значениями элементов арифметической прогрессии
voidgen(intk,int x[max]) { inti,d; printf("\nВведите нулевой элемент прогрессии: "); scanf("%d",&x[0]); printf("\nВведите разность прогрессии: "); scanf("%d",&d); for (i=1;i
-
Пример 5.Описание функции вывода массива в столбец
void out (intk,int x[max]){ inti; printf("\nВывод значений %d элементов массива в столбец: \n",k); for (i=0;i.
-
Для написания кода генерации массива случайными целыми числами используется:
Функция srand(). Синтаксис: voidsrand(unsignedseed); – функция устанавливает свой аргумент как основу ( seed ) для новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand(). Сформированную последовательность можно воспроизвести. Для этого необходимо вызвать srand() с соответствующей величиной seed. Для использования данной функции необходимо подключить библиотечный файл .
-
Функция rand(). Синтаксис: intrand(void); – функция возвращает псевдослучайное число в диапазоне от нуля до RAND_MAX. Для использования данной функции необходимо подключить библиотечный файл . Константа RAND_MAX определяет максимальное значение случайного числа, которое может быть возвращено функцией rand(). Значение RAND_MAX – это максимальное положительное целое число. //генерация случайных целых чисел на [a,b) x[i]=rand()%(b-a)+a;//генерация случайных вещественных чисел на [a,b) y[i]= rand()*1.0/(RAND_MAX)*(b-a)+a;
-
Пример 6.Описание функции генерации массива случайными вещественными числами на[a,b)
voidgen(intk,int a, int b, float x[max]){ inti; srand(time(NULL)*1000); //устанавливает начальную точку генерации случайных чисел for (i=0;i
-
Ключевые термины:
Генерация массива – это автоматическое формирование значений его элементов. Значение элемента массива – это значение, хранящееся по адресу, который соответствует данному элементу. Измерение массива – это количество индексов в определении массива. Имя массива – идентификатор, именующий выделенную под массив область памяти. Индекс элемента массива – это порядковый номер элемента в последовательности. Инициализация массива – это формирование значений его элементов. Массив – это именованная последовательность областей памяти, хранящих однотипные элементы. Одномерный массив – это массив, измерение которого равно единице. Размер массива – это количество элементов в массиве. Тип массива – это тип элементов массива. Указатель на массив – это адрес области памяти, выделенной под массив. Элемент массива – это каждая область памяти из последовательности областей, выделенных под массив.
-
Вопросы для самоконтроля
Почему в программе на С++ необходимо, чтобы был известен размер массива? Можно ли выполнить прямое присваивание массивов объявленных так: int x[10], y[10];? Когда, с какой целью и почему возможно объявление безразмерных массивов? В чем отличие обращения к элементам массива с помощью индексированного имени и посредством арифметики с указателями? Может ли значение элемента массива использоваться в качестве индекса другого элемента массива? Эквивалентны ли для массива mas следующие обращения и почему: mas и &mas[0]? Какие ограничения распространяются на тип массива? Каким образом можно определить объем памяти, выделяемой под массив? Каким образом можно составить выражение для генерации массива случайными целыми числами на заданном промежутке?
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.