Ввод-вывод данных и вычисление выражений

Ранее мы говорили о том, что наиболее общей блок-схемой любого алгоритма решения информационной задачи на компьютере является блок-схема, изображенная на рис. 4.3. Эта схема используется всегда, когда разрабатывают алгоритм и программу по схеме «сверху вниз» согласно принципам стуктурного программирования. В этой связи рассмотрим, какие программные инструменты предоставляет Turbo Pascal 7.0 для программирования ввода-вывода данных и их преобразования.

Так как ввод может осуществляться с клавиатуры и дисков (файлов), а вывод выполняться на монитор, принтер и диски (в файл), вначале ознакомимся с простейшими способами ввода-вывода: с клавиатуры и на монитор (дисплей).

Для ввода данных с клавиатуры предназначены два оператора Read (список ввода), Readln (список ввода), что в переводе с англ, означает читать и читать строку. При этом под списком ввода подразумевают перечисление через запятую имен переменных, которые должны получить значения, набираемые на клавиатуре. Например, применяя операторы Read (х,, х2, х3), Readln(a,b,c), предполагают, что с клавиатуры должны быть введены значения х,, х2, х3 и а, Ь, с.

Преобразование данных

' '

Общая блок-схема любого алгоритма

Рис. 4.3. Общая блок-схема любого алгоритма

Список ввода в операторах может состоять из любого числа имен. Он обязательно заключается в круглые скобки и может быть пустым, например Readln.

Операторы ввода действуют следующим образом. Когда в программе встречается один из этих операторов, ее выполнение приостанавливается, и программа «ждет» ввода данных с клавиатуры согласно списку ввода. Ввод обязательно заканчивается нажатием клавиши Enter.

Рассмотрим следующий фрагмент программы:

Var

a:integer;

b:real;

c:char;

Begin

Read (a,b,c);

End.

Для ввода с клавиатуры значений а, Ь, с необходимо знать эти значения. Пусть они соответственно такие: я = 1024,

Ь = -8.351, c = z• Тогда список ввода должен быть таким: 1024 -8.351 V. Иными словами, значения элементов списка ввода необходимо набрать на клавиатуре, по крайней мере, через один пробел, а значение символьной переменной заключить в апострофы. При этом типы вводимых значений должны соответствовать типам объявленных данных. В первую очередь это касается соответствия между числовыми и символьными или строковыми типами. При нарушении этого правила компилятор выведет на экран дисплея сообщение об ошибке, которую необходимо будет исправить. Различие между инструкциями Read (список ввода) и Readln (список ввода) состоит в том, что после выполнения оператора Readln очередной ввод данных согласно Read или Readln всегда начинается с новой строки. Однако следует помнить, что нажатие клавиши Enter всегда переводит курсор в ее начало. Так что в этом смысле различия между рассматриваемыми операторами не существует. Заметим лишь то, что оператор Readln можно применять без списка ввода. В этом случае он приостанавливает выполнение программы и она ждет нажатия клавиши Enter.

Для вывода информации на экран дисплея предназначены также два оператора: Write (список вывода), Writeln (список вывода). В качестве элементов списка вывода в обоих операторах могут использоваться имена переменных, константы, функции и выражения, записанные через запятую. Например, Write (х,у, ’= ', sin(x), х+у) или Writeln ('Здравствуйте, это моя первая программа!')

Различие между операторами Write и Writeln состоит в том, что оператор Writeln после вывода данных своего списка перемещает курсор в начало очередной строки, поэтому следующий вывод данных будет начат с начала этой строки. Если же применялся оператор Write, то следующий вывод данных будет продолжен в текущую строку. Например, пусть один за другим следуют два оператора

Writeln ( Я все понимаю');

Write ('Еще немного и я составлю первую программу').

Тогда на экран будет выведен следующий текст:

Я все понимаю

Еще немного и я составлю свою первую программу

Пусть теперь операторы вывода записаны в такой последовательности:

Write ('Программирование - это');

Writeln ('искусство или рутина?');

Тогда вывод будет таким:

Программирование - это искусство или рутина?

Оператор Writeln может использоваться и без списка вывода. В этом случае его применение просто переводит курсор в начало очередной строки. С помощью операторов Write, Writeln можно вывести на экран любой символ, даже тот, которого нет на клавиатуре. Для этого необходимо записать Writeln (# код символа). Например, Writeln (#191) выведет символ 1.

Весьма часто операторы ввода-вывода используются вместе. В этом случае Write, Writeln обычно комментируют те данные, которые вводятся. Например,

Write ('Введите а');

Read (а);

или

Write ('Введите x,y,z');

Read (x,y,z);

Согласно правилам, принятым в стандарте языка, вывод по оператору Write начинается с позиции, на которую указывает курсор. Поэтому, если требуется начать вывод, например, с 5-й строки и 10-й позиции, необходимо пропустить 4 строки, в 5-й строке пропустить 9 позиций слева. Это можно было бы запрограммировать так:

Writeln;

Writeln;

Writeln;

Writeln;

Writeln (' Доброе утро');

Однако для повышения гибкости вывода и сокращения письма в стандартном модуле языка Crt предусмотрена специальная процедура GotoXY (позиция в строке, строка), которая перемещает курсор в заданное место. Например, если необходимо установить курсор в 5-ю строку и 10-ю позицию, то следует записать так: GotoXY (10,5). Тогда приведенный выше фрагмент программы можно представить в следующем виде:

GotoXY (10,5);

Write (Доброе утро');

При этом необходимо отметить, что значения строки и столбца в процедуре GotoXY (строка, столбец) не обязательно должны быть записаны в виде чисел. Можно указать и переменные, как GotoXY (i,j), которые предварительно должны вычисляться и желательно лежать в видимых пределах экрана [1, 25], [1, 80]. Изменения переменных i, j дают возможность получить динамический вывод информации на экран.

Модуль Crt содержит также функции Where X, Where Y, определяющие позицию X в строке Y. Для определения текущего положения курсора можно предложить такой фрагмент программы:

Writeln ('Положение курсора');

Write (' Строка-', Where Y, ' столбец-', Where X);

Кроме этих стандартных средств Crt часто приходится пользоваться процедурой очистки экрана ClrScr (Clear Screen), которую рекомендуется применять в самом начале тела программы, а также функцией ReadKey определения той клавиши, которая нажата. Запомненную нажатую клавишу эта функция на экран не выводит. Однако узнать ее можно, лишь запомнив значение ReadKey в переменной. Если в программе встречается функция ReadKey, она приостанавливает выполнение программы и «ждет» нажатия какой-либо из символьных клавиш. Например,

ClrScr;

GotoXY(21,10);

Write ('Я уже программирую');

ReadKey;

После вывода текста «я уже программирую» с 21-й позиции 10-й строки, что объясняется желанием разместить ее симметрично относительно 40-й позиции, делящей по вертикали экран на две равные половины, программа будет «ждать» нажатия любой символьной клавиши, например А или 8.

В модуле Crt имеются средства, позволяющие установить цвет фона экрана и цвет выводимых символов. Для установления фона используется процедура TextBackGround (цвет). Например, TextBackGround (Blue) устанавливает голубой фон экрана, TextBackGround (Gray) — серый и т. д.

Для установления цвета символов применяют процедуру TextColor (цвет). Например, TextColor (Yellow) выводит символы желтого цвета.

Всего можно использовать 16 цветов. Их названия и коды приведены ниже в табл. 4.2.

Таблица 4.2. Таблица цветов и их кодов

Цвет

Константа

Код

Черный

Black

0

Синий

Blue

1

Зеленый

Green

2

Бирюзовый

Cyan

3

Красный

Red

4

Сиреневый

Magenta

5

Коричневый

Brown

6

Светло-серый

Light Gray

7

Серый

Dark Gray

8

Голубой

Light Blue

9

Светло-зеленый

Light Green

10

Светло-бирюзовый

Light Cyan

11

Алый

Light Red

12

Светло-сиреневый

Light Magenta

13

Желтый

Yellow

14

Белый

White

15

Для задания цвета фона экрана используются первые 8 цветов. Текст может выводиться одним из 16 цветов. При этом в процедурах TextBack Ground и TextColor можно использовать не только константы — названия цветов, но и их коды. Например, TextBackGround (Blue) равносильно TextBack Ground (1) или TextColor (Brown) равносильно TextColor (6).

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

Uses Crt;

Begin

TextBackGround (Blue);

TextColor(Yellow);

ClrScr;

GoToXY(30,10); Write ('Чародейкою зимою');

GoToXY(30,l 1); Write ('Околдован лес стоит');

GoToXY(30,12); Write ('И под снежной бахромою'); GoToXY(30,13); Write ('Неподвижною, немою');

GoToXY(30,14); Write ('Чудной жизнью он блестит'); GoToXY(50,15); Write ('Ф.Тютчев');

Readln;

End.

В этом фрагменте программы использован оператор Readln без списка ввода. Он приостановит программу, вследствие этого текст на экране не исчезнет до тех пор, пока не будет нажата клавиша Enter.

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

Ширина поля вывода при этом составляет 18 символов. Например, в следующем фрагменте программы

Const

х=18.428; у=-0.459481; z=l 248.348;

Var

x,y,z:real;

Begin

Writeln ('Вывод x,y,z');

Writeln ('x=', x);

Writeln ('y=', y);

Writeln ('z=', z);

End.

будет получен такой вывод:

х= 1.84280000000Е +01, у=-4.59000000000Е-01, z=l .24834800000Е+03.

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

Const

а=7489;

Ь=18;

c='timer';

Var

a,b:integer;

c:string(5);

Begin

Write ('Вывод a,b,c');

Writeln ('a=', a:4);

Writeln (W, b:2);

Writeln ('c=', c:5);

End.

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

Const

s= -84.24; h= 458.9414;

Var

s,h:real;

Begin

Write ('s=', s:6:2, 'h= h:8:4);

Writeln (’Программа завершена');

End.

Хороший стиль программирования рекомендует сообщать о завершении программы, что и показано в данном фрагменте.

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

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

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

х:=выражение.

Приведем примеры записи вычисления арифметических выражений:

а:=3.14, b:=Cos(x), c:=a+b-d,

х:=х+1, z:=-z, y:=a*b/c.

Следует всегда помнить, что символы := означают то, что переменная слева получает значение выражения, которое записано справа от этих символов, и отнюдь они не означают знак равенства между левой и правой частью записи.

Таким образом, согласно примеру, переменная а получает значение 3,14, переменная х станет на 1 больше, чем была, а переменная г поменяет знак.

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

Другие функции, такие, например, как tgx, десятичный логарифм log х, любая степень, в том числе и дробная числа х, вычисляются по известным формулам через приведенные в таблице функции.

Таблица 4.3. Стандартные числовые функции

Имя функции

Действие

Тип аргумента

Тип результата

Abs (x)

Определяет абсолютное значение х

Вещественный,

целый

Вещественный,

целый

Arctan (x)

Определяет арктангенс х

Вещественный

Вещественный

Cos (x)

Определяет косинус X

Вещественный

Вещественный

Exp (x)

Определяет ех

Вещественный

Вещественный

Int (x)

Определяет целую часть вещественного числа

Вещественный

Вещественный

Fzac (x)

Определяет дробную часть вещественного числа

Вещественный

Вещественный

Ln (x)

Определяет натуральный логарифм х

Вещественный

Вещественный

Pi

Вычисляет число тс = 3,14...

Вещественный

Вещественный

Round (x)

Округляет дробное число до целого

Вещественный

Целый

Random

Вырабатывает случайное число

Вещественный

Randomize

Инициирует датчик случайных чисел

Вещественный

Sin (x)

Определяет синус X

Вещественный

Вещественный

Sqr (x)

Определяет X2

Вещественный

Вещественный

Sqrt (x)

Вычисляет 7х

Вещественный

Вещественный

Так,

sinx

tg* =-,

cosx

logx = 0,43 • lnx,

arcsine = arctg

Ґ

к

arccos x = — - arctg

V

VT1

9

/

xn =en x ПрИ X>Q и x"e"ln|x| при X < 0.

Кроме известных арифметических операций сложения +, вычитания умножения * и деления / в арифметических выражениях используются операции целочисленной арифметики. Это деление нацело — Div и остаток от деления — Mod. При делении нацело остается целая часть, а дробная отбрасывается. Например, 15 Div 4=3, 17 Div 6 = 2. Остаток от деления нацело получается так: 17 Mod 4=1,8 Mod 3=2. Иными словами, выполняется деление нацело и берется оставшая часть целого числа. При этом при записи между операциями Div, Mod и операндами слева и справа обязательно должны быть пробелы.

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

При вычислении выражений необходимо строго следить за соблюдением типов переменной левой части и полученного значения правой части оператора присваивания. Если слева тип real, то справа может быть тип real или integer. Если же слева тип integer, то справа может быть только тип integer. Например, пусть х — real, а / — integer. Тогда, x:=i — верно, a i:=x — ошибочно. Безусловно, ошибочно, если слева числовой тип, а справа, символьный или строковый, т. е. если с — char, то х:=с ошибочно. Обо всех таких несогласованиях типов компилятор обязательно выводит сообщения с требованием исправить ошибку.

Оператор ввода-вывода и вычисления арифметических выражений позволяет составлять простейшие программы вычислительного характера линейной структуры. В качестве примеров приведем несколько таких программ.

Пример 4.1. Рассмотрим задачу вычисления объема цилиндра диаметром D и высотой h по выражению V=nD1h. Для этого предварительно составим алгоритм.

Шаг 1. Ввести D, h.

Шаг 2. Вычислить V=nD1h.

Шаг 3. Вывести V.

Возможный вид программы такой:

Program z; {Вычисление объема цилиндра}

Uses

Crt;

Var

D,h:real; {D — диаметр, h — высота цилиндра}

Begin

Clr Scr; {Очистка экрана}

Writeln ('Введите D, h'); Readln (D,h); {Ввод D, h}

Writeln ('D=', D); {Вывод значения D}

Writeln ('h=', h); {Вывод значения h}

V=Pi*D*D*h {Вычисление объема}

Writeln ('Объем цилиндра', V:8:3, 'м.кв.');

Writeln ('Программа завершена');

End.

Пример 4.2. Для значений а= 13,8, Ь = 421,3, х = 45,0 вычис-

а ? sin(37°

лить выражение к = - .

Vtf2 + b2 + esm(x)

Прежде чем составить программу, следует учесть, что стандартная функция sin(x) предполагает представление аргумента л: в радианах. Поэтому 37° должны быть переведены в радианы. Поскольку я радиан — это 180°, то 37° = я • 37/180.

Алгоритм включает следующие действия.

Шаг 1. Ввести а, Ь, х.

Шаг 2. Вычислить R.

Шаг 3. Вывести R.

Программа может быть такой.

Program R; {Вычисление выражения R}

Uses

Crt;

Var

a,b,x:real;

Begin

ClrScr;

Writeln ('Введите a,b,x ');

Readln (a,b,x);

R=(a*Sin(Pi*37/180)*Exp(ln(x)/3*0.43*ln(b))/Sgrt(a*a+b*b*b+

Exp(Sin(x)))

Writeln ('Значение R=', R: 10:3);

Writeln ('Программа завершена');

End.

В логических выражениях могут использоваться арифметические и логические операции, а также операции отношений =, >, =>, <, <=, <>. Из перечня логических операций чаще всего используются операции And, Or и Not. Операция And, записываемая как X And У, имеет смысл объединения и читается X и Y. Пусть 1 <х<2. Тогда можно записать (1 <х) And (х<2). Или Х= 10, Y= 15. Тогда, если (.Х= 10) And (У= 15), то ....

Операция Or записывается как X Or Y, имеет смысл пересечения и читается Xили Y. Пусть Х= 1, a Y= 2, тогда (Х= 1) Or (Y= 2) означает Х= 1 или Y = 2.

Операция Not — это операция отрицания. Если записано Not А, то это означает не А.

Логические переменные и логические выражения могут иметь два значения: истина или ложь. На английском это True или False. В числовой интерпретации это — 1 или 0.

Пусть заданы две логические переменные X, У, которые могут принимать значения истина или ложь. Тогда операции X And Y, X Or У, Not X можно определить по табл. 4.4.

Таблица 4.4. Логические функции

X

Y

X And Y

X Or Y

Not X

Истина

Истина

Истина

Истина

Ложь

Истина

Ложь

Ложь

Истина

Ложь

Ложь

Истина

Ложь

Истина

Истина

Ложь

Ложь

Ложь

Ложь

Истина

Рассмотрим следующее логическое выражение: вычислить (а + b + с)> (с*1п(й)) And (а > Ь) при условии, что а, Ь, с числа и а > 0. Вот как это нужно сделать.

Сначала независимо найти сумму а + b + с, вычислить 1п(я) и с*1п(я). Затем проверить условие а > № и установить, истинно оно или ложно. Далее выполнить операцию And, в результате которой определить истинен или ложен фрагмент с*1п(я)) And (а > Ь). После этого окончательно установить, истинно или ложно все выражение. Для того чтобы запомнить это выражение, его необходимо присвоить некоторой переменной, например х, объявленной как переменная булевого типа Boolean. Таким образом, х:= (а + b + с) > ((с*1п(я)) And > b)) — оператор присваивания логического типа.

Вообще говоря, в языке предусмотрен порядок выполнения в выражениях всех арифметических, логических операций, а также операций отношений. Он такой *, /, Div, Mod, And, +, -, Or, =, о, >, <, =>, =<. Однако, чтобы не запоминать этот порядок, лучше в затруднительных ситуациях, как это принято в алгебре, использовать технику применения скобок.

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

Рассмотрим пример. Пусть объявлены четыре переменные а, Ь, с, d. Тогда для операторов присваивания будем иметь:

Var

a:char;

b:char;

c:string(10);

d:string(10);

Begin

a:= {Верно}

a:= '***'; {Верно, но в ячейке а будет запомнен один символ,}

{так как под переменную а отводится один байт}

Readln (b); {Вводится ***}

а:= Ь; {Верно, но будет запомнен один символ *} а:= 1937; {Неверно, несоответствие типов} с:= 'Программа'; {Верно} d:= 'Завершена'; {Верно}

с:= c+d; {Верно, и в строке с будет храниться предложение}

{Программа завершена}

End.

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

Если коды символов совпадают, символы считаются равными. Больше тот символ, для которого код больше. Например, код буквы А — 65, a L — 76. Это значит, что L > А.

Что касается сравнения строковых данных, то строки сравниваются посимвольно слева направо. Если все коды символов строк одинаковы, строки считаются равными. Если в одинаковых позициях строк коды символов различны, большей считается та строка, из которой код этого символа больше. Например, 'abcd 'c'a b d с' и 'a b с d'c'a b d с e'.

Язык Turbo Pascal 7.0 содержит ряд стандартных процедур и функций, предназначенных для работы с символьными и строковыми данными.

Функция Chr (код символа) возвращает (определяет) символ по его коду. Ее удобно применять в тех случаях, когда необходимо на экране дисплея получить тот символ, которого нет на клавиатуре. Например, в таком фрагменте

Var

p:char;

Begin

p:=chr( 191);

Write ('Символ=', p);

End.

на экран будет выведен символ i. Можно было программировать и так

Begin

Write ('Символ=', chr( 191));

End.

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

Функция Length (Строка) возвращает длину строки. Например, такой фрагмент программы

Begin

Write ('Длина строкиЦ Length ('Иванов'));

End.

выведет на экран сообщение Длина строки=6. Иными словами, функция Length (длина строки) подсчитывает число символов в строке.

Процедура Delete (Строка, п,ш) позволяет в строке, начиная с /7-го символа, удалить подстроку длиной т символов. Например,

Var

u:string;

Begin

u:= 'Поезд Москва—Петербург';

Write (Delete (u,l,6));

End.

В результате выполнения этого фрагмента программы на экране дисплея получим сообщение Москва—Петербург.

Функция Сору (Строка, п,ш) позволяет копировать часть строки. Здесь п — номер символа, с которого начинается копирование, am — длина копируемой подстроки. Например, в таком фрагменте программы

Var

s:string(20);

Begin

s:= 'Европейский союз';

Write (Copy (S, 1,1));

End.

На экране появится запись Европейский.

Функция Concat (Строка 1, Строка 2, ..., Строка N) объединяет несколько строк в одну. Например, при выполнении фрагмента

Const

а:= 'Россия';

Ь:= '+Европа';

с:= '+Азия';

Begin

u:=Concat (а, b, с);

Write (и);

End.

на экран будет выведено Россия + Европа + Азия.

Функция Pos (Подстрока, Строка) позволяет указать номер символа в строке, которым начинается подстрока. Например, следующий фрагмент

Var

h: integer;

Begin

h:=Pos (Кавказ, Владикавказ);

Write ('Номер подстроки,= n);

End.

выводит на экран Номер подстроки = 6.

Процедура Val (Строка, Переменная, Код) выводит число, представленное в виде строки. Например, при выполнении такого фрагмента программы

Var

k: integer;

Begin

k:=Val ('129343', к, kode);

Write ('Число=', к);

End.

на экране получим: Число = 1293. Если записать Val ('1293,43', к, kode), то значение kode будет отличаться от нуля, что свидетельствует об ошибке: запятая в числе 1293,43 вместо точки — 1293,43.

Процедура Str выполняет преобразование числового выражения в строку. Например, фрагмент

Const

х=14.5;

У= -3.8;

Var

z: real; u: string;

Begin

z:=Sin(x)*(-y)2/Vx;

u:=Str(z,u);

Write ('Строка=', u);

End.

выводит строку, соответствующую выражению sin(x) • (-у)2/х.

Процедура Insert (Строка, Подстрока) вставляет в строку подстроку, начиная с позиции п. Например, в таком фрагменте

Var

a,b,с: string (20);

Begin

а:= 'Turbo'; b:= 'Pascal 7.0’; c=Insert (a,b,7);

Write ('c=', c);

End.

на экран будет выведена строка Turbo Pascal 7.0.

 
< Пред   СОДЕРЖАНИЕ     След >