Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Void main()

{

double a,b,c;

printf("ВВЕДИТЕ a,b,c\n");

scanf("%lf,%lf,%lf”,&а,&Ь,&с);

if((c=b*b-4.0*a*c)<0.)

printf("НЕТ РЕШЕНИЯ");

else

{

printf ("x1=%f\n",(-b+(c=sqrt (c) ) ) /a+=a) ;

printf ("x2=%f\n",(-b-c)/a);

}

}

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

Циклические выражения

Циклические выражения, или просто циклы, пред­назначены для многократного выполнения однотипных действий. В С используются три типа циклов. Рассмо­трим первый из них, называемый циклом while. Сразу начнем с примера программы:

#include<stdio.h>

Void nain()

{

int i,j=1,k=0;

printf("Введите i="); scanf("%d".&i);

while(j<=i)

{ k+=j; j++; }

printf('Cyммa ряда равна %d",k);

}

Цикл while имеет следующую структуру:

while(Выражение1)Выражение2;

Само слово while означает ПОКА. Более корректно трактовать это слово в форме ДО ТЕХ ПОР ПОКА. Работает цикл сле­дующим образом. Вычисляется Выражение1. Если его значение не 0, то выполняется Выражение2, которое мо­жет быть составным выражением. Затем снова вычисля­ется Выражение1, и если оно не 0, снова выполняется Выражение2. Так продолжается до тех пор, пока Вы­ражение1 не примет значение, равное нулю. Разумеет­ся, в процессе выполнения цикла что-то в выражении в скобках должно меняться. Иначе произойдет зациклива­ние программы. Кстати, в случае зацикливания или возникновения некоторых других аварийных ситуаций мож­но попробовать прервать работу программы? нажав Ctrl + C, или дважды на­жав комбинацию клавиш Ctrl+Pause.

Наша последняя программа вычисляет сумму первых i натуральных чисел 1 + 2 + 3 + ... + i, где i - целое число, вводимое с консоли. Условие, проверяемое в цикле j<=i, перестанет выполняться (примет значение 0), как только j станет больше i. Это событие рано или позд­но наступит, поскольку в составном выражении, выпол­няемом в цикле, каждый раз j увеличивается на едини­цу. Кроме того, в составном выражении в переменной k накапливается сумма членов ряда. С учетом того, что в описании переменных j и k им присвоены необходи­мые значения, можно убедиться "вручную" проследив работу цикла, что поставленная задача здесь решается. Если введено число i, равное нулю, то цикл не прора­ботает ни одного раза и переменная k останется со сво­им начальным значением 0, что также верно. Заметим, что в данном варианте цикл записан не вполне опти­мально. Составное выражение можно записать более ком­пактно и более оптимально с точки зрения быстродей­ствия: while(j<=i) k+=j++; Можно видеть, что необхо­димость в фигурных скобках отпала, поскольку выраже­ние перестало быть составным.

Рассмотрим еще одну программу, использующую цикл while:

Void main()

{

int st=1,i=0,n;

scanf("%d",&n);

while(i++<n) st<<=1;

printf("2^n=%d",st);

}

Эта программа вычисляет в переменной st n-ю степень двойки. Начальное значение st равно 1. В цикле каждый раз производится сдвиг двоичного кода величины st на одну позицию влево, то есть выполняется умножение на 2. Тем самым и определяется степень двойки. Успокоим того дотошного читателя, который разумно заподозрил, что мы делаем лишнюю работу. Эта программа только демонстрирует работу цикла. На самом деле вместо все­го цикла достаточно было бы записать одно выражение:

st<<=n;

Другой тип цикла называется циклом do-while и име­ет следующую структуру:

do Выражение1; while(Выражение2);

Такую конструкцию следует понимать так: ВЫПОЛ­НЯТЬ Выражение1, ПОКА Выражение2 есть НЕ НОЛЬ. Отли­чие от цикла while состоит в том, что сначала выпол­няется первое выражение, а затем проверяется второе и так происходит до тех пор, пока последнее не примет зна­чение 0. В цикле while, наоборот, сначала, проверялось условие, а потом выполнялось выражение. Как мы виде­ли, может иметь место такая ситуация, когда цикл while не вы­полняется ни разу. Цикл do-while выполняется, как ми­нимум, один раз. И здесь также Выражение1 может быть составным.

С использованием цикла do-while напишем програм­му, вычисляющую сумму п + 1 первых членов так называемого гармонического ряда 1+1/2+1/3+1/4+... +1/n.