int a[3] = {0, 1, 2}; | // Число инициализаторов равно числу элементов |
double b[5] = {0.1, 0.2, 0.3}; | // Число инициализаторов меньше числа элементов |
int c[ ] = {1, 2, 4, 8, 16}; | // Число элементов массива определяется по числу инициализаторов |
int d[2][3] = {{0, 1, 2}, {3, 4, 5}}; | // Инициализация двумерного массива. Массив состоит из двух строк, // в каждой из которых по 3 элемента. Элементы первой строки // получают значения 0, 1 и 2, а второй – значения 3, 4 и 5. |
int e[3] = {0, 1, 2, 3}; | // Ошибка – число инициализаторов больше числа элементов |
Обратите внимание, что не существует присваивания массиву, соответствующего описанному выше способу инициализации.
int a[3] = {0, 1, 2}; | // Объявление и инициализация |
a = {0, 1, 2}; | // Ошибка |
15) В дополнение к вводу/выводу на консоль и в файлы, система ввода/вывода языка С++ позволяет осуществлять ввод/вывод в массивы. Ввод/вывод на основе массивов использует память в качестве устройства для ввода и вывода. Ввод/вывод на основе массивов осуществляется с помощью обычных потоков С++. Фактически вся представленная в предыдущем разделе информация применима к вводу/выводу на основе массивов. Единственное, что делает ввод/вывод на основе массивов уникальным, заключается в том, что состыкованным с потоком устройством служит память.
|
|
В некоторой литературе по С++ ввод/вывод на основе массивов (array-based I/O) называют также вводом/выводом в память (in-RAM I/O). Поскольку потоки способны форматировать информацию, то иногда ввод/вывод на основе массивов называют также форматированием в памяти (in-RAM formatting).
Вывод на основе массивов С++ подобен использованию функций sprintf() и sscanf() в языке С. В обоих случаях память используется в качестве устройства для ввода и вывода.
Для использования ввода/вывода на основе массивов необходимо включить в программу заголовочный файл strstrea.h.
16) Вычисление суммы элементов массива
Часто возникают задачи, требующие вычислить сумму всех или некоторых элементов массива, например, сумму элементов, стоящих в массиве на заданных местах, или сумму элементов, удовлетворяющих некоторому условию (сумму только положительных элементов, сумму ненулевых элементов второй половины массива и т.д.).
Пусть а[] – заданный массив из n элементов. Сумма всех его элементов в математической форме выглядит следующим образом:
(2.1)
Для вычисления суммы элементов части массива, например, с in– го до ik –го. Следует использовать формулу:
(2.2)
Очевидно, что формула (2.2) получается из формулы (2.1) при in=0 и ik = n –1.
Алгоритм вычисления суммы состоит в следующем:
1. установить значение переменой для накопления суммы (s) в нулевое значение (s=0);
2. в цикле изменяя i от in до ik вычислить суммуэлементов массива по выражениию s=s+ai.
|
|
При первой итерации цикла (i=in) получим s=s+ain= 0+ ain. На второй (i=in+1) – s=s+ain+1= ain + ain+1 и т. д. На последней итерации цикла будем иметь s=s+aik= ain + ain+1+…+ aik. Т.е. в цикле по параметру i "старое" значение s, содержащее накопленную сумму на предыдущей итерации, изменяется на значение ai. На рисунке 2.5 представлен алгоритм и фрагменты программ вычисления суммы элементов массива.
*/вычисление суммы элементов массива с in по ik s=0; for(i=in;i<ik;i++)< p=""></ik;i++)<> s=s+a[i]; // или s+=a[i]; или s+=*(a+i); */вычисление суммы всех элементов массива s=0; for(i=0;i<n;i++)< p=""></n;i++)<> s+=a[i]; |
Рисунок 2.5 Графическая схема и фрагмент программы вычисления суммы элементов массива
Если в алгоритме (рисунок 2.5) в блоке 2 записать i=0, а блоке 3 – (i<n)< i=""></n)<>, то получим алгоритм вычисления суммы всех элементов массива.
Рассмотренный алгоритм вычисления суммы, можно применить для вычисления суммы элементов, стоящих в массиве на заданных местах (рисунок 2.6). В этом случаи шаг изменения параметра цикла определяется переменной step.
/* с помощью цикла for */ s=0; for(i=in;i< p=""><> s+=a[i]; // или s=s+a[i]; /* с помощью цикла while */ s=0; i=in; while (i<ik)< p=""></ik)<> { s+=a[i]; i=i+step; } |
Рисунок 2.6 Графическая схема и фрагмент программы вычисления суммы элементов массива стоящих на заданных местах
Например, чтобы вычислить сумму элементов, стоящих в массиве на четных местах, необходимо "заставить" i принимать значения 1, 3, 5, … (поскольку нумерация элементов массива в С начинается с нуля т.е. элемент массива с индексом a[0] – первый элемент массива). Для этого достаточно в блоке 2 записать i=1, в блоке 3 – (i<n)< i=""></n)<>, а в блоке 5 записать i=i+2 (step=2). В программе на языке С соответствующий фрагмент будет выглядеть следующим образом:
s=0;
for(i=1;i<="" p="">
s+=a[i]; // или s=s+a[i];
Для вычисления суммы только тех элементов, которые удовлетворяют некоторому условию, необходимо в алгоритме вычисления суммы (рисунок 2.6) блок 4 заменить на ветвление, которое обеспечивает выполнение команды s=s+ai только тогда, когда условие выполнено для рассматриваемого элемента массива ai. В этом случаи алгоритм вычисления суммы примет следующий вид (рисунок 2.7).
/* с помощью цикла for */ s=0; for(i=in;i< p=""><> if(условие) s+=a[i]; // или s=s+a[i]; /* с помощью цикла while */ s=0; i=in; while (i<ik)< p=""></ik)<> { if(условие) s+=a[i]; i=i+step; } |
Рисунок 2.7 Графическая схема и фрагмент программы вычисления суммы элементов массива стоящих на заданных местах
Применим полученный алгоритм для вычисления суммы положительных элементов массива стоящих на нечетных местах. Для этого в блоке 2 запишем i=0, в блоке 3 (i<n)< i=""></n)<>, в 4 условие – (a[i]>0), а в блоке 6 изменение параметра цикла (step=2) i=i+2. Тогда соответствующий фрагмент программы можно записать в виде:
s=0;
for(i=0;i< p=""><>
if(a[i]>0) s+=a[i]; // или s=s+a[i];
Рассмотрим примеры использования рассмотренных алгоритмов.