Язык Си - руководство для начинающих
Шрифт:
if (divisor == number) /* выполняется после завершения цикла */
printf(" %d - простое число.\n", number);
else printf(" %d - не простое число.\n", number);
}
Мы воспользовались структурой цикла while, чтобы избежать ввода значений, которые могли бы привести к аварийному завершению программы.
Обратите внимание, что все вычисления выполняются внутри спецификации цикла for. Величина переменной number последовательно делится
Для нахождения всех простых чисел, меньших некоторой заданной величины, нам нужно будет заключить наш цикл for в некоторый другой цикл. На псевдокоде это будет выглядеть следующим образом:
для числа (number)=1 до верхнего предела limit проверять, является ли число
простым
Вторая строка представляет собой нашу предыдущую программу.
Переводя эту запись на язык Си, получим программу:
/* простыечисла2 */
main
{
int number, divisor, limit;
int count = 0;
printf(" Укажите, пожалуйста, верхний предел для поиска простых чисел.\n");
printf(" Верхний предел должен быть 2 или больше.\n");
scanf(" %d", &limit);
while(limit < 2) /* вторая попытка, если ошибка при вводе */
{
printf(" Вы были невнимательны! Попробуйте еще раз. \n");
scanf(" %d", &limit);}printf(" Сейчас будут печататься простые числа!\n");
for(number = 2; number <= limit; number++) /* внешний цикл*/
{
for(divisor =2; number % divisor != 0; divisor++);
if(divisor == number)
{
printf(" %5d", number);
if(++count % 10 == 0)
printf(" \n"); /* новая строка начинается
через каждые 10 простых чисел */
}
}
printf(" \n Вот и все!\n");
}
Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. Мы использовали переменную count для хранения счетчика получаемых простых чисел. При печати каждое одиннадцатое простое
Укажите, пожалуйста, верхний предел для поиска простых чисел.
Верхний предел должен быть 2 или больше.
250
Сейчас будут печататься простые числа!
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229 233 239 241
Вот и все!
ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto
Операторы, определяющие циклические вычисления, которые только что обсуждались, и условные операторы (if, if-else, switch) являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для реализации общей структуры программы. Три оператора, рассматриваемые ниже, обычно применяются реже, поскольку слишком частое их использование ухудшает читаемость программы, увеличивает вероятность ошибок и затрудняет ее модификацию.
break:
Важнейшим из этих трех управляющих операторов является оператор break, который уже встречался нам при изучении оператора switch. Он может использоваться в операторе switch, где часто это просто необходимо, а также в циклах любого из трех типов. Когда в ходе выполнения программы встречается указанный оператор, его выполнение приводит к выходу из конструкций switch, for, while или do while, в которых он содержится, и переходу к следующему оператору программы. Если оператор break находится внутри некоторой совокупности вложенных структур, его действие распространяется только на самую внутреннюю структуру, в которой он непосредственно содержится.
Бывает, что break используется для выхода из цикла в тех случаях, когда заданы два разных условия прекращения его работы. Ниже приводится цикл, реализующий эхо-печать символов и завершающийся при чтении либо признака EOF, либо символа "новая строка":
while((ch = getchar)!= EOF)
{
if(ch == '\n') break;
putchar(ch);
}
Мы сделаем логику этого фрагмента программы более понятной, если объединим обе проверки в одном выражении:
while((ch = getchar) != EOF && ch != '\n') putchar(ch);
Если вы обнаружите, что break является частью оператора if, посмотрите, нельзя ли по-другому выразить это условие (как мы только что сделали), чтобы необходимость его использования отпала.