Среда Turbo Pascal 5 Разделы описаний 6 решение

Вид материалаРешение

Содержание


Разделы описаний
Var Summa, fio : word
Описание стандартных типов данных
Arctg x Экспонента аргумента
Odd(x) - проверка аргумента на четность. Вырабатывает результат булевского типа: для чётного аргумента - false
Булевский тип
Оператор присваивания
Организация ввода/вывода
Var a,b,c,d,e : Integer; Begin Read
Var p,r,s,t,u: Integer; Begin ReadLn
Write и Writeln
WriteLn (текст или переменная
Условный оператор if … then … else
Boolean (логический)
IF условие THEN оператор
IF условие
BEGIN оператор1; оператор2; …END
Оператор варианта case … of
CASE выражение OF константа1 : оператор1; константа2 : оператор2; …ELSE операторN END
Else Writeln ('Вы ошиблись. Нет дня недели с таким номером.')
...
Полное содержание
Подобный материал:
1   2   3   4

Разделы описаний


Описание переменных

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

Var v1, v2 : type_1;

v3 : type_2;

Здесь v1, v2, v3 — список переменных, в котором имена переменных разделяются запятыми, а type задает тип переменных.

Пример описания переменных:

Var

Summa, fio : word;

x,y,z : real;

otvet, Plan : extended;

Здесь word, real и extended — названия типов.

Описание констант

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

Const

My_birth_year = 1985;

x = 0.85;

s = ’меня зовут - ’;

Описание стандартных типов данных


Программа, написанная на языке Паскаль, оперирует данными. Данными является либо константы, либо переменные. Для каждой переменной или константы задается некоторый тип, определяющий как возможные значения переменной, так и операции, которые могут над ней выполняться. Однако все они строятся на основе четырех элементарных типов: целый (integer), вещественный (real), символьный (char) и булевский (Boolean).

Идентификатор

Длина, байт

Диапазон (множество) значений

Целый

Byte

1

0..255

Word

2

0..65535

Shortint

1

–128..127

Integer

2

–32768..32767

Longint

4

–2147483648..2147483647

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

Real

6

2,9x10391,7x1038

Single

4

1,5x10453,4x1038

Double

8

5x103241,7x10308

Extended

10

3,4x1049321,1x104932

Логический

Boolean

1

true, false

Символьный

Char

1

Все символы кода ASCII

String

символьная строка длиной от 1 до 255 символов

С аргументами целого и вещественного типа могут использоваться следующие стандартные функции:

Имя функции

Математическое значение результата

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

Sin(x)

Cos(x)

Ln(x)

Sqrt(x)

Arctan(x)

Exp(x)

Sqr(x)

Abs(x)

Frac(x)

Int(x)

Pi

Sin x

Cos x

Ln x – натуральный логарифм



Arctg x

Экспонента аргумента

X2

|x|

Дробная часть числа

Целая часть числа

Pi=3.1415926535897932385

Real

Real

Real

Real

Real

Real

Real, Integer

Real, Integer

Integer

Integer

Integer

Целый тип. В языке Паскаль целый тип обеспечивает задание целых чисел. В любой конкретной вычислительной машине существуют ограничения на диапазон целых чисел. Определено некоторое целое число MAXINT такое, что значение любой целой переменной или константы должно находиться в диапазоне от -MAXINT до + MAXINT. В противном случае будет зафиксирована ошибка. Примеры целых чисел: 173; -3; 0; +64.

Над переменными целого типа определены следующие арифметические операции: + (сложение), - (вычитание), * (умножение), / (деление).

Div  - деление нацело (например 9 div 4 равно 2).

Mod  - вычисление остатка от целочисленного деления (например 7 mod 3 = 1).

Все эти операции вырабатывают результат целого типа, кроме операции деления ( / - деление), результат которой всегда будет вещественного типа. Определены также операции отношения = (равно), <> (не равно), < (меньше), > (больше), <= (меньше или равно), >= (больше или равно), вырабатывающие результат булевского типа.

Определены также процедуры:

dec(x) - уменьшение значения переменной x на единицу.

inc(x) - увеличение значения переменной x на единицу.

Применяют также функции:

Odd(x) - проверка аргумента на четность. Вырабатывает результат булевского типа: для чётного аргумента - false, для нечетного - true.

Вещественный тип. Переменные и константы вещественного типа в программе употребляются в том же смысле, что и в математике. Запись вещественного числа в языке Паскаль возможна в виде числа с фиксированной точкой, например: 151.3487; 0.01; 21.3. 0чень большие или очень маленькие числа удобнее представлять в экспоненциальной форме: 2.108E-10; 1.1E7; 3.4E+5, где например:

2.108E-10 = 2.108·10-10.

Над переменными вещественного типа определены следующие арифметические операции: + (сложение), - (вычитание), * (умножение), / (деление), а также операции отношения.

С аргументами вещественного типа могут использоваться следующие стандартные функции: sin(x), cos(x), sqrt(x), arctan(x), exp(x), sqr(x), abs(x); все они вырабатывают результат вещественного типа.

Определены также стандартные функции преобразования значения вещественного типа в значение целого типа:

Trunc(x) - вырабатывает целый результат путем отбрасывания дробной части аргумента;

Round(x) - вырабатывает целый результат путем округления до ближайшего целого.

Например, если х=21.53, то trunc(x)=21, round(x)=22;

Если х= -2.7, то trunc(x)= -2, round(x)= -3.

Символьный тип. Значениями символьного типа являются элементы конечного и упорядоченного набора знаков. Символ, заключенный в апострофы, обозначает константу символьного типа, например: 'x', '5', '='.

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

ord(s) -дает номер символа s из таблицы кодов символов компьютера. Например: ord(‘:’)=58, ord('5')=53.

chr(i) -дает символ, имеющий код i в таблице кодов.

Например: chr(66)='b', chr(57)='9'.

Существуют и другие символьные функции, которые мы рассмотрим на стр. 19.

Булевский тип. Переменные булевского типа могут принимать одно из двух значений: true (истина) или false (ложь).

Исполняемые операторы

Тело каждой программы или подпрограммы состоит из последовательности операторов, каждый из которых выполняет определенное действие. Рассмотрим некоторые операторы языка Паскаль.

Оператор присваивания


Этот оператор обозначается знаком (:=). При выполнении оператора присваивания вычисляется выражение, стоящее в правой части, и его значение присваивается переменной в левой части. При этом тип выражения должен соответствовать типу переменной. Допускается присваивание переменной вещественного типа значения выражения целого типа. Присваивание переменной целого типа выражения вещественного типа запрещено!

Для преобразования значения вещественного типа в значение целого типа предназначены функции trunc(x) и round(x).

Примеры операторов присваивания (переменные x, y - вещественного типа; a,k,m - целого типа):

x:=y*a-2/k; m:=k*k*k; y:=a*k+m-7*k; k:=round(exp(16*ln(x)));

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

Значение выражения вычисляется с учетом расставленных скобок и старшинства операций. Ниже приведены операции в порядке убывания их приоритета, причем операции в одной строке имеют одинаковый приоритет:

действия в скобках

вычисления функций

*, /, mod, div

+, -

Операции одного и того же старшинства выполняются слева направо в порядке их появления в выражении.

Используя оператор присваивания можно составить следующие формулы:

k:=k+1; - формула накопления количества;

s:=s+x; - формула накопления суммы (где x – очередное число);

p:=p* x; - формула накопления произведения (где x – очередное число). Для правильной работы этой формулы необходимо в начале программы p:=1;

Для перевода радиан в градусы и обратно следует пользоваться следующими формулами:

Rad := Grad * Pi / 180; - перевод градусов (Grad) в радианы (Rad)

Grad := Rad * 180 / Pi; - обратный перевод

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

для тангенса x:=sin(x) / cos(x).

Для вычисления выражения вида: используют запись exp(ln(5)/12), для вычисления вида: 47 используют запись exp(ln(abs(4))*7).

Для получения случайного числа из интервала от А до В используется выражение вида: x:=Round(random*(b-a)+a); Для правильной работы этой формулы необходимо в начало программы вставить процедуру Randomize;

Контрольные вопросы:

1. Для чего используется оператор присваивания?
2. Из чего может состоять выражение справа от знака присваивания?
3. Перечислите стандартные арифметические функции.
4. Как осуществить перевод градусной меры угла в радианную и обратно?
5. Как в Паскале вычислить тангенс? возвести число в произвольную степень?

Организация ввода/вывода


Для ввода данных используются стандартные процедуры Read и ReadLn:

Read (переменная) - считывает с клавиатуры одно или несколько значений в одну или несколько переменных указанных в скобках.

Например:

Var a,b,c,d,e : Integer;
Begin
Read
(a,b,c);
Read
(d,e)



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

1 2
3 4 5

В этом случае процедура Read (a,b,c) прочтет значения переменных a и b из первой строки ввода, переменную c из второй стоки. Процедура Read (d,e) "дочитает" значения переменных d и e из второй строки. Корректным было бы так же размещение данных для ввода следующим образом:

1 2 3 4 5

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

ReadLn (переменная) - считывает значения переменных, а затем делает пропуск до начала следующей строки Пример:

Var p,r,s,t,u: Integer;
Begin
ReadLn
(p,r);
ReadLn
(s,t,u);


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

1 2 3 4 5
6 7 8 9

В этом случае процедура ReadLn (p,r) считает значения в переменные p и r (они примут значения 1 и 2 соответственно), затем пропустит все имеющиеся на этой строке данные (3, 4 и 5 будут пропущены) и перейдет на следующую строку. После выполнения процедуры ReadLn (s,t,u) переменные s,t,u примут значения соответственно 6, 7 и 8.

Для вывода Паскаль предоставляет процедуры Write и Writeln.

Write (текст или переменная) - выводит на экран текст, заключенный в апострофы или значение переменной. После вывода курсор остается в той же строке.

WriteLn (текст или переменная) - выводит на экран текст, заключенный в апострофы или значение переменной, затем переводит курсор на новую строку.

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

Пример:

{программа, работающая как калькулятор: компьютер ожидает ввода}
{двух чисел, затем выводит их сумму}


Var a,b: Integer;
Begin
Write
('Введите два числа через пробел '); {вывод строковой константы}
Read
(a,b); {чтение значений переменных a и b}
Writeln
(a,'+',b,'=',a+b); {вывод переменной a, вывод константы '+', вывод

переменой b, вывод константы '=', вывод значения a+b}
End.


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

Read (a,b,c);
Write
(a:3,b:2,c:5);

Если при выполнении этого фрагмента пользователь введет, предположим, числа

31 -450 8, то они будут выведены как

 31-450    8

Число a займет три позиции (31 будет напечатано с одним пробелом впереди), число c пять позиций (4 пробела перед числом 8), а вот на b в программе мы отвели лишь две позиции, а ввели число, занимающее четыре позиции. Но Паскаль вывел все цифры числа b, включая минус. т.е. при недостатке отведенных позиций для вывода на число отводится ровно столько позиций, сколько требуется.

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

Writeln (x:7:3); {на печать числа x отводится 7 позиций, из них 3 после запятой}

Writeln (‘Summa=’:10, S:2:3); {под текст 10 позиций, под s 2 и 3 позиции}

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

Контрольные вопросы:

1. Назовите стандартные процедуры ввода/вывода в языке Pascal.
2. В чем отличие процедур Read и ReadLn, Write и WriteLn?
3. Что такое "форматный вывод"?
4. Как напечатать вещественное выражение с требуемой точностью?

Условный оператор if … then … else


Условный оператор предназначен для выбора одного из двух действий, в зависимости от результата проверки условия. В языке Паскаль условный оператор состоит из ключевых слов if (читается как ЕСЛИ), then (ТО, ТОГДА), else (ИНАЧЕ), и имеет два вида – полную и сокращенную формы записи:

IF условие THEN оператор1 ELSE оператор2

Условный оператор выполняется следующим образом:

1) проверяется условие (результат проверки типа Boolean (логический) - истина или ложь);

2) если результат - True, то выполняется оператор1, стоящий за THEN;

3) если результат - False, то выполняется оператор2 стоящий за ELSE.

Сокращенная форма записи условного оператора:

IF условие THEN оператор

В этом случае, если условие истинно, то выполняется оператор стоящий за THEN, если же оно ложно, то оператор вообще не выполняется .

В полной и сокращенной формах условие – две переменные или два выражения разделенных одним знаком сравнения.

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


IF условие

   THEN оператор1

   ELSE оператор2;

или так:

IF условие THEN оператор1

                  ELSE оператор2;

После Then или Else мы можем записать лишь один оператор. Как быть, если нам необходимо выполнить несколько действий подряд в зависимости от условия? Язык Паскаль предоставляет такую возможность с использованием составного оператора, который имеет вид:

BEGIN оператор1; оператор2; …END

В этом случае последовательность операторов, заключенных между служебными словами Begin и End (они называются операторными скобками) воспринимаются Паскалем как один оператор. Таким образом, ограничение в один оператор можно обойти, применив составной оператор.

Условные операторы могут быть также "вложены" друг в друга, а также содержать сложные условия, составленные с помощью логических операций (not, or, and, xor).

Например:

условие принадлежности x интервалу 0≤x≤3 будет иметь вид (x>=0) and (x<=3);

условие не принадлежности x интервалу будет иметь вид (x<0) or (x>3).

Пример: решить квадратное уравнение с коэффициентами a, b и c с точностью 0.1.

Var a, b, c, d, x1, x2 : Real;

Begin

Write ('Введите коэффициенты a, b и c: ');

Read (a, b, c);

d := Sqr (b) - 4 * a * c;

If d < 0 Then Writeln ('Корней нет.')

Else Begin

x1 := (-b - Sqrt (d)) / 2 / a;

x2 := (-b + Sqrt (d)) / 2 / a;

Writeln ('Корни уравнения ', x1:1:1, ' ', x2:1:1)

End;

End.

Контрольные вопросы:

1. Для чего используется условный оператор?

2. Какой вид имеет полная и сокращенная форма условного оператора?

3. Как работает условный оператор?

4. Назовите особенности записи сложных условий.

5. Что такое составной оператор?

Оператор варианта case … of


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

CASE выражение OF
константа1 : оператор1;
константа2 : оператор2;

ELSE операторN
END


Выполняется оператор так:

1) вычисляется значение выражения (оно может быть и просто переменной);
2) выполняется оператор, чья константа совпадает с вычисленным значением выражения;
3) если соответствующей константы не найдено, то выполняется оператор после служебного слова ELSE.

Как и для условного оператора, существует сокращенная форма оператора варианта (без ветви ELSE).

Вернемся к программе, которая будет выглядеть так:

Case i Of
1: Writeln ('Понедельник.');
2: Writeln ('Вторник.');
3: Writeln ('Среда.');
4: Writeln ('Четверг.');
5: Writeln ('Пятница.');
6: Writeln ('Суббота.');
7: Writeln ('Воскресенье.');


Else Writeln ('Вы ошиблись. Нет дня недели с таким номером.')

End;

Контрольные вопросы:

1. Для чего используется оператор варианта?
2. Какой вид имеет полная и сокращенная форма оператора варианта?
3. Как работает оператор варианта?

Оператор цикла с предусловием  while … do …


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

WHILE условие DO begin операторы цикла end;

Работает оператор так:
  1. проверяется условие продолжения цикла;
  2. если результат проверки условия - True, то выполняются операторы цикла, а затем управление опять передается на начало оператора WHILE;
  3. если результат проверки условия - False, то происходит выход из цикла.

Например, необходимо подсчитать сумму некоторого количества чисел, вводимых с клавиатуры. Для ввода очередного числа с клавиатуры будем использовать процедуру Readln(x), которую будем выполнять в цикле с предусловием n раз. Сумму чисел получим с помощью формулы накопления суммы, описанной на стр. 9.

Program Summa_n;
Var x,s: Integer;


i,n: Integer;

Begin
Write
('Сколько чисел будем вводить? ‘); Readln(n);
i :=
1; {начальное значение счетчика}
While i <= n do begin
   Write
('число ', i:2, ' = '); Readln(x);
   s:=s+x;
   Inc(i); {равносильно выражению i:=i+1;}
end;
Writeln ('сумма ', n:2, ' чисел = ',s);
Readln;
End.


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

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

Контрольные вопросы:

1. Для чего используется оператор цикла с предусловием?
2. Какой вид имеет оператор цикла с предусловием?
3. Как работает цикл While?
4. Каковы особенности цикла While?

Оператор цикла с постусловием repeat … until …


Наряду с оператором цикла WHILE существует и другой вид цикла - цикл с постусловием:

REPEAT операторы цикла UNTIL условие;

Работает он следующим образом:
  1. выполняются операторы тела цикла;
  2. проверяется условие выхода из цикла;
  3. если результат проверки условия - True, то происходит выход из цикла, если - False, то управление передается на начало цикла.

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

Program Summa_n;
Var x,s: Integer;


i,n: Integer;

Begin
Write
('Сколько чисел будем вводить? ‘); Readln(n);
i :=
1; {начальное значение счетчика}
Repeat
   Write
('число ', i:2, ' = '); Readln(x);
   s:=s+x;
   Inc(i); {равносильно выражению i:=i+1;}
Until i > n;
Writeln ('сумма ', n:2, ' чисел = ',s);
Readln;
End.


В отличие от While, при использовании нескольких операторов в цикле Repeat нет необходимости использовать операторные скобки - их роль выполняют ключевые слова Repeat и Until.

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

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

Контрольные вопросы:

1. Для чего используется оператор цикла с постусловием?
2. Какой вид имеет оператор цикла с постусловием?
3. Как работает цикл Repeat?
4. Что общего и чем отличаются друг от друга циклы While и Repeat?

Оператор цикла с параметром for…to…do и for…downto…do


Иногда нужно выполнить многократные действия с известным числом повторений. Например, вычислить факториал (факториалом числа N называется произведение N!=1*2*3*...*N). Для организации подобных вычислений используется оператор цикла с параметром:

FOR переменная := значение1 TO значение2 DO begin операторы цикла end;

или

FOR переменная := значение1 DOWNTO значение2 DO begin операторы цикла end;

Работает цикл FOR так:
  1. переменной (параметр цикла) присваивается значение1(начальное значение);
  2. определяется значение2 (конечное значение);
  3. если значение1 больше (для TO) или меньше (для DOWNTO) значения2, то происходит выход из цикла;
  4. выполняются операторы цикла;
  5. значение переменной увеличивается на 1 (для TO) или на -1 (для DOWNTO);
  6. управление передается на начало цикла.

Пример программы, вычисляющей факториал числа N:

Program Factorial;
Var I, N, F: Integer;
Begin
Write
('N='); Read(N);
F:=
1; {начальное значение}
For I:=
1 To N do F:=F*I;
Writeln
(N,'!=',F);
End.


Как и в случае с циклом While, цикл For может не выполниться ни разу, если значение1 больше (для TO) или меньше (для DOWNTO) значения2.

Еще одно сходство с While. Если внутри цикла необходимо выполнить несколько операторов, то нужно воспользоваться операторными скобками.

Вложенные циклы


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

Контрольные вопросы:

1. Для организации каких вычислений используется оператор FOR?
2. Какой вид имеет оператор цикла с параметром?
3. Как работает оператор цикла с параметром?
4. В чем сходство и в чем различие оператора FOR и операторов WHILE и REPEAT?


5. Как организован вложенный цикл?

Массивы данных. Ввод и вывод массивов


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

Var A: array [1..6] Of Integer;
B: array [
1..3,1..4] Of Real;

Здесь array - служебное слово языка, обозначающее массив.

При выполнении такой программы в памяти компьютера будет отведено место для хранения данных. Графически такие массивы будут иметь вид:







1

2

3

4

5

6

A

1




























1

2

3

4

B

1













2













3
















Для обращения к любому элементу одномерного массива необходимо указать:

A[i] где: A – имя массива; i – номер элемента массива (индекс).

Для обращения к любому элементу двумерного массива необходимо указать:

B[i,j] где: B – имя массива; i – номер строки элемента массива; j – номер столбца элемента массива.

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

Для одномерного массива необходим один цикл. Например, для массива Mas, объявленного в разделе описания переменных: Mas : array [1..10] of real; цикл имеет вид:

for i:=1 to 10 do

begin

write (‘элемент ’,i,’=’); readln (Mas[i]);

end;

Тело цикла — собственно оператор ввода очередного элемента массива. Для удобства пользования программой целесообразно использовать «подсказку» если перед оператором readln записать оператор вывода на экран информации об индексе очередного элемента. В ответ на «подсказку» пользователь должен набрать на клавиатуре значение элемента и нажать Enter. При этом значение присваивается элементу массива c индексом i.

Для заполнения двумерного массива используют вложенные циклы. Например, для массива Mas произвольных чисел (4 строки, 7 столбцов), объявленного в разделе описания переменных: Mas : array [1..4,1..7] of integer; цикл можно записать в форме:

for i:=1 to 4 do

for j:=1 to 7 do

begin

write (‘элемент ’,i,’,’,j,’=’); readln (Mas[i,j]);

end;

Тело внутреннего цикла, как и в предыдущем примере, представляет собой ввод очередного элемента с расширенной «подсказкой».

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

Например, для вывода массива Mas из 10 элементов цикл организуется так:

for i:=1 to 10 do writeln (‘элемент ’,i,’=’,Mas[i]);

Тело цикла — собственно оператор вывода с указанием имени очередного элемента массива:

Двумерный массив для наглядности всегда выводится в виде матрицы. Для этого в программе нужно организовывать вложенный цикл. Например, для вывода массива Mas из 4 строк и 7 столбцов эта часть программы выглядит так:

for i:=1 to 4 do begin

for j:=1 to 7 do write (Mas[i,j]:4);

writeln;

end;

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

Const mas: array[1..6] of integer = (7,-2,3,5,12,9);

Такой массив можно использовать как обычный, но нельзя изменять.

Решение задач с одномерными массивами


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

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

Задача. Написать программу, которая вводит с клавиатуры одномерный массив из 10 целых чисел и выводит количество ненулевых элементов.

var

Mas : array [1..10] of integer;

n : integer; { кол-во ненулевых эл-тов }

I : integer; { индекс }

begin

writeln('Ввод массива целых чисел.');

for i:=1 10 do

begin

write (‘элемент ’,i,’=’);

readln (Mas[i]);

if Mas[i] <> 0 then n:=n+1;

end;

writeln('В массиве ', n ,' ненулевых элемента.');

readln;

End.

Задача. Написать программу, которая выводит минимальный элемент массива целых чисел, заданных случайным образом из интервала от –10 до +10..

var

Mas : array [1..10] of integer;

i, min : integer; { индекс и минимальный элемент массива }

Begin

writeln('Поиск минимального элемента массива.');

randomize; {инициализируем генератор случайного числа}

for i:=1 10 do

begin

Mas[i]:=Round(random*20 -10);

writeln(‘элемент ’,i,’=’,Mas[i]);

end;

min:=Mas[1]; {предположим, что первый эл-т минимальный }

{сравним оставшиеся эл-ты массива с минимальным }

for i:=2 to 10 do if Mas [ i ] < min then min : = Mas [ i ] ;

writeln('Минимальный элемент массива: ',min);

readln;

end.


Задача. Написать программу, которая методом обмена ("пузырька") сортирует по возрастанию введенный с клавиатуры одномерный массив.

var

Mas : array [1..10] of real;

i, k : integer; {индексы}

buf : real; {временная переменная}

Begin

writeln('Заполнените массив:');

for i:=1 10 do begin

write(‘элемент ’,i,’=’); readln(Mas[i]);

end;

for i:=1 to 9 do {циклы сортировки массива}

for k:=1 to 9 do begin

if Mas[k]>Mas[k+1] then begin { поменяем k-й и k+1й эл-ты }

buf:=Mas[k] ;

Mas[k]:=Mas[k+1];

Mas[k+1]:=buf;

end;

end;

writeln;

writeln('Массив отсортирован!');

for k:=1 to 10 do write(Mas[k]:2:1,' '); {цикл вывода массива}

readln;

End.

Решение задач с двумерными массивами


Обработка двумерных массивов почти всегда реализуется с применением вложенных циклов. В приведенной задаче используется в основном двумерный массив из 4 строк и 7 столбцов, который в разделе описания переменных объявлен как Mas : array [1..4,1..7] of integer;.

Задача. Написать программу, которая вводит по строкам с клавиатуры двумерный массив и вычисляет сумму его элементов по столбцам.

program sum_of_poles { сумма столбцов двумерного массива };

var

mas :array [1..4,1..7] of integer;

i,j,s :integer;

begin

for i:=1 to 4 do

for j:=1 to 7 do begin

write (‘элемент ’,i,’,’,j,’=’);

readln (mas[i,j]);

end;

for j:=1 to 7 do begin

s:=0;

for i:=1 to 4 do s:=s+mas[i,j];

writeln(‘сумма ’, j ,’ столбца = ’,s );

end;

end.

Контрольные вопросы:

1. В каких случаях целесообразно использовать массивы?
2. Что такое массив?
3. Как описать переменную типа массив?
4. Как обращаться к элементам массива?
5. С помощью каких конструкций удобно работать с массивами?
6. Что такое сортировка массивов. Какой способ сортировки вы знаете?

Строковый тип string


Строковый тип описывается с помощью зарезервированного слова string. В каком-то смысле строковая переменная является массивом символов Char (см. стр. 7). Пример описания строковой переменной:

var S: string[4]:

Целое число в квадратных скобках задает максимальную длину строки. Это атрибут длины строковой переменной. В данном примере максимальная длина переменной S равна 4, поэтому присваивание значения большей длины будет ошибочным.

Максимальная длина строки составляет 255 символов. Эта длина назначается строковой переменной по умолчанию (автоматически), если параметр длины не указан вовсе. Таким образом, предложение:

var S: string;

описывает переменную S как строку длиной до 255 символов.

Операции над строками


К строкам можно применять операцию конкатенации, которая обозначается знаком «плюс». Конкатенация — это объединение строк:

S1 := 'AВС';

S2 := S1 + 'DEF';

Результатом такой последовательности операторов будет строка 'ABCDEF'.

В Паскале имеется набор процедур и функций для работы со строками.

Функция Length(str) определяет длину аргумента str строкового типа. Результатом работы функции является число символов в строке.

Процедура Delete(str, start, n) используется для того, чтобы удалить n символов в строковой ременной str, начиная с позиции start. Например, последовательность операторов:

abra := '123abcde4567890';

Delete(abra, 4, 5),

даст результат abra = '1234567890'.

Процедура Insert служит для вставки одной строки в другую. Чтобы вставить строку (константу или значение строковой переменной) str1 в строковую переменную str2, начиная с позиции start, данную процедуру следует вызвать следующим образом: Insert(str1, str2, start). Например, последовательность операторов:

digits := '1237890';

Insert('456', digits, 4);

даст результат digits = '1234567890'.

Функция Copy(str, start, n) копирует п символов строки str, начиная с позиции start. Значение функции Copy можно присвоить другой строковой переменной. Например:

str := Copy('1234567xyzw890', 8, 4);

даст результат str = 'xyzw'.

Функция Pos(substr, str) позволяет найти начальную позицию подстроки substr в строке str. Например: Pos(' F(x) ', 'Let F(x) = 2х' ) будет равно 5. Значение Pos равно нулю, если подстрока не встретилась в строке.

Процедура Str(num, strnum) для преобразования числового значения в строковый;

где num — значение числового типа, a strnum — переменная строкового типа.

Процедура Val выполняет преобразование строкового значения в числовой. Обращение к ней имеет вид: Val (strnum, num, errcode);

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

Контрольные вопросы:

1. Что такое строковый тип?
2. Как описать переменную строкового типа?
3. Как обращаться к символам строки?
4. Какие операции определены для строкового типа?
5. Какие имеются стандартные функции и процедуры для работы со строками?

Графика


Приступая к решению задач этого раздела, следует вспомнить, что:
  • в графическом режиме экран представляет собой совокупность точек, каждая из которых может быть окрашена в один из 16 цветов;
  • координаты точек возрастают слева направо и сверху вниз, левая верхняя точка имеет координаты (0,0), а правая нижняя - (639,479);
  • для того чтобы программа могла выводить на экран графические примитивы (линии, окружности, прямоугольники), необходимо инициализировать графический режим.

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

Шаблон программы с инициализацией графического режима выглядит следующим образом:

uses Graph, Crt; {подключаем графический модуль}

var

grDnver : Integer;

grMode :Integer;

begin

grDnver := detect;

InitGraph (grDnver, grMode,'с:\tp7\bgi');


{сюда следует поместить основные инструкции решения задачи}

readln;

CloseGraph;

end.

Функции


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

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

Описание подпрограммы-функции должно располагаться в разделе описаний, то есть между заголовком программы и словом begin. Описание подпрограммы-функции начинается с заголовка, который имеет вид:

function name_of_function (parameters: type ): type_of_result;

Здесь type_of_result — тип результата, выдаваемого функцией. Parameters — параметры, использующиеся для передачи данных в подпрограмму-функцию. После parameters следуют через двоеточие тип передаваемых данных. Parameters может отсутствовать.

Внутренняя структура подпрограммы-функции аналогична структуре программы, то есть сначала в ней идут описания констант, переменных и так далее, а затем, после зарезервированного слова begin — исполняемые операторы. Завершается подпрограмма-функция зарезервированным словом end, но за ним следует не точка, а символ «точка с запятой». В теле подпрограммы-функции должен присутствовать оператор присваивания, в левой части которого указано имя самой подпрограммы-функции, а в правой находится значение результата функции.

Пример. Функция вычисления факториала числа n.

function factorial (n: byte): longint;

var

fact : longint;

i : byte;

begin

fact := n;

for i := n-1 downto 2 do fact := fact * i;

factorial := fact;

end;

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

part:=Sqr(t)/factorial(i);

В этом операторе:

Sqr(t) - вызов стандартной функции возведения в квадрат с фактическим параметром t;

factorial(i) - вызов функции, вычисляющей факториал с фактическим параметром i.

Процедуры


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

Процедура начинается заголовком procedure, имеет разделы описаний и операторов и завершается словом end. Заголовок процедуры имеет следующий вид:

procedure name_of_procedure (parameters: type);

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

Пример. Процедура ввода n целых чисел.

Пусть в основной программе определен следующий массив:

mas = array[1..10] of integer;

Процедура может иметь вид:

Procedure inpmas(var m: integer);

var i: integer; {локальный параметр - параметр цикла}

begin

Writeln ('введите ', m, ' целых чисел');

For i := 1 to m do Read(mas[i]);

end;

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

Например: inpmas(k); Означает, что вызывается процедура inpmas для ввода k целых чисел в массив mas. Естественно, что в этом случае параметр k целого типа.

Область видимости идентификаторов

Мы уже знаем, что функции и процедуры имеют собственные разделы описаний. Все переменные (и прочие объекты, используемые в программе), описанные в подпрограмме, являются локальными и действуют только внутри этой подпрограммы. Никакой связи между ними и объектами вызывающей программы, имеющими (возможно, случайно) такие же имена (идентификаторы), нет. Они полностью независимы. С другой стороны, в подпрограмме можно использовать переменные, описанные только в основной программе. Такие переменные называются глобальными. Область действия конкретной переменной называется еще её областью видимости.

Контрольные вопросы:
  1. Что такое подпрограммы?
  2. Можно ли подпрограммы, написанные для решения данной задачи, использовать при решении других задач, где их применение было бы целесообразно?
  3. Какие параметры называют формальными? фактическими?
  4. Может ли фактических параметров процедуры (функции) быть больше, чем формальных? А меньше?
  5. Существуют ли подпрограммы без параметров?
  6. В каком разделе объявляются и реализуются подпрограммы?
  7. В чём состоит отличие процедур и функций?
  8. В каких случаях целесообразно использовать функции?
  9. Какого типа может быть значение функции?

Работа с файлами


В Паскале имеются три класса файлов: текстовый файл, типизированный файл и нетипизированный файл. Начнем с текстовых файлов.

Текстовый файл содержит последовательность символов, организованных в строки, причем каждая строка заканчивается специальным символом возврата каретки CR=#13 и перевода строки LF=#10. Заканчивается текстовый файл признаком конца файла. Работу с текстовыми файлами обеспечивает модуль System Паскаля. В Паскале имеется стандартный файловый тип text. Прежде чем приступить к операциям над файлами, необходимо ввести переменную типа text для текстового, или типа file для типизированного файлов.

var my_file : text;

out_file : file;

Переменная in_file сопоставляется внешнему файлу на диске процедурой assign:

assign(my_file, 'c:\temp\input.txt');

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

Следующий шаг заключается в том, что внешний файл надо открыть для записи или чтения из него какой-то информации. Существующий файл открывается процедурой Reset(my_file) и создается новый текстовый файл процедурой Rewrite(my_file).

После завершения работы с файлом он должен быть закрыт, иначе вся записанная в него информация будет потеряна! Закрывается файл с помощью процедуры Close(my_file).

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

Read(in_fi1e, а, x);

Writeln(out_file, 'Urgent message!');

Первая процедура присваивает a и x значения очередных двух элементов из in_file. Вторая процедура записывает текст Urgent message! в out_file.

Текстовый файл может использоваться для хранения численных значений. При считывании значений или их записи в файл происходит автоматическое преобразование из числового формата в символьный и наоборот.

Решим следующую задачу: "Написать программу, которая вводит с клавиатуры список фамилий учащихся, а затем распечатывает его, кроме тех учащихся, у которых фамилия начинается с буквы 'Ш'".

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

Var

I,N : Integer;
F : File Of String;
S : String;


Begin

Assign(F,'Spis.lst'); {связываем переменную F с файлом Spis.lst}
Writeln
('Введите количество учащихся'); Readln(N);
Rewrite
(F); {создаем файл для записи в него данных}
For I:=
1 to N do begin

Writeln('Введите фамилию'); Readln(S);
Write
(F,S)

end;
Close
(F);
Reset
(F);
Writeln; Writeln
('Список учащихся:');
While Not
(Eof(F)) do begin {продолжаем пока не конец файла}
  Read
(F,S);
   If S[
1]<>'Ш' then Writeln(S)

end;
Close
(F)

End.

Процедуры и функции для работы с файлами


procedure Append(var f: File) - открывает существующий файл, связанный с файловой переменной f, для добавления в него новых записей.

procedure Assign(var fString) - связывает внешний файл, имя которого указано в строковой константе String, с файловой переменной f.

procedure BlockRead(var f: Filevar BufCount: Word) - считывает из нетипизированного файла, связанного с файловой переменной f, одну или несколько записей (их количество задается целочисленным выражением Count) в переменную Buf.

procedure BlockWrite(var f: File; var BufCount: Word) - записывает в нетипизированный файл, связанный с файловой переменной f, одну или несколько записей (их количество задается целым выражением Count) из переменной Buf.

procedure Close(var f) - закрывает открытый файл, связанный с файловой переменной f.

procedure Erase(var f) - стирает внешний файл, связанный с файловой переменной.

procedure Read(var f: text; v1, ...) - считывает одно или несколько значений из файла, связанного с файловой переменной f, в одну или несколько переменных v1...

procedure Rename(var fs) - переименовывает внешний файл, связанный с файловой переменной f, присваивая ему имя, содержащееся в строковой переменной s.

procedure Reset(var f) – открывает существующий файл, связанный с файловой переменной f. Текущий указатель устанавливается в начало файла. Текстовый файл открывается только для чтения.

procedure Rewrite(var f) – создает и открывает новый файл, связанный с файловой переменной f. Если файл с указанным именем уже существует, старый файл будет стерт, а на его месте создается новый пустой файл. Текущий указатель устанавливается в начало файла.

procedure Write(var f: textvl, ...) - записывает в файл, связанный с файловой переменной f, одно или несколько значений, хранящихся в переменных vl... Файловая переменная может быть связана не только с текстовым файлом. В случае текстового файла значения могут иметь целый, вещественный, строковый, символьный или булев типы. Procedure Writeln(var f: textvl, ...) - делает то же, что Write, но затем записывает в текстовый файл признак конца строки.