Смекни!
smekni.com

Операторы языка Си (стр. 2 из 2)

Рассмотрим ранее приведенный пример, в котором иллюстрировалось использование вложенных операторов 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 - это наиболее общий способ организации цикла. Он имеет следующий формат:

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 (выражение) тело ;

В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора 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 (выражение);

Схема выполнения оператора 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

Запишите без оператора goto следующий фрагмент

m: if(A)

{

B;

gotom;

}

Упрощаем логические выражения

Перепишите операторы условного перехода так, чтобы их условия не содержали логических операций.

if(A && B || !C)

D;

else if(B || C)

E;

else

F;

Взаимозаменяемостьциклов

Вычислить факториал n! тремя способами с помощью трех видов цикла.

Компактный for

Запишите двойной цикл

for (int i = 0; i<5; i++)

{

printf(“&bsol;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

ASCII-таблица

Использование двойного цикла 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 с.