Заметьте также, что мы воспользовались постфиксной формой операции увеличения. Поэтому, когда значение countравно 0, элементу массива score[0]присваивается величина переменной temp, а затем countвозрастает на 1. После каждой итерации цикла whileвеличина счетчика countстановится на единицу больше последнего использованного индекса массива. Это как раз то, что нам нужно, поскольку score[0]- первый элемент, score[20]- 2-й элемент и т. д. Когда работа цикла в программе завершается, значение countоказывается равным полному чиcлу прочитанных элементов данных. Затем величина countиспользуется в качестве верхней границы числа итераций для последующих циклов.
Этот алгоритм хорошо работает, пока у нас имеется запас таких чисел, которые никогда не будут вводиться как данные. Но что делать, если мы захотим иметь программу, допускающую ввод в качестве данных любых чисел, относящихся к некоторому определенному типу? В таком случае мы не сможем использовать ни одно из чисел как признак конца ввода.
Мы столкнулись с аналогичной проблемой, когда искали подходящий символ для признака End-of-File. Тогда было принято решение использовать для ввода символов специальную функцию( getchar( )), которая при обращении к ней фактически возвращала величину типа int. Это позволяло функции читать "символ" EOF, который на самом деле не был обычным символом. В рассматриваемом нами примере полезной оказалась бы функция, которая осуществляла бы ввод целых чисел, могла бы, кроме того, читать данные не только целого типа, но и использовать их в качестве признака конца ввода.
Мы можем одновременно и обрадовать и огорчить вас: такое решение оказывается возможным, но вы должны узнать несколько больше о работе функций; поэтому обсуждение данной идеи откладывается до гл. 10.
Основной темой данной главы было обсуждение возможностей управления ходом выполнения программы. Язык Си предоставляет много средств для структурирования программ. С помощью операторов whileи forреализуются циклы с предусловием. Второй оператор особенно подходит для циклов, включающих в себя инициализацию и коррекцию переменной. Использование операции "запятая" в цикле forпозволяет инициализировать и корректировать более одной переменной. Для тех редких случаев, когда требуется использовать цикл с постусловием, язык Си предоставляет оператор do while. Операторы break, continueи gotoобеспечивают дополнительные возможности управления ходом выполнения программы.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Три типа циклов в языке Си: while, forи do while.
Различие между циклами с предусловием и с постусловием.
Почему циклы с предусловием используются гораздо чаще, чем циклы с постусловием.
Дополнительные операции присваивания: += -= *= /= %=.
Как пользоваться операцией "запятая".
Когда использовать операторы breakи continue: по возможности редко.
Когда использовать оператор goto: когда вы хотите иметь неудобные, трудные для понимания программы.
Как использовать оператор whileдля защиты программы от ошибок при вводе данных.
1. Определите значение переменной quackпосле выполнения каждого оператора из приведенной ниже их последовательности.
int quack = 2;
quack + = 5;
quack * = 10;
quack - = 6;
quack / = 8;
quack % = 3;
2. Что будет получено на выходе в результате работы следующего цикла?
for(value = 36; value > 0; value /= 2) printf("%3d", value);
3. Как можно модифицировать операторы ifв программе угадывание числа2чтобы был возможен ввод как прописных, так и строчных букв?
4. Мы подозреваем, что следующая программа не совсем правильная. Какие ошибки вы сможете в ней обнаружить?
main( ) /* строка 1 */
{ /* строка 2 */
int i, j, lisl[10]; /* строка 3 */
for (i = 1, i < = 10, i++ ) /* строка 5 */
{ /* строка 6 */
list[i] = 2*i + 3; /* строка 7 */
for(j = 1, j >= i, j++ ) /* строка 8 */
printf(" %d \n", lisl[j]); /* строка 9 */
} /* строка 10 */
5. Воспользуйтесь пложенными циклами при написании программы, выводящей на печать следующую фигуру:
$$$$$$$$ $$$$$$$$ $$$$$$$$ $$$$$$$$
6. Напишите программу, которая создает массив из 26 элементов и помещает в него 26 строчных букв.
Читать дальше