Оформите вывод длинного числа на экран в виде отдельной процедуры

Обновлено: 16.05.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 – целое число, указывающее общее количество позиций, отводимое под значение переменной.

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

На занятии будет объяснен алгоритм работы с процедурами на Паскале. Будут разобраны примеры использования процедуры с параметрами и без параметров. Познакомитесь с понятиями: формальные и фактические параметры, параметр-переменная и параметр-значение

Процедуры в Паскале

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

Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале

procedure pr; var i:integer; begin for i:=1 to 60 do begin write('*'); writeln; end; end; begin pr; end.

В данном примере работы с процедурой в Паскале очевидно, что компилятор пропустит блок описания процедуры и дойдет до основной программы (9 строка кода). И только после того, как встретится вызов процедуры (10 строка), компилятор перейдет к ее выполнению, вернувшись к строке 1.

Процедуры с параметрами. Фактические и формальные параметры

Рассмотрим пример необходимости использования процедуры.

построение треугольников в процедуре

Пример:
Построить фигуру

Особенность: Три похожие фигуры.

Алгоритм решения:

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

1_1

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

Решение на паскале:
Процедура:

uses GraphABC; procedure Tr( x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.

Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.

Задание procedure 1: Написать процедуру рисования N вертикальных линий. N задается параметром процедуры.

Задание procedure 2: Написать процедуру рисования N окружностей, сдвинутых по горизонтали. N, радиус R и отступ O задаются параметрами процедуры (всего 3 параметра).

Пример: Написать процедуру, которая печатает 60 раз указанный символ (введенный с клавиатуры), каждый с новой строки

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

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

Фактический параметр — это то значение, которое указывается в скобках при вызове процедуры. Фактическим параметром может быть конкретное значение (литерал: число, символ, строка…) либо переменная, которые компилятор подставит вместо формального параметра. Поэтому тип данных у формального и фактического параметра процедуры должен быть одинаковым.

var s:char; procedure pr(a:char); var i:integer; begin for i:=1 to 60 do begin write(a); writeln; end; end; begin writeln('введите символ'); readln(s); pr(s); end.

procedure pr(a:char); begin loop 60 do begin println(a); end; end; begin writeln('введите символ:'); var s:= readchar; pr(s); end.

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

  • число фактических параметров должно быть равно числу формальных параметров;
  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу данных.

Процедуры с параметрами. Параметр-переменная
(передача параметра по ссылке)

var x,y,m,n:integer; procedure MaxNumber(a,b:integer;var max:integer); begin if a>b then max:=a else max:=b; end; begin write('vvedite x,y'); readln(x,y); MaxNumber(x,y,m); writeln('max=',m) end.

procedure MaxNumber(a,b:integer;var maximum:integer); begin maximum:=max(a,b); end; begin var (x,y):=readInteger2('введите x,y'); var m:integer; MaxNumber(x,y,m); writeln('max=',m) end.

В примере формальные параметры a и b служат для помещения в них сравниваемых чисел, а параметр-переменная max — для сохранения в ней максимального из двух чисел. Параметр-переменная или выходной параметр передает свое значение в основную программу (фактическому параметру m ), т.е. возвращает значение, тогда как формальные параметры-значения (входной параметр), наоборот, принимают значения из основной программы (из фактических параметров x и y ). Для параметра-переменной ( max ) используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры (ячейка m ).

Таким образом, сформулируем понятия:

Если в качестве формального параметра указана обычная переменная с указанием ее типа, то такой параметр есть параметр-значение или входной параметр ( a и b в примере). Тип данных формального параметра-значения должен соответствовать типу данных его фактического параметра ( a и b должны попарно соответствовать типу данных x и y ).

Если перед именем формального параметра в объявлении процедуры стоит служебное слово var, то такой параметр называется параметром-переменной или выходным параметром ( max в примере). Для него используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры ( m ). А передача такого параметра называется передачей по ссылке (ссылка на ту же ячейку в памяти). Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой, не литералом и не выражением).

var x,y:integer; procedure exchange(a: integer;var b:integer); var c:integer; begin if a>b then begin c:=a; a:=b; b:=c; end; end; begin writeln('введите два числа'); readln(x,y); exchange (x,y); writeln('max=',y) end.

procedure exchange(a: integer;var b:integer); begin b:=max(a,b); end; begin var (x,y):=readInteger2('введите x,y'); var m:integer; exchange (x,y); writeln('max=',y) end.

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


Словесный алгоритм:

0 do begin if a

1_1

Задача procedure 6. Даны 3 различных массива целых чисел (размер каждого 15 элементов). В каждом массиве найти сумму элементов и среднее арифметическое значение.
Для формирования элементов массива и подсчета суммы и среднего арифметического использовать одну процедуру (среднее арифметическое и сумму оформить как параметры-переменные).

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

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

const n = 10; var i:integer; a, b: array[1..n] of integer; procedure arr_out (k:integer; arr: array[1..n] of integer); var i: byte; begin write ('вывод массива: '); for i := 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end.

Пояснение:
Тело основной программы:
— формирование элементов массива (с функцией random ).
— вызов процедуры с двумя параметрами: количество элементов, массив.
Тело процедуры:
— вывод элементов массива с использованием параметров

Продолжим нашу задачу:

const n = 10; var a, b: array[1..n] of integer; procedure arr_rand (k:integer; var arr: array[1..n] of integer); var i: byte; begin write ('Заполнение массива случайными числами '); randomize; for i := 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.

Задача procedure 8. Добавьте в задачу процедуру для заполнения значений массива пользователем (ввод значений с клавиатуры). Оформите вывод двух разных массивов: один — со значениями, сформированными случайным образом, другой — со значениями, введенными пользователем.

Задача procedure 9. Составить программу с процедурой для вычисления степени числа (входные параметры: число и степень). Для вывода результата использовать параметр-переменную.

Задача procedure 10. Составить программу на Паскале с процедурой для вычисления факториала числа. (0!=1, 1!=1, 2!=2, 3!=6 …)

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

procedure p(a: integer); begin a := 666; // изменяется только формальный параметр! end; begin var x := 555; p(x); Print(x); // 555 end.

procedure p(var a: integer); begin a := 666; end; begin var x := 555; p(x); Print(x); // 666 – фактический параметр изменился тоже! end.

Самостоятельная работа

Общее задание 1: Написать процедуру рисования N прямоугольников сдвинутых по горизонтали. N, координаты точек x1, y1, x2, y2 и отступ O задаются параметрами процедуры (всего 6 параметров).

Общее задание 2: Описать процедуру Mean(X, Y, AMean, GMean) , вычисляющую:

  • среднее арифметическое AMean = (X+Y)/2
  • и среднее геометрическое GMean = √X*Y двух положительных вещественных чисел X и Y .

X и Y — входные параметры, AMean и GMean — выходные параметры вещественного типа.
В основной программе: Для заданных A, B, C, D найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), используя созданную процедуру.

1 вариант: для 5 одномерных массивов определять произведение элементов каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода произведения.

2 вариант: для 5 одномерных массивов определять минимальный элемент каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода минимального элемента.

* сложное С помощью процедуры формировать случайным образом одномерные массивы из 10 элементов (значения от -20 до +20). Вызывать процедуру до тех пор, пока среди значений не появится ноль.

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