Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

Пример: вычислить сумма геометрической прогрессии 1, 1*0.85, 1*0.85*0.85 и т.д., пока ее очередной член не станет меньше 10.

double s, sum, den = 0.85, eps = 1e-10; for ( s=1, sum=0; s>eps; s*=den )

sum += s;

В отличие от двух предыдущих примеров, здесь число проходов цикла заранее не известно, хотя управляющая переменная (s) имеется. Обратите внимание на область инициализации в ней задаются начальные значения для двух переменных, используя, для этой цели, операцию следования "," ( запятая). Количество операторов следующих через запятую в области инициализации не ограничено. То же самое можно сказать и об области модификации переменных.

Использовать ли циклы while или for это, в основном дело вкуса. Цикл for предпочтительнее там, где имеется простая инициализация и модификация, поскольку при этом управляющие циклом операторы наглядным образом оказываются вместе в начале цикла. Это хорошо видно в конструкции

for (i = 0; i < n; i ++), которая применяется для обработки первых n элементов массива. Следует отметить, что управляющая переменная (i) сохраняет свое значение после выхода из цикла, какова бы ни была причина этого выхода.

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

Пример: Вложенные циклы for main()

{

int row, col;

for (row = 1; row <= 10; row++)

{

for (col = 1; col <= 10; col++) printf("*");

putchar('\n'); /*вне внутреннего цикла, но внутри внешнего*/

}

}

Программа выводит на экран монитора 10 рядов, состоящих из 10 звездочек. Здесь используются две целочисленные переменные row и col, управляющие соответственно внешним и внутренним циклом. Во внешнем цикле переменная row увеличивает свое значение на единицу при каждом повторе, при этом переменная col пробегает значения от 0 до 9 , то есть внутренний цикл повторяется 10 раз при каждом проходе внешнего цикла.

Тело внешнего цикла ограничено фигурными скобками и содержит два оператора for и putchar, тогда как тело внутреннего цикла один оператор printf.

4.7. Оператор break

Оператор break используется для прерывания текущего оператора. После его выполнения управление передается оператору, следующему за прерванным оператором. Break может быть использован только внутри операторов:

switch, for, while или do while

Он обеспечивает прекращение выполнения самого внутреннего из содержащих его операторов. Подчеркнем, что break нельзя использовать для выхода из нескольких вложенных циклов, а составной оператор, состоящий из нескольких операторов break, эквивалентен одному break.

Пример:

Ввести с клавиатуры x и y, суммировать числа начиная от x с шагом y пока сумма меньше К, подсчитать количество итераций. Повторять процессы ввода x, y и суммирования пока х находится в

диапазоне от A до B.

#define A 10 #define B 1000 #define K 9999

int x,y,i,sum; do

{printf(“\n Ввести х, y\t:”);

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

// ввод данных с клавиатуры в переменные x и y scanf(“%d%d”,&x,&y);

for (i=x; i<y; i++) { sum += i*i;

if (sum>K) {break; break} // выход из цикла fo

}

}

//цикл продолжается, если х в диапазоне от А до В while (x>A&&x<B )

При выполнении условия sum<K завершится выполнение только внутреннего цикла for, а выполнение внешнего цикла do … while продолжится, несмотря на то, что оператор break повторен дважды. Для выхода

из вложенных циклов используйте оператор goto.

4.8. Оператор безусловного перехода goto

Использование оператора goto всегда вызывало много споров.

Так один из основоположников теоретического программирования Э. Дейкстра заметил, что качество программного кода обратно пропорционально количеству операторов goto в нём, считается, что он затрудняет понимание программ, а также их модификаций.

Тем не менее, в практическом программировании применение goto в некоторых случаях можно оправдать. Поскольку goto – "простейший", оператор перехода, то его применение оправданно, когда другие средства языка не позволяют достичь нужного результата. К таким случаям можно отнести:

Выход из нескольких вложенных циклов сразу.

Обработка ошибок.

Главным условием использования goto является соблюдение правил структурного программирования, приведу некоторые из них:

не следует использовать переходы внутрь цикла;

никогда не обходить операции инициализации, где бы они не использовались.

Игнорирование этих рекомендаций приводит к труднообнаруживаемым ошибкам. Оператор безусловного перехода имеет вид:goto метка;

Метка это имя, за которым следует ":". Этот оператор передает управление оператору, помеченному указанной меткой. Метка должна быть уникальна, и находиться в той же функции, что и goto.

Пример: В программе осуществляется преобразование десяти значений температуры, находящихся в пределах от 1 до 100. Значения вводятся с клавиатуры. Если оператор ошибся более 5 раз, происходит аварийное завершение программы.

(Выход сразу из нескольких вложенных циклов). #include <stdio.h>

int main()

{

int temp, count, errc=0; double celsius;

printf("Перевод температуры по Фаренгейту в температуру по Цельсию\n"); for (count = 1; count <= 10; count++)

{ printf(("Введите значение температуры от 1 до\ 100\n(значение по Фаренгейту): "); scanf("%d", &temp);

while (temp < 1 || temp > 100) { if (errc<5)

{printf("Повторите ввод, ошибка №%d ",errc); scanf("%d", &temp);

errc++;

}

else goto ex0;

}

celsius = (5.0 / 9.0) * (temp - 32);

printf("%d градусов по Фаренгейту соответствует\ %6.2f градусов по Цельсию\n",temp, celsius);

}

printf("\nНормальное завершение \n"); return 0;

ex0: printf("\nАварийное завершение : оператор \ ошибся более 5 раз!!!\n");

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

return 1;

}

4.9. Оператор continue

Оператор continue служит для изменения естественного хода при работе циклических структур, и используется только внутри операторов цикла: for, while или do… while. Этот оператор позволяет продолжить выполнение цикла, пропустив, операторы оставшиеся в теле цикла. Обычно этот оператор

входит в состав оператора if. Формат оператора: continue;

Пример: Программа обрабатывает только четные суммы, пропуская остальные void main ( )

{ int a,sum;

for ( a=1, sum=0 ; a<100; sum+=a, a++) { if (sum%2 != 0) continue;

... /* обработка четных сумм */

}

return 0;

}

В приведенном примере сумма вычисляется в области модификации оператора for (sum+=a). Тело цикла состоит из проверки суммы (оператор if) и программы обработки четных сумм.

Когда sum – нечетное, выражение sum % 2 получает значение 1 и выполняется оператор continue , который передает управление на следующую итерацию цикла for, тем самым "пропуская" программу обработки четных сумм.

4.10. Оператор return

Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию в точку, непосредственно следующую за вызовом.

Оператор return в функции main( ) прерывает выполнение программы и передает управление операционной системе.

Формат оператора: return [выражение] ;

Значение выражения, если оно задано, возвращается в вызывающую функцию в качестве значения вызываемой функции. Если выражение опущено, то возвращаемое значение не определено. Выражение может быть заключено в круглые скобки, хотя их наличие не обязательно. Если в какой-либо функции отсутствует оператор return, то передача управления в вызывающую программу происходит после выполнения последнего оператора функции, при этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void.

Таким образом, использование оператора return необходимо для немедленного выхода из функции и передачи возвращаемого значения.

Пример: Функция вычисляет сумму двух чисел a и b и возвращает результат.

int sum ( int a, int b ) { renurn a+b ;}

int x,y,z;

z= 1/sum(x,y);

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Вопросы для самопроверки

1.Дайте определение простого и составного оператора.

2.В каких случаях используется пустой оператор?

3.Нарисуйте в виде блок-схемы две формы условного оператора.

4.Что общего у операторов if и switch? Какие между ними различия?

5.Напишите общую форму оператора for.

6.Будет ли работать оператор for, и если да то как, если: ∙ в области инициализации нет ни одного оператора; ∙ отсутствует условие выхода из цикла;

∙ в области модификации переменных нет ни одного оператора;

7.Нарисуйте схему выполнения цикла с предусловием;

8.Нарисуйте схему выполнения цикла с постусловием;

9.Какой из операторов следует использовать для выхода из вложенных циклов: break, goto или return.

10.Для какой цели используют оператор continue?

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]