Слайд 2
Массив – именованная последовательность областей памяти, хранящих однотипные
элементы
Слайд 3
Синтаксис определения массива без дополнительных спецификаторов и модификаторов
[];
или
[];
Тип – тип
элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void.
Слайд 4
при объявлении массив инициализируется;
массив объявлен как формальный параметр
функции;
массив объявлен как ссылка на массив, явно определенный в
другом файле.
Например:
int a[100]; //массив из 100 элементов целого типа
double d[14]; // массив из 14 элементов типа double
char s[]="Программирование"; //символьный массив
const int t=5, k=8;float wer[2*t+k]; //массив из 2*t+k элементов вещественного типаint sample[853]; /*массив из элементов sample[0], sample[1], sample[2],...,sample[852] типа int*/ равносильно объявлению
const int N_max=853;int sample[N_max]; //равносильно объявлению
#define N_max 853...int sample[N_max];
Слайд 5
Инициализация одномерных массивов
Например:
float t[5]={1.0, 4.3, 8.1, 3.0, 6.74};
char
b[7]={'П','р','и','в','е','т'};/*в данных примерах длину массива компилятор вычисляет по количеству
начальных значений, перечисленных в фигурных скобках*/
int d[10]={1, 2, 3};
char a[10]="Привет";/*в данных примерах определяется значение только заданных переменных d[0],d[1],d[2] и a[0],a[1],...,d[9], остальные элементы не инициализируются*/
Слайд 6
Пусть необходимо проинициализировать массивы для создания таблицы сообщений
об ошибках:
char e1[12] = "read error\n";
char e2[13] = "write
error\n";
char e3[18] = "cannot open file\n";
Компилятор С++ сам сформирует нужное значение по количеству инициализирующих данных. В нашем случае под массив e2 будет отведено 13 байтов, включая последний байт с нулевым кодом, завершающий каждую строку. Оператор
printf("%s имеет длину, равную %d\n",e2,sizeof (e2)); выведет на экран write error имеет длину, равную 13
Слайд 7
Обращение к элементам одномерного массива
Адресация элементов массива осуществляется
с помощью индексированного имени. Синтаксис обращения к элементу массива:
ИмяМассива[ВыражениеТипаКонстанты];
или
ИмяМассива[ЗначениеИндекса];
Слайд 8
Таким образом, чтобы обратиться к элементу массива, надо
указать имя массива и номер элемента в массиве (индекс).
Например:
a[0]
– индекс задается как константа,
d[55] – индекс задается как константа,
s[i] – индекс задается как переменная,
w[4*p] – индекс задается как выражение.
Следует помнить, что компилятор в процессе генерации кода задет начальный адрес массива, который в дальнейшем не может быть переопределен. Начальный адрес массива – это адрес первого элемента массива. Вообще в программе начальным адресом массива считается ИмяМассива либо &ИмяМассива[0]. Имя массива считается константой-указателем, ссылающимся на адрес начала массива.
Слайд 9
Определение размера памяти для одномерных массивов
Массив занимает непрерывную
область памяти. Для одномерного массива полный объем занимаемой памяти
в байтах вычисляется по формуле:
Байты = sizeof (тип) * размер массива
Например, пусть одномерный массив A состоит из элементов, расположенных в памяти подряд по возрастанию индексов, и каждый элемент занимает по k байт. Тогда адрес i -того элемента вычисляется по формуле:
адрес(A[i]) = адрес(A[0]) + i*k
Слайд 10
Пример 1. Определение размера памяти одномерного массива.
#include "stdafx.h“
#include
using namespace std;
#define v 4
#define p 3
int _tmain(int argc,
_TCHAR* argv[]){
const int q=4, r=1;
int i_mas[10];
int k=sizeof(i_mas);
cout << "i_mas[10] занимает " << k << " байт\n";
float f_mas[7]={2.0,4.5,8.3,7.0,1.0};
int t=sizeof(f_mas);
cout << "f_mas[7]={2.0,4.5,8.3,7.0,1.0} занимает "<< t<<"байт\n";
Слайд 11
double d_mas[2*q-r];
int w=sizeof(d_mas);
cout
<< "d1_mas[2*v/p] занимает " << w1 << " байт\n";
char c_mas[]="Программирование";
int s=sizeof(c_mas);
cout << "c_mas[]=\"Программирование\"занимает"<< s <<"байт\n";
system("pause");
return 0;
}
Слайд 12
Результат выполнения программы:
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' )
Слайд 13
Указатели и одномерные массивы
Поскольку имя массива является указателем,
допустимо, например, такое присваивание:
int arrаy[25];int *ptr;ptr=array;
Здесь
указатель ptr устанавливается на адрес первого элемента массива, причем присваивание ptr = arrаy можно записать в эквивалентной форме ptr=&arrаy[0].
Слайд 14
Адрес каждого элемента массива можно получить, используя одно
из трех выражений:
А обращение к пятому элементу массива можно
записать как:
array[4], *( array + 4), *(рtr + 4). Эти операторы вернут пятый элемент массива.
Слайд 15
Указатели в одномерном массиве
Пример 2:
#include "stdafx.h "
#include
using
namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int array[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");
return 0;}
Слайд 16
Использование элементов массивов в выражениях (операции с элементами
массивов)
С элементами объявленного массива можно выполнять все действия, допустимые
для обычных переменных этого типа (выше был приведен пример целочисленного массива, т.е. типа int ). Например, возможны операторы присваивания:
hours[4] = 34;hours[5] = hours[4]/2; или логические выражения с участием элементов массива:
if (number < 4 && hours[number] >= 40) { ... }
Присвоить значения набору элементов массива часто бывает удобно с помощью циклов for или while. Для массивов не допустима операция прямого присваивания.
Слайд 17
Генерация одномерных массивов
Генерацию массива (массивов) в программе оформляют
в виде отдельной функции. Стандартными способами генерация массивов являются:
ввод
данных с клавиатуры,
формирование значений через генератор случайных чисел,
вычисление значений по формуле,
ввод данных из файла.
При этом при формировании значений элементов используют цикл по индексам элементов или арифметические операции с указателем на массив. В данной работе рассмотрим первые три способа генерации массивов ( Примеры 3, 4, 6 ).
Слайд 18
Вывод одномерных массивов
Одномерные массивы удобно выводить в строку
или в столбец в зависимости от задачи ( Пример
3 и 4 ).
Пример 3.
/*Генерация целочисленного массива числами с клавиатуры и вывод массива в строку*/
#include "stdafx.h "
#include
using namespace std;
#define max 20
void gen (int k,int *pp);//прототип функции генерации массива
void out (int k,int x[max]);//прототип функции вывода массива
int _tmain(int argc, _TCHAR* argv[]){
int a[max],n,*p;
do {
Слайд 19
printf("\nВведите количество элементов массива n (n
("%d",&n); }
while (n>max); //проверка выхода за
границы массива
p=a;
gen(n,p);
out(n,a);
system("pause");
return 0;}
//Описание функции генерации массива с клавиатуры
void gen(int k,int *pp){
/*передача указателя как параметра позволяет вернуть сформированный массив в основную программу*/
int i; printf("\nВведите значения %d элементов массива: \n",k); for (i=0;i printf("x[%d]= ",i);
scanf("%d",pp++);
Слайд 20
}}
//Описание функции вывода массива в строку
void out (int
k,int x[max]){
int i;
printf("\nВывод значений %d элементов
массива в строку: \n",k);
for (i=0;iprintf("%d\t",x[i]);
}
Слайд 21
Пример 4.
Описание функции генерации массива значениями элементов арифметической
прогрессии
void gen(int k,int x[max]) {
int i,d;
printf ("\nВведите
нулевой элемент прогрессии: ");
scanf("%d",&x[0]);
printf ("\nВведите разность прогрессии: ");
scanf("%d",&d);
for (i=1;i
Слайд 22
Пример 5.
Описание функции вывода массива в столбец
void out
(int k,int x[max]){
int i;
printf("\nВывод значений %d элементов
массива в столбец: \n",k);
for (i=0;iprintf("x[%i]= %d\n",i,x[i]);
}
Для использования функции генерации случайных чисел необходимо подключить библиотеку .
Слайд 23
Для написания кода генерации массива случайными целыми числами
используется:
Функция srand(). Синтаксис:
void srand(unsigned seed); – функция устанавливает свой
аргумент как основу ( seed ) для новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand(). Сформированную последовательность можно воспроизвести. Для этого необходимо вызвать srand() с соответствующей величиной seed.
Для использования данной функции необходимо подключить библиотечный файл .
Слайд 24
Функция rand(). Синтаксис:
int rand(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;
Слайд 25
Пример 6.
Описание функции генерации массива случайными вещественными числами
на[a,b)
void gen(int k,int a, int b, float x[max]){
int i; srand(time(NULL)*1000); //устанавливает начальную точку генерации случайных чисел
for (i=0;i}
}
Слайд 26
Ключевые термины:
Генерация массива – это автоматическое формирование значений
его элементов.
Значение элемента массива – это значение, хранящееся по
адресу, который соответствует данному элементу.
Измерение массива – это количество индексов в определении массива.
Имя массива – идентификатор, именующий выделенную под массив область памяти.
Индекс элемента массива – это порядковый номер элемента в последовательности.
Инициализация массива – это формирование значений его элементов.
Массив – это именованная последовательность областей памяти, хранящих однотипные элементы.
Одномерный массив – это массив, измерение которого равно единице.
Размер массива – это количество элементов в массиве.
Тип массива – это тип элементов массива.
Указатель на массив – это адрес области памяти, выделенной под массив.
Элемент массива – это каждая область памяти из последовательности областей, выделенных под массив.