Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_учебник_3.doc
Скачиваний:
33
Добавлен:
11.04.2015
Размер:
937.47 Кб
Скачать

Задания

№3. Напишите структурную схему и программу с комментариями для вычисления суммы и произведения двух данных чисел.

№4. Напишите структурную схему и программу с комментариями для вычисления среднего арифметического трех чисел a, b, c.

№5. Напишите программу для вычисления значений

3+3х2+10x+6 и -5x3+3x2-10x+6.

Позаботьтесь об экономии операций.

Вспомним опять задачу о вычислении пути. Мы получили такую программу:

{ Программа вычисления пройденного пути по формуле S=V*T }

Var

S,V,T:real;

{ Выполняемая часть программы }

Begin

Read(v,t);

S:=v*t;

{ Вывод результатов }

Write(v,t,S)

End.

Как же наша программа будет работать? Что же будет на экране при запуске программы на выполнение? После запуска программы выполняемая часть программы начнет выполняться пооператорно сверху вниз (после первого оператора будет выполняться второй и т.д.). Запишем, какая информация будет отображаться на экране и в каком виде (т.е. экран ввода/вывода информации). Курсор на экране обозначает место ввода или вывода информации: где он в данный момент находится, в том месте информация и будет выводиться на экран или вводиться. Примем условно, что экран к первому моменту запуска программы пустой (чистый), а курсор находится в первой строке экрана в первой позиции (на экране 25 строк, в каждой строке - 80 позиций; за начало отсчета принят верхний левый угол экрана).

Итак, первый выполняемый оператор программы:

read(v,t) - ввод исходных данных,

т.е. ЭВМ будет ждать, пока Вы их не введете.

Исходные данные вводятся через пробел, либо через <Enter> (через <Enter> - каждое исходное данное будет вводиться с новой строки).

Итак, на экране появится курсор, и ЭВМ будет ожидать ввода данных.

ЭКРАН

_

Возьмем для примера следующие данные: v=85,5; t=2. Т.к. в списке вводимых переменных сначала записано v, потом t, то в таком же порядке мы их будем и вводить:

ЭКРАН

85.52_

После набора данных их надо ввести в ЭВМ посредством нажатия клавиши <Enter>. После ввода курсор окажется на следующей строке в первой позиции.

ЭКРАН

85.52

_

Следующий оператор выполняемой части программы:

S:=v*t.

Значения переменных v и t уже известны, т.к. мы их ввели. Эти значения подставятся в этот оператор присваивания и вычислится значение S. На экране это никак не отобразится, т.к. на нем отображаются результаты работы только процедур ввода/вывода и управления курсором.

Следующий оператор - процедура вывода

write(v,t,S).

Курсор у нас уже стоит на второй строке в первой позиции. Начиная с этой позиции слева направо и будут выведены результаты.

ЭКРАН

85.52

8.55ШШШШШШШШЕ+Ø12.ШШШШШШШШШШЕ+ØØ1.71ШШШШШШШШЕ+Ø2_

Курсор останется в той же строке, т.к. для вывода используется оператор write.

Во второй строке числа представлены в формате с плавающей запятой (формат Е). Количество символов в записи числа зависит от настроек PASCALя. Чаще всего, если формат для вывода вещественных чисел не указан, то для записи числа отводится 17 позиций:



знак числа (ес­ли число положительное, плюс не пишется – по­зиция ос­та­ется свобод­ной)

одна по­зи­ция для целой час­ти числа (всегда одна!)

в третьей позиции всег­да сто­ит точ­ка, отделя­ющая дробную часть числа

остальная часть числа записывается здесь до символа Е. Если цифр меньше, чем позиций, то оставшиеся позиции заполняются нулями

в четвер­той пози­ции от кон­ца всегда сто­ит сим­вол Е

знак «+» или «-» степени, записанной в следующих двух позициях

в последних двух позициях - степень (знак степени записан в предыдущей позиции), в которую надо возвести число 10, чтобы получить то число, которое есть на самом деле

Следовательно, число 1.71ШШШШШШШШЕ+Ø2 следует читать так:

1,71•102.

Как видите, результаты на последнем экране ввода/вывода отделены друг от друга только одним пробелом. Да и то он будет присутствовать не всегда, а только тогда, когда выводимые данные положительны. Этот пробел ЭВМ оставляет для знака числа. Если бы выводимые числа были отрицательными (хотя в нашей задаче v и t не могут быть отрицательными), то и этого пробела не было бы, а вывод был бы, например, таким:

8.55ШШШШШШШШE+Ø1-2.ШШШШШШШШШШE+ØØ-1.71ШШШШШШШШE+Ø2_

Устраивают нас результаты в таком виде? Наверное, нет. Не очень удобно их читать. В последнем примере вывода на экран может вообще из первого числа надо вычесть второе, а потом третье? Где границы записи чисел? Также не понятно, что из выведенных результатов v, что t, а что S. Да и вывод результатов в формате Е в данном случае не очень удобен.

Наверное, было бы лучше, если бы результаты имели следующий вид:

v=85.5t=2.ØS=171.Ø

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

write('v=',v:4:1,'t=',t:3:1,'S=',S:5:1)

для записи числа

всего отводится

четыре позиции. Одна из них – для записи дробной части

Возможна и другая запись этой процедуры вывода. Вместо того, чтобы писать четыре пробела перед t= и семь пробелов перед S= (а если их будет еще больше?), можно использовать форматы для вывода этой информации. Тогда наша процедура вывода будет иметь следующий вид:

write('v=',v:4:1,'t=':6,t:3:1,'S=':9,S:5:1)

 

Что же обозначают эти форматы?

Разберем первый из них:

't=':6

Перед выводом t= будет выведено значение скорости v. В нашем примере мы взяли значение скорости, равное 85,5. В этом числе последний символ - цифра 5. После этой пятерки в следующих шести позициях должно быть выведено

t=

(для записи t= отводится 6 позиций). Получается, что в пятой и шестой позициях (относительно пятерки) и будет выведено t=, а перед буквой t будет 4 пробела, т.е. последний символ предложенной записи, к которой относится указанный формат - в нашем случае это знак равенства - будет в шестой позиции относительно последнего символа в записи значения скорости (относительно последней пятерки). Другими словами, если Вы хотите поставить несколько пробелов перед выводом какой-либо информации (в данном случае четыре пробела перед выводом t=), подсчитайте количество символов в выводимой записи (у нас два символа - t=) и прибавьте к ним то количество пробелов, которое Вы хотите поставить перед этим выводом (всего у нас получается 6).

Итак, экран ввода-вывода будет иметь вид:

ЭКРАН

85.52

v=85.5t=2.ØS=171.Ø_

После вывода информации курсор останется в той же строке. Если мы захотим запустить нашу программу на выполнение еще раз и найти результаты при других исходных данных, то второй раз исходные данные будут вводиться в том месте экрана, где у нас расположен курсор, т.е. рядом со значением S, рядом с нулем, (если мы не нажмем на клавишу <Enter>). Если же следующая информация будет выводиться, то <Enter> нам не поможет, эта информация будет выведена рядом со значением S. Поэтому лучше будет, если после вывода информации курсор окажется в начале следующей строки. Это осуществляется путем добавления к имени процедуры write двух букв LN (от слова line - строка), которые говорят о том, что после вывода информации курсор окажется в начале следующей строки. Итак, наша процедура вывода приобретает вид:

writeLN('v=',v:4:1,'t=':6,t:3:1,'S=':9,S:5:1)

это перевод курсора на следующую строку

Так.как после вывода информации курсор перейдет в первую позицию следующей строки, то экран ввода/вывода приобретет следующий вид:

ЭКРАН

85.52

v=85.5t=2.ØS=171.Ø

_

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

WRITELN;

Т.к. список вывода отсутствует, то после выполнения этого оператора курсор просто окажется на новой строке (потому что в процедуре вывода присутствует LN). Итак, процедуры вывода будут иметь вид:

writeln;

writeLN('v=',v:4:1,'t=':6,t:3:1,'S=':9,S:5:1)

а экран ввода/вывода приобретет вид:

ЭКРАН

85.52

v=85.5t=2.ØS=171.Ø

_

Если Вам надо пропустить несколько строк между вводом и выводом, то нужно написать несколько операторов writeln.

Итак, если в процедурах вывода присутствует LN, то следующий ввод или вывод будет осуществляться на новой строке, если же нет, - то на той же.

Уже экран ввода/вывода у нас имеет более понятный вид, но все равно не ясно, что вводить, когда и в каком порядке.

Когда при выполнении программы встречается процедура ввода, то, как мы уже говорили, выполнение программы приостанавливается и ЭВМ ждет ввода исходных данных. А если процедура ввода еще и в середине текста программы находится? Мы будем гадать, чего же компьютер от нас хочет, может зациклилась программа? Поэтому, наверное, было бы лучше, если бы ЭВМ сообщила нам о том, что она ожидает ввод данных, причем, каких данных и в каком порядке их вводить. Для этого мы сами должны написать приглашение к вводу. Т.е. мы хотим, чтобы на экране перед вводом данных появилось следующее приглашение:

Введите v,t

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

writeln('Введите v,t');

Для тог, чтобы исходные данные

вводились с новой строки, т.е. чтобы после вывода этого сообщения курсор оказался в первой позиции следующей строки.

Поставим этот оператор перед оператором read(v,t). Теперь будет понятно, когда вводить, что вводить и в каком порядке.

Запишем окончательный текст программы и экран ввода/вывода.

{ Программа вычисления пройденного пути по формуле S=V*T }

Var

S,v,t:real;

{ Выполняемая часть программы }

Begin

Writeln('Введите v,t');

Read(v,t);

S:=v*t;

{ Вывод результатов }

Writeln;

Writeln('v=',v:4:1,'t=':6,t:3:1,'S=':9,S:5:1)

End.

ЭКРАН

Введите v,t

85.52

v=85.5t=2.ØS=171.Ø

_

Структурную схему составленной программы см. на рис. 21.

Этот блок соответствует процедуре вывода приглашения к вводу.

Эта схема является структурной схемой программы, т.к. каждому блоку соответствует оператор программы, а каждому оператору - блок (в схему мы включили почти весь сервис; процедуру Writeln (без параметров) можно в схемах не отображать).

Рис. 21

Структурная схема программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]