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

Viod main()

{

double a.b,c,xl,x2;

printf ("a="); scanf ("%lf ",&a);

printf ("b="); scanf ("%lf ",&b);

printf ("c=") ; scanf("%lf" ,&c) ;

xl=(-b+(c=sqrt(b*b-4.0*a*c)))/(a+a);

x2=(-b-c)/(a+a);

printf ("xl=%f\n",xl);

printf ("x2=%f\n",x2);

getch();

}

Функция scanf в какой-то степени напоминает по сво­ей структуре функцию printf, но по своему назначению скорее противоположна ей, поскольку предназначена для придания переменным значений, вводимых с консоли. Структура функции такова:

Scanf(“строка.", Указатель1, Указатель2,...);

В строке в кавычках мы рекомендуем начинающим писать только форматные выражения, полностью ана­логичные форматным выражениям в функции printf. Количество форматных выражений, которые советуем писать подряд через разделители, например, запя­тые, должно быть равным количеству элементов в кон­струкции после закрывающих строку кавычек и запятой. Функция устроена так, что в ней перечисляются (че­рез запятую) не сами имена переменных, которым нужно придать значения, а так называемые указатели на име­на или адреса этих переменных. Разговор об указателях отложим до более подходящего момента, ограничившись пока тем пояснением, что адрес переменной r (указатель на r) записывается как &r, что мы и видим в примере программы. Важнейшим обстоятельством является то, что программист должен очень строго следить за совпадением типа вводимой переменной с типом соот­ветствующего форматного выражения. Так, если в функ­ции printf вы печатаете переменную типа double по формату %f, то значение выведется на экран правильно, однако, если вы по этому формату попытаетесь ввести переменную типа double функцией scanf, то результат будет плачевным, вплоть до полного "зависания" систе­мы - для типа double строго требуется формат %lf. Сочетание букв соответствует типу long float, что и есть double. Можно ли между знаком % и форматными буквами писать что-нибудь типа 6.3? Да, можно. Од­нако извольте и число, вводимое с клавиатуры, задавать именно в такой форме: две позиции в целой части, деся­тичная точка, три позиции в дробной части. Для полного согласования типов вводимых значений и типов формат­ных выражений автор настоятельно советует читателю еще раз обратиться к справочной системе Builder, вы­звав справку по функции scanf. Отметим также еще раз, что если функция printf может печатать значение пе­ременной, значение выражения, значение, возвращаемое какой-либо функцией, то функция scanf только присва­ивает переменной значение, вводимое с клавиатуры. Если ввод осуществляется выражением:

scanf("%lf,%lf,%lf",&a,&b,&c);

то нужно ввести на экран первое число, затем запятую, затем второе число, затем запятую, затем третье число и только потом нажать клавишу ввода Enter. В примере программы ввод организован иначе. Сначала печатается "подсказка" а=. Теперь курсор ввода находится пра­вее знака равенства, и вы должны напечатать вводимое число и нажать Enter. Все. Первая функция ввода про­работала, и переменная а получила введенное значение. Функция scanf, закончив работать, всегда осуществляет переход на новую строку так, что следующая подсказка будет уже на новой строке, и все повторяется теперь для переменной b, а затем и для с.

Читатель уже понял, что программа вычисляет кор­ни квадратного уравнения ax2 + Ьх + с = 0. Здесь могут возникнуть неприятности, если a равно нулю или если дискри­минант отрицателен. Будем считать, что коэффициенты введены такими, что неприятностей не возникнет. Далее в программе реализованы расчетные формулы для кор­ней. Здесь снова продемонстрирована интересная новин­ка. Обратите внимания на то, что прямо внутри ариф­метического выражения помещено выражение присваи­вания: c=sqrt(b*b-4.0*a*c) , что вполне допустимо. То­гда переменная с получает новое значение, вычисленное с использованием ее старого значения. Разумеется, это старое значение после такого присваивания исчезает, но в данном примере оно уже и не нужно, что и позволило сэкономить немного машинной памяти - обойтись без вве­дения и описания новой переменной. Если бы мы не присвоили переменной с значения корня из дискриминанта, в следующем выражении нам снова пришлось бы вычи­слять этот корень. Поскольку именно вычисление значе­ний математических функций занимает наибольшее про­цессорное время, здесь мы оптимизировали программу по быстродействию. И еще один момент. В последних вы­ражениях программы мы снова пишем а+а вместо 2*а, заменяя медленную операцию умножения быстрой опера­цией сложения.