ЖАНРЫ

Язык Си - руководство для начинающих

Д. МАРТИН

Шрифт:

РИС. 8.7. Размещение в памяти массивов с элементами типа char и int

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

/* ввод счета*/

main

{

int i, score[10];

 for (i = 0; i <= 9; i++)

scanf(" %d", &a[i]); /* ввод десяти результатов*/

printf("Введены следующие результаты :\n" );

for (i = 0; i <= 9; i++)

printf(" %5d", a[i]); /* проверка правильности ввода*/

printf("\n");

 }

В понятие хорошего стиля программирования входит эхо-печать только что введенных величин. Она даст уверенность, что в программе будут обрабатываться те данные, для которых она предназначена.

Применяемый здесь способ гораздо более удобен, чем использование 10 различных операторов scanf и 10 отдельных операторов printf для ввода и проверки десяти результатов, определяющих число набранных очков. Цикл for обеспечивает очень простои и удобный способ использования индексов массивов.

Какого типа операции могли бы мы выполнить над этими данными? Мы могли бы найти их среднее, величину стандартного отклонения (мы знаем даже, как это сделать) и максимальное значение счета, а также произвести их сортировку в некотором порядке. Займемся двумя простейшими задачами: нахождением среднего и максимального результатов.

Чтобы вычислить среднее, мы можем добавить к нашей программе приведенный ниже фрагмент:

int sum, average;

for(i = 0, sum = 0; i <= 9; i++) /* две инициализации*/

sum + = a[i]; /* суммирование элементов массива */

average = sum/10; /*классический метод усреднения */

printf(" Средний результат равен %d.\n", average);

Для нахождения максимального результата к программе можно добавить следующий фрагмент:

int highest;

for(highest = а[0], i = 1; i <= 9; i++)

if(a[i] > highest) highest = a[i];

printf ("Максимальный результат равен %d.\n", highest);

Здесь мы начинаем с того, что полагаем переменную highest равной величине а[0]. Затем производится сравнение значения highest с каждым элементом массива. Когда обнаруживается, что некоторая величина больше текущего значения переменной highest, ей присваивается эта новая большая величина.

Теперь объединим все части программы. На псевдокоде алгоритм ее работы можно записать следующим образом:

ввод результатов.

эхо-печать результатов.

вычисление и печать среднего значения.

вычисление и печать максимального значения.

Кроме того, мы несколько обобщим нашу программу:

/* результаты*/

#define NUM 10

main

{

int i, sum, average, highest, score [NUM];

 printf(" Укажите10 результатов. \n");

for(i = 0; i < NUM; i++)

scanf(" %d" , &scorc[i]); /* ввод десяти результатов */

printf(" Введены следующие результаты:\n");

for(i = 0; i<NUM; i++)

printf("%5d", score[i]);/* проверка правильности ввода*/

printf("\n");

tor(i = 0, sum = 0; i < NUM; i++)

sum + = score[i]; /* суммирование элементов массива */

average = sum/NUM; /* классический метод усреднения */

printf(" Средний результат равен %d.\n", average);

for(highest = score[0], i = 1; i < NUM; i++)

if(score[i] > highest) /* какая из величин больше*/

highest = score[i];

printf(" Максимальный результат равен %d.\n", highest);

}

Мы заменили число 10 символической константой и воспользовались тем, что выражения i <=(NUM-1) и i < NUM эквивалентны.

Давайте сначала посмотрим, как это программа работает, а затем сделаем несколько замечаний.

Укажите 10 результатов:

76 85 62 48 98 71 66 89 70 77

Введены следующие результаты:

76 85 62 48 98 71 66 89 70 77

Средний результат равен 74. Максимальный результат равен 98.

Первый момент, который необходимо отметить, состоит в том, что мы использовали четыре различных цикла for. Вас может заинтересовать вопрос: является ли это на самом деле необходимым или мы можем некоторые из данных операций объединить в одном цикле? Такая возможность существует, и она позволила бы сделать программу более компактной. Однако мы побоялись следовать такому подходу (видите, какие мы впечатлительные люди!), поскольку это противоречит принципу модульности. Смысл, заключенный в данной фразе, состоит в том, что программа должна быть разбита на отдельные единицы, или "модули", причем каждый из них должен выполнять одну задачу. (Наша запись на псевдокоде отражает деление программы на четыре модуля.) Такое разбиение облегчает чтение текста программы. Возможно, еще более важным является то, что если отдельные части программы не перемешаны, ее коррекция или модификация упрощаются. Для этого необходимо только исключить из программы требуемый модуль, заменить его новым, а оставшуюся часть программы не изменять.

Поделиться с друзьями: