Как сделать чтобы в паскале выводилось в столбик

Добавил пользователь Владимир З.
Обновлено: 19.09.2024

Для ввода данных в языке Турбо Паскаль предусмотрены стандартные операторы (процедуры) – READ и READLN , которые предназначены для чтения данных, как с клавиатуры, так и из файла. В данном разделе рассматривается ввод данных только с клавиатуры. Добавление к оператору READ символов LN обеспечивает автоматический переход курсора после ввода данных на новую строку.

Формат оператора:

Здесь a1,a2,a3. an – переменные, которым последовательно присваиваются значения. Если в тексте программы встречается оператор READ , компьютер приостанавливает работу и ожидает ввода значений переменных с клавиатуры. Когда все значения переменных, перечисленных в операторе ввода, введены, процесс выполнения программы продолжается.

Допускается использование оператора ввода без параметров

который выполняет переход на новую строку при вводе данных.

При вводе данных с помощью оператора READ нужно иметь в виду следующие основные правила:

  • логические данные в Турбо Паскале вводить не разрешается;
  • при вводе числовых данных, числа разделяются пробелом или символом окончания ввода (клавиша ENTER). Ввод всегда заканчивается нажатием клавиши ввода – ENTER;
  • пробелы перед числом и между числами игнорируются, поэтому их можно ставить в любом количестве;
  • если переменная описана как Integer , ее значение вводится как целое число, т.е. не допускается использование точки после числа;
  • если переменная описана как вещественная ( Real ), а ее значение является целым числом, то можно вводить число как целое (т.е. без точки) и как вещественное число – с точкой. Преобразование целого числа к вещественному числу будет выполнено автоматически;
  • ввод символьных данных имеет особенности. Поскольку пробел является символом, как и любой другой символ языка Турбо Паскаль, то символьные данные необходимо вводить сплошной строкой;
  • одной символьной переменной можно присвоить значение только одного символа;
  • нажатие клавиши ENTER воспринимается как символ, поэтому для правильного ввода символьных данных рекомендуется перед каждым оператором ввода символьных данных ставить оператор перехода на новую строку READLN , чтобы их ввод осуществлялся с новой строки.

ЗАДАЧА. Ввод данных.

Введем в программу следующие исходные данные:

Обозначим символом пробел при вводе. При вводе числа будем разделять пробелом. Между числами допускается любое количество пробелов. Тогда экран монитора при вводе данных может выглядеть следующим образом:

Введите a, b, c: 2 3

Введите x, y, z:44.4 47.5 76

Введите s1,s2,s3:A B C

Вывод данных

Для вывода данных из памяти компьютера на экран монитора предназначен оператор Write .

Здесь a1,a2,a3. an могут быть либо переменными, либо строкой символов, заключенной в апострофы. Все элементы перечисляются через запятую. Добавление к оператору WRITE символов LN обеспечивает автоматический переход курсора после вывода данных на новую строку.

Допускается использование оператора ввода без параметров

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

Параметрами оператора WRITE могут быть данные целого, вещественного, логического, символьного, а также типа string .

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

Бесформатный вывод. Форма представления выводимых данных зависит от типа данных:

  • значения логического типа выводятся в виде логических значений TRUE и FALSE ;
  • значения символьных переменных выводятся в виде соответствующих символов;
  • символьная константа выводится в том виде, как она записана, но без апострофов;
  • значения величин целого типа выводятся как целые числа;
  • значения величин вещественного типа выводятся в формате с плавающей точкой.

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

ПРИМЕР. Рассмотрим фрагмент программы:

Оператором write(n,m); на экран монитора выводятся целые числа: n=1234 и m=7890 . Поскольку используется вывод без форматов данных, результат будет иметь вид:

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

Результат:

Результат:

Форматный вывод. Для вывода вещественных чисел необходимо указать в операторе WRITE формат представления числа, который имеет вид:

где: m – целое число, указывающее общее количество позиций отводимое под значение переменной, включая позицию под знак числа, точку и количество цифр дробной части; n – целое число, определяющее количество цифр дробной части.

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

Пример. Выведем значение переменной A , равное 401.3 оператором write(A:8:2) . На экран монитора будет выведено:

401,30
8 позиций

Символом обозначен пробел.

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

  1. Если число имеет меньшую длину, чем m , то оно будет дополнено слева пробелами.
  2. Если число имеет большую длину, чем m , то параметр m игнорируется и число будет выведено полностью.
  3. Если дробная часть больше, чем параметр n , то число округляется. Округление не изменяет самого значения переменной, меняется только представление числа на мониторе.
  4. Если параметр n не указан, то ни дробная часть числа, ни десятичная точка не выводятся. Вывод осуществляется в формате с плавающей запятой.

В качестве примера рассмотрим печать вещественного числа в различных форматах.

Результат работы программы:

Печать вещественного числа

Печать в фиксированном формате

Печать в плавающем формате

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

k – целое число, указывающее общее количество позиций, отводимое под значение переменной.

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

Вывести на экран в паскале можно любой текст, состоящий из букв, цифр, или некоторых других символов типа ",.№%*!_%" и тому подобных.
Для этого есть две стандартные паскалевские процедуры: Write и WriteLn.
Чтобы понять разницу между ними нужно знать что такое курсор.
Курсор:
Если мы хотим вывести текст на экран, то мы должны определиться, куда он будет выводиться в данный момент. Это место называется активной позицией. Курсор указывает на текущую активную позицию, в которую можно вывести буковку на экране.
Обычно вы могли видеть курсор в виде мигающей горизонтальной чёрточки, или вертикальной чёрточки (например тут в форуме). Как и в любом текстовом редакторе курсор можно двигать.
Курсор имеет свои координаты - координату по горизонтали, и координату по вертикали. Эти две координаты указывают, где на экране в данный момент он находится.
Когда команды Write и WriteLn выводят текст, то они двигают курсор (обычно вправо), и пишут буквы.


Команда Write:
пишет текст, и оставляет курсор в конце текстовой строки. Текст пишется начиная с текущего месторасположения курсора. К примеру: Если на экране до этого написано было

(курсор я обозначил красной чёрточкой), то команда write(' Его вербальные способности и харизма поражают каждого %)') cделает так:

То есть перезапишет всё то что было после курсора новым текстом и сдвинет курсор.
Возможно у вас может возникнуть вполне закономерный вопрос - А что будет, если строка длиннее ширины экрана (80 символов) или курсор находится уже в правой части экрана, и мы туда пытаемся вывести строку ?
Ответ довольно очевиден - в этом случае вмещающаяся часть выводимого текста будет дописана в конец экранной строки, после чего курсор переместится на начало следующей экранной строки, и будет дописан оставшийся текст (естественно курсор после этого установится на конец этого оставшегося текста).
Важно понимать - что паскаль, это вам не Word, и переносы он расставлять не умеет. Если у вас не вмещается слово "Синхрофазотрон", то это слово будет безжалостно разбито на две части, одна в конце одной строки, и другая в начале следующей. Так что если вам нужны переносы - добавляйте их сами (ставьте в слово минусы).


Команда WriteLn:
Эта команда имеет одно принципиальное отличие от её побратима - write.
После вывода текста она перемещает курсор на начало новой строки. Это почти всегда очень удобно.
Вот пример:

Функция возвращает порядковый номер символа параметра в таблице ASCII:

var i: integer; begin for i:=32 to 255 do write(chr(i):3); end.

var c := 'Ю'; var n := Ord(c); // n := c.Code Print(n); // 1070 c := Chr(n); print(c); // Ю

char.IsLetter(с); // буква ли, boolean char.IsDigit(с); // десятичное ли число, boolean char.IsLower(с); // буква нижнего регистра, boolean char.IsUpper(с); // буква верхнего регистра, boolean char.IsPunctuation(с); // знак препинания, boolean с := char.ToLower(с) ; с := char.ToUpper(с);

c1 c2; с in ['a','e','i','o','u',’y’]; // c принадлежит гласным с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам

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

//c принадлежит диапазону: c.InRange('a'..'z'); //Трансформация символа в цифру: var n := Ord(c) – Ord('0'); // Увеличение кода символа на n: c := Chr(Ord(c) + n); // или Inc(c,2);

Строковые переменные в Паскаль

Строковые переменные в Паскале имеют тип String

Объявление и инициализация строковой переменной:

var a:string; begin a:='Привет всем!'; writeln(a); end.

Ввод значения строковой переменной с клавиатуры:

var a:string; begin writeln('Введите слово'); readln(a); writeln('Вы ввели слово ',a); end.

Функции работы со строками в Pascal

var s:string[30]; n,i:integer; begin writeln('введите текст'); readln(s); n:=0; for i:=1 to length(s) do if s[i]='f' then n:=n+1; write('в тексте букв f = ',n) end.

begin var s := readString('введите текст'); var n := 0; foreach var c in s do if c = 'f' then inc(n); Print(n); end.

s1 + s2 // конкатенация s1 и s2 s1 += s2 s1 Показать решение:

const m = ['0'..'9']; var s: string; i, k: byte; begin read(s); k := 0; for i := 1 to length(s) do if s[i] in m then inc(k); writeln('цифр = ', k); readln; end.

begin var s := readString; var k := 0; foreach var c in s do if char.IsDigit(c) then k += 1; Print($'цифр = '); end.

var a,b,c:string; i:longint; begin write('введите слово:'); readln(a); b:=''; for i:=1 to length(a) do b:=a[i]+b; if a=b then write('перевертыш') else write('не перевертыш'); end.

// с помощью среза begin var s := readString; var n := s.Length; var s1 := s[::-1]; if s = s1 then print('перевертыш') else print('не перевертыш'); end.

String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).

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

String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:

Примечание:
Использовать функции: Pos, Copy, Delete

String 12. Программа должна позволять ввести текст, и потом удалять в нем все восклицательные знаки, расположенные непосредственно перед запятой, и выводить измененный текст на экран.

Пример:

Трудность низкая:
Программа должна формировать в памяти вторую строковую переменную с измененным текстом, а потом выводить ее на экран.

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


А теперь рассмотрим олимпиадное задание по Паскалю:

Задача Цезарь: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).

* Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k , причем отрицательное значение является признаком сдвига влево, положительное — вправо.

var a:char; i,n:byte; s,s1:string; begin s1:=''; readln(s); for i:=1 to length(s) do begin n:=ord(. ); n:=n+3; if n=123 then n:=97; if . ; if . ; a:=chr(. ); s1:=. ; end; writeln(s1) end.

var a:char; i,n:byte; s,s1:string; begin s1:=''; readln(s); for i:=1 to length(s) do begin n:=ord(s[i]); n:=n+3; if n=123 then n:=97; if n=124 then n:=98; if n=125 then n:=99; a:=chr(n); s1:=s1+a; end; writeln(s1) end.

Посимвольный ввод до пробела

посимвольный ввод строк

Для организации массива символьных строк:

Пример:

String 14. с клавиатуры вводится число N, обозначающее количество студентов в группе, а затем – N строк, в каждой из которых – информация о студенте в формате:

  1. Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
  2. Вывести фамилии студентов, у которых оценка 2.
  3. Вывести фамилии студентов, родившихся в 1996 году.

Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

vedro-compota

Литералы -- это данные записанные непосредственно в программном коде, мы можем посмотреть на них в конкретной строке программы и сказать, что это число или строка или символ и т.д. И какая именно число, строка или символ т.д. Значение литерала нельзя изменить, так как он сам и есть значение.

Типы литералов

Литералы бывают разных типов и каждый литерал соответствует какому-то типу данных, но о типах данных вообще мы поговорим позднее. Пока же рассмотрим литералы трёх типов:

  1. Строковые литералы
  2. Символьные литералы
  3. Числовые литералы

Строковые литералы

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

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

Символьные литералы

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

Последним в списке примеров символьных литералов приведён пробел, это просто символ пробела окружённый одинарными кавычками

Числовые литералы

Числовые литералы можно разделить на:

    Целочисленные -- это любые целые числа -- положительные, например:

или отрицательными, например:

Далее рассмотрим использование литералов для вывода данных.

Вывод данных на экран с помощью write() и writeln()

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

Первая программа -- Привет Мир!

Следуя уже довольно старой и всё такой же доброй традиции, выполним нашу первую программу, поприветствовав мир:

Запустите этот пример (не забывая о том для чего нужны и что значат комментарии и операторные скобки). Вывелось ли приветствие?

Если окно в котором оно выводится слишком быстро закрывается, используйте приём для удержания консоли (просто запомните его, позже мы объясним как это работает):

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

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

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

write() и writeln() -- стандартные процедуры вывода данных


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

Write() и Writeln() -- две стандартные (то есть разработанные создателями языка) процедуры в Паскаль, которые позволяют выводить на экран переданную в них информацию, или говорят "переданные им аргументы".

Аргументы -- это значения, которые передаются в процедуру, будучи перечисленными в коде программы внутри скобок после имени процедуры, например:

Даст нам в консоли текст:

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

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

Вызов процедуры с указанным именем

Чтобы вызвать какую-то процедуру необходимо знать:

  1. её имя
  2. число её аргументов и их тип

Например ,пусть у нас есть выдуманная процедура с именем, скажем, $test()$ и мы знаем, что она принимает на вход два аргумента: один целочисленный аргумент и один литерал, тогда вызвать её можно с помощью такой строки в теле программы:

Или даже передав в качестве первого аргумента переменную нужного типа:

write() & writeln()

Теперь перейдём непосредственно к обсуждению write() и writeln().
Общее:

    И write() и writeln() служат для вывода в консоль информации.
    Например, ввод чисел:

Или строк (строковый литералов):

Отличие:

  • write() просто выводит на экран переданные ему аргументы.
  • writeln() же выводит переданные аргументы и переводит курсор на новую строку. То есть любой следующий вызов процедуры вывода данных начнёт свой вывод уже со следующей строки.

Таким образом сравним работу фрагментов кода:

В чем разница между результатами, если запустить их? Обратите внимание в каком случае произошёл перенос строки, а в каком нет.

Пустой writeln() и пустой write() для перевода строки

Следует отметить, что по данному выше описанию работы writeln() и write() можно сказать, что вызванный без аргументов write():

не делает вообще ничего, а вот пустой writeln() позволяет перенести курсор на новую строку:

(заметьте, что в последнем примере кода использовались и однострочные и многострочные комментарии)

Вывод литералов разного типа:

Примеры вывода одного и того же разными способами

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

Вывод одной строки -- разными способами

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

Итак, рассмотрим разные способы:

    Проще всего напечатать этот текст в виде строкового литерала:

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

ПРИМЕЧАНИЕ: Надо понимать, что множественные вызовы write() и передача всё тех же аргументов через запятую -- это одно и то же, а вот множественный вызов writeln() и передача аргументов в один writeln() через запятую -- не одно и то же, так как после каждого вызова writeln происходит перенос курсора на новую строку.

Вывод многострочного текста

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

Пусть нам требуется вывести в косоль такого аски-арт робота:

По сути это текст из нескольких строк, где встречаются пробелы другие символы:
Разные способы вывода:

  1. В отличии от предыдущих примеров тут уже не обойтись передачей всего текста в один строковый литерал, так как этот робот многострочный, поэтому чтобы вывести его построчно будем использовать серию writeln():
  2. После вывода последней строки перенос курсора не обязателен, и потому можно использовать write():
  3. Если вы почему-то хотите вывести какую-то очередную стоку с помощью write() и после неё идёт текст, который должен начинаться с новой строки, то не забывайте дополнительно вызвать пустой writeln(), например:

Видео-пояснение

К этому уроку есть видео-пояснения:

Задачи для самостоятельного решения

    Ответьте на вопросы (письменно):
  1. Литералы какого типа вы знаете? Чем они отличаются друг от друга при записи
  2. Что такое процедура? Что такое аргументы процедуры?
  3. Пусть у вас есть абстрактная процедура с именем $abc()$, запишите её вызов в теле программы, передав литералы соответствующего типа (для каждого варианта), если она принимает на вход :
    • четыре аргумента - первые два целочисленные, и третий символьный и четвертый строковый.
    • два разных аргумента символьного типа
    • пять аргуементов - первые два строковое, один числовой и два символьных
    • три аргумента: два строковых и один числовой
  4. Чем отличается write от writeln()?
  5. Если ли разница между передачей многих аргументов во write(), например:

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

? Будет ли разница между выведенными на экран текстами, если в них write() заменить на writeln()?
(если не можете ответить сходу -- запустите по очереди оба примера ,сравните результат и снова почитайте объяснения выше)

ПРИМЕЧАНИЕ: когда будете решать следующие ниже задачи, можете привести все решения в теле одной программы, просто закомментировав то. что уже работает, ваш код будет выглядеть как-то так:

Когда же будете показывать работу программы расскомментируйте те строки, работу которых хотите продемонстрировать. Например показываем работу первой строчки тела программы (в предыдущем же примере мы показывали работу второй строки):

Далее решите задачи запуская код программы, в теле которого:

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

  1. С помощью 1 аргумента -- литерала строкового типа
  2. С помощью 2-х аргументов-литералов любого типа одним вызовом write().
  3. С помощью вывода всей строки, кроме последнего символа, потом уже этот последний символ.
  4. Так, чтобы одна цифра была числовым литералом, вторая символом, а всё остальное чем угодно.

ПРИМЕЧАНИЕ: После выполнения всех четырёх пунктов на экране (в консоли) вы должны получить (4 строки):

с помощью отдельных символов (симольных литералов), а всё остальное как угодно.

Подсказка: попробуйте решить самостоятельно, если не все понятно можно посмотреть разбор решения

Читайте также: