Чтение онлайн

на главную - закладки

Жанры

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

Д. МАРТИН

Шрифт:

}

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

ПРОБЛЕМА ВВОДА

Существует несколько способов последовательного ввода набора данных, скажем чисел. Мы обсудим здесь некоторые из них, переходя от менее удобных к более удобным.

Вообще говоря, наименее удобный способ - это тот, который мы только что использовали; написание программы, допускающей ввод фиксированного числа элементов данных. (Такой способ, однако, прекрасно подходит для тех ситуаций, когда число входных данных никогда не изменяется.) Если число входных элементов данных изменяется, необходимо осуществить повторную компиляцию программы.

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

printf(" Сколько элементов данных вы будете вводить ?\n");

scanf(" %d", &nbr);

while(nbr > NUM)

{

printf("Я смогу обрабатывать не больше %d элементов; пожалуйста, укажите");

printf("меньшую величину.\n", NUM);

scanf("%d", &nbr);

 }

/* гарантирует,

что nbr <= NUM - максимального размера массива */

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

scanf("%d", &score[i]);

Мы можем продолжить движение в этом направлении, заменяя в каждом случае символическую константу NUM в программе (исключая

наличие ее в директиве #define и в описании массива) переменной nbr. При таком способе различные операции будут выполняться только над теми элементами массива, в которые введены данные.

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

Это подводит нас к следующему методу, при котором в программе осуществляется подсчет количества вводимых чисел. После всего сказанного выше очевидно, что у компьютеров имеются для этого вес возможности. Основная проблема здесь состоит в том, как сообщить компьютеру о завершении ввода чисел. Один из методов - дать пользователю возможность вводить специальный признак, указывающий на конец ввода. Признак должен принадлежать к данным того же типа, что и остальные вводимые данные, так как он должен быть прочитан тем же оператором программы. Но при этом он должен отличаться от обычных данных. К примеру, если бы мы вводили результаты игры, чтобы узнать, кто набрал от 0 до 100 очков, мы не могли бы выбрать число 74 в качестве такого признака, потому что оно может соответствовать некоторому возможному результату. С другой стороны, например, число 999 или - 3 вполне могло бы подойти в качестве такого признака, поскольку оно не соответствует требуемому результату.

 Ниже приводится программа, являющаяся реализацией этого метода:

#define STOP 999 /* признак завершения ввода */

#define NUM 50

main

{

int i, count, temp, score [NUM];

printf(" Начните ввод результатов. Введите 999 для указания \n");

printf(" конца ввода. Максимальное число результатов, которое вы\n");

printf(" можете ввести.- это %d.\n", NUM);

count = 0;

scanf(" %d", &temp); /* вводвеличины*/

while(temp != STOP && count <= NUM) /* проверка наличия признака STOP */

{ /* и проверка, не произошло ли превышения размера массива */

score[count++] = temp;

/* запись величины в память и коррекция счетчика */

if(count < NUM + 1)

scanf("%d", &temp); /* ввод очередного результата */

else

printf("Я не могу принять больше данных.\n");

}

printf("Bы ввели %d результатов, а именно:\n", count);

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

printf("%5d\n", scorc[i]);

}

Поделиться:
Популярные книги

Товарищ "Чума" 5

lanpirot
5. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 5

Страж Кодекса. Книга IX

Романов Илья Николаевич
9. КО: Страж Кодекса
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Страж Кодекса. Книга IX

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Избранный. Книга 3

Маханенко Василий Михайлович
3. Избранный
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Избранный. Книга 3

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Повелитель механического легиона. Том III

Лисицин Евгений
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том III

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10