Массивы: одномерные массивы
Использование элементов массивов в выражениях (операции с элементами массивов)
С элементами объявленного массива можно выполнять все действия, допустимые для обычных переменных этого типа (выше был приведен пример целочисленного массива, т.е. типа int ). Например, возможны операторы присваивания:
hours[4] = 34; hours[5] = hours[4]/2;
или логические выражения с участием элементов массива:
if (number < 4 && hours[number] >= 40) { ... }
Присвоить значения набору элементов массива часто бывает удобно с помощью циклов for или while. Для массивов не допустима операция прямого присваивания.
Генерация одномерных массивов
Задачи по программированию с использованием массивов решаются, как правило, по следующему алгоритму: объявление массива, генерация или инициализация, обработка значений элементов, вывод. При этом, если в процессе обработки значения элементов массива изменяются, то вывод осуществляется дважды: до и после обработки.
Перед использованием значений элементов массива их необходимо сформировать. Задать значения элементам массива можно на этапе объявления, т.е. выполнить инициализацию, а также непосредственным выполнением присваивания.
В большинстве задач с использованием массивов целесообразно выполнять генерацию массивов – автоматическое формирование значений элементов. Генерацию массива (массивов) в программе оформляют в виде отдельной функции.
Стандартными способами генерация массивов являются:
- ввод данных с клавиатуры,
- формирование значений через генератор случайных чисел,
- вычисление значений по формуле,
- ввод данных из файла.
При этом при формировании значений элементов используют цикл по индексам элементов или арифметические операции с указателем на массив. В данной работе рассмотрим первые три способа генерации массивов ( Примеры 3, 4, 6 ).
Вывод одномерных массивов
Вывод массивов также целесообразно оформлять в виде отдельной функции. Так как функция вывода не изменяет значения элементов массива, то в качестве одного из параметров такой функции выступает сам массив или указатель на массив. Одномерные массивы удобно выводить в строку или в столбец в зависимости от задачи ( Пример 3 и 4 ). Для организации вывода также используют цикл по индексам элементов или арифметические операции с указателем на массив.
Пример 3.
/*Генерация целочисленного массива числами с клавиатуры и вывод массива в строку*/ #include "stdafx.h" #include <iostream> 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 { printf("\nВведите количество элементов массива n (n<=20):"); scanf ("%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<k;i++){ printf("x[%d]= ",i); scanf("%d",pp++); } } //Описание функции вывода массива в строку void out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в строку: \n",k); for (i=0;i<k;i++) printf("%d\t",x[i]); }
Пример 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<k;i++) x[i]=x[i-1]+d; }
Пример 5.
//Описание функции вывода массива в столбец void out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в столбец: \n",k); for (i=0;i<k;i++) printf("x[%i]= %d\n",i,x[i]); }
Для использования функции генерации случайных чисел необходимо подключить библиотеку <time.h>.
Для написания кода генерации массива случайными целыми числами используется:
- Функция srand(). Синтаксис:– функция устанавливает свой аргумент как основу ( seed ) для новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand(). Сформированную последовательность можно воспроизвести. Для этого необходимо вызвать srand() с соответствующей величиной seed.
void srand(unsigned seed);
Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>.
- Функция rand(). Синтаксис:– функция возвращает псевдослучайное число в диапазоне от нуля до RAND_MAX. Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>.
int rand(void);
- Константа RAND_MAX определяет максимальное значение случайного числа, которое может быть возвращено функцией rand(). Значение RAND_MAX – это максимальное положительное целое число.
- Часто в задачах требуется выполнить генерацию массива на произвольном промежутке [a,b). Для этого используются следующие выражения:
//генерация случайных целых чисел на [a,b) x[i]=rand()%(b-a)+a; //генерация случайных вещественных чисел на [a,b) y[i]= rand()*1.0/(RAND_MAX)*(b-a)+a;
Пример 6.
/*Описание функции генерации массива случайными вещественными числами на[a,b)*/ void gen(int k,int a, int b, float x[max]){ int i; srand(time(NULL)*1000); //устанавливает начальную точку генерации случайных чисел for (i=0;i<k;i++){ x[i]=(rand()*1.0/(RAND_MAX)*(b-a)+a); //функция генерации случайных чисел на [a,b) } }
Ключевые термины
Генерация массива – это автоматическое формирование значений его элементов.
Значение элемента массива – это значение, хранящееся по адресу, который соответствует данному элементу.
Измерение массива – это количество индексов в определении массива.
Имя массива – идентификатор, именующий выделенную под массив область памяти.
Индекс элемента массива – это порядковый номер элемента в последовательности.
Инициализация массива – это формирование значений его элементов.
Массив – это именованная последовательность областей памяти, хранящих однотипные элементы.
Одномерный массив – это массив, измерение которого равно единице.
Размер массива – это количество элементов в массиве.
Тип массива – это тип элементов массива.
Указатель на массив – это адрес области памяти, выделенной под массив.
Элемент массива – это каждая область памяти из последовательности областей, выделенных под массив.
Краткие итоги
- Массив является представителем структурированного типа данных в языке С++.
- Элементы массива имеют одинаковые имя, тип и располагаются в памяти последовательно.
- Элементы массива характеризуются индексами, значениями и адресуемой памятью.
- Существует две основные формы объявления массивов: с указанием и без указания размера. Безразмерный массив объявляется, если: он инициализируется при объявлении, является формальным параметром функции, объявлен как ссылка на массив.
- Инициализация массива заключается в присваивании начальных значений его элементам. В программах часто используется генерация массивов.
- Для массивов нельзя выполнить операцию прямого присваивания.
- Адресация элементов массива осуществляется с помощью индексированного имени. Обращаться к элементам массива можно также посредством механизма указателей.
- Размер памяти, занимаемой массивом, зависит от реализации и вычисляется с помощью операции sizeof.
- Массивы используются для решения прикладных задач.