Программирование разветвляющегося
Циклического вычислительного процесса.
Цель работы: Изучить написание программ на языке С, используя итерационные (циклические) методы, освоить основные операторы, поддерживающие работу с циклами (for, while, do... while). Научиться писать программы, используя данные операторы.
Теоретические сведения
Каждый оператор С заканчивается оператором (;), который является пустым оператором. Циклы или итерационные процедуры позволяют выполнять отдельные операторы или блоки операторов (составные операторы {…}). Число повторов определяется выражением в скобках, значение которого сравнивается с Æ (Æ-прекращение цикла). Циклы бывают с проверкой значения выражения перед началом выполнения тела цикла (с предусловием), по окончанию выполнения тела (с постусловием) или внутри тела цикла. В С определено три вида операторов цикла: оператор цикла с предусловием - while, оператор цикла с постусловием do...while и оператор цикла for. Рассмотрим эти операторы детально:
Цикл while имеет следующий формат:
while (<выражение>) <оператор>
Условие выполнения итерации в цикле while предварительно проверяется и в случае истинности выражения (не равно Æ) выполняются те операторы, которые описаны в теле цикла. В противном случае цикл заканчивается, и программа продолжает свое выполнение с того места, где закончилось тело цикла. Если тело цикла содержит несколько операторов, оно ограничивается операторными скобками: "{"и"}"и являетсясоставным оператором.
Прервать выполнение цикла можно, используя операторы break, goto, return. Ниже продемонстрировано два примера работы с циклом whileв виде фрагментов программ.
Первый пример демонстрирует применение операторов whileи break,перекрывающего цикл. Второй пример показывает использование цикла whileдля проверки ответа, который вводится с клавиатуры.
Пример 1 | Пример 2 |
… int i=10,k,s =Æ; printf ("ввести шаг приращения к: "); scanf("%i",&k ); while (i) //выполнять цикл, пока i не // равно Æ { s+=k; // увеличить sна k i- - ;// уменьшитьi на 1 if (i=k) break; //выйти, если выполнится // условие: i=k }... | ... char ch =’a’; do //начать цикл do while { printf("\nОтвечайтеyesили no (y/n):"); scanf(ch!=’y’ &&ch!= 'n'); // выполнять цикл до тех пор, пока не будет нажата // буква ‘y’ или ‘n’ |
Оператор циклаdo while() является циклом с постусловием. В этом случае тело цикла всегда выполнится хотя бы один раз.
Формат оператора цикла следующий:
do <оператор>
while(<выражение>);
Телом цикла может являться один или несколько операторов (составной оператор). Ниже приведены аналогичные примеры реализации цикла с постусловием.
Пример 1 | Пример 2 | |
int i=10, k, s=Æ; printf("ввести шаг приращения к: "); scanf("%i", &k); do//начать циклdo while { s+=k;//увеличить s на k i-- ; //уменьшить i if (i=k) break;//выйти, если // выполнится условие: i= =k while (i);// выполнять цикл, пока i //не равно Æ | char ch; do //начать цикл do while printf("\n Отвечайте yes или no (y/n):"); scanf("%c",&ch); while (ch!='y' && ch!='n');// выполнять //цикл до тех пор, пока не будет нажата //буква 'y' или 'n' |
Оператор циклаforявляется наиболее удобным и мощным средством организации циклических вычислений в С.
Формат цикла for:
for([<выражение1>];[<выражение2>];[<выражение3>]) <оператор>
где :<выражение1> - производит инициализацию тех переменных, которые будут непосредственно изменяться в цикле, в частности, задаётся начальное значение переменной-счётчика
<выражение2> -определяет условие выхода из цикла. При равенстве его значения Æ цикл прерывается;
<выражение3> - это выражение задает изменение на каждом шаге переменных, проинициализированных в <выражении1>. Можно задавать также изменение других переменных, не связанных с <выражением1>.
Каждое из описанных выражений может отсутствовать. Оператор цикла for, заданный как for(;;){<тело_цикла>}, является бесконечным циклом.
Алгоритм работы оператора цикла for ():
1 Вычисляется первое выражение (если оно присутствует).
2 Вычисляется второе выражение (если оно присутствует), проверяется условие окончания цикла:(<выражение 2>= =Æ “ Ложно ”) т.е. Если оно не равноÆ (“Истинно”)– происходит переход к пункту 3, иначе выход из цикла.
3 Исполняется тело цикла.
4 Вычисляется третье выражение, если оно присутствует.
5Переход к пункту 2.
Появление в любом месте тела цикла оператора continue- приводит к прекращению выполнения операторов в теле цикла 4 немедленному переходу к шагу 2.
Выход из циклавозможен аналогично while с помощью операторов break, goto, return.
Пример 1 (вариант 1) (вариант 2)
#include <stdio.h> void main (void) {// Программа выводит четные числа //в диапазоне от 100 до 0, в порядке // убывания. for (int i=100;i>=0;i-=2) printf("\n%d",i); } i - =2 | f r (i=100; i>=0; i--) if (i%2= =1) continue; o// оператор // continueпрерывает текущую // итерацию else printf("\n%d",i); |
Для демонстрации гибкости оператора for перепишем пример в следующем виде (вариант 3):
for(int i=100;i>=0; printf("\n%d",i), i - =2);
Пример
/* ЗАНЯТИЕ N 4
Разработал ...........
Cтрока символов записывается в обратном порядке с
применением различных операторов организации циклов */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
# define N 23
main()
{int t,b;
char string[]="\"Инициализация строки\"";
char m;
clrscr();
// Цикл for -с предусловием
printf("Вывод исходной строки\n");
for (t=0;t<N;t++)
printf("%c ",string[t]);
for (t=0,b=N-2;t<(N-1)/2;t++,b--)
{m=string[t];
string[t]=string[b];
string[b]=m;
}
printf("\nВывод строки в обратном порядке\n");
for (t=0;t<N;t++) printf("%c ",string[t]);
printf("\nВвод новой строки -y, нет-n:\t");
m=getche();
if(m!='n')
new_str: scanf("%s",string);
else printf("\n");
// Цикл while -с предусловием
t=0;
while(string[t]!='\0')
{printf("%c",string[t]);
t++;
}
printf("\nКоличество символов =%2d\n",t);
// Цикл d0...while -с постусловием
printf("Вывод строки в обратном порядке\n");
b=t-1;t=0;
do
{m=string[t];
string[t]=string[b];
string[b]=m;
t++;b--;
}while(t<b);
printf("%s ",string);
printf("\nВвод новой строки -y, нет-n:\t");
m=getche();
if(m=='y') goto new_str; //new_str -метка
else getch();
}
/* Вывод исходной строки
" И н и ц и а л и з а ц и я с т р о к и "
Вывод строки в обратном порядке
" и к о р т с я и ц а з и л а и ц и н И "
Ввод новой строки -y, нет-n: n
"икортс яицазилаицинИ"
Количество символов =22
Вывод строки в обратном порядке
"Инициализация строки"
Ввод новой строки -y, нет-n: y
qwert12345
Количество символов =10
Вывод строки в обратном порядке
54331trewq
Ввод новой строки -y, нет-n: n */
Ход работы
1 По индивидуальному заданию преподавателя составить программу с различными вариантами применения операторов цикла:while, do… while, for. Предусмотреть дополнительные возможности выхода из циклов (операторы break, goto).
2 Набрать программу на компьютере, выявить и устранить ошибки.
3Ознакомиться с работой операторов цикла в языке С.
4 Получить результаты работы программы.
5 Оформить отчет и сделать выводы о проделанной работе, изучив контрольные вопросы по теме.
Задание к лабораторной работе
Вычислите таблицу значений функции
для значений аргумента х в интервале от Хн до Хк с шагом DX. Исходные данные приведены в таблице 4.
Таблица 4
Вар. | f1(x) | f2(x) | а | Хн | Xк | DX |
3,2 | 1,3 | 6,5 | 0,5 | |||
4,1 | 1,2 | 3,6 | 0,2 | |||
2,8 | 1,4 | 4,2 | 0,3 | |||
0,5 | ||||||
2,4 | 0,7 | 3,8 | 0,2 | |||
10,3 | 0,3 | |||||
ax2+ex | 2,1 | 0,8 | 3,6 | 0,2 | ||
5,4 | 2,3 | 8,9 | 0,4 | |||
1,7 | 0,4 | 2,8 | 0,3 | |||
14,2 | 11,6 | 1,6 | 0,2 | |||
1,1 | 0,2 | 1,8 | 0,2 | |||
5,4 | 2,2 | 7,3 | 0,3 | |||
2,5 | 1,9 | 3,8 | 0,2 | |||
5,1 | 3,3 | 6,9 | 0,3 | |||
0,7 | 0,6 | 0,9 | 0,05 | |||
3,8 | 1,2 | 5,3 | 0,4 | |||
2,7 | 1,8 | 4,2 | 0,3 | |||
2,1 | 0,4 | 3,9 | 0,2 | |||
3,4 | 0,5 | 4,6 | 0,5 | |||
asin(x3)+x | 2,8 | 1,6 | 4,8 | 0,3 | ||
x4sin(ax) | 4,2 | 2,8 | 5,6 | 0,2 | ||
ax+tg(ax) | 2,6 | 0,5 | 3,5 | 0,5 | ||
6,3 | 2,5 | 7,5 | 0,5 | |||
0,5 | ||||||
p | 2p | p/4 | ||||
p/4 | -p | p | p/3 | |||
3,9 | 2,8 | 4,6 | 0,2 | |||
p | 0,1 | 2p | p/6 | |||
-1 | -4,2 | 3,8 | 0,5 |
Лабораторная работа №8