Предположим, нам необходимо создать простую программу, которая вычисляет корни квадратного уравнения ax2+bx+c=0. Конечно, для полного решения этого уравнения было бы необходимо предусмотреть различные случаи, когда его коэффициенты A, B и C ,будут равны или же не равны нулю. (Например, если А=0, B=0, а C=0, то уравнение будет иметь бесконечное множество решений. Если А=0, B=0, а C не равно нулю, то у уравнения, как правило, нет решений. Для этих и прочих всевозможных случаев в нашей будущей программе можно было бы предусмотреть вывод соответствующих текстовых сообщений). Однако для упрощения задачи (и будущей программы) будем считать что коэффициент А здесь не равен нулю, а дискриминант уравнения (b2-4ac) неотрицателен. Программа с учетом всех изменений содержит вид:



program roots1;
var a, b, c, x1, x2: real;
begin

read (a, b, c)

x1:=(-b+sqrt(sqr(b)-4*a*c))/(2*a);

x2:=(-b-sqrt(sqr(b)-4*a*c))/(2*a);

write (x1, x2);

end.

Первая строка приведенной выше программы, начинающаяся со специального зарезервированного слова PROGRAM, представляет собой заголовок. (Здесь, вероятно, нужно сказать, что длина заголовка, а также любой другой строки программы на Turbo Pascal не должна превышать 126 символов). Вообще-то, присутствие в программе заголовка - это требование стандартного Pascal. В Turbo Pascal заголовок программы не является обязательным элементом текста программы. Тем не менее, нам очень важно, чтобы каждая рассматриваемая нами программа имела собственное имя, все примеры программ, с которыми нам придется иметь дело, мы будем дополнять заголовками. (Подробнее о структуре программы и о месте в этой структуре заголовка речь пойдет в других статьях).

Слово PROGRAM (а также VAR, BEGIN и END, которые вы также найдете в приведенной программе) относится к так называемым зарезервированным в (Turbo Pascal) словам, имеющим специальное назначение, о которых будет идти речь дальше в данной статье. После слова PROGRAM, через пробел, следует ввести имя программы, присваиваемое разработчиком при её написании. Наша программа имеет имя Roots1.

Со второй строки в нашей программе начинается раздел описания переменных. Все используемые в программе переменные должны быть описаны в этом разделе. В нашем случае после зарезервированного слова VAR следует перечень из пяти переменных. Слово Real после этого перечня (через двоеточие) указывает, что данные переменные могут принимать только вещественные значения. Если какая-либо переменная из тех, что используется в программе, не фигурирует в разделе описания переменных, компилятор выведет соответствующее сообщение об ошибке. С наиболее используемыми типами данных мы познакомимся позже в этой статье.

В оставшейся части программы - между служебными словами BEGIN и END - содержится тело программы (или раздел операторов). Здесь описаны средствами Turbo Pascal представлены все действия, позволяющие получить нужные результаты. (О структуре программы и о том, какое место в этой структуре занимает тело программы, речь пойдет в следующих статьях).

Первая строка программы в приведенном выше примере представляет собой оператор чтения Read, который предназначен для ввода значений переменных A, B и C. На практике это выглядит примерно следующим образом. Дойдя до оператора Read, программа приостанавливает работу и от пользователя программы (который заинтересован в получении результатов вычислений) требуется ввести значения соответствующих переменных. Пользователь вводит значение переменной A и нажимает клавишу <Enter>, а затем аналогично вводит значение переменных B и С. Eсли бы оператор чтения выглядел как read (c, a, b), то сначала пришлось бы ввести значения для переменной C, затем для A и наконец для B.

После операторов, позволяющих ввести значения переменных, следует, так называемый, оператор присваивания x1:=(-b+sqrt(sqr(b)-4*a*c))/(2*a);. Знак присваивания (:=) делит его на две части. В правой его части представлено выражение, которое необходимо вычислить. Затем полученное значение присваивается переменной, которая содержится в левой части оператора. Данный оператор вычисляет значение одного из корней (x1) квадратного уравнения и присваивает его переменной x1. Если в простой форме записи, принятой в математике, это выражение выглядит как то представленное на языке программирования Turbo Pascal oно имеет несколько иной вид. Во-первых, для возведения в квадрат предусмотренных специальная функция Sqr. Выражение Sqr(b) из Turbo Pascal соответствует b2. Кроме того, выражение 4ac (представленное в традиционной форме) Turbo Pascal следует записать как 4*а*с, где символ * (звездочка) - знак умножения. Иными словами, в тексте программы на Turbo Pascal знак умножения нельзя отпускать или заменять точкой.
Также если в традиционном математическом представлении выражение, вычисляющее один из корней квадратного уравнения, записано в две строки и операция деления представлена горизонтальной линией, разделяющей делимое делитель, то в Turbo Pascal соответствующее выражение записывается в одну строку, а в качестве знака деления используется наклонная черта (/). При этом в место знака радикала в Turbo Pascal используется специальная функция Sqrt, предназначенная для вычисления квадратного корня.

Оператор присваивания x2:=(-b-sqrt(sqr(b-4*a*c))/(2*a);, вычисляющий второй корень нашего квадратного уравнения, отличается от предшествующего оператора единственным знаком математической операции. Вместо знака плюс (+) перед функцией вычисления квадратного корня здесь используюется минус (-).

К сказанному можно добавить, что операторы в тексте программы следует располагать определенным образом и при этом в меру использовать отступы и пустые строки. Отступы предназначены для того, чтобы показать, где одна структура включается в другую, а пустые строки - для отделения основных разделов программы. В принципе, текст программы можно записать и в одну строку - для компилятора это безразлично. Наша программа Roots1, представленная подобным образом, выглядит так:

Program roots1; var a, b, c, x1, x2: real; begin read (a, b, c) x1:=(-b+sqrt(sqr(b)-4*a*c))/(2*a); x2:=(-b-sqrt(sqr(b)-4*a*c))/(2*a); write (x1, x2); end.

И эта программа будет работать! Однако, если данную программу потребуется когда-нибудь изменить или усовершенствовать, разобраться в таком исходном тексте будет непросто. Чтобы повысить их читабельность, при написании текстов программ следует придерживаться определенного стиля.

Кроме того, отладка (т.е. удаление ошибок) программы проводится построчно. Если в программе, записанной в одну строку, компилятор обнаружит ошибку, будет зафиксирован сам факт, но не выявлен оператор, содержащий ошибку. А если в строках программы содержится по два-три оператора, при обнаружении ошибки программисту придется предпринимать дополнительные действия, чтобы выявить ее местонахождение. Иными словами, целесообразно исходный текст программы максимально вытягивать по вертикали - стремиться в каждой строке иметь не более одного оператора.
Теперь, когда мы себе представляем, как должна выглядеть программа, вычисляющая корни квадратного уравнения, остается только ввести её текст и попробовать выполнить. Исходный текст программы Root1 в окне интегрированной среды разработчика Turbo Pascal 7.0 можно увидеть на рисунке.

itmagick.ru

Теперь попробуем выполнить нашу программу. Для этого в меню Run интегрированной среды разработчика выберем одноименный пункт. В результате программа запускается на выполнение.

Собственно при этом программа выполняется, только если в ней нет ошибок. Если же без ошибок не обошлось, курсор прозиционируется в месте предполагаемой ошибки, а в первой строке в окне редактора отображается информация об обнаруженной ошибке.

itmagick.ru

Мы здесь просто забыли ввести точку с запятой после оператора Read. Более подробную информацию по той или иной ошибке вы найдете в системе справки (пункт меню help интегрированной среды разработчика).

Какой вид принимает экран после запуска на выполнение нашей (свободноей от ошибок) программы, позволяет судить на следующем рисунке. Здесь в первой строке можно видеть введённые исходные данные, а во второй -  вычесленные программой корни уравнения.

itmagick.ru
Конечно, это никуда не годится! Во-первых не помешало бы сделать так, чтобы программа отображала текстовое сообщение, приглашающее ввести значение каждой из переменных. Для этого вместо единого оператора Read, позволяющего задать по очереди все три переменные, добавим в программу три оператора Read, - для ввода значения каждой переменной в отдельности, - предварив каждый из них оператором Write, обеспечивающим вывод на экран соответствующего сообщения. В результате фрагмент текста программы, позволяющий ввести значение одной из переменных, пример следующий вид:

 

write ('Введите значение А');

read (a);

Во-вторых, значение корней уравнения здесь представлены в одну строку и не разделены даже пробелом. Было бы лучше вывести их в отдельных строках и как-нибудь обозначить. Для этого вместо одного оператора Write, обеспечивающего выход на экран значений обоих корней уравнения, введём в программу два оператора WriteLn, чтобы значения корней отображались в разных строках. (Процедура Write осуществляет вывод заданного значения и переводит курсор на следующую позицию в той же строке: процедура WriteLn осуществляет вывод заданного значения и переводит курсор в начало следующей строки.) Кроме того, сделаем так, чтобы значения корней, выводимые на экран, предварялись, соответствующими обозначениями. В результате операторы WriteLn будут выглядеть так:

 

writeln ('x1=',x1);

writeln ('x2=',x2);

Вероятно, вы уже догадались, что если аргумент функции WriteLn заключён в апострофы, символы между апострофами будут выведены на экран в том виде, в каком они представлены в тексте программы.
Наконец, неплохо бы весь вывод на экран как-нибудь озаглавить, для этого можно ввести в начало программы оператор

writeln ('Вычисление корней квадратного уравнения')

Программу со всеми этими преобразованиями будет называться Roots2 содержится в примере ниже

program roots2;

var a, b, c, x1, x2,: real;

begin

writeln ('Вычисление корней квадратного уравнения');

write ('Введите значение А');

read (a);

write ('Введите значение В');

read (b);

write ('Введите значение С');

read (c);

x1:=(-b+sqrt(b)-4*a*c))/(2*a);

x2:=(-b-sqrt(b)-4*a*c))/(2*a);

writeln ('x1', x1);

writeln ('x2', x2);

end.

Получившийся результат работы программы можно посмотреть на рисунке расположенном ниже.

itmagick.ru

Ну вот, здесь уже что-то можно понять. Видны значения коэффициентов А, В и С, а также вычисленные значения корней уравнения. Пусть вас не смущают, возможно, непонятные величины Х1 и Х2. Здесь мы имеем дело с так называемым представлением чисел с плавающей точкой (известное также как экспоненциальный формат чисел). Число расположенное перед символом Е, в этом представлении заменяет основание степени 10, а непосредственно за ним следует порядок. В нашем случае 1. 2188741862Е-01 соответствует 1.2188741862*10-1 или 0.12188741862, а 2.1878112581Е+01 - 2.1878112581*101 или 21.878112581. Для чего это нужно спросите вы? Для краткого представления чисел с большим количеством разрядов (например, двадцатью и больше).  Дело в том, что компьютеры имеют ограниченную разрядность, и чтобы на них можно было обрабатывать огромные (или бесконечно малые) числа, эти числа приходится представлять в форме, подходящей для компьютера.

Как еще можно усовершенствовать программу вычисления корней квадратного уравнения? Например, вовсе не обязательно вводить программу переменных x1 и x2 и использовать отдельно операторы для вычисления и для вывода результатов. Эти действия можно совместить. В результате корни квадратного уравнения будут вычисляться и выводиться на экран следующим образом:

 

writeln (('x1='),(-b+sqrt(sqr(b)-4*a*c))/(2*a));

writeln (('x2='),(-b-sqrt(sqr(b)-4*a*c))/(2*a));

Нетрудно заметить, что выражение sqrt(sqr(b)-4*a*c) и 2*a вычисляются здесь по два раза, и это увеличивает время работы программы. Конечно, в случае такой простой программы, как наша, это не ощутимо, однако в обширных программах если допустить, чтобы одно и то же выражение вычислялось повторно несколько десятков (или сотен) раз, мелкие задержки неизбежно сложатся в нечто существенное. Кроме того, хороший стиль программирования диктует исключить случаи повторного вычисления выражений. В силу этого введём в нашу программу две новые переменные D и E, присвоим им вычисленные значения указанных выражений, а затем используем эти переменные для дальнейших вычислений. Программа с указанными изменениями (которая теперь будет называться Roots3) содержится в примере ниже

program roots3;

var a, b, c, d, e: real;

begin

writeln('Вычисление квадратного уравнения');

write ('Введите значение А');

read (a);

write ('Введите значение В');

read (b);

write ('Введите значение С');

read (c);

d:=sqrt(sqr(b)-4*a*c);

e:=2*a;

writeln (('x1='), (-b+d)/e);

writeln (('x2='), (-b-d)/e);

end.

Теперь испытаем наш программу. При этом необходимо помнить что, изменения в последнем варианте нашей программы Roots3 по сравнению с Roots2 связаны исключительно с внутренним порядком вычислений и никак не влияют на вид экрана с результатами работы программы.

Кстати, можно сделать так, чтобы на экране одновременно были видны исходный текст программы и результаты её работы. Для этого в меню  Debug (отладка) среды разработчика выберем пункт Output (вывод).

itmagick.ru

На экране появилось окно Output с отображением результатов работы программы Roots3. Если здесь видна не вся информация, можно воспользоваться полосами прокрутки окна Output. На этом, пожалуй, можно завершить совершенствование программы вычисления корней квадратного уравнения.

Как будто все очевидно, вам вероятно уже не терпится написать собственную программу. Но к сожалению не так все просто. Для того, чтобы программы на Turbo Pascal писать правильно, необходимо прежде познакомиться с некоторыми элементами вещами.


Рейтинг@Mail.ru Яндекс.Метрика
error: Content is protected !!