Рассмотрим ранее приведенный пример, в котором иллюстрировалось использование вложенных операторов if, переписанной теперь с использованием оператора switch.
char ZNAC;
int x,y,z;
switch (ZNAC)
{
case '+': x = y + z; break;
case '-': x = y - z; break;
case '*': x = y * z; break;
case '/': x = u / z; break;
default : ;
}
Использование оператора break позволяет в необходимый момент прервать последовательность выполняемых операторов в теле оператора switch, путем передачи управления оператору, следующему за switch.
Отметим, что в теле оператора switch можно использовать вложенные операторы switch, при этом в ключевых словах case можно использовать одинаковые константные выражения.
Пример:
switch (a)
{
case 1: b=c; break;
case 2:
switch (d)
{
case 0: f=s; break;
case 1: f=9; break;
case 2: f-=9; break;
}
case 3: b-=c; break;
:
}
Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:
for ( выражение 1 ; выражение 2 ; выражение 3 ) тело
Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.
Схема выполнения оператора for:
1. Вычисляется выражение 1.
2. Вычисляется выражение 2.
3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.
Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.
Пример:
int main()
{
int i,b;
for (i=1; i<10; i++) b="i*i;" return 0; }
В этом примере вычисляются квадраты чисел от 1 до 9.
Некоторые варианты использования оператора for повышают его гибкость за счет возможности использования нескольких переменных, управляющих циклом.
Пример:
int main()
{
int top, bot;
char string[100], temp;
for ( top=0, bot=100 ; top < bot ; top++, bot--)
{
temp=string[top];
string[bot]=temp;
}
return 0;
}
В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько выражений, записанных через запятую, и выполняемых последовательно.
Другим вариантом использования оператора for является бесконечный цикл. Для организации такого цикла можно использовать пустое условное выражение, а для выхода из цикла обычно используют дополнительное условие и оператор break.
Пример:
for (;;)
{
...
... break;
...
}
Так как согласно синтаксису языка С оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска.
Пример:
for (i=0; t[i]<10 ; i++) ;
В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.
Оператор цикла while называется циклом с предусловием и имеет следующий формат:
while (выражение) тело ;
В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая:
1. Вычисляется выражение.
2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.
3. Процесс повторяется с пункта 1.
Оператор цикла вида
for (выражение-1; выражение-2; выражение-3) тело ;
может быть заменен оператором while следующим образом:
выражение-1;
while (выражение-2)
{
тело
выражение-3;
}
Так же как и при выполнении оператора for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять.
Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.
Оператор цикла do while называется оператором цикла с постусловием и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат оператора имеет следующий вид:
do тело while (выражение);
Схема выполнения оператора do while :
1. Выполняется тело цикла (которое может быть составным оператором).
2. Вычисляется выражение.
3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.
Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.
Операторы while и do while могут быть вложенными.
Пример:
int i,j,k;
...
i=0; j=0; k=0;
do { i++;
j--;
while (a[k] < i) k++;
}
while (i<30 && j<-30);
Запишите без оператора goto следующий фрагмент
m: if(A)
{
B;
gotom;
}
Перепишите операторы условного перехода так, чтобы их условия не содержали логических операций.
if(A && B || !C)
D;
else if(B || C)
E;
else
F;
Вычислить факториал n! тремя способами с помощью трех видов цикла.
Запишите двойной цикл
for (int i = 0; i<5; i++)
{
printf(“\n”);
for (int j = 0; j<4; j++)
printf(“%3d”, i*j);
}
с помощью одинарного цикла с теми же счетчиками i, j.
Замените оператор
if(A)
B;
Эквивалентным оператором цикла for.
Операторы if-else if, switch. Написать программу, которая решает линейное уравнение a ∙ x + b = 0. Использовать операторы if-elseif. Логические выражения в условиях этих операторов не должны содержать логических операций && и ||. Предусмотреть четыре возможных исхода при решении уравнения:
- нет решения,
- найдено единственное решение,
- любое число является решением,
- решение единственное, но не входит в диапазон типа переменной x.
В операторе if-elseif определить некоторую переменную flag, которая принимает четыре значения, соответствующих возможному исходу решения. Вывод текстовой информации с результатами решения организовать с использованием оператора switch, условие которого содержит flag. Выход из программы должен быть единственным.
Организовать проверку корректности данных при вводе коэффициентов a и b.
Операторы while, switch. С клавиатуры вводятся символы. После анализа символа программа выводит на экран одно из следующих сообщений:
- русская гласная буква такая-то,
- русская согласная буква такая-то,
- английская буква такая-то,
- символ псевдографики такой-то,
- другой символ.
В программе вместо числовых констант вида 128 использовать символьные константы вида ‘А’. Обработать символы с расширенным кодом. Выход из программы происходит по нажатию клавиши Escape.
Использование двойного цикла for. В программе вводятся шестнадцатеричные числа m и n, после чего на экран выводится таблица умножения в шестнадцатеричной системе счисления следующего вида
Таблица 1.
1 | 2 | … | n |
1 | |||
2 | |||
… | |||
m |
Из таблицы должно быть видно, что например, 112 = 121, 122 = 144, 132 = 169.
При больших размерах таблицу целесообразно выводить в файл. Это можно сделать из командной строки DOSс помощью команды
tabl.exe >> tabl.txt
Использование двойного цикла for. Вывести на экран ascii-таблицу без управляющих символов в следующем виде
Таблица 2.
2 | 3 | E | F |
0 | |||
1 | |||
2 | |||
F |
Символ с шестнадцатеричным кодом 0xST находится на пересечении столбца S и строки T.
Для вывода на экран графических представлений управляющих символов необходимо записывать их коды напрямую в видеопамять, без использования стандартных функций типа printf (см. [1]).
Операторы while. Найти машинный ноль и машинный эпсилон для вещественных типов данных: float, double, longdouble.
Сравнить с теоретическими результатами и со справочной информацией в Help оболочки.
Учесть, что в арифметических выражениях вида 1+x>1 компилятор использует повышенную точность во внутренних вычислениях. Поэтому значение 1+x необходимо запомнить во вспомогательной переменной того же типа, который имеет переменная x.
1. Найдите сумму цифр целого числа типа unsignedlong. Число вводится с клавиатуры.
2. Найдите вероятность счастливого шестизначного трамвайного билета. У такого билета сумма первых трех цифр равняется сумме трех последних.
3. С клавиатуры вводится число типа int. Найдите сумму битов этого числа.
4. Вывести на экран все простые числа до N включительно. Число N имеет тип unsignedint и вводится с клавиатуры.
1. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си: Задачи по языку Си. М.: Финансы и статистика, 1985. – 192с.
2. Керниган Б., Ритчи Д. Язык программирования Си. М.: Финансы и статистика, 1992. - 272с.
3. Подбельский В.В., Фомин С.С. Программирование на языке Си. Учеб.пособие. М.: Финансы и статистика, 2004. 600 с.