Этот алгоритм хорошо работает, пока у нас имеется запас таких чисел, которые никогда не будут вводиться как данные. Но что делать, если мы захотим иметь программу, допускающую ввод в качестве данных любых чисел, относящихся к некоторому определенному типу? В таком случае мы не сможем использовать ни одно из чисел как признак конца ввода.
Мы столкнулись с аналогичной проблемой, когда искали подходящий символ для признака 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
после выполнения каждого оператора из приведенной ниже их последовательности.
2. Что будет получено на выходе в результате работы следующего цикла?
3. Как можно модифицировать операторы if
в программе угадывание числа2 чтобы был возможен ввод как прописных, так и строчных букв?4. Мы подозреваем, что следующая программа не совсем правильная. Какие ошибки вы сможете в ней обнаружить?
{ /* строка 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 строчных букв.
Ответы
1. 2, 7, 70, 64, 8, 2
2. 36 18 9 4 2 1.
Вспомните, как выполняется деление целых чисел. Результатом деления 1
на 2 будет 0, поэтому работа цикла завершится после того, как переменная value станет равной 1.3. if(response == 'б' || response == 'Б')
.4. строка 3: должно быть list[10].
строка 5: вместо запятых должны стоять символы "точка с запятой".
строка 5: переменная i
должна изменяться в диапазоне от 0 до 9, а не от 1 до 10.строка 8: вместо запятых должны стоять символы "точка с запятой".
строка 8: знак >=
должен быть заменен на <=. В противном случае при значении i, равном 1, цикл никогда не завершится.строка 10: между строками 9
и 10 должна находиться еще одна закрывающая фигурная скобка. Одна скобка закрывает составной оператор, а другая тело программы.5.
{ int i, j;
for(i = 1; i <= 4; i++)
{
for( j = 1; j <= 8; j++)
printf("$");
}
printf("\N");
}
{ int i;
char ch, alpha[26];
for(i = 0, ch = 'a'; i <= 26; i++, ch++)
alpha[i] == ch;
УПРАЖНЕНИЯ