Remkomplekty.ru

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Вывод в консоль паскаль abc

#5 Ввод данных с клавитуры (из консоли) в Паскаль. Процедура Readln()

Primary tabs

Forums:

Ранее мы говорили о стандартных процедурах write() и writeln(), служащих для вывода данных в консоль, теперь же погорим об обратном процессе — а именно получении данных от пользователя.

Процедура Readln()

Стандартная процедура readln() позволяет записывать в переданные аргументы-переменные те значения, которые пользователь вводит в консоли.

Подробнее:
Стандартная процедура readln() (читают как «ридлэн» или «ридлайн«) работает в двух режимах (всегда временно останавливая консоль):

    Если ей переданы аргументы-переменные , например:

— то она ожидает ввода данных (литералов) для этих переменных, а после ввода последнего требуемого литерала ожидает последнего нажатия клавиши Enter.

Просто ожидает нажатия Enter пользователем, если вызывается без аргументов :

— кстати, именно этот её свойство мы используем для удержания консоли (там мы делаем вызов процедуры readln() перед закрывающей операторной скобкой тела программы).

Подробнее поговорим о первой функции данной процедуры.

Получение значений переменных и стандартный поток ввода данных

Стандартный поток ввода данных

В Паскале стандартным потоком ввода можно назвать

«то, откуда читает Readln()»

, так для разных реализаций Паскаля этот «источник» чтения может оказаться различным.

Давайте возьмём такой код:

и запустим его в паре средств разработки (мы можете попробовать запустить в вашей среде).

В Lazarus Delphi местом чтения оказывается «консоль», например в Windows, это выглядит как-то так (черное окно появляющееся при запуске программы):

— белый горизонтальный курсор внизу мигает (на этой картинке он просто отображается, а на экране мигает) в ожидании того, как пользователь введёт число и нажмёт Энтер.

Тот же самый код, запущенный в среде ABCПаскаль, не приведёт к открытию черного окна, а просто предложит ввести данные в нижней части собственного окна:

— здесь для обозначения места ввода используется вертикальный курсор.

Получение значений для переменных — два способа

К этому моменту мы с вами слышали про два способа получения значений для переменных:

  1. С помощью операции (и её оператора) присваивания, например:
  2. С помощью вызова Readln(), где в качестве аргументов переданы эти переменная/переменные:

— о втором способе получения данных поговорим подробнее ниже.

Как работает Readln()

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

Как и при перезаписи переменной (если одной и той же переменной при выполнении программы последовательно присваивают разные значения), Readln() может перезаписать старое значение переменной, например, запустите код:

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

С помощью readln() можно вводить данные любого типа, из списка приведённого ранее.
Когда мы говорим «вводить», то подразумеваем, что пользователь вводит — передаёт данные в «область» выполнения программы — как бы из одного мира в другой.

Получение значений для нескольких переменных одним вызовом

Readln() умеет запрашивать данные сразу для нескольких переменных одним вызовов, переменные, переданные в качестве аргументов могут быть разных типов, но так как мы к данному моменту изучили только два типа (integer и real), то рассмотрим пример получения нескольких значений этих двух типов.

Здесь в первой части программы значения всегда придётся вводить по одному, а вот во второй части, где аргументы передаются списком можно:

  1. либо также вводить по одному (после каждого нажимая Энтер), тогда мы получим в консоли что-то вроде:
  2. либо в одну строку через пробел, нажав Энтер после ввода третьего значения:

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

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

Например, рассмотрим код:

В примере выше в однострочных комментариях мы показали, что выведет на экран writeln() в первом и третьем случае.
Во втором же случае значение переменной $a$ перезаписывается не явно с помощью оператора присваивания, а с помощью процедуры чтения readln(), а потому в консоли вместо строки:

будет какое-то число введённое пользователем.

Разбор задач

Пример №1

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

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

Далее перейдём к решению:

Запустите этот код и посмотрите на ответ задачи (введя значение переменной и нажав Энтер).

Пример №2

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

Сказано, что одна переменная хранит целое число, а другая вещественное — значит ясно, что одну надо объявить как переменную целого типа integer, а вторую как вещественного real. Третья же переменная будет хранить их сумму, так как в случае арифметических операций с вещественными и целыми типами имеет место неявное приведение типа, то тип суммы будет вещественным.
Давайте объявим эти переменные:

С помощью комментариев к коду можно даже пояснить какая переменная за что отвечает:

Теперь когда мы определились с секцией объявления переменных, можно переходить к реализации тела программы.
Здесь всё просто:

— запустите эту программу, курсор ввода значения (задержанный realdln-ом) для второй переменной будет мигать без всяких пояснений, что не удобно, так как не совсем понятно, что требуется делать. В таких случаях обычно перед любым readln() используют вывод какого-либо пояснения, которое помогает пользователю понять, что требуется делать:

Ввод-вывод данных в Pascal

Компьютерные программы обрабатывают (изменяют) различные данные. Программа получает данные, что-то делает с ними и выводит их в измененной форме или выводит другие данные.

Следовательно, любой язык программирования должен иметь инструменты как для ввода данных, так и их вывода. В Паскале ввод осуществляется с помощью процедур read() и readln() , а вывод — благодаря write() и writeln() . Процедуры, которые имеют окончание ln , после своего выполнения переводят указатель на новую строку.

Откуда или с помощью чего можно ввести данные в программу? Обычно это можно сделать с помощью клавиатуры или из файлов.

Куда можно вывести данные? На экран, в файл, на принтер и др.

Стандартным устройством ввода является клавиатура, а вывода — монитор. Стандартные — значит «работающие по-умолчанию»; т.е. если не указано ничего иного, то программа будет считывать данные с клавиатуры, а выводить их на монитор. Вместе клавиатуру и монитор называют консолью. Таким образом консоль представляет собой стандартное устройство ввода-вывода.

Вывод данных на экран. Форматированный вывод

Вывод данных на экран и в файл в языке программирования Pascal осуществляется с помощью процедур write ( ) и writeln ( ) . Здесь будет рассмотрен вывод только на экран.

Допустим, нам требуется отобразить на экране пару фраз. Если мы хотим, чтобы каждая из них начиналась с новой строки, то надо использовать writeln() , если нет – то write() .

Write() чаще используется, когда надо вывести для пользователя сообщение на экран, после чего получить данные, не переводя курсора на новую строку. Например, выводим на экран «Введи число: » и не переводим курсор на новую строку, а ждем ввода.

Еще один пример. В памяти компьютера хранятся данные. Из программы мы обращаемся к ним с помощью переменных num, fl и st. Вывести их значения на экран можно по-разному.

Во втором случае мы видим, что процедуры вывода (как write() так writeln() ) позволяют конструировать выводимую информацию из различных компонент (строк-констант и переменных).

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

Ввод данных с клавиатуры

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

Когда данные вводятся, то они помещаются в ячейки памяти, доступ к которым обеспечивается с помощью механизма переменных. Поэтому, когда в программе на Pascal используется процедура read() (или readln() ), то в качестве фактического параметра (аргумента) ей передается имя переменной, которая будет связана с вводимыми данными. Потом эти данные можно будет использовать в программе или просто вывести на экран.

В процедуры ввода можно передавать не один фактический параметр, а множество.

При вводе данных их разделяют пробелом, табуляцией или переходом на новую строку (Enter). Данные символьного типа не разделяются или разделяются переходом на новую строку.

Существуют особенности ввода данных с помощью операторов read() и readln() . Если используются подряд несколько операторов read() , то вводимые данные можно разделять всеми допустимыми способами. При использовании нескольких вызовов readln() каждый последующий срабатывает только после нажатия Enter. Программа ниже иллюстрирует это. Комментарии поясняют последовательность возможных действий при вводе данных.

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

Рассмотрим способы организации ввода и вывода информации, предоставляемые языком программирования Паскаль.

Процедура ввода

Ввод данных — это процесс передачи исходных данных от внешнего устройства в оперативную память.

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

Для ввода данных с клавиатуры в языке Паскаль используются процедуры read и readln , имеющие следующий формат:

  • read(список);
  • readln(список);

Процедура readln аналогична процедуре read , единственное отличие заключается в том, что после считывания последнего значения переменной из списка, происходит перевод следующего ввода данных в начало новой строки.

Элементом «список» является список имен переменных через запятую, значения которых будут вводится с клавиатуры (заметим, что список может быть пустым), например:

  • read(a, b, c);
  • readln;

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

ВНИМАНИЕ: вводимые значения должны соответствовать типам переменных, в противном случае возникает ошибка (например, переменная b имеет тип integer , а вводится вещественное число).

Процедура вывода

Вывод – это процесс передачи данных после обработки из оперативной памяти на внешнее устройство.

Для вывода данных на экран в языке Паскаль используются процедуры write и writeln , которые имеют следующий вид:

  • write(список);
  • writeln(список);

В случае использования процедуры write , после выведения последнего элемента списка на экран, курсор останется в той же строке. Процедура writeln , после завершения вывода, переводит курсор на следующую строку. Если процедуре writeln не передавать параметры, то курсор просто переводится на следующую строку.

Правила записи параметров процедуры вывода

  1. Список вывода разделяется запятыми
  2. Список вывода может содержать переменные, константы и выражения
  3. Под вывод любого значения можно задать формат поля вывода — количество позиций, в которых будет размещаться величина (указывается сразу после выводимого значения через двоеточие):
    • если значение выводимой величины оказывается короче, то оно «прижимается» к правому краю отведенного поля, в противном случае — поле «раздвигается» до необходимых размеров;
    • для вещественных чисел в формате поля вывода предусматривается возможность указания количество выводимых позиций и отводимых под дробную часть числа (десятичная точка также занимает одну позицию).
  • writeln(‘a = ‘, a:2, ‘ ‘, 10 + sqrt(a):2:4, ‘ ‘, pi:4:2);

Copyright © 2014-2018, Урок информатики
Все права защищены

Вывод в консоль паскаль abc

vas-vas » 11.10.2014 13:27:08

FPC 2.6.4 / Windows 7 x64 /
Задача: с экрана (консоль) считать символ и его атрибут.

На BorlandPascal делалось примерно так.
type
TEkr= array[1..2000,1..2] of byte;
var
Ekran : TEkr absolute $B800:$0000;
begin
< читаем с массива что хотим >
end.

На такую конструкцию идет ошибка: 2.pas(4,29) Fatal: Syntax error, «;» expected but «:» found
как это можно сделать в FPC ? если можно с примером.

Re: Работа с консолью

Дож » 11.10.2014 15:44:41

Для начала рекомендую попробовать модуль video:

var
Cell: TVideoCell;

begin
InitVideo;
Cell := VideoBuf^[ScreenWidth * (ScreenHeight — 1)];
Writeln(‘Char: $’, HexStr(Cell and $FF, 2), ‘, ‘,
‘Color: ‘, (Cell shr 8) and $F, ‘, ‘,
‘Background: ‘, (Cell shr 8) and $70, ‘, ‘,
‘Blinking: ‘, (Cell shr 8) and $A0 > 0);
DoneVideo;
end.

Технически он подходит под задачу, но на практике имеет странности (в частности, в винде предварительно очищает экран после запуска).

Re: Работа с консолью

vas-vas » 11.10.2014 21:06:18

Спасибо. Давно в руки паскаль не брал. Как все усложнилось, главное что понятно, то что написано.

Добавлено спустя 21 час 39 минут 16 секунд:
Код: Выделить всё InitVideo;
gotoxy(1,1);
writeln(‘1’);
Writeln(‘Char kod:’, (VideoBuf^[0] and $FF) );
DoneVideo;

получаем:
1
Char kod:32 (тут не правильно)

———————————————-
а если
Код: Выделить всё InitVideo;
// символ цвет фон
VideoBuf^[0]:=byte(‘1’) + ((7 + (0 shl 4)) shl 8);
UpdateScreen(false);
Writeln(‘Char kod:’, (VideoBuf^[0] and $FF) );
DoneVideo;

получаем:
1
Char kod:49 (тут правильно)

На экран выводит то что надо в обоих вариантах. Определяет символ неправильно. Почему?

Re: Работа с консолью

Дож » 13.10.2014 12:43:22

Во-первых, модуль video не делает чуда и то, что выведено каким-то другим способом, само в VideoBuf не попадёт. Поэтому выводить нужно через video. Если же требуется прочитать что напечатал другой код или уже есть много кода со всякими Writeln, который нет возможности переписать, то придётся использовать чистый WinApi, никуда не деться:
Код: Выделить всё uses
windows;

var
Stdout, ScreenBuffer: HANDLE;
Buf: array[0..24] of array[0..79] of TCharInfo;
BufPos, BufSize: TCoord;
ReadRect: TSmallRect;
Security: TSecurityAttributes;
Info: TConsoleScreenBufferInfo;

FillChar(Security, SizeOf(Security), 0);
Stdout := GetStdHandle(STD_OUTPUT_HANDLE);
ScreenBuffer := CreateConsoleScreenBuffer(
GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
Security, CONSOLE_TEXTMODE_BUFFER, nil);
GetConsoleScreenBufferInfo(Stdout, @Info);

ReadRect.Top := Info.srWindow.Bottom — Length(Buf);
ReadRect.Left := 0;
ReadRect.Bottom := Info.srWindow.Bottom;
ReadRect.Right := Length(Buf[0]);

BufPos.X := 0;
BufPos.Y := 0;
BufSize.X := Length(Buf[0]);
BufSize.Y := Length(Buf);

if (Stdout = INVALID_HANDLE_VALUE) or
(ScreenBuffer = INVALID_HANDLE_VALUE) or
(not SetConsoleActiveScreenBuffer(ScreenBuffer)) or
(not ReadConsoleOutput(Stdout, @Buf[0][0], BufSize, BufPos, ReadRect)) then
Halt(5);

Writeln(‘Char code: ‘, Ord(Buf[High(Buf)][0].AsciiChar));
end.

Во-вторых, по той ссылке, которую я дал, прямым текстом написано:

Введение в Pascal

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

✎ 1) program – по-английски «программа», пишется в самом начале кода, после чего идет название программы латиницей и точка с запятой. Например: program Summa; − программа под названием Summa. Но эту часть кода, называемую заголовком программы, можно и не писать − она присутствует только для наглядности и показывает, какую задачу решает данная программа. Здесь мы употребили слово «код» − так называется текстовая запись программы.

✎ 2) integer – по-английски означает «целое число» (или просто «целое») и в Паскале используется для обозначения 32-битных (8 байт) целых чисел со знаком с диапазона [-2147483648, 2147483647] . Что означают эти большие числа, мы потом разберем.

✎ 3) real – с английского «реальный», «настоящий», «вещественный», «действительный». В языке Паскаль этим термином обозначаются вещественные числа с диапазона [-1.8∙10 308 , 1.8∙10 308 ] . Это очень большие числа, но значащих цифр выводится 15 – 16. Кстати, типы данных integer и real в среде программирования PascalABC.Net всегда автоматически выделяются синим цветом.

✎ 4) const – аналог англ. «constant», означающее «постоянная», «константа». В Паскале это величина, которая не может изменяться. Записывается так:

Эту запись надо воспринимать так, как она пишется: число N равно 12, S равно 5, «пи» равно 3,14 (как и в математике, только вместо запятой в Паскале используется точка). В последней строке мы использовали двойной слэш (две косые черты), после которых идет текст, – так в Паскале пишутся комментарии, и их программа не воспринимает. Всё, что начинается двойным слэшом и до конца строки – это комментарий, который пишется для пояснения к программе и всегда выделяется другим цветом (в PascalABC.Net — это зеленый , в Turbo Pascal не используется такой вид комментария). Существует и другой тип комментария – это <текст, заключенный в фигурные скобки, так же, как и здесь, тоже выделяющийся зеленым цветом>. Этот вид комментария может действовать несколько строк подряд – от начала скобки и до её закрытия, и всё, что находится в середине такой конструкции, компилятор не воспринимает как код и просто пропускает.

В действительности формат записи const немножко сложнее. По правилам мы должны были записать:

После объявления каждой величины указывается её тип, а потом присваивается значение. Но предыдущая запись тоже верна, поскольку компилятор Паскаля настроен так, что он автоматически определяет тип постоянной. Но этого нельзя сказать о следующем типе чисел – переменных.

✎ 5) var – происходит от англ. «variable» («переменная», или «изменчивый»), что в Паскале означает величину, которая в процессе программы может изменять свое значение. Записывается так:

Как видно из записи, знака «=» здесь нет – пересчитываются переменные одного типа (через запятую) и после двоеточия указывается только тип. Переменные N, m (целые) и Q, r, t (вещественные) в программе могут изменять значения в пределах integer и real соответственно. Ещё одно замечание: описание переменных всегда стоит после описания констант (постоянных) – сначала идет конструкция const , а потом var .

✎ 6) begin – в переводе с английского означает «начинать» и Паскале означает начало основной программы, в которой записываются команды (операторы). После слова begin точка с запятой не ставится.

✎ 7) end – по-англ. «конец», и в языке Pascal означает то же (конец программы). После последнего слова end всегда стоит точка. Мы выделили слово «последнего», поскольку использование конструкции begin – end возможно ещё в одном случае: это так называемые операторные скобки, которые применяются для объединения нескольких операций под одним оператором. Но об этом потом. Таким образом, основная программа будет выглядеть так:

Здесь операторы в теле программы – это разные команды компилятору.

✎ 8) write – по-английски означает «писать». Этот оператор выводит на экран текст, помещенный в него, поэтому так и называется – оператор вывода. Текст, помещенный в него, выделяется синим и записывается так:

write( ‘этот текст выведен на экране’ );

Сообщение, находящееся в скобках и кавычках, будет показано в окне консоли (просто в скобках без кавычек нельзя). После выполнения этого оператора мы увидим на экране:

этот текст выведен на экране

В таком виде оператор write используется в том случае, когда надо показать подсказку, пояснение, комментарий и т. п. А от если необходимо вывести ещё и числовое значение, скажем, S = 50 кв. м, то используется формат:

write( ‘Величина площади равна: S = ‘ , S);

В результате получим на экране результат:

Величина площади равна: S = 50

А при необходимости вывести единицы измерения, надо после S снова вставить текст в кавычках:

write( ‘Величина площади равна: S = ‘ , S, ‘ кв.м’ );

После выполнения последнего оператора вывода получим вывод на экран:

Величина площади равна: S = 50 кв.м

✎ 9) writeln – то же, что и write, но после выполнения курсор будет переведен на следующую строку.

✎ 10) read – в переводе с английского означает «читать», поэтому read называется оператором считывания, или ввода данных. Записывается как read(N), что означает необходимость ввода величины N, где N – любое число, или текст, или другой тип переменной. Например, если надо ввести возраст человека, которому 32 года, мы можем записать так:

Читать еще:  Удалить лишние пробелы паскаль
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×