Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17105 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 8:

Циклы и другие управляющие средства. Структурное программирование

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Подведем итоги. В операторе for используются три выражения, управляющие работой цикла. Они разделены символом "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемое выражение оказывается истинным, или не равным нулю, тело цикла выполняется один раз. Затем вычисляется величина корректируемого выражения, и значение проверяемого выражения определяется вновь. Оператор for - это цикл с предусловием. Решение о том, выполнить ли в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть как простым, так и составным.

Операция "запятая" увеличивает гибкость использования цикла for, позволяя включить в его спецификацию несколько инициализирующих или корректирующих выражений.

Цикл с постусловием

Цикл

do оператор while(e);

выполняется до тех пор, пока выражение e имеет значение "истина". В отличие от цикла while, в котором проверка условия окончания цикла делается до выполнения тела цикла, в цикле do такая проверка имеет место после выполнения тела цикла. Следовательно, тело цикла do будет выполнено хотя бы один раз, даже если выражение e имеет значение "ложь" c самого начала. Цикл do аналогичен циклу repeat в языке Паскаль, отличаясь от него лишь тем, что цикл repeat выполняется до тех пор, пока некоторое условие выходa из цикла не становится истинным, а цикл do выполняется все время, пока некоторое условие остается истинным!

!

Цикл do while - это конструкция с условием на выходе.

Использовать цикл do while лучше всего в тех случаях, когда должна быть выполнена по крайней мере одна итерация. К примеру, мы могли бы применить цикл do while в нашей программе угадывания числа. На псевдокоде алгоритм работы программы можно тогда записать следующим образом:

do {
выдвиньте предположение
получите ответ вида y,n
} while(ответ не совпадает с y);
!

Вы должны избегать использование цикла do while, структура которого аналогична представленной ниже операции: cпросите пользователя, хочет ли он продолжать

do
оператор
while (ответ будет да)

В данном случае, после того как пользователь ответит "нет", "оператор" будет выполнен, поскольку проверка осуществляется слишком поздно.

Пример:

do
	scanf("%d", &number);
while(number!=50);

Подведем итоги.

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

Особенности работы с языком Си. Циклом какого вида лучше всего воспользоваться? Во-первых, решите, нужен ли вам цикл с предусловием или же с постусловием. Чаще вам нужен будет цикл с предусловием. По оценкам Кернигана и Ритчи, в среднем циклы с постусловием составляют только 5% общего числа используемых циклов. Существует несколько причин, по которым программисты предпочитают пользоваться циклами с предусловием. В их числе один общий принцип, согласно которому лучше посмотреть, куда вы прыгаете, до прыжка, а не после. Вторым моментом является то, что программу легче читать, если проверяемое условие находится в начале цикла. И наконец, во многих случаях важно, чтобы тело цикла игнорировалось полностью, если условие вначале не выполняется.

Вложенные циклы. Вложенным называется цикл, находящийся внутри другого цикла.

Пример:

/* Простое число - это такое число, которое 
делится нацело только на 1 и само на себя. 
Первыми простыми числами будут 2, 3, 5, 7 и 11. */
/*простые числа*/ 
main()
{
	int number, divisor, limit;
	int count=0;
	printf("Укажите, пожалуйста, верхний предел 
			для поиска простых чисел. \n");
		printf("Bерхний предел должен быть 2 
			или больше.\n");
	scanf("%d",&limit);
	while (limit<2) {
	/* вторая попытка, если ошибка при вводе */
		printf("Bы были невнимательны! 
		Попробуйте еще раз\n");
		scanf("%d",&limit);
	}
	printf("Ceйчac напечатаем простые числа!\n");
	for (number=2;number<=limit; number++) 
		/*внешний цикл*/
	{
		for(divisor=2; number%divisor!=0; divisor++)
		;
		if(divisor==number)
		{
			printf("%5d",number);
			if(++count%10==0)
			printf("\n");/* новая строка начинается 
				через каждые 10 простых чисел */
		}
	}
	printf("Pa6oта завершена!\n");
}

Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. В count хранится счетчик получаемых простых чисел. При печати каждое одиннадцатое простое число печатается с новой строки.

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Дмитрий Объедков
Дмитрий Объедков
Россия, г. Тула
Владимир Румянцев
Владимир Румянцев
Россия