Обращение к элементам массива

Для обращения к любому элементу массива используется имя массива и порядковый номер элемента, указывающий его относительную позицию среди остальных элементов. Этот номер называется индексом; индекс записывается в квадратных скобках. Индексация элементов массива в языке Си начинается с нуля, т.е. индекс изменяется от 0 до N-1, где N – количество элементов массива.
Таким образом, если массив объявлен:

int a[10];

его отдельные элементы обозначаются:

а[0], а[1], ..., а[9]

То есть, к любому элементу массива можно обратиться, указав его имя и в квадратных скобках индекс элемента. Например:

a[4], b[0], d[8+1].

Такие отдельные элементы массива в программе можно использовать как обычные переменные.
В качестве обозначения индекса также можно использовать любую целочисленную переменную, предварительно определив ее значение. Над такими переменными-индексами можно выполнять арифметические операции:

int i=5;
d[i]=8.3;
d[i+1]=12.5;

Ввод/вывод массива

Поскольку массив - это целый агрегат данных, ввести его как простую переменную невозможно. Элементы массива вводятся по одному.
Если массив совсем небольшой, например, содержащий всего четыре элемента:

float s[4];

его можно ввести с помощью четырех функций scanf:

scanf("%f", &s[0]);
scanf("%f", &s[1]);
scanf("%f", &s[2]);
scanf("%f", &s[3]);

или с помощью одной такой функции:

scanf("%f%f%f%f", &s[0],&s[1],&s[2],&s[3]);

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

int A[100];

Количество элементов 100 указано с запасом; программа же может работать с массивом, состоящим из двух, восьми, пятидесяти и вообще любого числа элементов, меньше или равного 100. Поэтому предварительно следует описать переменную целого типа, например n - фактическое число элементов, и ввести это значение. Опишем также переменную i - параметр цикла:

int n,i;
printf("\nВведите количество элементов массива <=100\n");
scanf("%d", &n);

Теперь можно и организовать цикл для ввода массива. С массивом удобнее всего использовать оператор цикла с параметром (как вы думаете, почему?):

for(i=0; i<n; i++)
{
printf("\nВведите элемент\n");
scanf("%d", &A[i]); // Ввод элемента
}

Теперь разберем, как подавать числа для ввода массива. Мы помним, что разделителем при вводе значений с клавиатуры является пробел. В принципе все значения можно ввести "в строку" через пробел:

9 8 7 6 5 4 3 2

Программа будет брать их по одному из входного потока каждый раз, когда встречает функцию scanf. Но такой ввод выглядит некрасиво (попробуйте, убедитесь сами!). Удобнее при вводе очередного элемента сначала выводить текст подсказки с предложением ввести элемент, а затем вводить элементы по одному, каждый раз нажимая клавишу Enter.
Вывести массив на экран нужно тоже по одному элементу, т.е. с помощью оператора цикла:



for( i = 0; i < n; i++)
{
printf("%d\n", A[i]); // Вывод элемента
}

Соберем теперь все вместе. Наша следующая небольшая программа сначала запрашивает число элементов массива, затем вводит их по одному значению и выводит на экран:

Протокол работы программы:

Вопросы для самопроверки

1. Как дать описание массива в программе?
2. Как узнать, сколько байт памяти будет отведено компилятором под масив?
3. Для чего при обращении к элементам массива используется индекс?
4. С какого значения начинается нумерация элементов массива?
5. Какие операции можно выполнять с индексами?
6. Почему при работе с массивами нужен оператор цикла?

2. Задания для самостоятельной работы к уроку 13

3. Во всех заданиях следует составить программу на языке Си.

1. В примере урока 13 на экран выводятся элементы массива вместе с их индексом. Как изменить текст подсказки, чтобы программа предлагала вводить номер элемента. Рекомендуемый вид экрана во время работы программы приведен ниже.

4. Введите элемент A[0]
12
Введите элемент A[1]
44
Введите элемент A[2]
65
. . . и т.д.

5. 2. Дать описание массива A. Ввести массив. Вывести элементы массива в обратном порядке (указание: использовать цикл с убывающим значением параметра).

3. Дать описание двух массивов A и B. Ввести массивы последовательно, один за другим. Вывести элементы массивов в виде таблицы, чередуя их элементы между собой. Рекомендуемый вид результата работы программы приведен ниже.

6. i A[i] B[i]
---------------------------
0 6 1
1 8 9
2 5 15
3 7 94
4 2 81
5 10 121
6 . . . и т.д.

7. 4. Написать программу, которая вычисляет площадь треугольника по формуле Герона. Длины сторон занести в массив.

Урок 14. Действия с массивами

Инициализация массива

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

11. float a[10] = {0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9};
int b[] = {3, 6, 4, 2, 7};

12. Для массива a количество ячеек указано явно (в квадратных скобках). У массива b в квадратных скобках ничего нет, но компилятор Си допускает такое описание. Длину массива во втором случае компилятор вычисляет по количеству начальных значений, перечисленных при инициализации. После такого определения элемент
b[0] равен 3,
b[1] равен 6 и т. д. до b[4], который равен 7.
Таким образом, для второго массива будет выделено 5 ячеек памяти, их номера изменяются от 0 до 4 включительно.
Инициализация очень удобна на стадии отладки программы, с тем, чтобы каждый раз заново не вводить все элементы массива. Разумеется, в ходе работы программы содержимое массивов может изменяться.

Действия с массивами

14. Для работы с массивами имеется множество алгоритмов. Некоторые из них похожи на те, что мы разбирали в задачах на последовательности ( тема 8, урок 11).
Главное отличие последовательности от массива то, что элементы последовательности вводятся в одну и ту же ячейку, и после ввода следующего числа предыдущее "затирается". В массиве же все значения сохраняются, и обращаться к ним можно многократно. Это открывает широкие возможности для программирования многих задач.
Многие алгоритмы обработки массивов опираются на простые базовые алгоритмы.
К базовым алгоритмам работы с одномерными массивами можно отнести следующие:
1. Сумма элементов массива.
2. Нахождение максимального (минимального) элемента массива.
3. Нахождение номера максимального элемента.
4. Подсчет количества элементов, удовлетворяющих заданному условию.

Это наиболее простые алгоритмы, и прежде чем перейти к более сложным задачам на массивы, рекомендуем хорошенько их освоить.
Продемонстрируем первый алгоритм на примере вычисления среднего арифметического элементов массива. Для этого как раз надо найти сумму элементов массива и знать их количество, затем разделить первое на втрое.
Алгоритм взят из урока 11, где находили сумму элементов последовательности. Ниже приведен полный листинг программы.

15. #include<stdio.h>
#include<math.h>
int main()
{
float a[30]; // a – массив вещественных чисел
int count; // count – фактическое количество элементов, целочисленная переменная
int i; // Рабочая переменная
float S; // S - сумма элементов массива
printf("Введите количество элементов массива <=30\n");
scanf("%d", &count); // Ввод фактического количества элементов массива
for(i=0; i<count; i++) // Цикл ввода элементов массива
{
printf("Введите элемент\n");
scanf("%f", &a[i]);
}
// Здесь начинается вычисление суммы
S=0; // Обнуляем значение ячейки S
for(i=0; i < count; i++) // Цикл вычисления суммы элементов массива
S = S+ a[i]; // Накопление суммы
S = S/count; // Находим среднее арифметическое, результат - в ячейке S
printf("Среднее арифметическое = %f\n", S); // Вывод результата на печать
return 0;
}

Как можно улучшить этот код Начало формы Конец формы

16.

Начало формы Конец формы

17. Алгоритмы под номерами 2, 3, и 4 реализуются с помощью сочетания цикла и разветвления. Алгоритм 2 (нахождение максимального элемента последовательности) был уже нами рассмотрен в Уроке 11, здесь мы приведем фрагмент кода, реализующий этот алгоритм для массива (опуская описание и ввод массива).
Алгоритм нахождения максимального элемента массива:

18. float M; // M - ячейка для максимального элемента массива
M=a[0]; // Первоначально максимальному равен элемент с индексом 0
for(i=1; i < count; i++) // Цикл для всех остальных элементов массива
if( a[i]>M ) M=a[i]; // Если встретился элемент, больший чем максимальный,
// он становится максимальным
printf("Максимальный элемент массива = %f\n", M);

19. Часто в задачах, кроме самого максимального элемента, используется и его порядковый номер в массиве, то есть его индекс. Для реализации Алгоритма 3 будем использовать предыдущий алгоритм, но добавим еще одну ячейку - для сохранения индекса. Точно так же будем искать максимальный элемент и одновременно запоминать его номер.
Фрагмент кода нахождения номера максимального элемента следующий:

20. float M; // M - ячейка для максимального элемента массива
int N; // N - ячейка для номера максимального элемента, целое число
M=a[0]; // Первоначально максимальному равен элемент с индексом 0
N=0; // Индекс максимально равен 0
for(i=1; i < count; i++) // Цикл для всех остальных элементов массива
if( a[i]>M ) // Проверка условия
{
M=a[i]; // Запоминаем максимальный элемент
N=i; // и его номер
}
printf("Максимальный элемент массива = %f, его номер = %d\n", M, N);

21. В качестве демонстрации Алгоритма 4 рассмотрим простое условие. Допустим, массив заполнен положительными и отрицательными числами. Подсчитаем количество положительных элементов этого массива.

22. int k; // k - счетчик количества положительных элементов массива, целое число
k=0; // Первоначальное значение счетчика равно 0
for(i=0; i < count; i++) // Цикл для всех элементов массива
if( a[i]>0 ) k=k+1; // Проверка условия и подсчет
printf("Количество положительных элементов массива = %d\n", k);

Примеры алгоритмов на массивы Начало формы Конец формы

23.Начало формы

24.Конец формы

 

 

Алгоритмы с массивами

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

1. Пусть имеется фрагмент программы: int a[] = {0, 1, 2, 3, 4, 5, 6}; int S=0, i; for(i=0; i<7; i++) S+=a[i]; printf("%d", S); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
2. Пусть имеется фрагмент программы: int a[] = {0, 1, 2, 3, 4, 5, 6}; int S=1, i; for(i=0; i<5; i++) S=S+a[i]; printf("%d", S); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
3. Пусть имеется фрагмент программы: int a[10] = {4,3,1,8,2,3,4,7,5,6}; int b=4, S=0, i; for(i=0; i<10; i++) if(a[i] > b) S+=a[i]; printf("%d", S); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
4. Пусть имеется фрагмент программы: int a[10] = {4,3,1,8,2,3,4,7,5,6}; int b=a[0], i; for(i=1; i<10; i++) if( a[i]>b ) b=a[i]; printf("%d", b); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
5. Пусть имеется фрагмент программы: int a[10] = {4,3,1,8,2,3,4,7,5,6}; int b=a[0], i; for(i=1; i<10; i++) if( a[i]<b ) b=a[i]; printf("%d", b); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
6. Пусть имеется фрагмент программы: int a[10] = {4,3,1,8,2,3,4,7,5,6}; int S1=a[0], S2=a[0], i; for(i=1; i<10; i++) {if( a[i]>S1 ) S1=a[i]; if( a[i]<S2 ) S2=a[i]; } printf("%d", S2-S1); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
7. Пусть имеется фрагмент программы: int a[10] = {4,-3,-1,8,2,-3,4,-7,-5,-6}; int k=0, i; for(i=0; i<10; i++) if( a[i]<0 ) k++; printf("%d", k); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
8. Пусть имеется фрагмент программы: int a[10] = {4,-3,-1,8,2,-3,4,-7,-5,-6}; int k1=0, k2=0, i; for(i=0; i<10; i++) if( a[i]>0 ) {k1=k1+a[i]; k2++;} printf("%d", k1*1.0/k2); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 

   
9. Пусть имеется фрагмент программы: int a[10] = {4,3,1,8,2,3,4,7,5,6}; int b=a[0], N=0, i; for(i=1; i<10; i++) if( a[i]<b ) {b=a[i]; N=i;} printf("%d", N); Что выполняет этот алгоритм и что будет выведено на экран в результате выполнения этого фрагмента программы?

 









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

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь