- •Лекция 2. Переменные
- •Типы переменных
- •Комментарии
- •Лекция 3. Операции и операнды. Выражения. Стандартные функции и процедуры Операции и операнды. Выражения
- •Стандартные функции и процедуры
- •Лекция 4.Операторы.Ввод-вывод информации. Операторы
- •Ввод-вывод информации
- •Лекция 5.Создание консольного приложения
- •Лекция 6. Управляющие конструкции. Управляющая конструкция if
- •Самостоятельная работа.
- •Цикл for
- •Самостоятельная работа.
- •Инструкция (цикл) while
- •Самостоятельная работа.
- •Оператор цикла с постусловием repeat
- •Самостоятельная работа.
- •Оператор выбора case
- •Оператор перехода goto
- •Лекция 7.Строки Строковые типы
- •Стандартные подпрограммы для строк
- •Строковые выражения
- •Лекция 8. Преобразования типов Преобразования типов
- •Другие преобразования
- •Подстановка значений
- •Глобальная переменная DecimalSeparator
Ввод-вывод информации
В консольном приложении ввод данных с клавиатуры осуществляется при помощи стандартных процедур read и readln, а вывод на экран дисплея - при помощи процедур write и writeln.
Процедуры Read и Readln
В Object Pascal имеет две основные процедуры ввода Read и Readln, которые используются для чтения данных, вводимых с клавиатуры. Общий формат этих процедур следующий:
Read(элемент1,элемент2,…); или
Readln(элемент1,элемент2 ,...); где каждый элемент представляет собой переменную целого, вещественного, символьного или строкового типа, например:
read(x,y,z);
readln(name,age);
При выполнении процедуры read происходит следующее. Программа приостанавлива¬ет свою работу и ждет, пока на клавиатуре будут набраны нужные данные и нажата кла¬виша Enter.
После нажатия клавиши Enter, введенные значения присваиваются переменным, имена которых указаны в процедуре read.
Данные, которые вводятся с клавиатуры, представляют собой символьные строки независимо от того, что он и содержат - числа или символы. При выполнении процеду¬ры read эти строковые значения автоматически преобразуются к типу тех переменных, которым они предназначены. Например, в результате выполнения процедуры
Read(x0); и ввода с клавиатуры строки 32, значением переменной x0 будет целое число 32,если x0 имело тип integer , и вещественные число 32.0,если x0 имеет тип real.
Одна процедура read позволяет внести значения нескольких переменных. Если вводятся числовые значения, то они должны быть набраны в одной строке и разделены пробелами. Например, если тип переменных х,у и z - real, то в результате выполнения про¬цедуры
read(х,у,z);
и ввода с клавиатуры строки
5.25, 10, -0.05
переменные будут иметь следующие значения:
х=5.25, у=10. 0, z=-0.05.
Если в строке экрана после запуска программы набрано больше чисел, чем задано элементов в списке ввода процедуры read, то оставшаяся часть строки будет проигнорирована или обработана следующей процедурой read, если такая имеется. Например, если k, I — переменные целого типа, то в результате выполнения процедур:
read(i,к);
read(I);
и ввода с клавиатуры строки
5, 10, 15
переменные получат следующие значения:
I=5, k=10, 1=15.
В отличие от процедуры read процедура readln после ввода всех указанных в процедуре элементов списка ввода осуществляет переход к следующей строке дисплея. Отсюда следует, что если в списке ввода процедуры readln указано меньше элементов, чем расположено значений в строке дисплея, то избыточная часть строки будет утеряна, а следующая процедура read иди readln будет требовать ввода данных с новой строки дисплея. Например, в результате выполнения процедур
readln(s, t,w);
read(q); и ввода с клавиатуры строки
6, 9 , 12 , 15
переменные получат следующие значения (в предположении, что они все имеют целый тип):
s=6, t=9, w=12.
После чего программа будет ожидать нажатия клавиши Enter и ввода нового числа с новой строки дисплея, чтобы присвоить его переменной q.
Рассмотрим решение следующей задачи. Пусть требуется ввести данные: a= 3,7; b=-1,6 10^6; k= 101; 1=-25; с’*’; d=’?’; p=true и изобразить строки ввода данных на экране дисплея.
При решении этой задачи следует учитывать, что данные целого и вещественного типов отделяются друг от друга пробелами в строке ввода. Это значения переменных a,b,k и I. Целая часть от дробной отделяется точкой. Данные символьного типа (значе-ния переменных с и d) записываются в строке ввода подряд, без использования пробе¬ла в качестве разделителя. Данные логического типа (значение переменной р) нельзя вводить с использованием процедуры ввода. Одним из вариантов решения этой задачи может быть следующий:
................
const p=true;
readln(a,b,k,1);
readln(c,d);
...............
Строки ввода данных:
3.7, -1.6е-6, 101 , -25
Процедуры Write и Writeln
Назначение процедуры writeln - выводить информацию на экран. В общем виде они записывается следующим образом:
writeln(элемент1,элемент2,...);
где каждый элемент - это то, что нужно напечатать на экране. Элементом списка вывода, может быть, например, целое или вещественное число (3.42,-1732.3), символ (‘a',’ Z’), строка ('Hello,world') или логические значение (true). Кроме того, им может быть именованная константа, переменная, разыменованный указатель или обращение к функции если она возвращает значение, которое имеет целый, вещественный, символьный, строковый или логический тип. Все элементы печатаются в одной строке дисплея в заданном порядке. После этого курсор устанавливается в начало следующей строки. Если вы хотите оставить курсор на той же строке после последнего элемента, то используйте процедуру:
write(элемент1,элемент2,...);
Когда распечатываются элементы списка вывода при помощи процедуры writeln, между ними пробелы автоматически не вставляются. Поэтому, если вы хотите разделим выводимые значения пробелами, то они должны быть указаны в списке вывода непосредственно, например:
writeln(a,' ',b,' ',...);
Предположим, что переменные x,y,z и student имеют значения: х:= 2; у:= 4: z := 6 student:=’Ivan'. Тогда выполнение процедур вывода приведет к появлению на экране сле¬дующих строк:
Процедуры вывода Результат
writeln(x,y,z); 246
writeln(x,' ',у,’ ', z); 2 4 6
writeln(‘Hello’,student); Hellolvan
writeln(‘Hello’,student); Hello, Ivan.
Для улучшения внешнего вида выводимых на экран дисплея данных можно использовать формат (описание поля вывода) для определения количества позиций которые займет на экране дисплея элемент из списка вывода. В этом случае процедура вывода будет иметь вид:
writeln( элемент1: ширина1, элемент2:ширина2,...)
где ширина - целое выражение ( константа, переменная, обращение к функции или комбинация из них), определяющее общую длину поля, в котором должен быть записан элемент. Например, для переменных целого типа, имеющих значения k=50, m=3, n= 200 форматный вывод на экран дисплея даст следующий результат:
Процедуры вывода Результат
writeln(k,m,n); 503200
writeln(k:2,m:2,n:2); 50 3200
writeln (k: 3 ,m: 3 ,n: 3); 50 3200
writeln(k,m:2,n:4); 50 3 200
Отметим, что элемент дополняется начальными пробелами слева в том случае, когда заданная ширина поля превышает количество цифр в числе. Внутри поля значение выравнивается по правой границе поля.
Что произойдет, если ширина поля меньше, чем необходимо? Во второй процедуре writeln из приведенного выше примера для переменной n, имеющей значение 200, указанна ширина поля 2, хотя необходима ширина 3. Мы видим, что в этом случае Object Pascal увеличил ширину поля до минимально необходимого размера.
Рассмотренный выше способ задания формата можно использовать для целых и ве-щественных значений, символов, строк и логических выражений. Однако при таком задании ширины поля вещественные числа распечатываются в экспоненциальной форме. Так для w = 123.45 будем иметь:
Процедуры вывода Результат
writeln(w); 1.2345000Q000000E+02
writeln(w:8); 1.2E+0002
Поэтому в Object Pascal для вещественных значений предусмотрено после ширины поля через двоеточие указывать и второй параметр - количество позиций, отводимых для дробной части из общей ширины поля. Этот второй параметр указывает распечатать вещественное число в формате с фиксированной точкой и определяет, сколько цифр поместить после десятичной точки. Например, переменную w можно вывести на экран следующим образом:
Процедуры вывода Результат
Writeln(w:6:2); 123.45
Writeln(w: 8:2); 123.45
Writeln(w : 8 :4 ); 123.4500
Пример 1.
Составим программу для ввода и вывода данных. a= 3,7; b=-1,6 102; k=101; l=-25; с='*'; d=’?’; p=true. Выведем данные по стандартом формату (т.е. без указания формата), но формату с укачанной шириной поля и изобразим строки вывода.
Решение
При использовании процедур ввода read и readln принято перед выполнением каждой из них выдавать на экран дисплея соответствующее сообщение-подсказку о том, что необходимо ввести. Это можно сделать, используя процедуры write или writeln.
Консольное приложение создается в операционной системе Windows, где символы кодируются в соответствии с таблицей кодов ANSI. При запуске консольного приложения создается так называемая виртуальная MS-DOS-машина, использующая операционную систему MS-DOS и, соответственно, таблицу кодов ASCII. Таблицы кодой ANSI и ASCII содержат по 256 кодов символов, включая коды букв английского и русского алфавита. Буквы английского алфавита находятся в первой половине таблицы, а русского - во второй. Отличаются обе таблицы как раз второй половиной,содержащей буквы русского алфавита. Поэтому, если в консольном приложении сообщения-подсказки в процедурах write или writeln будут набраны на русском языке,то при выполнении приложения внутри виртуальной MS-DOS-машины сообщения будут искажены. Чтобы избежать этого, можно, например, записывать сообщения на английском языке. Можно, конечно, писать сообщения и на немецком, и на французском и даже на русском - только при этом необходимо все-таки использовать буквы английского алфавита. Указанное ограничение имеет место только для консольных приложений. Для оконных приложений, создаваемых и выполняемых в одной операционной системе — Windows - по ограничение отсутствует.
Программа
Program1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const p=true;
var a,b:real;
k,l:integer;
c,d:char;
begin
writeln('enter a,b');
readln(a,b);
writeln('enter к,l');
readln(k,1);
writeln('enter c,d’};
readln(c,d);
writeln('standard format'};
writeln(a);
writeln(b);
writeln(k,l);
writeln(c,d,p);
writeln('given format');
writeln(a:3:l,b:ll:7);
writeln(k:4,l:4);
writeln(c:2,d:2,p:5);
readln
end.
Результаты работы программы
enter a,b
3,7,-1,62-6
enter k,1
101,-25
enter c,d
*?
standart format
3,70000000000000E+0000
-1,60000000000000E-0006
101,-25
*?true
given format
3.7,-0,0000016
101,-25
* ? true
Как видно из результатов работы программы, при выводе данных в стандартном формате значения целого, символьного и логического типов занимают на экране столько позиций, сколько в них содержится цифр или букв. Данные вещественного типа выводятся форме с плавающей точкой и занимают 23 позиции.
