Основы программирования (947332), страница 8
Текст из файла (страница 8)
{nl получит значение 15}41Часть 1. Основы алгоритмизации и процедурное программированиеб) Var c:char; x,y:integer:Begin x:=3;y:= Ord(*A*);{y получит значение 65 - код символа Апо таблице ASCII}с. = Chr(Ord('A*)-^x); ... {с получит значение 'D'}Кроме того, для явного преобразования типов можно использоватьфункции, имена которых соответствуют идентификаторам стандартных илиопределенных пользователем типов. Этот вид преобразования иногда называют автоопределеиным, например:Var h'.char;... h:=Char(65); ...
{h получит значение 'А'}Следует отметить, что при данном виде преобразования изменения значения не происходит, выполняется просто изменение типа, связанного с данным значением. В результате может произойти усечение или увеличение размера значения по сравнению с исходным. В случае усечения значения (приведение к меньшему по размеру типу) возможно изменение знака преобразуемого числа.
В случае же расширения значения (приведение к большему поразмерам типу) знак числа всегда сохраняется.Например:Туре Month=(Jan,FabMcir,ApKMayJun,JulAug,Sep, Oct,Nov,Dec);Var M:Month;A,B:mteger;C'char;L:longint;BeginA:=10;C-'E';B:==Integer(C); {число 69 - код символа E - длиной 2 байта}М: =Month(A'2); {значение Sep}L:=Longint(M);.... {значение 8}2.6.
Процедуры ввода-выводаВвод значений. Для ввода значений с клавиатуры используют специальные процедуры Read и ReadLn (рис. 2.10). Эти процедуры позволяют вводитьзначения стандартных типов, кроме boolean, и строки (string).Вводимые значения (кроме значений символов и строк) разделяют пробелами или записывают на разных строках.
Отдельные символы и строкисимволов при вводе записывают подряд, так как пробел в этом случае такжесчитается символом.422. Простейшие конструкции языкаrURead V iИдентификаторпеременнойL^/ReadLnVIОРис. 2.10. Синтаксическая диаграмма<Процедуры ввода с клавиатуры>Физически операции ввода выполняются с использованием буферОуТ, е.вводимая с клавиатуры последовательность символов сначала помещается впамять, а затем, уже из памяти, читается программой.
Последовательностьпередается в буфер ввода по нажатию клавиши Enter. При этом в буфер вместе с кодами введенных символов помещается и код Enter, состоящий из двухсимволов «#13, #10».Если ввод осуществляется процедурой ReadLn, то буфер ввода послевыполнения операции очищается, причем символы, оставшиеся не обработанными, игнорируются. Если ввод осуществляется процедурой Read, тоочистка не выполняется и, следовательно, следующий оператор ввода начнетчитать символы из той же строки.
Последнее cyщectвeннo только, если вводятся значения типа char (или string, см. параграф 4.5), так как при вводе чисел пробелы и переход на следующую строку игнорируются.Например:а)Var a,b,c:real;BeginRead(a,b);п:integer;{числа могут быть введены в одной строке или вразных}ReadLn(c,n);,,.
{числа могут быть введены в той же строке, что ипредыдущие числа}б) Var a:real; c:char;Begin ...Read(a); ...Write ('Продолжить? (y/n)*);Read(c); {приводит к тому, что после запроса компьютер непереходит в ожидание ввода, как мы предполагали, а вводитследующий символ из буфера ввода, т.е. символ #13 (рис. 2.11)}Чтобы избежать «игнорирования ввода», необходимо для выполненияпредыдущей операции ввода использовать вместо процедуры Read процедуру ReadLn:43Часть L Основы алгоритмизации и процедурное программированиеМестоположениеуказателя ввода передчтением символаЧисло ал/г85#13 #10Рис. 2.11.
Ситуация «игнорирования» вводаVar a:real; c:char;Begin...ReadLn(a);... {очистим буфер ввода после выполнения операции}Write('Продолэюитъ? (у/п) *);Read(c); {в данном случае все в порядке: после вывода запросапрограмма ожидает ввода символа}Вывод значений. Для вывода значений на экран используют процедурыWrite и WriteLn (рис.
2.12). Эти процедуры предназначены для вывода значений стандартных типов и строк.Целочисленный литерал <Целое 1> интерпретируется как ширина поля,в которое выводится значение, причем выводимые значения прижимаются кправой границе. Если указанной ширины поля недостаточно, то она автоматически увеличивается до нужного значения.
Если <Целое 1> не указано, тоего значение определяется количеством выводимых символов.Целочисленный литерал <Целое 2> указывается только для вещественных чисел: он определяет количество цифр дробной части числа. Если <Целое 2> указано равным О, то ни дробная часть числа, ни десятичная точка невыводятся.
Если <Целое1> и <Целое 2> не указаны, то веш[ественные числавыводятся в виде мантиссы и порядка, причем ширина поля вывода по умолчанию принимается равной 23, а количество дробных цифр - 14.Логические значения выводятся как TRUE или FALSE.Символы и строки выводятся без изменения, но дополняются пробелами, если ширина поля вывода больше, чем необходимо.г*^ Write \h0^Г0-ВыражениеU/writeLn\jЧ1ЯЦелое1<1ЯЦелое2 ИРис.
2.12. Синтаксическая диаграмма <Процедуры вывода на экран>442. Простейшие конструкции языкаПосле вывода значений процедурой WriteLn курсор переводится на следующую строку.Пример 2.1. Разработать программу вычисления корней уравненияАх2-1-Вх+С=0 при условии, что дискриминант - неотрицательное число.Формула корней уравнения известна:-b±Vdх,2 ='2агде d = Ь^ - 4ас.Алгоритм программы выглядит следующим образом:Корни уравнения:Ввести а, Ь, сd := b^ - 4асе := Ь / (2а)X, := - е + V d / (2а)Х2 := - е - V^d / (2а)Вывести Х|, Х2Конец алгоритма.Ниже приведен текст программы.Program ex;Var a,bx,xl,x2,e,d:real; {описываем переменные}BeginWriteLnCВведите коэффициенты уравнения: ');ReadLn(a,b,c);{вводим параметры}d:=b*b'4*a*c; {определяем дискриминант}е:=Ь/(2*а);{определяем значение вспомогательной переменной}xl:=-e^sqrt(d)/(2'^a):{определяем xj}x2:^'e'Sqrt(d)/(2^a);{определяем Х2}WriteLn('xl= \х1:6:2, *х2= \х2:б:2); {выводим результаты}End2.7.
Практикум. Оценка точности результатовПри программировании вычислений необходимо помнить о том, что вомногих случаях результат этих вычислений является числом приблиэюенным.Пусть «А» - точное значение числа, а «а» - его приближенное представление, тогда ошибкой или абсолютной погрешностью приближенного представления числа А называют значениеЛ = |А - а|.45Часть 1. Основы алгоритмизации и процедурное программированиеОбычно при оценке точности полученных результатов точное значениенеизвестно.
Поэтому для оценки погрешности используют ее приближение«сверху», т.е. максимально возможное значение погрешности, которое называют предельным значением абсолютной погрешностиАа>А = | А - а | .Абсолютная погрешность не является единственной характеристикойошибки. Сравним два варианта результата с одинаковой погрешностью:100±1 и 1±1. Очевидно, что с точки зрения практики необходимо иметь характеристику, позволяющую при оценке ошибки учитывать само значение.Такой характеристикой является относительная погрешность.Относительной погрешностью называют отношение абсолютной погрешности числа к его модулю (А;»^0):5 = А /А.С учетом того, что точное значение А обычно не известно, в качествепредельной относительной погрешности или «оценки сверху» относительной погрешности можно использовать значение5, = Д , / ( а - Д , ) .Погрешность результата вычислений складывается из погрешностей:• допущенных при постановке задачи за счет ее упрощения (погрешности задачи);• связанных с использованием приближенных методов решения задачи(погрешности метода);• связанных с использованием приближенных значений параметров, например, любых физических констант (начальные погрешности);• связанных с ограниченным количеством разрядов, используемых дляпредставления чисел (погрешности округления);• возникающих при выполнении операций над приближенными числами (погрешности операций).Примечание.
При программировании следует помнить, что относительная погрешностьвычислений резко возрастает при вычитании двух близких чисел. Это связано с тем, что приэтом резко уменьшается значение результата и соответственно также резко возрастаетотносительная погрешность.Естественно, при решении конкретной задачи какие-то погрешностимогут отсутствовать или быть несущественными.Пример 2.2.
Выполнить оценку погрешности представления числа 1/3и вычислений над числами типа real.462. Простейшие конструкции языкаProgram ex;Var у,у1у2,уЗ,у4,у5,у6,р:геа1;Beginy-l;yl-y/3;WriteLnCyl = ',yl:16:14); {выводит yl=0.33333333333348}y2:=sqrt(yl};y3:=sqr(y2);у4:=уЗ/14;у5:=у4*]4;WriteLnCy6^ \у6:16:14):WriteLn(y = \y:16:14);End{выводит у6=1.00000000000182}{выводит у =1.06000000000000}Откуда погрешности представления числа 1/3 в формате real:А,/3 = |1/3 - у1| = I 0.33333333333333 - 0.333333333333481 = 0.15-10-'2,5,/з = 0.15 10-12/(1/3) = 0.45-10-10а погрешность выполнения операций над числами, представленными вформате типа real, в конкретном случае:Дуб = 1У - Уб1 = 11 - 1.00000000000182| = 0.182.1 о-1',5уб = Дуб 'у = 0.182.10-11/1= 0.182.10-11.Пример 2.3.
Из математики известно, что ch^ х - sh^ х = 1. Разработатьпрограмму, «проверяющую» это равенство.Наша программа должна вводить значение х и для него считатьу, = (ех +е-х)/2,У2 = (е>^-е-^)/2,У = У1^-У2^Полученные значения У], У2 и у выведем на экран.Program ex;Var X, у, yly y2:real;BeginWrite ('Введите значение x: *);ReadLn(x);yl: ='(exp(x)-^exp('X))/2;47Часть 1.