1. Точка с запятой после скобок селектора:
switch (n);
{
case 0: оператор;
break;
..........
2. Отсутствие фигурных скобок после слова switch:
Switch (n)
case 0: оператор;
break;
..........
3. Перечисление меток вариантов без слов case:
Switch (n)
{
case 0, 1, 2: n++;
break;
.....
4. Перечисление меток вариантов через запятые:
Switch (n)
{
case 0, case 1, case 2: n++;
break;
.....
5. Отсутствие оператора break после ветвей переключателя:
Switch (n)
{
case 0: case 1: case 2: n++;
case 3: n--;
.....
Циклы
Одним из самых ценных свойств компьютеров является их способность многократно повторять последовательность одинаковых или похожих действий – циклов.
Являясь наиболее мощными структурами алгоритмических языков, циклы подразделяются на:
1) бесконечные циклы,
2) циклы с предусловием (циклы типа ПОКА),
3) циклы с постусловием (циклы типа ДО),
4) циклы с параметром (циклы типа ДЛЯ).
Бесконечные циклы
Бесконечный цикл может быть представлен следующей схемой:
i=0;
label: i++; //эти три оператора образуют бесконечный цикл
i--;
goto label;
Как правило, появление в программе бесконечных циклов вызвано логическими ошибками, допущенными программистом при разработке алгоритма и кодировании (написании операторов программы) с использованием оператора безусловного перехода goto. Поэтому в современных алгоритмических языках этот оператор практически не используется, а заменяется циклами. Бесконечные циклы не выявляются транслятором при синтаксическом контроле и проявляются только после запуска программы на выполнение следующим образом:
1) длительное время (десятки секунд) программа не выводит на устройство вывода никакой информации – программа зависает,
2) на устройство вывода постоянно выводится одна и та же информация.
Таким образом, бесконечные циклы – это логические ошибки программиста.
С ними сталкивается любой программист, и поэтому необходимо овладеть методами их поиска.
Циклы с предусловием
Как правило, некоторую цепочку операторов необходимо повторять не бесконечно, а до тех пор, пока выполняется некоторое условие:
ПОКА (условие) ВЫПОЛНЯТЬ
цепочка;
Такой цикл называется циклом с предусловием (циклом ПОКА) и изображается следующей схемой:
Условие – это логическое выражение, зависящее от переменных, входящих в цепочку. Цикл повторяется до тех пор, пока условие истинно. Значит, данное условие является условиемпродолжения цикла. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным.
Цикл не выполняется ни разу, если условие было ложным с самого начала.
Цикл ПОКА превращается в бесконечный, если условие подобрано так, что оно всегда истинно.
В Си цикл с предусловием реализуется оператором цикла while:
While (условие)
оператор;
или
While (условие)
{
оператор;
оператор;
....
оператор;
}
Операторы, находящиеся между фигурными скобками, называются телом цикла.
Внимание!Условие всегда заключается в скобки, и после него точка с запятой не ставится!
Если поставить точку с запятой после условия, то этот цикл, как правило, превращается в бесконечный, потому что в этом случае условие изменяться не будет.
Фигурные скобки используются в том случае, если после условия должна следовать цепочка операторов.
Действия оператора while:
1) проверяется выполнение условия,
2) если оно истинно, то выполняется оператор (цепочка), стоящий после него,
3) после его выполнения снова проверяется условие, и если оно снова истинно, то цикл повторяется,
4) если условие становится ложным, то цикл заканчивает работу.
Примеры
1. Вычислить сумму ста первых натуральных чисел:
s = 1 + 2 + 3 + … + 98 + 99 + 100
Пусть s – искомая сумма,
i – очередное число (изменяется от 1 до 100).
Тогда алгоритм решения задачи можно описать следующим образом:
a) обнуляем сумму s = 0,
b) берем первое число: i = 1,
c) добавляем в сумму это число: s = s + i,
d) увеличиваем очередное число на единицу: i = i+ 1,
e) если оно не больше 100, то снова добавляем его в сумму и повторяем цикл.
Представим этот алгоритм так:
s = 0;
i = 1;
ПОКА (i ≤ 100)
НАЧАЛО
s = s + i;
i = i + 1;
КОНЕЦ;
Программа
#include <stdio.h>
#include <conio.h>
#include <math.h>
Int main()
{
int i=1, s=0;
while (i<=100)
{
s+=i;
i++;
}
printf(“\ns=%d i=%d”,s, i);
return 0;
}
Результат решения задачи:
s=5050 i=101
Таким образом, выходим из этого цикла со значением i не 100, а 101.
Вместо цепочки
s+=i;
i++;
можно использовать один оператор:
s+=i++;
Этот цикл можно превратить в бесконечный, если после условия поставить точку с запятой:
int i=1, s = 0;
while (i<=100);
{
s += i;
i++;
}
printf(“\ns=%d i=%d”,s, i);
Значение переменной i в этом случае меняться не будет – она останется равной единице.
2. Вычислить сумму s всех цифр заданного натурального числа n
Пусть s – искомая сумма,
i – очередная цифра числа.
Тогда алгоритм решения задачи можно описать следующим образом:
1) обнуляем сумму s = 0,
2) берем последнюю цифру числа, для чего определяем остаток от деления исходного числа на 10: i = n % 10,
3) добавляем в сумму найденную цифру: s = s + i,
4) уменьшаем число в 10 раз: n = n / 10,
5) повторяем цикл до тех пор, пока n > 0 – это и будет условием продолжения цикла.
Программа
#include <stdio.h>
#include <conio.h>
#include <math.h>
Int main()
{
int i, n, s = 0;
printf(“\nВведите целое положительное число:”);
scanf(“%d”, &n);
while (n>0)
{
i = n % 10;
s+=i;
n /= 10;
}
printf(“\ns=%d”,s);
return 0;
}
Схема алгоритма
3. Ввести с клавиатуры по одному последовательность целых чисел (конец последовательности – число 0). Определить их сумму, максимальное и минимальное число, количество введенных чисел и их среднее арифметическое.
Пусть s – искомая сумма,
min, max – минимальное и максимальное из введенных чисел,
count – количество введенных чисел,
sred – среднее арифметическое,
n – очередное число.
Тогда алгоритм решения задачи можно описать следующим образом:
1) обнуляем сумму s = 0,
2) вводим первое число n,
3) если оно не равно нулю, то
4) принимаем его значение за min и max,
5) количество введенных чисел count = 1,
6) увеличиваем сумму на введенное число s = s + n,
7) входим в цикл ввода:
8) вводим очередное число n,
9) если оно не равно нулю, то
10) количество введенных чисел увеличиваем на 1: count = count+1,
11) увеличиваем сумму на введенное число s = s + n,
12) если оно меньше min, то min = n,
13) если оно больше max, то max = n,
14) повторяем цикл до тех пор, пока n # 0 – это и будет условием продолжения цикла.
Создадим интерфейс этой задачи – взаимодействие программы с пользователем, то есть что должно выводиться на экран:
Первое число: 3
Очередное число: 8
Очередное число: 1
Очередное число: -2
Очередное число: 0
Сумма = 10
Количество чисел = 4
min = -2
max = 8
Среднее арифметическое = 2.50
Схема алгоритма
Программа
#include <stdio.h>
#include <conio.h>
#include <math.h>
Int main()
{
int min, max, n, count = 0;
float sred, s = 0.0;
printf(“\nВведите первое число:”);
scanf(“%d”, &n);
if (n==0)
return 0;
min = n; // за минимум и максимум принимаем
max = n; // первое введенное число
count = 1; // введено одно число
s += n;
while (n!=0)
{
printf(“\nВведите очередное число:”);
scanf(“%d”, &n);
if (n==0)
break;
count++;
s += n;
if (n > max)
max = n;
if (n < min)
min = n;
}
printf(“\nСумма = %4.2f”, s);
printf(“\nКоличество чисел = %d”, count);
printf(“\nmin = %d”, min);
printf(“\nmax = %d”, max);
sred = s / count;
printf(“\n Среднее арифметическое = %6.2f”,sred);
return 0;
}