35499

Основы алгоритмизации и программирования

Конспект

Информатика, кибернетика и программирование

ЧИСЛА Целые числа: SHOPTINT – 120127 BYTE 0 – 255 перечисляемые типы INTEGER – 32768 32767 WORD 0: 65535 LONCINT – 231 231 Действительные: SINGLE 1038 7 знаков после запятой REAL 1038 11 знаков DOUBLE 100300 19 знаков EXTENDED 104900 19 знаков. USES список библиотек; – подключение библиотек или модулей TYPE описание; –описание собственных типов данных CONST – список постоянных VAR – список переменных BEGIN – начало программы END. – конец программы Обязательными элементами являются только PROGRAM BEGIN END. PROGRAM FIRST;...

Русский

2013-09-15

495.5 KB

1 чел.

Министерство Образования Российской Федерации

Канашский Педагогический Колледж

Конспект по предмету:

«Основы алгоритмизации и программирования»

Выполнила: студентка 302 группы

Табакова Анжелика

Проверила: преподаватель

Фомин А. А.

г. Канаш, 2010


Содержание:

Алгоритм. 

Язык Pascal.

Вывод данных (запрос данных).

Составной оператор или операторные скобки.

Оператор циклов.

Определение функции. Общий вид определения функции.

Процедуры.

МассивыОпределение массивов в языке PASCAL.

Заполнения массивов.

Обработка массивов.

Совместная работа с несколькими массивами.

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

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

Функция работа с файлами (продолжение).

Использование файлов.

Типизированные файлы.

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

Строковые переменные (символьные).

Обработка строковых переменных.

Решение задач

Работа с графикой.

Построение движущегося изображения.

Управление движением объекта на экране.

Построение векторного изображения с помощью языка PASCAL. 

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

Объектно-ориентированное программирование.

Применение объектно-ориентированного программирования в решении задач.

Структура из объектов.

Диапазоны.

Решение задач с диапазонами.

Модули (библиотеки).

Разработка модулей.

Функциональный тип данных.

Динамические переменные (указатели).

Динамические списки.

Двумерный массив.

Рекурсия.

Алгоритм.

– это строго определённая последовательность действий, приводящая к решению поставленной задачи или порядок выполнения действий.

Шесть основных действий:

  1.  понятность (исполнительность);
  2.  выполнимость;
  3.  конечность;
  4.  результативность;
  5.  дискретность (алгоритм разбивается на определённые действия);
  6.  массовость (получение результата независимо от исполнения).

Пример написания алгоритма:

  1.  запросить значения переменной – запрос x, y;
  2.  сообщить значения переменной – сообщить А;
  3.  переменная x ровняется значению ax:=a;
  4.  если условие, то действие 1 иначе действие 2 – если x=y то x:=4 иначе y:=5
  5.  начало, конец.

Язык Pascal.

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

  1.  ЧИСЛА
    1.  Целые числа:

SHOPTINT – 120+127

BYTE 0 – 255 перечисляемые типы

INTEGER – 32768 +32767

WORD 0: 65535

LONCINT – 231 +231

  1.  Действительные:

SINGLE ±10±38, 7 знаков (после запятой)

REAL ±10+38, 11 знаков

DOUBLE ±100±300, 19 знаков

EXTENDED ±10±4900, 19 знаков.

  1.  ЛОГИЧЕСКИЕ ТИПЫ – переменные логического типа могут  иметь только два значения:

TRUE – истина

FALSE – ложь

BOOLEAN

  1.  СИМВОЛЬНЫЕ ТИПЫ ДАННЫХ
    1.  CHAR – значение переменной один символ
      1.  STRING – строка символов
  2.  МАССИВ

ARRAY [размер] OF тип

  1.  СТРУКТУРНЫЕ ТИПЫ ДАННЫХ
    1.  RECORD – запись
      1.  OBJECT – объект

Определить типы переменных для вычисления следующих значений

  1.  Количество студентов сдавших экзамен (BYTE)
  2.  Значение функции y=sin x*x2(REAL)
  3.  Среднее значение количества студентов в группах отделения информатики (REAL)
  4.  Количество планет в звездных системах (BYTE)

Структура программ.

PROGRAM имя;

Имя – название программы.

Может не совпадать с именем сохраняемого файла.

Ограничения на имя программы:

  1.  Состоит из латинских букв и цифр
  2.  Первая обязательно должна стоять буква
  3.  Имя программы должно быть уникальным.

USES список библиотек; – подключение библиотек или модулей

TYPE описание; –описание собственных типов данных

CONST – список постоянных

VAR – список переменных

BEGIN – начало программы

END. – конец программы

Обязательными элементами являются только PROGRAM, BEGIN, END. Остальные по мере необходимости.

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

VAR имя: тип;

Примеры:

VAR KOLST: BYTE;

VAR A, B, C, D: REAL;

Арифметические Действия

+ - * /

DIV 5=2

MOD – вычисление остатка от целого деления

9 MOD 4=1 (используется для определения кратности чисел)

9 MOD 3=0

PI=3.141519

SIN(X) – в радианах

COS(X) – в радианах

ARCTAN (A)

X°=X*PI/180 радиан

SIN 12°=SIN (12*PI/180)

SQR(X) =X2

SQRT(X) =√X

EXP(X) =Ex

LN X=LN(X)

Xn=EXP (N*LN (X))

EX=EXP(X)

Операторы языка ПАСКАЛЬ

  1.  

Присвоение значения переменной

Переменная должна быть определена, значение – число или вычисление (формула).

Пример№1:

X: =4, 8; Y: =X*SIN(X);

X: =X+1;

X: =2; X: =X*2;

  1.  Вывод на экран значения переменной, текста

WRITE (переменные, текст); – в строку

WRITELN (переменные, текст); – в столбец

Пример№2:

WRITELN (‘привет ’);

WRITELN (X, Y, Z);

WRITELN (‘количество’, KOL);

Задача №1

Написать программу, вычисляющую значение функции Y=SIN AO+COS BO ПРИ A=15, B=14.

PROGRAM FIRST;

CONST A=15; B=14;

VAR Y: REAL;

BEGIN

Y: =SIN (A*PI/180) +COS (B*PI/180);

WRITELN (‘Y=’, Y: 6:4);

END.

Вывод данных (запрос данных).

READ (список переменных);

READLN (список переменных); – обязательное нажатие на ENTER по окончанию ввода данных.

При выполнение команды READ или  READLN никакие сообщения на экран не выдаются, то есть для пояснения перед командой READ обычно используется WRITE для вывода на экран «подсказки». Вводимые данные разделяются пробелом.

Задача №1

Написать программу определяющий количество байт в Х Килобайтах.

PROGRAM KOLVO;

CONST K=1024;

VAR X, KOLB: REAL;

BEGIN

WRITE (‘СООБЩИТЕ КОЛИЧЕСТВО КБАЙТ’); READLN(X);

KOLB: =K*X;

WRITELN (‘KOL=’, KOLB: 10:1);

END.

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

Составной оператор или операторные скобки.

Составной оператор – это несколько операторов, выполняемых вместе.

BEGIN

оператор1;

оператор2;

………….;

END;

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

Оператор выбора действий (Если …то ... иначе)

IF логическое выражение THEN оператор 1 ELSE оператор 2 (ELSE не обязательно).

Логические выражения состоят из:

  1.  условий: >, <, =, < >, >=, <=.

x>a; A=0

  1.  AND, OR, NOT, XOR

(X>2) AND (A<5); (X<2) OR (X>5)

  1.  Переменные типа BOOLEAN

X: =A>B

Оператор 1 –– оператор, который выполняется, если логическое выражение равняется истине.

Оператор 2 –– оператор, который выполняется, если логическое выражение равняется  ложь.

Оператор 1 и оператор 2 могут быть составными операторами( или операторными скобками).

Задача №1

Написать программу, запрашивающую значения двух переменных – A, B и выводящую на экран значения большой переменной или сообщение ‘переменные равны’.

PROGRAM BIG;

VAR A, B: REAL;

BEGIN

WRITE (‘сообщите A, B’); READLN (A, B);

IF A>B THEN WRITELN (‘A’);

IF B>A THEN WRITELN (‘B’);

IF A=B THEN WRITELN (‘A=B’);

END.

Задача №2

Написать программу, определяющую, какая из функций Y=SIN X или Z=COS X имеет большее значение при одном и том же X. Если функции равны, вывести на экран сообщение ‘функции равны’.

PROGRAM NAITI;

VAR X, Y, Z: REAL;

BEGIN

WRITE (‘сообщите X’); READLN(X);

Y: = SIN(X); Z: =COS(X);

IF Y>Z THEN WRITELN (‘синус больше’, Y);

IF Z>Y THEN WRITELN (‘косинус больше’, Z);

IF Y=Z THEN WRITELN (‘переменные равны’);

END.

Задача №3

Написать программу, определяющую корни квадратного уравнения.

PROGRAM KVADYR;

VAR X1, X2, A, B, C, D: REAL;

BEGIN

WRITE (‘сообщите A, B, C’); READLN (A, B, C);

D: =B*B-4*A*C;

IF D>=0 THEN BEGIN

X1:=(-B-SQRT (D))/ (2*A);

X2:=(-B+SQRT (D))/ (2*A);

WRITELN (‘КОРНИ УРАВНЕНИЯ =’, X1:10:3, X2:10:3);

END ELSE WRITELN (‘КОРНЕЙ НЕТ’);

END.

   Перед ELSE;” не ставиться.

Оператор циклов.

Циклические алгоритма – это алгоритмы, в которых организован повтор действий в зависимости от условия.

Три вида:

  1.  фиксированное количество шагов
    1.  предварительное условие
      1.  пост условие.

I. Фиксированное количество шагов.

FOR переменная: = начальное значение TO конечное значение DO оператор;

  Перечисляемый тип (целый, CHAR, BOOLEAN)

ШАГ=1 TO

ШАГ=-1 DOWNTO

Если начальное меньше конечного следует TO

Если начальное больше конечного следует DOWNTO

Оператор – 1оператор или BEGIN…….END;

Задача №1

Написать  программу, запрашивающую значение переменной X 12 раз и выводящую на экран значения Y=X2.

PROGRAM XVKVADRATE;

VAR X, SCET: BYTE; Y: WORD;

BEGIN

FOR SCET: =1 TO 12 DO BEGIN

WRITE (‘сообщите X’); READLN(X);

Y: =X*X;

WRITELN (‘X в квадрате =’, Y);

END;

END.

Задача №2

Написать программу 10 раз запрашивающую значение переменных X1,X2 и выводящую на экран сумму ведённых переменных.

PROGRAM SUMMA;

VAR X1, X2, SCET: BYTE; S: WORD;

BEGIN

FOR SCET: =1 TO 10 DO BEGIN

WRITE (‘сообщите X1, X2’); READLN(X1, X2);

S: =X1+X2;

WRITELN (‘сумма введенных переменных =’, S);

END;

END.

II. Циклический алгоритм предложения

Цикл с пред условием – цикл, в котором проверка предложения происходит перед началом цикла.

ЕСЛИ условие повтора ТО повторять список действий;

WHILE условие повтора DO оператор;

Условие повтора условие при котором цикл выполняется.

Оператор – один оператор или BEGIN…….END;

Количество повторов цикла заранее не определяется, цикл выполняется, пока выполняется условие. Переменные цикла – нет.

Пример№1: Записать с помощью оператора WHILE цикл: FOR X: =1 TO 10 DO WRITELN(X*X);

X: =1;

WHILE X < 10 DO

BEGIN

WRITELN (X*X); X: =X+1;

END;

III. Пост условие – повторение действий определяется условием в конце цикла.

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

REPIAT список операторов

UNTIL условие завершения;

Количество повторов заранее не определяется, переменная цикла отсутствует.

Пример№2: Записать с помощью оператора REPEAT цикл FOR X: =1 TO 10 DO WRITELN(X*X);

X: =1;

REPEAT

WRITELN(X*X);

X: =X+1;

UNTIL X>10;

Задача №3

Написать программу, запрашивающую значение переменной X. Значение переменной X не должно равняться 0. Программа запрашивает X до тех пор, пока X не станет отличаться от нуля.

PROGRAM XNOTZERO;

VAR X: REAL;

BEGIN

REPEAT

WRITE (‘X=?’); READLN(X);

UNTIL X<>0;

END.

Задача №4

Написать программу, запрашивающую пароль до тех пор, пока не напишет верный пароль.

PROGRAM PAROL;

VAR PASS, TRUEPASS: STRING [10];

BEGIN

TRUEPASS: =’DER PAROL’;

REPEAT

WRITE (‘VVEDITE PAROL’); READLN (PASS);

IF PASS<>TRUEPASS THEN WRITELN (‘NE VERNO’);

UNTIL PASS=TRUEPASS; END.

Оператор WRITELN и REPEAT используются если:

  1.  невозможно определить количество шагов (повторов)
  2.  шаг имеет не целое значение
  3.  выполнение действий зависимости от условий.

Задача №5

Написать программу, выводящую на экран таблицу значений Y=SIN(X), X Є [-PI;+PI]. Шаг изменений X=PI/10.

PROGRAM TABL;

VAR X, Y: REAL;

BEGIN

X: =-PI;

WHILE X<=PI DO BEGIN

Y: =SIN(X);

WRITELN (‘X=’, X: 6:3, ‘Y=’, Y: 7:4);

X: =X+PI/10; END;

END.

То же самое с помощью REPEAT.

PROGRAM TABL;

VAR X, Y: REAL;

BEGIN

X: = -PI;

REPEAT

Y: =SIN(X);

WRITELN (‘X=’, X: 6:3, ‘Y=’, Y: 7:4);

X: =X+PI/10;

UNTIL X>PI;

END.

Задача №6

Написать программу, определяющую среднее значение элементов последовательности. Элемент последовательности – N элементов вычисляется по формуле: AN=N2/(N+2). Программа должна:

1. Запросить количество элементов последовательности.

2. Вывести на экран элементы с первого по последний.

3.Рассчитать среднее значение.

PROGRAM SRZN;

VAR K, N: BYTE; AN, S, SR: REAL;

BEGIN

WRITE (‘KOL-VO ELEMENTOV-?’); READLN (K);

FOR N: =1 TO K DO BEGIN

AN: =N*N/ (N+2);

WRITELN (‘ELEMENT’, N,’=’, AN: 8:2);

END;

S: =0;

FOR N: =1 TO K DO S: =S+N*N/(N+2);

SR: =S/K;

WRITELN (‘SR=’, SR);

END.

Задача №7

Написать программу, определяющую при каком значении N(N – номер элемента) значение элемента An>M и вычисляется по формуле An=2n/(n-4).

PROGRAM VICHISLENIE;

VAR M, N: BYTE; AN: REAL;

BEGIN

WRITE (‘VVEDITE M’); READLN (M);

N: = 1;

REPEAT

AN: =EXP (N*LN (2))/ (N-4);

WRITELN (‘ELEMENT ’, N,’=’, AN);

N: =N+1;

UNTIL AN<M;

END.

Определение функции. Общий вид определения функции.

Определение функции делается в начале программы: до или после описания переменных.

FINCTION имя (список аргументов): тип;

VAR внутренние переменные;

BEGIN

Вычисления;

Имя:= значение;

END;

В «теле» функции, имя функции должно получить, какое-либо значение.

Список аргументов и описаний внутренних переменных могут отсутствовать.

Пример: описать функцию TG(X).

FUNCTION TG(X: REAL): REAL;

BEGIN

TG: = SIN(X)/COS(X);

END;

Использование функций, вычисляемое с помощью функции, значение можно:

1. вывести на экран

2. присвоить какой-либо переменной

3. использовать для вычисления.

Задача №1

Написать программу, вычисляющую значение функций Y:=EXP (1/3*LN(X)) X Є [1; 25]. Шаг равен 1.

PROGRAM FKKUB;

FUNCTION FKUB(X: REAL): REAL;

BEGIN

KKUB: = EXP (1/3*LN(X));

END;

BEGIN

X: =1;

REPEAT

Y: =KKUB(X);

WRITELN(Y: 6:2); X: =X+1;

UNTIL X>25;

END.

Задача №2

Написать функцию для вычисления S=1+2+3+…+N.

FUNCTION SUM (N: BYTE): WORD;

VAR S: WORD; X: BYTE;

BEGIN

S: =0;

FOR X: =1 TO N DO S: =S+X;

SUM: =S;

END.

Поиск решения уравнения методом деления пополам.

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

  1.  Описание функции
    1.  Запросит A, B
      1.  Повторять

C :=( A+B)/2;

ЕСЛИ F(C)*F(A)<0 ТО B:=C ИНАЧЕ A: =C

ЗАКОНЧИТЬ ЕСЛИ |F(C)| <0.01

  1.  Сообщить С.

PROGRAM FUNC;

FUNCTION F(X: REAL): REAL;

BEGIN

F(X):=ЗАПИСАТЬ УРАВНЕНИЕ;

END;

VAR A, B, C: REAL;

BEGIN

WRITE (‘A=; B=?’); READLN (A,B);

REPEAT

C: = (A+B)/2;

IF F(C)*F (A) < 0 THEN B: =C ELSE A: =C;

UNTIL ABS (F(C)) < 0.01;

WRITELN (‘решение =’, C: 8:3);

END.

Задача №3

Вывести на экран значение суммы чисел 1+2+3…+N для N Є [1;10], т.к. в задаче требуется вычислить несколько сумм, определим функцию для вычисления суммы.

PROGRAM NSUMM;

FUNCTION SUMMA (N: BYTE): WORD;

VAR S: WORD; SL: BYTE;

BEGIN

S: =0;

FOR SL: =1 TO N DO S: =S+SL;

SUMMA: =S;

END;

VAR N: BYTE;

BEGIN

FOR N: =1 TO 10 DO

WRITELN (‘сумма для N=’, N, SUMMA (N)); READLN;

END.

Задача №4

Вывести на экран значение суммы чисел 1+2+3…+N для N Є [A;B], т.к. в задаче требуется вычислить несколько сумм, определим функцию для вычисления суммы.

PROGRAM NSUMM;

FUNCTION SUMMA (N: BYTE): WORD;

VAR S: WORD; SL: BYTE;

BEGIN

S: =0;

FOR SL: =1 TO N DO S: =S+SL;

SUMMA: =S;

END;

VAR N: BYTE;

BEGIN

FOR N: =A TO B DO

WRITELN (‘сумма для N=’, N, SUMMA (N)); READLN;

END.

Задача №5

Написать программу, определяющую наибольшую разницу между значениями функций F(X), где Х Є [A,B].

PROGRAM RAZ;

FUNCTION F(X: REAL): REAL;

BEGIN

F: =SQR(X);

END;

VAR A, B, X, DX, M, K, R: REAL; N: INTEGER;

BEGIN

WRITE (‘VVEDITE A, B’); READLN (A, B);

WRITE (‘VVEDITE KOLICHESTVO SHAGOV’); READLN (N);

DX :=( B-A)/N; X: =A; M: =F(X);

REPEAT

IF F(X)>M THEN M: =F(X);

X: =X+DX;

UNTIL X>B;

WRITELN (‘BOLSHOE ZNACHENIE M=’, M);

K: =F(X);

REPEAT

IF F(X) <K THEN K: =F(X);

X: =X+DX;

UNTIL X>B;

WRITELN (‘MENSHEE ZNACHENIE K=’, K);

R: =M-K;

WRITELN (‘OTVET’, R);

END.

Процедуры.

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

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

• для разбиения программы на отдельные блоки, что бы облегчить написание и понимание программы

• как функцию, вычисляющую не одно, а несколько значений

Общий вид описания процедуры:

PROCEDURE имя < (входные параметры; выходные параметры)>;

<FUNCTION... ;>

<VAR ... ;>

BEGIN

END;

Если    в    процедуре    есть    выходные    параметры,    то    им ОБЯЗАТЕЛЬНО   должны   быть   присвоены   значения!   Иначе,   при использовании процедуры, обращение к выходным параметрам может привести к непредсказуемым результатам!

Примеры описания процедур:

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

PROCEDURE SVEDENIE;

BEGIN

WRITELN ('AVTOROM PROGRAMMY YAVLYAETSYA TABAKOVA');

Пример№2: записать процедуру, вычисляющую сумму чисел от 1 до N и выводящую вычисленное значение. Процедура аналогична функции и содержит входной параметр—значение N, и вычисляемое значение S—сумма чисел. Вычисления производятся с помощью цикла, следовательно, потребуется переменная для организации цикла S1—слагаемое.

PROCEDURE SUMN (VAR N: BYTE; VAR S: INTEGER);

VAR SL: BYTE;

BEGIN

S: =0;

FOR SL: =L TO N DO S: =S+SL;

END;

Вызов процедур.

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

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

Пример№3: написать программу, вычисляющую сумму чисел от 1 до N. Использовать процедуру примера№2.

PROGRAM ZADACHA;

PROCEDURE SUMN (VAR N: BYTE; VAR S: INTEGER);

VAR SL: BYTE;

BEGIN

S: =0;

FOR SL: =L TO N DO S: =S+SL;

END;

VAR K: BYTE; SM: INTEGER; BEGIN

WRITE ('до сколки считать сумму?'); READLN (K);

SUMN (K, SM);

WRITELN ('CYММA=', SM);

END.

Задача№1. 

Написать программу, выводящую на экран сумму чисел от 1 до N,где N изменяется от 2 до8.

PROGRAM ZADACHA;

PROCEDURE SUMN (VAR N: BYTE; VAR S: INTEGER);

VAR SHBYTE;

BEGIN

S: =0;

FOR SL: =L TO N DO S: =S + SL;

END;

VAR N: BYTE; S: INTEGER;

BEGIN

FOR N: =2 TO 8 DO BEGIN

SUMN (N, S); WRITELN(S);

END;

END.

Массивы

– это нумерованный набор однотипных элементов. Каждый элемент массива определяется набором индексов – «координат».

Массив характеризуется:

  1.  имя – аналогично имени переменной (А_1);
  2.  тип элементов – любой доступный тип данных;
  3.  размерность – количество индексов необходимых для определения элемента в массиве.

Определение массивов в языке PASCAL.

  1.  Массивы определяются в блоке описания переменных – VAR;
  2.  общий вид описания массивов:

Имя: ARRAY [диапазон первого индекса <, диапазон 2, диапазон 3, . . . >] OF тип;

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

№1. Описать массив для хранения следующих данных: фамилия, имя, отчество студентов группы 202. Массив должен позволять: отдельно определять фамилию, имя, отчество.

Рассуждения: так как для определения фамилии, имени, отчества студента необходимо указать: номер студента, номер идентификатора, следовательно, массив будет двумерным. Первый индекс – номер студента, второй индекс – ФИО. Так как хранимые данные – набор символов (буквы), то тип элементов будет  STRING.

VAR FIO: ARRAY [1..31, 1..3] OF STRING;

№2. Определить массив для хранения информации: рост каждого студента группы 202 в сантиметрах.

VAR ROST: ARRAY [1..31] OF REAL;

№3. Определить массив для хранения информации о результатах соревнования 15 спортсменов по 3 соревнованиям.

VAR REZSOR: ARRAY [1..15, 1..3] OF REAL;

№4. Оценки студентов групп 202, 203 по 23 предметам и по 30 занятиям по каждому предмету.

VAR OCENKI: ARRAY [1..20, 1..23, 1..30, 1..30] OF REAL;

Заполнения массивов.

  1.   Генератор случайных чисел. При определении массивов все элементы получают нулевые или «пустые» значения. Для решения учебных задач требуется «дополнительные» массивы. Массив можно заполнить с помощью ввода данных (READ, READLN), но для больших массивов это неудобно. Поэтому для ввода значения будет использоваться функция RANDOM (максимальное значение).

X: = RANDOM (MAX); X Є [0; MAX]

Пример№1: записать значение переменной Y Є [0;20]

Y: = RANDOM (20);

Пример№2: X Є [10; 50]

X: = RANDOM (40) +10;

Пример№3: X Є [-10; 10]

X: = RANDOM (20) - 10;

Общая формула:

Х Є [A,B]

X: = RANDOM (B-A) +A

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

Пример№4: написать программу для заполнения и вывода на экран массива из примера №2

PROGRAM MROST;

VAR ROST: ARRAY [1..31] OF REAL; NOM: BYTE;

BEGIN

FOR NOM: = 1 TO 31 DO BEGIN

ROST [NOM]:= RANDOM (40) +160;

WRITELN (‘ROST’, NOM, ‘=’, ROST [NOM]); END;

END.

Пример№5: написать программу для определения и вывода на экран массива оценки группы 203 по одному предмету на одном занятии (одномерный).

PROGRAM MOCENKI;

VAR OCENKI: ARRAY [1..31] OF REAL; NOM: BYTE;

BEGIN

FOR NOM: = 1 TO 31 DO BEGIN

OCENKI [NOM]:= RANDOM (3) +2;

WRITELN (‘OCENKI’, NOM, ‘=’, OCENKI [NOM]); END;

END.

  1.   Заполнение массива с помощью функций, формул. В этом случае существует формула, определяющая значение элемента в зависимости от его индекса (номера).

Пример№6: определить и вывести на экран массив каждый элемент, которого вычисляется по формуле An = n2 / (n+2); размерность массива A[1..12].

PROGRAM MFUNC;

FUNTION AN (N: BYTE): REAL;

BEGIN

AN: = N*N/ (N+2);

END;

VAR A: ARRAY [1..12] OF REAL; N: BYTE;

BEGIN

FOR N: =1 TO 12 DO BEGIN

A [N]:=AN (N);

WRITELN (‘A’, N, ‘=’, A [N]); END;

END.

Обработка массивов.

Задача №1

Написать программу, определяющую порядковые номера по списку студентов группы 202 получивших оценку «5» на экзамене по ОАП. Заполнение массива произвести с помощью случайных чисел.

PROGRAM OTL;

VAR OC: ARRAY [1..30] OF BYTE; NOM: BYTE;

BEGIN

FOR NOM: =1 TO 30 DO BEGIN

OC [N]:= RANDOM (4) +1;

WRITELN (‘студент N’, NOM: 2, ‘оценка=’, OC [NOM]:2); END;

FOR NOM: =1 TO 30 DO

IF OC [NOM] =5 THEN WRITELN (‘студент N’, NOM, ‘отличник’);

END.

Задача №2

Написать программу, определяющую номера студентов, не сдавших экзамен, сдавших экзамен неудовлетворительно.

PROGRAM DV;

VAR NOM: BYTE; OC: ARRAY [1..30] OF BYTE;

BEGIN

FOR NOM: = 1 TO 30 DO BEGIN

OC [NOM]:=RANDOM (5);

WRITELN (‘студент N’, NOM: 2, ‘оценка =’, OC [NOM]:2); END;

FOR NOM: =1 TO 30 DO

IF OC [NOM] =0 THEN WRITELN (‘студент N’, NOM, ‘не сдавал’);

FOR NOM: =1 TO 30 DO

IF (OC [NOM] >0) AND (OC [NOM] <3) THEN WRITELN (‘студент N’, NOM, ‘неудовлетворительно’); END.

Задача №3

Написать программу, определяющую средний балл студентов группы 202 на экзамене по ЭВМ.

PROGRAM SRB;

VAR NOM: BYTE; OC: ARRAY [1..30] OF BYTE; SUM, SR: REAL;

BEGIN

FOR NOM: = 1 TO 30 DO BEGIN

OC [NOM]:=RANDOM (3) +2;

WRITELN (‘студент N’, NOM: 2, ‘оценка =’, OC [NOM]:2); END;

SUM: =0;

FOR NOM: =1 TO 30 DO

SUM: = SUM + OC [NOM];

SR: = SUM/30;

WRITELN (‘средний балл = ’, SR: 4:2);

END.

Задача №4

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

PROGRAM VISHSR;

VAR NOM: BYTE; OC: ARRAY [1..30] OF BYTE; SUM, SR: REAL;

BEGIN

FOR NOM: = 1 TO 30 DO BEGIN

OC [NOM]:=RANDOM (3) +2;

WRITELN (‘студент N’, NOM: 2, ‘оценка =’, OC [NOM]:2); END;

SUM: =0;

FOR NOM: =1 TO 30 DO

SUM: = SUM + OC [NOM];

SR: = SUM/30;

WRITELN (‘средний балл = ’, SR: 4:2);

FOR NOM: =1 TO 30 DO

IF OC [NOM]>SR THEN WRITELN (‘студент N’, NOM, ‘хороший’);

END.

Задача №5

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

PROGRAM KOLCT;

VAR NOM: BYTE; OC: ARRAY [1..30] OF BYTE; SUM, SR: REAL; KOL: BYTE;

BEGIN

FOR NOM: = 1 TO 30 DO BEGIN

OC [NOM]:=RANDOM (3) +2;

WRITELN (‘студент N’, NOM: 2, ‘оценка =’, OC [NOM]:2); END;

KOL: =0;

FOR NOM: =1 TO 30 DO

IF OC [NOM]>SR THEN KOL: = KOL+1;

WRITELN (KOL, ‘оценка выше среднего балла по группе’);

SUM: =0;

FOR NOM: =1 TO 30 DO

SUM: = SUM + OC [NOM];

SR: = SUM/30;

WRITELN (‘средний балл = ’, SR: 4:2);

END.


Совместная работа с несколькими массивами.

8

5

13

24

1

5

6

9

10

11

исходный

    A [N] >10

13

0

13

24

0

0

0

0

0

11

Задача №1

Написать программу, заполняющую массив результата (RES) данными из массива исходный (ISH). Условие отбора ISH [N]>12. Массив ISH Є [-10; 20].

PROGRAM TWOARR;

VAR ISH, RES: ARRAY [1..10] OF REAL; N, K: BYTE;

BEGIN

FOR N: =1 TO 10 DO BEGIN

ISH [N]:= RANDOM (30)-10;

WRITELN (‘ISH’, N, ‘=’, ISH [N]:5:2); END;

K: =1;

FOR N: =1 TO 10 DO

IF ISH [N]> 12 THEN BEGIN

RES [K]: = ISH [N]; K: = K+1; END;

N: = 1;

REPEAT

WRITELN (‘RES’, N, ‘=’, RES [N]:5: 2);

N: =N+1;

UNTIL RES [N] = 0;

READLN;

END.

Задача №2

Написать программу, заполняющую массив A [1..10] по следующему правилу A [N]:= B [N] + C [N]. Массивы B и C заполнены произвольными числами. B Є [5; 25], C Є [3; 30].

PROGRAM ARR;

VAR A, B, C: ARRAY [1..10] OF REAL; N: BYTE;

BEGIN

FOR N: =1 TO 10 DO BEGIN

C [N]: = RANDOM (27) +3; B [N]: = RANDOM (25) +5;

WRITELN (‘C’, N, ‘=’, C [N]:5:2, ‘B’, N, ‘=’, B [N]:5:2);

END;

FOR N: =1 TO 10 DO BEGIN

A [N]: = B [N] + C [N];

WRITELN (‘A’, N, ‘=’, A [N]:5:2); END;

END.

Задача №3

Написать программу, определяющую значение массива MAX [1..15]. Элементы массива MAX [N] = большее из (A [N], B [N]). Массивы A и B заполняются случайными числами. A, B Є [10; 90].

PROGRAM ARR;

VAR A, B, MAX: ARRAY [1..15] OF REAL; N: BYTE;

BEGIN

FOR N: =1 TO 15 DO BEGIN

A [N]: = RANDOM (80) + 10; B [N]: = RANDOM (80) +10;

WRITELN (‘A’, N, ‘=’, C [N]:5:2, ‘B’, N, ‘=’, B [N]:5:2);

END;

FOR N: =1 TO 15 DO BEGIN

IF A [N] > B [N] THEN MAX [N]: = A [N] ELSE MAX [N]: = B [N];

WRITELN (‘MAX’, N, ‘=’, MAX [N]:5:2); END;

END.

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

  1.   Файловые переменные. Типы:
    1.  FILE – не типизированный файл – вся информация, относящаяся к не типизированному файлу является последовательностью байт, нет возможности точного определения завершения файла;

б.FILE OF тип данных – типизированный файл – вся информация относится к указанному типу данных;

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

в.TEXT – файл является текстовым файлом соответствующим  *.TXT – в данный файл можно помещать информацию любого типа (числовой, текстовый).

  1.   Тип данных используемого файла определяется только файловой переменной (имя файла и расширение имени значения не имеют).
  2.   Для работы с файлами обязательно объявляются переменная, соответствующая типу файловой переменой.

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

VAR FP: FILE OF INTEGER;

Пример№2: определить файловую переменную для файла, который содержит фамилию студентов и их средний балл.

VAR FP: TEXT;

Пример№3: определить файловую переменную для файла, который содержит средний балл.

VAR FP: FILE OF REAL;

  1.   Процедуры и функции для работы с файлами.
  2.  ASSIGN (файловая переменная, имя файла: STRING); – означает установить связь между файловой переменной и именем файла (определение имени файла).

б.REWRITE (файловая переменная); – означает открытие или создание файла. Если файл не существует, то он создается и открывается для записи. Если файл существует, то он перезаписывается и открывается для записи (все данные стираются).

в. RESET (файловая переменная); – открытие файла для чтения.

г. APPEND (файловая переменная: TEXT); – открытие файла для добавления информации. Только для файлов типа TEXT.

д. RENAME (файловая переменная, новое имя: STRING); – переименование. Выполняется только для закрытых файлов.

е. ERASE (файловая переменная); – удаление файла. Выполняется только для закрытых файлов. Удаление без запроса, не в корзину.

ж. CLOSE (файловая переменная); – закрытее файла. Закрытие файла обязательно при окончании работы с файлом – сохранение.

Перед работой с файлами необходимо: определить файловую переменную, с   помощью процедуры ASSIGN определить имя файла.

 

з. EOF (файловая переменная): BOOLEAN; – логическая функция, которая позволяет определить завершен ли файл. Истина, если файл завершен, ложь, если файл не завершен.


Задача №1

Написать программу, выполняющая следующие действия: создание файла для хранения результатов вычисления функции Y = SINX* X2; вычисления значения функции для  X Є [A, B], шаг 0, 5; запись результатов вычисления в файл.

PROGRAM TOFILE;

FUNCTION Y (X: REAL): REAL;

BEGIN

Y: = SIN (X) * X*X; END;

VAR FP: FILE OF REAL; X, A, B: REAL;

BEGIN

WRITE (‘A, B=?’); READLN (A, B);

ASSIGN (FP, ‘RESULT. DAT’); REWRITE (FP);

X: = A;

REPEAT WRITE (FP, X, Y, Y (X)); X: = X+0.5;

UNTIL X>B; CLOSE (FP);

WRITELN (‘результаты записаны в файл’);

READLN;

END.

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

Задача №2

Написать программу, выполняющую следующее: создающую файл, который возможно прочитать с помощью стандартной программы «Блокнот»; записывающий в файл результаты вычисления функции Y = SINX* X2.

PROGRAM TOFILE;

FUNCTION Y (X: REAL): REAL;

BEGIN

Y: = SIN (X) * X*X; END;

VAR FP: FILE OF REAL; X, A, B: REAL;

BEGIN

WRITE (‘A, B=?’); READLN (A, B);

ASSIGN (FP, ‘RESULT. DAT’); REWRITE (FP);

X: = A;

REPEAT WRITE (FP, X, Y, Y (X)); X: = X+0.5;

UNTIL X>B; CLOSE (FP);

WRITELN (‘результаты записаны в файл’);

READLN;

END.

При записи в файл используется оператор WRITE (файловая переменная, список переменных);. При записи в файл типа TEXT как WRITE, так и WRITELN

Задача №3

Написать программу, выполняющую следующее: открывающую файл RESULT. DAT, созданный в программе из задачи №1; выводящую на экран значение функции Y (X) > M. Файл RESULT. DAT считать уже созданным.

PROGRAM FROMFILE;

VAR FP: FILE OF REAL; X, Y, M: REAL;

BEGIN

ASSIGN (FP, ‘RESULT. DAT’); RESET (FP);

WRITE (‘M=?’); READLN (M);

REPEAT

READ (FP, X, Y); IF Y>M THEN WRITELN (Y);

UNTIL EOF (FP); CLOSE (FP);

READLN;

END.

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

8

11

12

4

9

60

4

45

10

 X = 9

X сравнить с элементом N = 1 до количества элементов, если M [N] > X TO X = M [N].

Пример№1: массив M [1..20], найти максимальный элемент.

X: = M [1];

FOR N: =1 TO 20 DO

IF M [N]>X THEN X: =M [N];

Пример№2: поиск номера максимального элемента.

1. FOR N: =1 TO 20 DO

IF M [N] =X THEN WRITELN (N);

2. X: = M [1]; NX: =1;

FOR N: =1 TO 20 DO

IF M [N]>X THEN BEGIN X: =M [N];

NX: = N;

END;

NX – номер максимального элемента

M [NX] – определение наибольшего элемента

3. NX: = 1;

FOR N: =1 TO 7 DO

IF M [N]> M [NX] THEN NX: =N;

Проверка четности и нечетности.

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

N= 2, шаг = 2 – четное

N=1, шаг = 2 – нечетное

Пример№1: определить сумму элементов массива М, стоящих на нечетных местах.

S: =0; N: =1;  

REPEAT     вычисление суммы элементов с нечетными номерами

S: = S + M [N]; N: = N+2;

UNTIL N> 20;

Пример№2: определить в массиве M [1..20], какая сумма элементов с четными или с нечетными номерами имеет большее значение. Вывести на экран сообщение «Сумма четных больше» или «Сумма нечетных больше».

S1:=0; N: =2;

REPEAT

S1:= S1 + M [N]; N: = N2;

UNTIL N>20;

S2:=0; N: =1;

REPEAT

S2:= S2 + M [N]; N: = N + 2;

UNTIL N> 20;

  1.  Четность элементов в массиве.

Определить четность элемента с помощью формулы, цикла невозможно (или слишком трудно). Поэтому для определения используется операция MOD – остаток от целого деления. Если остаток от целого деления числа (элемента массива) на 2=0, то число – четное, если 1 – нечетное.

IF число MOD 2=0 THEN число четное ELSE число нечетное.

Пример№3: определить сумму четных элементов массива.

S: =0;

FOR N: =1 TO 20 DO

IF M [N] MOD 2=0 THEN S: = S+M [N];

Файлы при работе с массивами могут использоваться:

  1.  Для ввода значений элементов
  2.  для сохранения результатов вычислений.

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

Пример№4: использовать файл NUMBER. TXT для ввода значений элементов массива M.

VAR FP: TEXT; M: ARRAY [1..20] OF INTEGER; N: BYTE;

BEGIN

ASSIGN (FP, ‘NUMBER. TXT’); RESET (FP);

FOR N:=1 TO 20 DO

BEGIN

READ (FP, M [N]);

WRITELN (M [N]); END;

CLOSE (FP);

Пример№5: определить сумму всех элементов массива М и записать результат в файл SUMMA. TXT.

VAR FPZ: TEXT; M: ARRAY [1..20] OF INTEGER; N: BYTE; S: WORD;

BEGIN

* * * (здесь может быть заполнение массива)

S: =0;

FOR N: =1 TO 20 DO

S: =S + M [N];

ASSIGN (FPZ, ‘SUMMA. TXT’); REWRITE (FPZ);

WRITELN (FPZ, ‘сумма =’, S);

CLOSE (FPZ);

Пример№6: из массива М отобрать нечетные элементы и записать их в файл NC. TXT.

ASSIGN (FPN, ‘NC. TXT’); REWRITE (FPN);

FOR N:= 1 TO 20 DO

IF M [N] MOD 2=1 THEN WRITELN (FPN, M [N]);

CLOSE (FPN);

Пример№7: из массива М четные элементы записать в файл CHET. TXT, NCHET. TXT.

VAR FP: TEXT; M: ARRAY [1..20] OF INTEGER; N: BYT;

ASSIGN (FPC, ‘CHET. TXT’); REWRITE (FPC);

FOR N: =1 TO 20 DO

IF M [N] MOD 2=0 THEN WRITELN (FPC, M [N]);

CLOSE (FPC);

ASSIGN (FPN, ‘NCHET. TXT’); REWRITE (FPN);

FOR N: =1 TO 20 DO

IF M [N] MOD 2=0 THEN WRITELN (FPN, M [N]);

CLOSE (FPN);

Функция работа с файлами (продолжение).

EOF: BOOLEAN;  TRUE (истина)

 FALSE (ложь)

Назначение:

Функция приобретает значение истина, если при чтении файла файл завершен, и значение ложь, если информация осталась. Функция позволяет читать из файла не точное количество записей, а читать файл до конца.

Задача №1

Написать программу, вычисляющую значение функции Y=X2. Значения X брать из файла INPUT. TXT. Файл INPUT. TXT уже создан, количество записей неизвестно.

PROGRAM FROMFILE;

VAR X, Y: REAL; FP: TEXT;

BEGIN

ASSIGN (FP, ‘INPUT. TXT’); RESET (FP);

REPEAT

READ (FP, X); Y: =SQR (X);

WRITELN (‘Y=’, Y: 6:2);

UNTIL EOF (FP); CLOSE (FP);

END.

Задача №2

Написать программу, определяющую значение функции Y=A2+ B2. Значение A находится в файле INPA. TXT, B – INPB. TXT.

PROGRAM FROMFILE;

VAR A, B, Y: REAL; FP1, FP2: TEXT;

BEGIN

ASSIGN (FP1, ‘INPA. TXT’); RESET (FP1);

ASSIGN (FP2, ‘INPB. TXT’); RESET (FP2);

REPEAT

READ (FP1, A);

READ (FP2, B); Y: =(A*A)+ (B*B);

WRITELN (‘Y=’, Y: 6:2);

UNTIL (EOF (FP1) OR EOF (FP2));

CLOSE (FP1); CLOSE (FP2);

END.

Задача №3

Написать программу, вычисляющую значение функции Y= √(X2+1)/ (X+2). Значение X в файле INPUT. TXT, вычисленные значения Y записать в файл OUT. TXT.

PROGRAM FROMFILE;

FUNCTION Y (X: REAL): REAL;

BEGIN

Y: = SQRT ((X*X+1)/ (ABS(X) +2); END;

VARX: REAL; FPX, FPY: TEXT;

BEGIN

ASSIGN (FPX, ‘INPX. TXT’); RESET (FPX);

ASSIGN (FPY, ‘OUT. TXT’); REWRITE (FPY);

REPEAT

READ (FPX, X);

WRITELN (FPY, ‘Y=’, Y(X): 8:2);

UNTIL EOF (FPX);

CLOSE (FPX); CLOSE (FPY);

WRITELN (‘результаты в файле OUT. TXT’); READLN;

END.

Задача №4

Написать программу, выполняющую следующие действия: открыть файл INPUT. TXT; числа большие 20 записать в файл BIG. TXT.

PROGRAM BIGNUMBER;

VAR CHIS: REAL; FPI, FPB: TEXT;

BEGIN

ASSIGN (FPI, ‘INPUT. TXT’); RESET (FPI);

ASSIGN (FPB, ‘BIG. TXT’); REWRITE (FPB);

REPEAT

READ (FPI, CHIS);

IF CHIS >20 THEN WRITELN (FPB, CHIS);

UNTIL EOF (FPI);

CLOSE (FPI); CLOSE (FPB);

WRITELN (‘Результаты записаны в файле BIG. TXT’); READLN;

END.

Использование файлов.

Файлы используются для ввода данных, при этом для чтения информации из файла используется оператор READ, с указанием файловой переменной из которой происходит чтение информации (точно также как при вводе данных с клавиатуры).

Задача №1

Написать программу, выполняющую следующее: определить два массива А, В, каждый из 12 элементов целого типа (BYTE); заполнить массивы, значения элементов взять из файлов A. TXT, B. TXT; определить в каком из массивов среднее значение элементов больше.

PROGRAM FFILE;

VAR A, B: REAL; M1, M2: ARRAY [1..12] OF BYTE; S1, S2, SR1, SR2: REAL; N: BYTE; FP1, FP2: TEXT;

BEGIN

ASSIGN (FP1, ‘A. TXT’); RESET (FP1);

ASSIGN (FP2, ‘B. TXT’); RESET (FP2);

FOR N: =1 TO 12 DO BEGIN

READ (FP1, A [N]); READ (FP2, B [N]); END;

S1:=0; S2:=0;

FOR N: =1 TO 12 DO

S1:= S1+ A [N]; S2:= S2+ B [N];

SR1:= S1/12; SR2:=S2/12;

IF SR1>SR2 THEN WRITELN (‘SR1=’, SR1);

IF SR2>SR1 THEN WRITELN (‘SR2=’, SR2);

CLOSE (FP1); CLOSE (FP2);

END.

Типизированные файлы.

  1.  При использовании типизированных файлов необходимо определить тип данных RECORD (запись). Тип RECORD позволяет объединить в пределах одной переменной различные типы данных.
  2.  RECORD – структурный тип данных, отдельные части записи называются поля. Поле характеризуется именем и типом.
  3.  Определение типа данных RECORD.

TYPE имя типа = RECORD

поле1: тип;

поле2: тип;

*   *   *

END;

Пример№1: определить тип данных – «студент». Поля: ФИО, номер группы, год рождения.

TYPE TSTUDENT = RECORD

FIO: STRING;

NOMGR: WORD;

GODROZ: WORD;

END;

  1.  Использование типа данных RECORD.
    1.  для использования типа данных объявляются переменные. При этом мы переходим от общего описания к конкретным данным;

б. для обращения к полям записи используется следующая форма:

Имя переменной. Поле (обращение к полям возможно только после определения переменных).

Пример№2: объявить переменную типа TSTUDENT и установить произвольное значение для полей.

VAR STUD: TSTUDENT;

*   *   *

STUD. FIO: =’Табакова Анжелика Александровна’;

STUD.NC:=202;

STUD.GR:=1992;

  1.  Использование типа данных RECORD при работе с файлами:

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

б. объявить файловую переменную

FILE OF тип RECORD

Например: FP: FILE OF TSTUDENT;

в. д RECORD ля чтения или записи информации из файла необходимо объявить «простую» переменную типа запись (не файловую, так как в типизированный файл можно записать только информацию типа указанного при описании файловой переменной).

  1.  Примеры программ, использующих типизированные файлы.

Задача №1

Написать программу, создающую файл: хранящий сведения о студентах (фамилия ,год рождения, средний балл), внести  в файл 5 записей.

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT; I: BYTE;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); REWRITE (FP);

FOR I: =1 TO 5 DO BEGIN

WRITE (‘фамилия’); READLN (BUF. F);

WRITE (‘год рождения’); READLN (BUF. GR);

WRITE (‘средний бал’); READLN (BUF. SR);

WRITE (FP, BUF); END; CLOSE (FP);

END.

Задача №2

Написать программу, которая выполняет следующее: открывающую файл STUD. DAT; выводящую на экран все записи из этого файла.

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); RESET (FP);

REPEAT

READ (FP, BUF);

WRITE (BUF. F, ‘_’, BUF. GR, ‘_’, BUF. SR);

UNTIL EOF (FP); CLOSE (FP);

END.

Задача №3

Написать программу, выводящую на экран фамилии студентов, средний балл которых выше 3, 5. Сведения о студентах получать из файла STUD. DAT.

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); RESET (FP);

REPEAT

READ (FP, BUF);

IF BUF. SR>3.5 THEN WRITE (BUF. F);

UNTIL EOF (FP); CLOSE (FP);

END.

Задача №4

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

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL; VZ: WORD;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); RESET (FP);

REPEAT

READ (FP, BUF);

IF BUF. VZ>18 THEN WRITE (BUF. F);

UNTIL EOF (FP); CLOSE (FP);

END.

Задача №5

Написать программу, определяющую количество записей в файле STUD. DAT (считать, что при создании файла количество записей не определялось).

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT; K: BYTE;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); REWRITE (FP);

REPEAT

READ (FP, BUF);

K: =K+1

UNTIL EOF (FP); CLOSE (FP);

WRITELN (‘количество =’, K)

END.

Задача №6

Написать программу, выводящую на экран фамилии студентов чей средний балл больше числа Х.

PROGRAM TOFILE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL; X: REAL;

END;

VAR FP:  FILE OF TSTUDENT; BUF: TSTUDENT;

BEGIN

ASSIGN (FP, ‘STUD. DAT’); RESET (FP);

REPEAT

READ (FP, BUF);

IF BUF. SR>X THEN WRITE (BUF. F);

UNTIL EOF (FP); CLOSE (FP);

END.

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

Так как файл можно открыть с помощью RESET – только для чтения или с помощью REWRITE – теряется вся информация из файла. Следовательно, для добавления (изменения, удаления) нам потребуется применить специальные алгоритмы.

Добавление.

Алгоритм добавления информации:

  •  Открыть исходный файл для чтения (RESET);
  •  Создать временной файл (REWRITE);
  •  Скопировать все записи из исходного файла во временный;
  •  Добавить информацию во временный файл;
  •  Удалить исходный файл (ERASE);
  •  Переименовать временный файл. Назвать, так как назывался исходный (RENAME).

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

Процесс копирования записей их исходного файла во временный.

IS – файловая переменная исходного файла;

FT – временный файл.

REPEAT

READ (IS, BUF); WRITE (FT, BUF);

UNTIL EOF (IS); CLOSE (IS);

Временный файл (FT) не закрываем, так как в него необходимо добавлять информацию

Добавление информации – запрашиваем значение полей, записываем в файл FT.

WRITE (‘Сообщите фамилию’); READLN (BUF. F);

WRITE (‘Сообщите группу’); READLN (BUF. GR);

WRITE (‘Сообщите средний балл’); READLN (BUF. SR);

WRITE (FT, BUF); CLOSE (FT);

Удаление записей из файла.

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

  •  Открыть исходный файл (RESET);
  •  Создать временный файл (REWRITE);
  •  Запросить условие удаления;
  •  Скопировать из IS файла все записи, кроме удаляемых;
  •  Удалить IS файл;
  •  Переименовать FT.

Изменение записей.

Для изменения записей необходимо:

  •  Определить (найти) изменяемую запись;
  •  Запросить новые значения изменяемых полей.
  •  Сохранить измененную запись.

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

Задача №1

В файле STUD. DAT заменить поле SR на 3, для тех записей в которых SR<3.

PROGRAM REPLACE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL; END;

VAR IS, FT: FILE OF TSTUDENT; BUF: TSTUDENT;

BEGIN

ASSIGN (IS, ‘STUD. DAT’); RESER (IS);

ASSIGN (FT, ‘TEMP. TMP’); REWRITE (FT);

REPEAT

READ (IS, BUF);

IF BUF. SR<3 THEN BUF. SR: =3;

WRITE (FT, BUF);

UNTIL EOF (IS); CLOSE (IS); CLOSE (FT);

ERASE (IS); RENAME (FT, ‘STUD. DAT’);

WRITELN (‘данные изменены’); READLN;

END.

Задача №2

Написать программу, заменяющую GR студента по фамилии X на число Y. Фамилия X и число Y запрашиваются.

PROGRAM REPLACE;

TYPE TSTUDENT = RECORD

F: STRING; GR: WORD; SR: REAL; END;

VAR IS, FT: FILE OF TSTUDENT; BUF: TSTUDENT; X: STRING; Y: WORD;

BEGIN

ASSIGN (IS, ‘STUD. DAT’); RESER (IS);

ASSIGN (FT, ‘TEMP. TMP’); REWRITE (FT);

WRITE (‘X, Y’); READLN (X, Y);

REPEAT

READ (IS, BUF);

IF BUF. F: =X THEN BUF. GR: =Y;

WRITE (FT, BUF);

UNTIL EOF (IS); CLOSE (IS); CLOSE (FT);

ERASE (IS); RENAME (FT, ‘STUD. DAT’);

WRITELN (‘файл изменен’); READLN;

END.

Строковые переменные (символьные).

Строковые переменные – переменные, значением которых являются символы, наборы (строки) символов.

Символ – знак, содержащийся в кодовой таблице. Символы кодовой таблицы генерируются при нажатии на клавиатуру. Символы в таблице располагаются по порядку – каждый символ имеет порядковый номер – код. Таблица называется – ASCII. Таблица содержит 255 символов. Код символа – байт.

Типы символьных переменных:

CHAR –один символ.

VAR имя: CHAR;

Действия с CHAR:

  1.  Сравнения (=, >=, <=, <>, >, <)

При сравнении >, < сравниваются порядковые номера символов в таблице ASCII (коды).

  1.   ORD (переменная: CHAR): INTEGER; – означает определение кода символа
  2.  KOD: = ORD (‘A’); – переменная KOD приобретает значение = коду буквы А
  3.  WRITELN (ORD(‘1’)); – вывести на экран код цифры 1
  4.  ASC (код): CHAR – определение символа по его коду.

S: =ASC (ORD (‘A’) +1); => S: =B.

Не любые символы, которые содержатся в таблице ASCII, могут быть выведены на экран.

Например: Enter, стрелочки (вверх, вниз, влево, вправо).

 

Не любое нажатие на клавишу генерирует код.

Например: Shift, Ctrl, Alt, Caps Look – код не генерирует.

Присвоение символьным переменным значений:

Переменная: = ‘значение’;

X: = ’A’;

Переменные типа STRING.

Представляет собой одномерный массив типа CHAR, каждый символ, входящий в переменные типа STRING имеет порядковый номер (индекс). При определении переменной типа STRING можно указывать максимальную длину строки. Если длина не указана, она считается = 255.

VAR STROKA: STRING;

ST: STRING [20]; – максимальная длина строки.

Переменная STROKA имеет максимальную длину 255, а ST –20.

Действия со строками:

  1.  Сложение. При сложении двух и более строк, строки объединяются в одну. К строкам можно прибавить переменные типа CHAR (символ)

Примеры:

S1:=’ма’;

S2:=’рт ’;

S: = S1+S2;

Ответ: март

S3:=S1+S1;

Ответ: мама

S3:=S1+’_’+S1;

Ответ: ма_ма.

  1.  Сравнение. При сравнении сравниваются только первые символы. При сравнении на равенство переменные будут равными при совпадении всех символов.

Пример:

S1:=’ABCDE’;

S2:=’DE’;

Ответ: S1>S2

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

  1.  LENGTH (S: STRING): INTEGER; – вычисления длины строки (определение количества символов в строке)

D: = LENGTH (S3); => D: =5;

  1.  COPY (S: STRING, B: BYTE, K: BYTE): STRING; – означает копирование части строки S, начиная с символа под номером D, K – символ

S: =’машина’;

S1:= COPY (S, 3, 4); => шина;

  1.  INSERT (WHAT: STRING, WHERE: STRING; N: BYTE); –  вставка строки WHAT в строку, начиная с позиции номера N

S: =’машина’;

INSERT (‘K’, S, 6);

Если длина строки после вставки будет больше, чем 255 лишние символы будут отброшены.

  1.  DELETE (S: STRING, B: BYTE, K: BYTE); – удаление из строки S, начиная с B, K символов

S: =’машинка’;

DELETE (S, 6, 1);

Примеры решения задач

Задача №1

Запросить два символа, вывести на экран их коды.

PROGRAM A;

VAR A, B: CHAR; X, Y: BYTE;

BEGIN

WRITE (‘введите A’); READLN (A);

WRITE (‘введите B’); READLN (B);

X: =ORD (A);

Y: = ORD (B);

WRITELN (X, Y);

END.

Задача №2

Запросить две символьных переменных, вывести на экран больший код.

PROGRAM ZAPROS;

VAR A, B, C: CHAR; X, Y, Z, M: BYTE;

BEGIN

WRITE (‘введите A’); READLN (A);

WRITE (‘введите B’); READLN (B);

WRITE (‘введите C’); READLN (C);

X: =ORD (A);

Y: = ORD (B);

Z: = ORD (C);

IF X>Y THEN M: = X ELSE M: =Y;

IF Z>M THEN M: = Z;

WRITELN (‘M=’, M);

END.

Задача №3

Запросить две строки, вывести на экран более длинную.

PROGRAM ZAPROSTWO;

VAR ST1: STRING [20]; ST2: STRING [150];

BEGIN

WRITE (‘введите ST1’); READLN (ST1);

WRITE (‘введите ST2’); READLN (ST2);

IF ST1>ST2 THEN WRITELN (‘> ST1’, ST1) ELSE WRITELN (‘>ST2’, ST2);

END.

Задача №4

Запросить строку, вывести на экран первые две буквы.

PROGRAM ZAPROSTHREE;

VAR ST, S: STRING;

BEGIN

WRITE (‘введите ST’); READLN (ST);

S: =COPY (ST, 1, 2);

WRITELN (‘S=’, S);

END.

Задача №5

Запросить строку, вывести на экран первую половинку (например, строка =  ’машина’, первая часть = ’маш’).

PROGRAM ZAPROSFOUR;

VAR ST, S: STRING; X, Y, D: BYTE;

BEGIN

WRITE (‘введите ST’); READLN (ST);

D: = LENGTH (ST);

X: =D DIV 2;

Y: = D-X;

DELETE (ST, X+1, Y);

WRITELN (‘S1=’, S1);

END.

Задача №6

Определить род слова.

PROGRAM GTH;

VAR A, B, S: STRING;

BEGIN

WRITE (‘S –?’); READLN (S);

A: =COPY (S, LENGTH(S)-1, 2);

WRITELN (A);

IF A=’ая’ THEN WRITELN (‘жен’);

IF A=’яя’ THEN WRITELN (‘жен’);

IF A=’ий’ THEN WRITELN (‘муж’);

IF A=’ый’ THEN WRITELN (‘муж’);

END.

Обработка строковых переменных.

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

Примеры задач по обработке строк.

  1.  Статистическая обработка строки. Данная задача сводится к подсчету повторения символа, комбинации символов в строке. Эту задачу решают:
    •  в криптографии (шифровании);
    •  фонетический анализ;
    •  дешифрование;
    •  распознавание языка и т. д.

Задача №1

В произвольной строке (не больше 255 символов) определить частоту повторения символа  ‘_’. Частота вычисляется: частота = количество ‘_’/ длина * 100%/

PROGRAM CHASTOTA;

VAR KOL: BYTE; STROKA: STRING; N: BYTE; CH: REAL; DL: BYTE;

BEGIN

WRITE (‘сообщите строку’); READLN (STROKA);

DL: = LENGTH (STROKA); KOL: = 0;

FOR N: = 1 TO DL DO

IF STROKA [N] = ‘_’ THEN KOL: = KOL+1;

CH: = KOL/ DL* 100;

WRITELN (‘частота = ’, CH: 6:2); READLN;

END.

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

Задача №2

Написать программу, определяющую частоту повторения произвольного символа в произвольной строке.

PROGRAM CHASTOTA;

VAR KOL: BYTE; STROKA: STRING; N: BYTE; CH: REAL; DL: BYTE; SIM: CHAR;

BEGIN

WRITE (‘сообщите строку’); READLN (STROKA);

WRITE (‘сообщите символ’); READLN (SIM);

DL: = LENGTH (STROKA); KOL: = 0;

FOR N: = 1 TO DL DO

IF STROKA [N] = SIM THEN KOL: = KOL+1;

CH: = KOL/ DL* 100;

WRITELN (‘частота = ’, CH: 6:2); READLN;

END.

  1.  Замена. Задачи, выполняющие замену символа, используются:
    •  шифрование;
    •  дешифрование;
    •  грамматическая проверка и т. д.

Задача №3

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

Потребуется использование функций ORD, CHR. Программа является примитивной шифрующей программой.

PROGRAM SIMPLESHIFR;

VAR STROKA: STRING; N: BYTE; DL: BYTE; B: CHAR; KOD: BYTE;

BEGIN

WRITE (‘сообщите строку’); READLN (STROKA);

DL: = LENGTH (STROKA);

FOR N: = 1 TO DL DO BEGIN

KOD: = ORD (STROKA [N]); KOD: = KOD+1;

B: = CHR (KOD);

STROKA [N]:= B; END;

WRITELN (‘шифрованная строка = ’, STROKA); READLN;

END.

  1.  Подсчет повторений комбинации символов.

В программе потребуется выделять из строки комбинацию символов (функция COPY).

Задача №4

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

PROGRAM POISK;

VAR KOL: BYTE; STROKA: STRING; N: BYTE; SLOG: STRING [2];

BEGIN

WRITE (‘сообщите строку’); READLN (STROKA);

KOL: = 0;

FOR N: = 1 TO LENGTH (STROKA) DO BEGIN

SLOG: = COPY (STROKA, N, 2);

IF (SLOG = ‘жы’) OR (SLOG = ‘шы’) THEN KOL: = KOL+1;

END;

WRITELN (‘количество = ’, KOL); READLN;

END.

Задача №5

Написать программу, определяющую количество союзов «и» в произвольной строке.

PROGRAM POISK;

VAR KOL: BYTE; STROKA: STRING; N: BYTE; SLOG: STRING;

BEGIN

WRITE (‘сообщите строку’); READLN (STROKA);

KOL: = 0;

FOR N: = 1 TO LENGTH (STROKA) DO BEGIN

SLOG: = COPY (STROKA, N, 1);

IF (SLOG = ‘и’) THEN KOL: = KOL+1;

END;

WRITELN (‘количество = ’, KOL); READLN;

END.

Решение задач

Оператор условного перехода (выбор действий).

входные данные – фамилия (STRING), выходные данные – обращение + фамилия.

Задача №1

PROGRAM FAMIL;

VAR F: STRING [25]; OB: STRING; BUK: CHAR; DL: BUTE;

BEGIN

WRITE (‘СООБЩИТЬ ФАМИЛИЮ’); READLN (F);

DL: =LENGTH (F);

BUK: = F [DL];

IF (BUK=’A’) OR (BUK=’Я’) THEN OB: = ‘Уважаемая гражданка’ + F;

IF (BUK=’B’) OR (BUK=’H’) OR (BUK=’Й’) THEN OB: = ‘Уважаемый гражданин’ + F;

IF NOT ((BUK=’A’) OR (BUK=’Я’) OR (BUK=’В’) OR (BUK=’Н’) OR (BUK=’Й’)) THEN

OB: = ‘Товарищ_ ‘+ F;

WRITELN (OB); WRITE (‘PRESS ENTER’);

READLN;

END.

Задача №2

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

     Рифмой считать совпадение трех последних букв.

PROGRAM RIFMA;

VAR S1, S2: STRING; BUK1, BUK2: STRING; DL1, DL2: BYTE; CH1, CH2: BYTE;

BEGIN

WRITE (‘Сообщите первое слово’); READLN (S1);

WRITE (‘Сообщите второе слово’); READLN (S2);

DL1:= LENGTH (S1); DL2:= LENGTH (S2);

CH: = DL1-2; CH: = DL2-2;

BUK1:= COPY (S1, CH1, 3); BUK: = COPY (S2, CH2, 3);

IF BUK1 = BUK2 THEN WRITELN (‘рифма’) ELSE WRITELN (‘не рифма’);

END.

Операторы циклов.

FOR – используется точное количество шагов, шаг = 1.

REPEAT, WHILE – повтор действий в зависимости от условия. Размер шага, количество шагов заранее не определяется.

Задача №3

Написать программу, определяющая  значение суммы ряда чисел. Каждый элемент ряда определяется по формуле An = n2 / n+2.

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

PROGRAM SUMMA;

FUNCTION AN (n: INTEGER): REAL;

BEGIN

AN: = SQR (n)/ (n+2); END;

VAR S: REAL; n: INTEGER; NM: INTEGER;

BEGIN

WRITE (‘количество элементов’); READLN (NM);

S: =0;

FOR n: =1 TO NM DO

S: = S + AN (n);

WRITELN (‘сумма =’, S: 6:2);

WRITE (‘PRESS ENTER’);

READLN;

END.

Работа с графикой.

  1.  Общие сведения.

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

Процедуры и функции, использующие графику, объединяются в модули GRAPH. То есть перед использованием графики модуль должен быть «подключен».

Система координат в графическом режиме:

0, 0            x 640

y480

     Координаты могут быть только целыми.

  1.  Настройка графического модуля.

Для настроек выполнить следующие действия:

  •  Зайти в пункт меню OPTIONS;
  •  Выбрать пункт DIRECTORIES;
  •  В строке UNITS записать путь до файла GRAPH.TPU.

Для корректной работы с графикой необходимо скопировать файл EGAVGA. BGI в каталог с запускаемой программой.

  1.  Подключение модуля.

USES_GRAPH;

 

  Строка пишется сразу после PROGRAM.

  1.  Необходимые переменные, инициализация графики (включение), выход из графического режима.

GD, GM: INTEGER;

GD – автоопределение графики

GM – автоопределение монитора

GD: = DETECT; – автоопределение графического режима.

INITGRAPH (GD, GM, ‘’);

CLOSEGRAPH;

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

  1.  Процедуры и функции по работе с графикой.
    1.  SETCOLOR (цвет/ номер цвета); – выбор цвета.

Цвет = RED, либо 0-15.

Пример: установить зеленый цвет рисования.

SETCOLOR (GREEN);

  1.  PUT PIXEL (X, Y, цвет); – поставить точки.

Пример: поставить в центре экрана желтую точку.

PUT PIXEL (320, 240, yellow);

  1.  LINE (X1, Y1, X2, Y2); – отрезок от точки X1, Y1 к точке X2, Y2.

Пример: начертить отрезок        синего цвета.

SETCOLOR (BLUE);

LINE (0, 480, 640, 0);

  1.  CIRCLE (X, Y, радиус)

Пример: начертить в центре экрана красную окружность, R=50.

SETCOLOR (RED);

CIRCLE (320, 240, 50).

  1.  BAR (X1, Y1, X2, Y2); – рамка.
    1.  BAR3D(X1, Y1, X2, Y2, глубина, порядок);
    2.  ELLIPSE(X, Y, начальный угол, конечный угол, RX, RY); – рисование эллипсов, дуг (углы в градусах).

Пример: ELLIPSE (320, 240, 90, 270, 50, 100)

 y

 900

0  x

  1.  OUTTEXT (‘строка’); – строка, выводимая на экран.

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

  1.  OUTTEXT XY(X, Y, ‘строка’);
    1.  PIESLISE (X, Y, начальный угол, конечный угол, R); – сектор

Пример: нарисовать сектор первой четверти координатной плоскости.

PIESLISE (320, 240, 0, 90, 100).

Задача №1

Написать программу, выводящую на экран 10 окружностей, радиус изменяется от 1 с шагом 3, центр всех окружностей (320, 240), цвет зеленый.

PROGRAM OKR;

USES GRAPH;

VAR GD, GM, R, N: INTEGER;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

R: =1; SETCOLOR (GREEN);

FOR N: = 1 TO 10 DO BEGIN

CIRCLE (320, 240, R);

R: = R+3; END;

READLN; CLOSEGRAPH;

END.

Задача №2

Написать программу, выводящую на экран 20 окружностей, радиус изменяется от1, Y =240, X изменяется с шагом 10, цвет голубой.

PROGRAM OKR;

USES GRAPH;

VAR GD, GM, R, N, X: INTEGER;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’); X: =0;

R: =1; SETCOLOR (BLUE);

FOR N: = 1 TO 20 DO BEGIN

CIRCLE (X, 240, R);

R: = R+9; X: =X+10; END;

READLN; CLOSEGRAPH;

END.

Задача №3

Написать программу для построения графики функции, Y=X2, X принадлежит промежутку

[-10; 10].

  1.  Начало координат на экранелевый верхний угол, нам привычнее начало координат переместить в точку 320, 240. Для этого Xц= X +320, Yц=240-Y.
  2.  Для более удобного просмотра график можно увеличить в n раз, n выбирается самостоятельно.
  3.  Значение функции и аргумента – действительные числа, нам потребуется перевести их в целое – функция ROUND.

PROGRAM GRAFIK;

USES GRAPH;

FUNCTION F (X: REAL): REAL;

BEGIN

F: = SQR(X); END;

VAR GD, GM, XE, YE: INTEGER; X, Y: REAL;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

X: =-10;

REPEAT

Y: =F(X);

XE: =ROUND (320+X*10);

YE: =ROUND (240-Y*10);

PUT PIXEL (XE, YE, BLUE); X: =X+0.1;

UNTIL X>10;

READLN; CLOSEGRAPH;

END.

Задача №4

Написать программу для построения, следующего изображения:

   Y=SIN(X)

 

PROGRAM SINUS;

USES GRAPH;

VAR GD, GM, XE, YE: INTEGER; X, Y: REAL;

FUNCTION F (X: REAL): REAL;

BEGIN

F: = SIN(X); END;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

X: =-10; SETCOLOR (RED);

REPEAT

Y: =F(X);

XE: =ROUND (320+X*12);

YE: =ROUND (240-Y*12);

LINE (0, 0, XE, YE); X: =X+0.1;

UNTIL X>10;

READLN; CLOSEGRAPH;

END.

Задача5

  1.  A, B, C, D – произвольные числа
  2.  A, B, C, D – произвольные числа

PROGRAM SECTOR;

USES GRAPH;

VAR GD, GM, A, B, C, D X, Y, R, A2, B2, C2, D2: INTEGER;

BEGIN

WRITE (‘введите A’); READLN (A);

WRITE (‘введите B’); READLN (B);

WRITE (‘введите C’); READLN (C);

WRITE (‘введите D’); READLN (D);

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

SETCOLOR (2);

X: = (A+B+C+D);

Y: =360 DIV X;

A2:=Y*A; B2:=Y*B; C2:=Y*C; D2:=Y*D;

PIESLIE (320, 240, 0, A2, 100);

PIESLIE (320, 240, A2, A2+B2, 100);

PIESLIE (320, 240, A2+B2, A2+B2+C2, 100);

PIESLIE (320, 240, A2+B2+C2, A2+B2+C2+D2, 100);

READLN; CLOSEGRAPH;

END.

Построение движущегося изображения.

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

Для реализации движения будем делать следующее:

  1.  Рисуем объект на экране.
  2.  Вычисляем (определяем) новые координаты объекта.
  3.  Стираем объект.
  4.  Повторяем действия n раз.

Пример: выбор объекта (окружность), выбор траектории движения (график функции SINX).

PROGRAM MOVECIRCLE;

USES GRAPH; CRT;

VAR GD, GM, XE, YE: INTEGER; X, Y: REAL;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

X: =-20;

REPEAT

Y: =SIN(X);

XE: =ROUND (320+X*10);

YE: =ROUND (240-Y*10);

SETCOLOR (WHITE);

CIRCLE (XE, YE, 20); DELAY (2000);

SETCOLOR (BLACK); CIRCLE (XE, YE, 20);

X: =X+0.1;

UNTIL X>20;

READLN; CLOSEGRAPH;

END.

Управление движением объекта на экране.

При управлении объектом траектория движения отсутствует. Для управления нам необходимо вводить данные с клавиатуры и в зависимости от нажатых клавиш изменять значение X или Y.

Пример:  

  1.  Ввод данных с клавиатуры сделаем с помощью READKEY – не требует нажатия ENTER для завершения ввода.
  2.  Определим клавиши для перемещения объекта:

W – вверх

S – вниз

A – влево

D – вправо

  1.  Так как движение должно быть постоянным необходимо определить клавишу завершение программы,  «_» – завершение работы.

PROGRAM UPRAV;

USES GRAPH; CRT;

VAR GD, GM, X, Y: INTEGER; C: CHAR;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

X: =320; Y: = 240; SETCOLOR (BLUE);

CIRCLE (X, Y, 20);

REPEAT

REPEAT

C: = READKEY; UNTIL C<> ‘’;

IF C =’W’ THEN Y: =Y-1;

IF C =’S’ THEN Y: =Y+1;

IF C =’A’ THEN X: =X-1;

IF C =’D’ THEN X: =X+1;

SETCOLOR (BLUE); CIRCLE (X, Y, 20);

UNTIL C = ’_’;

CLOSEGRAPH;

END.

Данная программа не перемещает объект, а рисует на экране траекторию его      движения.

Задача1

Написать программу, управляющую передвижением объекта (объект необходимо стирать).

PROGRAM KVADRAT;

USES GRAPH; CRT;

VAR GD, GM, XE, YE: INTEGER; X, Y: REAL;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

X: =-20;

REPEAT

Y: =SQR (X);

XE: =ROUND (320+X*10);

YE: =ROUND (240-Y*10);

SETCOLOR (5);

RECTANGLE (XE, YE, XE+20, YE-20);

DELAY (2000);

SETCOLOR (BLACK); RECTANGLE (XE, YE, XE+20, YE-20);

X: =X+0.1;

UNTIL X>20;

READLN; CLOSEGRAPH;

END.

Построение векторного изображения с помощью языка PASCAL.

Векторная графика – это способ построения изображения, основанный на использовании двух объектов: точки, линии.

При построении изображения определяются координаты точек, точки соединяются линиями. Тип линии – график какой-либо функции (наиболее простая линия – прямая).

Изображение трехмерного объекта на экране.

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

  1.          z     Изометрическая

 Xi =(Y-X)*COS300

1200  Yi =Z-(X+Y)*SIN300

 x    y

             z  x  Диметрическая

  1.  

y

Последовательность действий при построении трехмерного объекта:

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

Пример: Проекция – изометрическая

X

Y

Z

1

60

0

0

2

0

60

0

3

0

0

0

4

30

30

60

PROGRAM GRAH3D;

USES GRAPH;

CONST

X1=60; Y1=0; Z1=0;

X2=0; Y2=60; Z2=0;

X3=0; Y3=0; Z3=0;

X4=30; Y4=30; Z4=60;

VAR GD, GM: INTEGER;

FUNCTION XI (X, Y: INTEGER): INTEGER;

BEGIN

XI: = ROUND (320+(Y-X)*COS (PI/6)); END;

FUNCTION YI (X, Y, Z: INTEGER): INTEGER;

BEGIN

YI: =ROUND (240-(Z-(X+Y)*SIN (PI/6))); END;

BEGIN

GD: = DETECT; INITGRAPH (GD, GM, ‘’);

LINE (XI(X1, Y1), YI(X1, Y1, Z1), XI(X2, Y2), YI(X2, Y2, Z2));

LINE (XI(X2, Y2), YI(X2, Y2, Z2), XI(X3, Y3), YI(X3, Y3, Z3));

LINE (XI(X3, Y3), YI(X3, Y3, Z3), XI(X4, Y4), YI(X4, Y4, Z4));

LINE (XI(X4, Y4), YI(X4, Y4, Z4), XI(X1, Y1), YI(X1, Y1, Z1));

LINE (XI(X2, Y2), YI(X2, Y2, Z2), XI(X4, Y4), YI(X4, Y4, Z4));

LINE (XI(X1, Y1), YI(X1, Y1, Z1), XI(X3, Y3), YI(X3, Y3, Z3));

READLN; CLOSEGRAPH;

END.

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

  1.  Общие сведения.

Собственные типы данных используются в следующих ситуациях:

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

TYPE_ имя типа данных = описание;

Имя – может быть любое. Не должно содержать пробелов, специальных символов. Принято первую букву имени ставить T.

Описание – при описании структурных типов (RECORD, OBJECT) описание завершается с END;

  1.  Использование собственных типов данных – после определения тип данных может использоваться так же, как предопределенный, то есть используется для описания переменных.
  2.  Примеры.
    1.  Определите тип данных для определения переменных – ФИО.

TYPE TFIO = STRING [50];

  1.  Определите тип данных – массив 12 элементов целого типа.

TYPE TMASSIV = ARRAY [1..12] OF INTEGER;

  1.  Определите массив – двумерный массив 1..5, 1..5, действительных элементов.

TYPE TMASS = ARRAY [1..5, 1..5] OF REAL;

  1.  Решение задач с использованием собственных типов.

Задача№1

Написать программу, выполняющая следующие действия: определение типа данных – массив 20 элементов целого типа; определение переменных типа массив (1 переменная); заполнение массива, вывод его на экран.

PROGRAM Z1;

TYPE T MASS = ARRAY [1..20] OF INTEGER;

VAR X: TMASS; I: BYTE;

BEGIN

FOR I: = 1 TO 20 DO BEGIN

X [I]: =RANDOM (100);

WRITELN (‘X’, I,’=’, X [I]); END;

END.

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

Задача№2

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

PROGRAM Z2;

TYPE T MASS = ARRAY [1..20] OF INTEGER;

FUNCTION MAX (VAR X: TMASS): INTEGER;

VAR I: BYTE; M: INTEGER;

BEGIN

M: = X [1];

FOR I: = 2 TO 20 DO

IF X [I]>M THEN M: = X [I];

MAX: =M; END;

VAR M1, M2: TMASS; I: BYTE;

BEGIN

FOR I: = 1 TO 20 DO BEGIN

M1 [I]: =RANDOM (100) +50;

WRITELN (‘M1’, I,’=’, M1 [I]); END;

FOR I: = 1 TO 20 DO BEGIN

M2 [I]: =RANDOM (140) +20;

WRITELN (‘M2’, I,’=’, M2 [I]); END;

WRITELN (‘максимальный элемент первого массива =’, MAX (M1));

WRITELN (‘максимальный элемент второго массива =’, MAX (M2));

END.

Задача№3

Определить тип данных массив 1..20 REAL. Функции: максимум, минимум, среднее значение.

PROGRAM Z3;

TYPE T MASS = ARRAY [1..20] OF INTEGER;

FUNCTION MAX (VAR X: TMASS): INTEGER;

VAR I: BYTE; M: BYTE;

M: = X [1];

FOR I: = 2 TO 20 DO

IF X [I]>M THEN M: = X [I];

MAX: =M; END;

FUNCTION MIN (VAR X: TMASS): INTEGER;

VAR I: BYTE; M: BYTE;

BEGIN

M: = X [1];

FOR I: = 2 TO 20 DO

IF X [I] <M THEN M: = X [I];

MIN: =M; END;

FUNCTION SR (VAR X: TMASS): REAL;

VAR I: BYTE; SUM: REAL;

BEGIN

SUM: =0;

FOR I: =1 TO 20 DO

SUM: =SUM +X [I];

SR: =SUM/20; END;

VAR M1, M2, M3: TMASS; I: BYTE;

BEGIN

FOR I: = 1 TO 20 DO BEGIN

M1 [I]: =RANDOM (100) -50;

WRITELN (‘M1’, I,’=’, M1 [I]); END;

M2 [I]: =RANDOM (200) +10;

WRITELN (‘M2’, I,’=’, M2 [I]); END;

FOR I: = 1 TO 20 DO BEGIN

M3 [I]: =RANDOM (150) -10;

WRITELN (‘M3’, I,’=’, M3 [I]); END;

WRITELN (‘максимальный элемент =’, MAX (M1));

WRITELN (‘минимальный элемент =’, MIN (M2));

WRITELN (‘среднее значение =’, SR (M3):6:2);

END.

Объектно-ориентированное программирование.

  1.  Основная идея – представление решения задачи в виде комбинации (взаимодействия) объектов. Под объектом понимается тип данных.
  2.  Характеристики типа данных OBJECT. Тип данных является структурным. Объединяет в себе свойства объекта и средства для их обработки (функции и процедуры).

Свойства объекта: характеристики, имеющие значение для решения поставленной задачи.

Средства обработки называются методами.

Объект – математическое отображение объекта реального мира.

  

  Набор свойств и методов объекта зависит от решаемой задачи.

  1.  Общий вид определения типа данных объекта.

TYPE имя типа = OBJECT

Список свойств;

Список методов;

END;

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

TYPE TSTUDENT = OBJECT

NST: STRING [6];

FIO: STRING [25];

GR: WORD;

FUNCTION VOZR (VAR GOD: WORD): WORD;

END;

FUNCTION TSTUDENT. VOZR (VAR GOD: WORD): WORD;

BEGIN

VOZR: = GOD – GR;

END;

 Программный код методов (функций и процедур) записывается после описания объекта.  Форма записи: FUNCTION (PROCEDURE_имя объекта _имя метода);

PROGRAM VOZRAST;

TYPE TSTUDENT = OBJECT

NST: STRING [6];

FIO: STRING [25];

GR: WORD;

FUNCTION VOZR (VAR GOD: WORD): WORD;

END;

FUNCTION TSTUDENT. VOZR (VAR GOD: WORD): WORD;

BEGIN

VOZR: = GOD – GR;

END;

VAR X: TSTUDENT; GOD: WORD;

BEGIN

WRITE (‘’); READLN (GOD);

X. FIO: =’Табакова А. А.’; X. GR: = 1992; X. NST: =’Т-160’

WRITELN (‘VOZR=’, X. VOZR (GOD)); READLN;

END.

Задача №1

Дан объект «точка». Свойства: координаты; метод: определение расстояния между центром и точкой, заполнить координаты, вывести на экран расстояние.

PROGRAM RASTOIANIE;

TYPE TTOCHKA = OBJECT

X: WORD; Y: WORD;

FUNCTION RAST: REAL;

END;

FUNCTION TTOCHKA. RAST: REAL;

BEGIN

RAST: =SQRT (X*X+Y*Y); END;

VAR Z: TTOCHKA; X1, Y1: WORD;

BEGIN

WRITELN (‘введите координаты точек X1, Y1’); READLN (X1, Y1);

Z.X: = X1, Z.Y: = Y1;

WRITELN (‘RAST=’, Z.RAST); READLN;

END.

Применение объектно-ориентированного программирования в решении задач.

Перед решение надо подумать и определить:

  1.  Какой объект будем использовать (какие объекты);
  2.  Какие свойства и методы необходимо определить для этого объекта;
  3.  Определить объект – тип данных;
  4.  Определить переменные – объекты;
  5.  Решить задачу – использовать объект.

Пример№1: определить решение линейного уравнения. Объект – линейное уравнение, свойства: коэффициенты К, В: REAL; методы: проверка К не равно 0 (функция), решение -В/К (функция).

PROGRAM USEOBJ;

TYPE TLIN = OBJECT

K, B: REAL;

FUNCTION CHECK: BOOLEAN;

FUNCTION RESH: REAL;

END;

FUNCTION TLIN. CHECK: BOOLEAN;

BEGIN

CHECK: = K<>0; END;

FUNCTION TLIN. RESH: REAL;

BEGIN

RESH: = -B/K; END;

VAR LIN: TLIN;

BEGIN

WRITE (‘сообщите коэффициент уравнения’); READLN (LIN. K, LIN. B);

IF LIN. CHECK = TRUE THEN WRITELN (‘решение=’, LIN. RESH: 8:3)

ELSE WRITELN (‘решения нет’);

END.

Пример№2: определить стоимость покупки. Известно: цена за единицу и количество.

  

  В данном примере проверку можно не делать (метод  CHECK не нужен)

PROGRAM STOIM;

TYPE TSTOIM = OBJECT

KOL, CENA: REAL;

FUNCTION RESH: REAL;

END;

FUNCTION TSTOIM. RESH: REAL;

BEGIN

RESH: = KOL*CENA;

END;

VAR STOIM: TSTOIM;

BEGIN

WRITE (‘сообщите количество и цену’); READLN (STOIM. KOL, STOIM. CENA);

WRITELN (‘ответ=’, STOIM. RESH: 6:3);

END.

Структура из объектов.

  1.  Общие сведения.

Так как «объект» является типом данных он может использоваться для определения свойств других объектов. Таким образом, можно строить «древовидные» структуры объектов. Удобства древовидных структур заключается  в том, что, изменяя корневой или узловой объект, мы изменяем все «дерево» или «ветку».

Идея построения структур с наследованием свойств называется «наследование» – одна из базовых идей ООП.

  1.  Пример построения структур объектов.

Задача №1

Определить типы данных «точка» и «окружность».

PROGRAM OKRUZHOST;

TYPE TTOCHKA = OBJECT

X, Y: REAL;

FUNCTION RAST: REAL;

END;

TYPE TOKR = OBJECT

CENTR: TTOCHKA; R: REAL;

FUNCTION DLINA: REAL;

END;

FUNCTION TTOCHKA. RAST: REAL;

BEGIN

RAST: = SQRT (X*X+Y*Y); END;

FUNCTION TOKR. DLINA: REAL;

BEGIN

DLINA: = 2*PI*R; END;

VAR Z: TTOCHKA; X1, Y1, R1: REAL; W: TOKR;

BEGIN

WRITELN (‘введите X1, Y1’); READLN (X1, Y1);

Z. X: =X1; Z. Y: =Y1;

WRITELN (‘введите R1’); READLN (R1);

W. CENTR: =Z; W.R:=R1;

WRITELN (‘RAST=’, Z. RAST: 5:3);

WRITELN (‘DLINA=’, W. DLINA: 5:3);

READLN;

END.

Задача №2

Определить объект «точка» и «отрезок» (две точки, метод – длина отрезка), массив 10 отрезков, вывести координаты вершин отрезков, вывести длины.

PROGRAM OTREZOKITOCHKA;

TYPE TTOCHKA = OBJECT

X, Y: REAL;

END;

TYPE TOTREZ = OBJECT

A, B: TTOCHKA

FUNCTION DLINA: REAL;

END;

FUNCTION TOTREZ. DLINA: REAL;

BEGIN

DLINA: = SQRT (SQR (A.X-B.X) +SQR (A.Y-B.Y));

END;

VAR M: ARRAY [1..10] OF TOTREZ; N:BYTE;

BEGIN

FOR N: =1 TO 10 DO BEGIN

M [N]. A. X: =RANDOM (10); M [N]. A. Y: =RANDOM (10);

M [N]. B. X: =RANDOM (10); M [N]. B. Y: =RANDOM (10);

WRITELN (‘отрезок’, N, ‘имеет координаты’, M [N]. A. X: 8:3, ‘;’, M [N]. B. X: 8:3, ‘ ’,

M [N]. A. Y: 8:3, ‘;’, M [N]. B. Y: 8:3);

WRITELN (‘длина=’, M [N]. DLINA: 8:3);

END;

END.

Диапазоны.

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

  1.  определение индексов в массивах;
  2.  при проверке принадлежности элемента диапазона.

Пример№1:  [1..10] – диапазон, целые числа от 1 до 10.

Пример№2: диапазон – строчные латинские буквы [‘a’..’z’].

Пример№3: диапазон – нечетные цифры [1, 3, 5, 7, 9].

Пример№4: диапазон, содержащий цифры 16-ричной системы счисления [‘0’..’9’, ‘a’..’f’].

Функция, используемая при работе с диапазоном:

элемент IN диапазон: BOOLEAN;

Значение операции IN = TRUE, если элемент принадлежит диапазону, если IN = FALSE, то не принадлежит.

Решение задач с диапазонами.

Задача №1

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

PROGRAM ZAGL;

VAR KOL: BYTE; STROKA: STRING; N, D: BYTE;

BEGIN

WRITE (‘введите строку’); READLN (STROKA);

D: = LENGTH (STROKA);

KOL: =0;

FOR N: =1 TO D DO

IF STROKA [N] IN [‘A’..’Z’] THEN INC (KOL);

WRITELN (‘в строке’, KOL, ‘заглавных букв’);

END.

Задача №2

В произвольной строке определить количество знаков препинания.

PROGRAM ZAGL;

VAR KOL: BYTE; STROKA: STRING; N, D: BYTE;

BEGIN

WRITE (‘введите строку’); READLN (STROKA);

D: = LENGTH (STROKA);

KOL: =0;

FOR N: =1 TO D DO

IF STROKA [N] IN [‘.’,’,’,’!’,’?’,’;’,’:’,’-’] THEN INC (KOL);

WRITELN (‘в строке’, KOL, ‘знаков препинания’);

END.

Задача №3

В произвольной строке определить есть или нет 16-ричные цифры. Ответ должен быть либо да, либо нет.

PROGRAM CIFRI;

VAR KOL: BYTE; STROKA: STRING; N, D: BYTE;

BEGIN

WRITE (‘введите строку’); READLN (STROKA);

D: = LENGTH (STROKA);

KOL: =0;

FOR N: =1 TO D DO

IF STROKA [N] IN [‘0’..’9’, ‘A’..’F’] THEN KOL: =1;

IF KOL=1 THEN WRITELN (‘да’) ELSE WRITELN (‘нет’);

END.

Задача №4

Определить является ли введенное число двузначным. Число должно вводиться как переменная числового типа.

PROGRAM DVUZNACH;

VAR CHISLO: BYTE;

BEGIN

WRITE (‘введите число’); READLN (CHISLO);

IF CHISLO IN [10..99] THEN WRITELN (‘число двузначное’) ELSE WRITELN (‘не двузначное);

END.

Модули (библиотеки).

  1.  Общие сведения.

Модуль – подключаемая к основной часть программы.

Модуль может содержать:

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

Все элементы подключенного модуля могут использоваться в основной программе как предопределенное. Основное назначение модуля – сохранение часто используемых элементов программы. Модули могут быть «целевыми».

  1.  Структура модуля.

Модуль состоит из двух частей:

  1.  INTERFACE содержит определение типов данных, определение переменных и постоянных, заголовки определения функций и процедур.
  2.  IMPLEMENTATION – программный код функций и процедур (включая методы типов данных объект).

Общая структура модуля:

UNIT имя модуля;

 Имя модуля и имя сохраняемого файла должно совпадать!

INTERFACE

      * * *

IMPLEMENTATION

      * * *

END.

  1.  Пример разработки модуля.

Пример№1: разработать модуль, содержащий функции TG X, CTG X.

UNIT MATH;

INTERFACE

FUNCTION TG (VAR X: REAL): REAL;

FUNCTION CTG (VAR X: REAL): REAL;

IMPLEMENTATION

FUNCTION TG (VAR X: REAL): REAL;

BEGIN

TG: = SIN(X)/ COS(X); END;

FUNCTION CTG (VAR X: REAL): REAL;

BEGIN

CTG: =COS(X)/ SIN(X); END;

END.

  1.  Использование модуля.
    1.  Компиляция модуля. Модуль не является запускаемой программой. Модуль может быть подключен к главной программе. Подключение возможно только скомпилированного модуля. Последовательность действий при компиляции:
      •  Сохранить;
      •  Проверить назначение компиляции ALT+CCOMPILE – если DISK, то нажимаем ESC, а если MEMORY, то нажимаем ENTER;
      •  Компиляция ALT+F9;
      •  Проверить, что компиляция прошла успешно (имя модуля. PAS, имя модуля. TPU).
  2.  Подключение модуля (возможно только для скомпилированного модуля).

 USES имя модуля;

  1.   Пример использования модуля:

Пример№2: вычислить значение функций TG2(X), CTG(X2). Для вычислений использовать модуль MATH.

PROGRAM TESTMATH;

USES MATH;

VAR X, Y1, Y2: REAL;

BEGIN

WRITE (‘введите X’); READLN (X);

Y1:= TG(X)*TG(X);

Y2:=CTG(X*X);

WRITELN (‘Y1=’, Y1:8:3);

WRITELN (‘Y2=’, Y2:8:3);

END.

Задача №1

Разработать модуль, содержащий функции Xn, X1/n. Написать программу для проверки модуля.

Модуль:
UNIT ALGEBRA;

INTERFACE

FUNCTION STEPEN (VAR X, N: BYTE): REAL;

FUNCTION KOR (VAR X, N: BYTE): REAL;

IMPLEMENTATION

FUNCTION STEPEN (VAR X, N: BYTE): REAL;

BEGIN

STEPEN: = EXP (N*LN(X)); END;

FUNCTION KOR (VAR X, N: BYTE): REAL;

BEGIN

KOR: = EXP (1/N*LN(X)); END;

END.

Программа:
PROGRAM TESTALGEBRA;

USES ALGEBRA;

VAR X, N: BYTE; Y1, Y2: REAL;

BEGIN

WRITE (‘введите X, N’); READLN (X,N);

Y1:= STEPEN(X, N);

Y2:=KOR(X, N);

WRITELN (‘Y1=’, Y1:8:3);

WRITELN (‘Y2=’, Y2:8:3);

END.

Разработка модулей.

  1.  Общие сведения.

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

  1.  Пример разработки.

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

Определим общие задачи, которые встречаются при работе с массивами:

  1.  заполнение – ZAP (массив, начало, конец);
  2.  вывод на экран – OUT (массив);
  3.  нахождение суммы – SUMMA (массив);
  4.  MAX (массив)
  5.  MIN (массив).

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

UNIT MASSIV;

INTERFACE

TYPE TMASS = ARRAY [1..100] OF REAL;

PROCEDURE ZAP (VAR M: TMASS; A, B: INTEGER; K: BYTE);

PROCEDURE OUT (VAR M: TMASS; K: BYTE);

FUNCTION SUMMA (VAR: TMASS; K: BYTE): REAL;

FUNCTION MAX (VAR: TMASS; K: BYTE): REAL;

FUNCTION MIN (VAR: TMASS; K: BYTE): REAL;

IMPLEMENTATION

PROCEDURE ZAP (VAR M: TMASS; A, B: INTEGER; K: BYTE);

VAR N: BYTE;

BEGIN

FOR N: = 1 TO K DO

M [N]:= RANDOM (B-A) +B;

END;

PROCEDURE OUT (VAR M: TMASS; K: BYTE);

VAR N: BYTE;

BEGIN

FOR N: = 1 TO K DO

WRITELN (‘номер’, N,’=’, M [N]:8:3);

END;

FUNCTION SUMMA (VAR: TMASS; K: BYTE): REAL;

VAR N: BYTE; S: REAL;

BEGIN

S: =0;

FOR N: = 1 TO K DO

S: = S+M [N]; SUMMA: =S; END;

FUNCTION MAX (VAR: TMASS; K: BYTE): REAL;

VAR N: BYTE; X: REAL;

BEGIN

X: =M [1];

FOR N: = 2 TO K DO

IF M [N]>X THEN X: =M [N];

MAX: =X;

END;

FUNCTION MIN (VAR: TMASS; K: BYTE): REAL;

VAR N: BYTE; X: REAL;

BEGIN

X: =M [1];

FOR N: = 2 TO K DO

IF M [N] <X THEN X: =M [N];

MIN: =X;

END;

END;


Функциональный тип данных.

  1.  Общие сведения.

Функциональный тип определяет:

  •  количество и типы аргументов;
    •  тип вычисляемого значения.

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

  1.  Общий вид определения типа.

TYPE имя типа = FUNCTION (список аргументов): тип;

  1.  Примеры определения функционального типа.
    1.  TYPE TFUN = FUNCTION (X: REAL): REAL;
    2.  Определить функциональный тип данных – функция два аргумента целого типа,  вычисляемое значение тип

TYPE TFUN = FUNCTION (X, Y: BYTE): REAL;

  1.  Определение функции, которая соответствует функциональному типу.

Список аргументов и тип значения должны совпадать с определением типа

Например: определим функцию соответствующую второму примеру

FUNCTION FUN (X, Y: BYTE): REAL; FAR;

BEGIN

FUN: = X/Y; END;

  1.  Решение задач.

Задача №1

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

PROGRAM TWOFUN;

TYPE TFUN = FUNCTION (X: REAL): REAL;

FUNCTION F1 (X: REAL): REAL; FAR;

BEGIN

F1:= X*X; END;

FUNCTION F2 (X: REAL): REAL; FAR;

BEGIN

F2:= 3*X; END;

FUNCTION MAXF (F1, F2: TFUN; X1, X2: REAL): REAL;

BEGIN

IF F1 (X1)> F2 (X2) THEN MAXF: = F1 (X1) ELSE MAXF: = F1 (X2); END;

VAR X1, X2: REAL;

BEGIN

WRITE (‘сообщите X1’); READLN (X1);

WRITE (‘сообщите X2’); READLN (X2);

WRITELN (MAXF (F1, F2, X1, X2):8:3);

END.

Задача №2

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

PROGRAM FREEFUN;

TYPE TFUN = FUNCTION (X: REAL): REAL;

FUNCTION F1 (X: REAL): REAL; FAR;

BEGIN

F1:= X*X; END;

FUNCTION F2 (X: REAL): REAL; FAR;

BEGIN

F2:= 3*X; END;

FUNCTION SUMF (F1, F2: TFUN; X1, X2: REAL): REAL;

BEGIN

SUMF: =F1 (X1) + F2 (X2); END;

VAR X1, X2: REAL;

BEGIN

WRITE (‘сообщите X1’); READLN (X1);

WRITE (‘сообщите X2’); READLN (X2);

WRITELN (MAXF (F1, F2, X1, X2):8:3);

END.

Динамические переменные (указатели).

  1.  Общие сведения.

В языках программирования имеются два типа переменных: статические и динамические.

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

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

  1.  Определение динамических переменных.

VAR имя переменной: ^ тип;

Тип – любой, доступный (предопределенный и определяемый).

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

MEMAVAIL: LONGINT;

Пример: WRITELN (MEMAVAIL); – вывод на экран размера доступной памяти.

б.NEW (динамическая переменная); – процедуры выделения памяти для переменных.

Перед использованием динамической переменной обязательно выделить память. После выделения памяти динамическую переменную можно использовать как статическую. Только после имени переменной необходимо ставить значок «^».

Пример: NEW (A); A^:= 2.5;

  1.  DISPOSE (динамическая переменная); – освобождение памяти от динамической переменной. Обязательно после завершения работы.
  2.  SIZEOF (динамическая переменная): LONGINT; – определение размера оперативной памяти необходимо для размещения динамической переменной (размер в байтах).
  3.  GETMEM (динамическая переменная, объем); – выделение памяти, конкретное.
  4.  FREEMEM (динамическая переменная, объем); – освобождение памяти.
  5.  Примеры программ.

Задача №1

Написать программу, которая позволяет определить размер оперативной памяти выделяемой для переменной типа STRING.

PROGRAM TESTRAM;

VAR X: ^ STRING;

BEGIN

WRITELN (‘до’, MEMAVAIL);

NEW (X);

WRITELN (‘после’, MEMAVAIL);

DISPOSE (X);

WRITELN (‘освободили’, MEMAVAIL);

END.

Задача №2

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

PROGRAM DINAMARRAY;

TYPE TARR = ARRAY [1..20] OF BYTE;

VAR A: ^TARR; N: BYTE;

BEGIN

NEW (A);

FOR N: =1 TO 20 DO BEGIN

A^ [N]:= RANDOM (20) +5;

WRITELN (A^ [N]); END;

DISPOSE (A);

END.

Задача №3

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

PROGRAM DINAMARRAY;

TYPE TARR = ARRAY [1..15] OF REAL;

VAR A: ^TARR; N: BYTE; SUM: REAL;

BEGIN

NEW (A); SUM: =0;

FOR N: =1 TO 15 DO BEGIN

A^ [N]:= RANDOM (20) +5;

SUM: = SUM+A^ [N];

WRITELN (A^ [N]); END;

WRITELN (‘сумма =’, SUM: 6:2);

DISPOSE (A);

END.

  1.  Динамические списки.Общие сведения.

Динамические списки позволяют определять переменные неопределенной длины. При этом каждая следующая переменная «порождается» предыдущей. С помощью динамических списков можно организовать работу с текстом неограниченной длины.

  1.  Организация динамических списков.

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

  1.  Трудности при работе со списком.
    •  необходимость сохранения первого элемента – для возможности просмотра заново;
    •  вставка нового элемента – необходимо переопределение указателей предыдущего и следующего элементов;
    •  удаление элемента – переопределение указателей;
    •  двунаправленные списки – необходимо определение двух указателей на следующий  предыдущий элементы.
  2.  Организация списков.

Организуем однонаправленный список, позволяющий работать с неограниченным числом переменных типа STRING. Для организации нам потребуется: определить тип данных RECORD, который будет содержать ТЕХ – строка, NEXT – указатель на следующую строку; определить указатель на тип данных; для возможности повторного просмотра списка первую запись будем сохранять в отдельной переменной.

PROGRAM DINAMSPISKI;

TYPE PTR=^TREC;

TREC=RECORD

TEX: STRING; NEXT: PTR;

END;

VAR BEG, S: PTR;

BEGIN

NEW (BEG); NEW (S);

WRITE (‘введите строку’); READLN (S^.TEX);

NEW (S^. NEXT); BEG^:=S^;

S: =S^. NEXT^;

WRITE (‘введите строку ‘); READLN (S^.TEX);

NEW (S^.NEXT);

S: =S^.NEXT^;

S^:=BEG^;

WRITELN (‘1-я’, S^. TEX);

WRITELN (‘2-я’, S^. TEX);

END.

Двумерный массив.

  1.  Общие сведения.

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

 

 

 

 

X

 

 

 

 

 

 

 

A                      
     VAR A [1..3, 1..4] OF
тип;    

A [2, 1]

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

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

VAR SHESS [1..8, ‘a’..’h’] OF CHAR;

  1.  Работа с двумерным массивом.

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

Задача№1

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

PROGRAM ZAPOLN;

VAR M: ARRAY [1..5, 1..10] OF INTEGER; NROW, NCOL:BYTE;

BEGIN

FOR NROW: =1 TO 5 DO BEGIN

FOR NCOL: =1 TO 10 DO BEGIN

M [NROW, NCOL]:=RANDOM (15) +10;

WRITE (M [NROW, NCOL]:4); END;

WRITELN; END;

END.

Задача№2

Определить среднее значение элемента массива. Массив из примера №1 (заполнение писать не будем).

PROGRAM ZAPOLN2;

VAR M: ARRAY [1..5, 1..10] OF INTEGER; NROW, NCOL:BYTE; S: INTEGER; SR:REAL;

BEGIN

S: =0;

(Заполнение массива)

FOR NROW: =1 TO 5 DO

FOR NCOL: =1 TO 10 DO

S: =S+M [NROW, NCOL];

SR: =S/50;

WRITELN (‘среднее значение =’, SR: 8:3); END.

Рекурсия.

  1.  Общие сведения.

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

Сферы применения – ПО, в котором главный показатель качества компактность программы:

  •  программы для мобильных устройств;
  •  встроенное ПО;
  •  системное ПО.
    1.  Трудности в использовании.

Точное определение выхода из рекурсии:

  •  переполнение регистров процессора;
  •  переполнение стека(STACK OVERFLOW);
  •  бесконечный цикл.
    1.  Пример использования.

Задача№1

Написать процедуру, выдающую на экран N раз строку «Рекурсия».

RPOGRAM REC1;

PROCEDURE VYVOD (N: INTEGER);

BEGIN

IF N>=0 THEN BEGIN

WRITELN (‘рекурсия’); DEC (N); VYVOD (N);

END; END;

BEGIN

VYVOD (5);

END.

Задача№2

Написать рекурсивное вычисление N!

RPOGRAM REC2;

FUNCTION FACT (N: INTEGER): REAL;

BEGIN

FACT: =1;

IF N>1 THEN BEGIN FACT: =N*FACT (N-1); END;

END;

BEGIN

WRITELN (FACT (4):10:1, ‘если Вы видите 24, то хорошо!’);

END.

Задача№3

Написать рекурсивную процедуру для вывода на экран произвольной строки N раз.

RPOGRAM REC3;

PROCEDURE VYVOD (N: INTEGER; S: STRING);

BEGIN

IF N>0 THEN BEGIN WRITELN(S); DEC (N); VYVOD (N, S);

END; END;

VAR S: STRING; N: INTEGER;

BEGIN

WRITELN (‘введите строку, количество’); READLN (N, S);

VYVOD (N, S);

END.


 

А также другие работы, которые могут Вас заинтересовать

34723. Денежная система Древнерусского государства 15.01 KB
  происходит дальнейшее усложнение денежной системы. общерусская денежновесовая система как бы разделилась на две местные системы северную и южную. В основу северной системы была положена норма веса принятая в торговле с Западной Европой. Гривна этой системы равнялась 5119 г серебра и являлась древнейшим элементом возникше.
34724. Мера веса и объема в удельных княжествах 12.94 KB
  Основными мерами веса являлись большая96 золотников и малая48 золотников гривенка. В новгородских летописях появляется новая единица весапочка служившая при взвешивании благородных металлов и драгоценных камней. Продолжают употребляться крупные единицы весаберковец равный 10 пудам; пуд; а так же новая мера капь=4 пудам= 65.
34725. Изменение единиц площади, длины и расстояния в удельных княжествах 15.91 KB
  Сохраняется старое деление крупных единиц на мелкие: локоть или стопа = 2 пядям или ногам; сажень = 4 локтям = 8 пядям.и сажень в 174 см. Малой пяди в 19 см соответствовал локоть в 38 см й сажень в 152 см. Помимо указанных размеров саженей локтей и пядей в употреблении была и сажень в 216 см образовавшаяся на основании пяди с кувырком в 27 см1.
34726. Дифференциация денежной системы Руси периода феодальной раздробленности 18.37 KB
  Таким образом гривна из счетной денежной единицы гривны кун превратилась в гривну серебра. По источникам можно проследить что стоимость гривны серебра была в четыре раза больше стоимости гривны кун. Вес этой гривны 195 2045 г. Основные единицы гривны сеЬёрорусской и южнорусской денежных систем существовали в виде слитков.
34727. Метрологическая деятельность Московского государства по унификации системы измерений 16.43 KB
  Если в период феодальной раздробленности можо было наблюдать различие в местных мерах то в Русском централизованном государстве правительство стремится создать единые общегосударственные меры обязательные к употреблению по всей стране. Это мероприятие диктовалось централизаторской политикой правительства. Необходимость введения единых мер и веса диктовалась и экономическими соображениями.
34728. Меры длины и расстояния централизованного государства 15.5 KB
  начинает употребляться новая единица длины аршин. Аршин мера восточного происхождения но точного прототипа аршина среди восточных мер нет. Распространение аршина проходит от центра к окраинам. господствовал аршин.
34729. Меры поверхности в централизованном государстве. Сошное письмо 19.08 KB
  Официальный размер казенной десятины определился и 2400 кнадратпых сажен 80 сажеп длины и 30 сажан ширины. Наряду с казенной десятиной на частновладельческих землях встречалась десятина и большей площади 80 сажен длины и 40 ширины т. 3200 квадратных сажен. Попадалась десятина и в 2500 квадратных сажен по 50 сажен в длину и ширину.
34730. Меры веса и объема централизованного государства 16.98 KB
  В XVI XVII вв. Вместе с тем Торговая книга называет и другие весовые единицы ансыръ или фунт: В документах XVI XVII вв. В течение XVII в. Новой мерой по сравнению с предыдущим периодом является четверик появившийся в начале XVII в.
34731. Единицы длины, расстояния и площади в Российской империи 17.9 KB
  Образованной для разработки мероприятий по уточнению мер и организации поверочного дела а также обмеры подлинной линейки начала XVIII в. которой пользовался Петр I свидетельствуют что меры длины в первой половине XVIII в. омимо аршина и сажени в XVIII XIX вв. В XVIII в.