методические указания к контрольной работе по информатике n 1

advertisement
Герасименко С.А. (geras@mail.esoo.ru)
КОНТРОЛЬНЫЕ РАБОТЫ ПО ИНФОРМАТИКЕ И МЕТОДИЧЕСКИЕ УКАЗАНИЯ К НИМ:
Первый год обучения — Оренбург: Издательство ОГПУ, 2001. – 39 с.
Пособие предназначено для обучающихся
(программирования) заочной физико-технической школы.
на
отделении
информатики
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К КОНТРОЛЬНОЙ РАБОТЕ ПО ИНФОРМАТИКЕ N 1
ТЕМА: ОПЕРАТОРЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ ПАСКАЛЬ.
Перед выполнением данной работы необходимо изучить и освоить
следующие разделы языка программирования Турбо Паскаль: алфавит,
синтаксис и семантика языка программирования Паскаль; данные,
структуры данных, выражения, типы данных; структура программы.
(см. [2], [4], [6], [7], [8])
Основная часть программы на Турбо Паскаль представляет собой
последовательность
операторов,
каждый
из
которых
производит
некоторое действие над данными. Разделителем операторов служит
точка с запятой. Все операторы языка Турбо Паскаль подразделяются
на две группы: простые и структурные.
1. ПРОСТЫЕ ОПЕРАТОРЫ.
Операторы,
не
содержащие
никаких
других
операторов,
называются простыми. К ним относятся операторы присваивания,
безусловного перехода, вызова процедуры и пустой оператор.
1.1. Оператор присваивания.
Самым простым, но наиболее часто встречающимся оператором
является
оператор
присваивания.
Он
определяет,
что
вновь
вычисленное значение должно быть присвоено некоторой переменной.
Формат оператора:
<имя переменной>:= <выражение>
Переменной присваивается значение, получающееся в результате
вычисления
выражения,
стоящего
в
правой
части
оператора
присваивания. Переменная и выражение должны иметь одинаковый тип.
Пусть, например, заданы следующие описания переменных:
VAR I,J,K:INTEGER;
A,B,C:REAL;
BOOL:BOOLEAN;
CH1,CH2:CHAR;
Тогда возможны следующие операторы присваивания:
I:= I DIV J + K;
A:= B/C;
BOOL:=A=B;
CH1:=CH2;
1.2. Оператор безусловного перехода.
Оператор безусловного перехода предоставляет возможность
изменять порядок выполнения операторов. С его помощью естественный
порядок выполнения программы (т.е. оператор за оператором)
прерывается и указывается, что дальнейшее выполнение программы
должно продолжаться с оператора, помеченного меткой, которая
использована в данном операторе перехода.
Формат оператора:
GOTO <метка>
Примеры операторов перехода и помеченных операторов:
GOTO 25;
GOTO M1;
25: IF X>0 THEN X:=X*X;
M1:I:=0;
Каждая метка, прежде чем она используется, должна быть
описана в разделе описания меток. При использовании оператора GOTO
необходимо помнить, что областью действия метки является только
тот блок, в котором она описана. Передача управления в другой блок
запрещена.
1.3. Оператор вызова процедуры.
Оператор
вызова
процедуры
служит
предварительно
определенной
пользователем
процедуры. Например:
ClrScr;
InitWork(True);
Writeln('Hello');
для
или
активизации
стандартной
1.4. Пустой оператор.
Пустой оператор никак не обозначается и не вызывает никаких
действий. Пустой оператор - это просто лишняя точка с запятой в
программе. Чаще всего пустой оператор встречается с меткой и
ставится в конце составного оператора или в конце программы.
BEGIN
...
if A>0 then GOTO Metka;
{переход в конец блока}
...
Metka:
{пустой оператор помечен меткой}
END;
2. СТРУКТУРНЫЕ ОПЕРАТОРЫ.
Структурные
операторы
представляют
собой
конструкции,
построенные из других операторов по строго определенным правилам.
К
ним
относятся
операторы
составной,
условные,
повтора
и
присоединения.
2.1. Составной оператор.
Составной оператор объединяет некоторую последовательность
операторов
в
единый
оператор
путем
заключения
этой
последовательности в операторные скобки - служебные слова BEGIN и
END.
Формат оператора:
BEGIN
<оператор 1>;
<оператор 2>;
..
<оператор N>
END
Операторы, входящие в составной оператор, выполняются в том
порядке, в котором они записаны.
Пример составного оператора:
BEGIN
Y:=X/2;
Х:=Х+H
END;
2.2. Условные операторы.
В Турбо Паскале имеются два условных оператора IF и CASE.
2.2.1. Оператор IF.
С помощью оператора IF выбирается и выполняется один из
операторов, входящих в его состав.
Формат оператора:
IF <логическое выражение> THEN <оператор1> ELSE <оператор2>
Выполнение оператора IF происходит так: если логическое
выражение истинно, то выполняется первый оператор, если ложно, то
второй. Условный оператор используется также в сокращенной форме:
IF <логическое выражение> THEN <оператор>
В этом случае, если логическое выражение ложно, то не
происходит никаких действий. По синтаксису после THEN и
ELSE
может стоять только один оператор, поэтому если необходимо
выполнить несколько операторов, то их объединяют в составной
оператор.
Примеры условных операторов:
IF X<0 THEN I:=I+1 ELSE K:=K+1;
IF (X<5) AND (Y>=2) THEN BEGIN X:=SIN(X); Y:=Y+1 END;
Приведем пример программы с использованием рассмотренных выше
операторов.
Вводится непустая последовательность положительных чисел, за
которой следует нуль - это признак конца последовательности.
Вычислить среднее арифметическое этих чисел.
PROGRAM PRIMER1;
LABEL 1,2,3;
VAR I
: INTEGER;
X,S : REAL;
BEGIN
S:=0;
I:=0;
1:READLN(X);
IF X=0 THEN GOTO 2;
IF X<0 THEN GOTO 3;
S:=S+X;
I:=I+1;
GOTO 1;
3:WRITELN ('Недопустимое значение Х');
GOTO 1;
2:IF I>0
THEN WRITELN ('Среднее арифметическое равно',S/I)
ELSE WRITELN ('Пустая последовательность')
END.
2.2.2. Оператор варианта.
Часто в программе бывает необходимо проверять достаточно
много условий и в зависимости от них выполнять те или иные
действия. Для этого можно использовать многократно вложенные друг
в друга условные операторы IF. Однако в этом случае программа
становится громоздкой и ее трудно понимать. Считается, что число
уровней вложения не должно превышать двух-трех. Если же необходимо
выбирать из большего числа условий, то целесообразным становится
применение оператора варианта.
Формат оператора варианта:
CASE <селектор варианта> OF
<константа варианта 1>:<оператор 1>;
<константа варианта 2>:<оператор 2>;
...
<константа варианта n>:<оператор n>
END
Селектор варианта может быть любого порядкового типа.
Константы варианта должны быть того же типа, что и селектор
варианта. При выполнении оператора варианта сначала вычисляется
значение селектора варианта, а затем выполняется тот оператор,
который отмечен константой варианта, имеющей данное значение. Если
подходящей константы нет, то выполняется следующий за CASE
оператор.
В
Турбо
Паскале
предусмотрена
также
следующая
конструкция:
CASE <селектор варианта> OF
<константа варианта 1>:<оператор 1>;
...
<константа варианта n>:<оператор n>
ELSE <оператор>
END
Теперь, если значение селектора варианта не совпало ни с
одной константой, то будет выполняться оператор, записанный после
служебного слова ELSE.
Для того чтобы пометить оператор в списке выбора можно
использовать несколько констант варианта, а также диапазоны.
Например:
CASE CH OF
'A','B','E','I':CH1:=SUCC(CH1);
'K'..'R':CH1:=PRED(CH1)
END;
Отметим, что если после константы варианта нужно выполнить не
один, а несколько операторов, то необходимо использовать составной
оператор.
Пример программы с использованием оператора варианта.
Для целого числа k от 1 до 99 напечатать фразу "мне k лет",
учитывая при этом, что при некоторых значениях k слово "лет" надо
заменить на слово "год" или "года".
PROGRAM PRIMER2;
VAR NUM:0..99;
BEGIN
WRITE('Введите количество лет от 1 до 99: ');
READLN(NUM);
WRITE('Мне ',NUM,' ');
IF (NUM>=11) AND (NUM<=14)
THEN WRITELN('лет')
ELSE BEGIN
NUM:=NUM MOD 10;
CASE NUM OF
0,5..9 :WRITELN('лет');
1
:WRITELN('год');
2..4
:WRITELN('года')
END
END
END.
2.3. Операторы цикла.
Операторы цикла выполнять входящие в их состав операторы
несколько раз. В Паскале существует три вида операторов цикла:
оператор цикла с параметром, оператор цикла с предусловием,
оператор цикла с постусловием.
2.3.1. Оператор цикла с параметром.
Формат оператора цикла с параметром:
for V:=E1 to E2 do S
где V - переменная порядкового типа, Е1, Е2 - выражения того же
типа, S - оператор, называемый телом цикла. Выражения Е1 и Е2
вычисляются один раз при входе в цикл. Параметр V принимает
сначала значение Е1 затем непосредственно следующее за ним
(SUCC(V)) и т.д. до достижения Е2. При каждом значении V
выполняется оператор S. Если в теле цикла необходимо выполнить
несколько операторов, то их объединяют в один с помощью составного
оператора. Если конечное значение Е2 меньше начального Е1, то
оператор S не выполняется ни разу. Оператор цикла с параметром
применяется также в следующем виде:
for V:=Е1 downto E2 do S
В отличие от первого случая V изменяется от Е1 до Е2, переходя от
V
к pred(V). Отметим, что если V, Е1, Е2 типа INTEGER, то в
первом случае это цикл с шагом +1, а во втором с шагом -1.
2.3.2. Оператор цикла с предусловием.
Формат оператора цикла с предусловием:
while B do S
где B - логическое выражение, S - оператор. Оператор S будет
выполняться пока условие B будет истинно. Выполнение оператора
цикла завершится, когда выражение B впервые примет значение false.
2.3.3. Оператор цикла с постусловием.
Формат оператора цикла с постусловием:
repeat S until B
где B - логическое выражение, S - оператор. Оператор S выполняется
до тех пор, пока B не станет истинным. Оператор REPEAT
выполняется, по крайней мере, один раз, так как проверка
истинности условия B осуществляется после выполнения оператора S.
Служебные слова REPEAT и UNTIL уже играют роль скобок, поэтому
операторные скобки BEGIN и END являются необязательными.
В качестве примера использования операторов цикла рассмотрим
программу вычисления факториала (N!=1*2*3*…*N).
Цикл с параметром (шаг +1)
PROGRAM FACTORIAL1;
VAR I,N:INTEGER;
F:REAL;
BEGIN
WRITE('ВВЕДИТЕ N');
READLN(N); F:=1;
FOR I:=1 TO N DO F:=F*I;
WRITELN ('ФАКТОРИАЛ ОТ ',N,' РАВЕН ',F)
END.
Цикл с параметром (шаг -1)
PROGRAM FACTORIAL2;
VAR I,N:INTEGER;
F:REAL;
BEGIN
WRITE('ВВЕДИТЕ N');
READLN(N); F:=1;
FOR I:=N DOWNTO 1 DO F:=F*I;
WRITELN ('ФАКТОРИАЛ ОТ ',N,' РАВЕН ',F)
END.
Цикл с предусловием
PROGRAM FACTORIAL3;
VAR I,N:INTEGER;
F:REAL;
BEGIN
WRITE('ВВЕДИТЕ N');
READLN(N); F:=1; I:=1;
WHILE I<=N DO
BEGIN
F:=F*I;
I:=SUCC(I)
END;
WRITELN ('ФАКТОРИАЛ ОТ ',N,' РАВЕН ',F)
END.
Цикл с постусловием
PROGRAM FACTORIAL4;
VAR I,N:INTEGER;
F:REAL;
BEGIN
WRITE('ВВЕДИТЕ N');
READLN(N); F:=1; I:=1;
REPEAT
F:=F*I;
I:=SUCC(I)
UNTIL I>N;
WRITELN ('ФАКТОРИАЛ ОТ ',N,' РАВЕН ',F)
END.
КОНТРОЛЬНАЯ РАБОТА ПО ИНФОРМАТИКЕ N 1
Для
решения
задач
программирования Паскаль.
рекомендуется
использовать
язык
РАЗДЕЛ 1. ЛИНЕЙНЫЕ ПРОГРАММЫ.
1. Написать программу, которая вычисляет периметр и площадь
прямоугольного треугольника по длинам двух катетов.
2. Написать программу, вычисляющую площадь полной поверхности
и объем прямого кругового цилиндра, заданного высотой и диаметром
основания.
3. Написать программу, вычисляющую площадь полной поверхности
и объем правильного тетраэдра по длине его ребра.
РАЗДЕЛ 2. УСЛОВИЯ В ПРОГРАММАХ.
1.Три точки A(x1,y1), B(x2,y2), C(x3,y3) задаются своими
координатами. Написать программу, которая определяет, какая из
этих точек ближе к началу координат.
2. Треугольник задан длинами своих сторон a,b,c. Написать
программу, которая если треугольник является равнобедренным,
вычисляет его площадь, в противном случае вычисляет его периметр.
3. Для натурального числа k напечатать фразу "мы нашли в лесу
k грибов", согласовав окончание слова "гриб" с числом k.
4. Напишите программу, которая запрашивает номер месяца и год
и печатает название месяца и число дней в нем. Например:
Ввод:
2 1992
Вывод: февраль 29
5*. В старояпонском календаре был принят 60-летний цикл,
состоявший из пяти 12-летних подциклов. Подциклы обозначались
названиями цвета: зеленый, красный, желтый, белый и черный. Внутри
каждого подцикла годы носили названия животных: крысы, коровы,
тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы,
собаки и свиньи. 1984 год - год зеленой крысы
- был началом
очередного цикла. Написать программу, которая по введенному номеру
некоторого
года
нашей
эры
и
печатает
его
название
по
старояпонскому календарю.
РАЗДЕЛ 3. ЦИКЛЫ В ПРОГРАММАХ.
1. Написать программу, вычисляющую значение функции
y=cosx+cos2x+cos3x+…+cos30x
2. Написать программу, находящую для натурального числа все
его натуральные делители.
3. Написать программу, вычисляющую наибольший общий делитель
двух натуральных чисел.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К КОНТРОЛЬНОЙ РАБОТЕ ПО ИНФОРМАТИКЕ N 2
ТЕМА: МАССИВЫ И СТРОКИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ПАСКАЛЬ.
1. МАССИВЫ И ПЕРЕМЕННЫЕ С ИНДЕКСАМИ.
Переменная, имеющая структуру массива (тип ARRAY), - это
совокупность компонентов одного и того же типа. Характерными
особенностями массива являются:
1) каждый компонент массива может быть явно обозначен и к
нему имеется прямой доступ;
2) число компонентов массива определяется при его описании и
в дальнейшем не меняется.
Для обозначения компонентов массива используется имя массива
и индексы. Компоненты массива могут быть произвольного типа, в том
числе массивами. В этом случае получаются многомерные массивы,
двумерные, трехмерные и т.д. Тип индексов может быть только
порядковым,
то
есть
либо
перечислимым,
либо
ограниченным
(например, диапазон целых чисел), либо BOOLEAN, либо CHAR. Тип
индексов не может быть REAL.
Таким образом, определение типа для массива имеет следующий
вид:
TYPE A = ARRAY[<тип индексов>] OF <тип компонентов>
где A - имя нового типа. Примеры описания массивов:
TYPE VECTOR = ARRAY[1..20] OF REAL;
MATR
= ARRAY[1,.10,1..5] OT INTEGER;
Если теперь:
VAR A,B:VECTOR;
X,T:MATR;
то компонент массива А, соответствующий значению индекса I,
обозначается как A[I], а компонент массива Х, соответствующий
индексам I, J - Х[I,J].
Массив, как и любую другую структуру данных в Паскале, нужно
сначала описать и только затем использовать. При определении
размера массива лучше использовать константы. В этом случае задача
изменения размеров массива существенно упрощается.
Пример 1.1. Ввести массив из N
подсчитать сумму всех его компонентов.
строк
и
M
столбцов
и
Программа 1.1
PROGRAM SUMMA;
CONST N=5; M=3;
TYPE MATR=ARRAY[1..N,1..M] OF REAL;
VAR S
: REAL;
I,J : INTEGER;
A
: MATR;
BEGIN
S:=0;
WRITELN('Введите элементы массива ',N,'*',M);
FOR I:=1 TO N DO {Ввод компонентов массива}
FOR J:=1 TO M DO BEGIN
WRITE('A[',I,',',J,']=');
READLN(A[I,J]);
END;
FOR I:=1 TO N DO {Подсчет суммы компонентов}
FOR J:=1 TO M DO S:=S+A[I,J]
WRITELN('Сумма компонентов массива равна: ',S)
END.
Отметим, что изменяя в этой программе только определение
констант N и M, можно легко модифицировать размеры массива.
2. СЛУЧАЙНЫЕ ЧИСЛА.
В Турбо Паскале предусмотрена возможность генерирования
последовательностей случайных чисел. Инициализация генератора
случайных чисел осуществляется с помощью процедуры RANDOMIZE, а
функция RANDOM возвращает случайные числа. Функция RANDOM может
применяться в двух видах:
RANDOM(N),где N положительное целое число;
или
RANDOM
В первом случае случайное целое число лежит в интервале от 0
до N-1 (включая 0 и N), а во втором случайное вещественное число в интервале от 0 до 1 (0 и 1 не включаются).
Пример 2.1. Создать массив из N случайных чисел от 0 до 100 и
вывести его компоненты на экран.
Программа 2.1.
PROGRAM PR21;
CONST N=10; M=101;
TYPE VECTOR=ARRAY[1..N] OF INTEGER;
VAR I : INTEGER;
V : VECTOR;
BEGIN
RANDOMISE;
FOR I:=1 TO N DO V[I]:=RANDOM(M); {Создание массива}
FOR I:=1 TO N DO WRITE(V[I]:5) {Вывод на экран}
END.
Замечание: При выводе целых чисел на экран с помощью процедур
WRITE и WRITELN можно через двоеточие указывать количество
знакомест, предназначенных для записи числа на экране. Числа
выравниваются по правому краю. Это удобно при печати таблиц. При
выводе вещественных чисел можно указывать два числа - первое, это
количество знакомест, предназначенных для записи числа на экране,
второе указывает, сколько знакомест, из общего количества,
отводится на вывод дробной части числа.
3. СТРОКИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ТУРБО-ПАСКАЛЬ.
Строки в Турбо Паскале состоят из символов. Символьный тип
обозначается именем CHAR, он является стандартным. Значениями
этого типа являются элементы набора символов, определяемого
реализацией языка. Некоторые из символов не имеют графического
представления
это
управляющие
символы.
Все
символы
перенумерованы, начиная с 0. Полный набор символов в Турбо-Паскаль
состоит из 256 элементов с номерами от 0 до 255.
Все символы фиксированы и упорядочены. Отношение порядка
между ними такое же, как и между их порядковыми номерами. Так
'A'>'0', потому что номер 'A' - 65, а номер '0' - 48.
Две стандартные функции дают отображение символов на их
номера и наоборот. Это следующие функции: ORD(C), где C - символ.
Значением этой функции является порядковый номер символа C;
CHR(N), где N - целое число от 0 до 255.Значением этой функции
является символ с порядковымномером N. Эти функции являются
обратными по отношению друг к другу, то есть
CHR(ORD(C)) = C и ORD(CHR(N)) = N.
Строки
в
языке
программирования
Паскаль
это
последовательности
символов.
В
качестве
ограничителя
строкконстант используются апострофы, например: 'PASCAL', 'компьютер',
'25'.
В языке Турбо-Паскаль определен стандартный строковый тип
STRING. В определении строкового типа может быть указана в
квадратных скобках максимальная длина строки данного типа.
Максимальная длина - целочисленная константа в диапазоне от 0 до
255.В старших версиях Турбо-Паскаля разрешено не указывать N, в
этом случае считается, что N=255.
Примеры:
TYPE ABC
= STRING[100];
SCREENLINE = STRING[80];
XYZ
= STRING;
Строковые
выражения
состоят
из
строковых
констант,
переменных, имен строковых функций и операторов. Знак "+"
используется
для
слияния
(конкатенации)
строк.
Если
длина
результата больше 255 символов, то возникает ошибка. При сравнении
двух строк истина получается тогда и только тогда, когда
сравниваемые строки совпадают по-символьно и имеют одинаковую
длину.
Типы STRING[N] для различных N и CHAR совместимы. Строки и
символы могут употребляться в одних и тех же выражениях.
Строковая переменная занимает в памяти место, равное в байтах
максимальной длине плюс один. Тип STRING[N] в Турбо-Паскале
представляется как ARRAY[0..N] OF CHAR.
К любому элементу строки так же, как к элементу одинарного
массива. В результате получается величина типа CHAR.
Например, если
VAR A:STRING[8];
и A:='COMPUTER',
то A[3] равно'M' , A[5] - 'U'.
Замечание:
С
любой
строкой
можно
обращаться
как
с
соответствующим массивом, не требуется дополнительного описания
строки, как массива.
В компоненте строки с индексом 0 находится символ, номер
которого есть текущая длина строки. То есть ORD(A[0]) есть текущая
длина строки. Например, если A:='DAY' то ORD(A[0])=3.
4. СТРОКОВЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ В ТУРБО ПАСКАЛЕ.
В Турбо-Паскале имеются ряд стандартных процедур и функций,
специально предназначенных для работы со строками. Отметим, что
надо различать описание и применение процедур и функций. Например,
при описании указывается тип параметров процедур и функций, а при
применение это не указывается. Рассмотрим описание основных
процедур и функций, предназначенных для работы со строками.
4.1. Процедура DELETE.
Синтаксис:
DELETE(var S:String;Pos,Len:Integer);
Убирает из строки S Len символов начиная с Pos.Если Len
больше длины S то ничего не происходит. Если Pos+Lеn больше длины
строки то удаляются все символы до конца строки.
4.2. Процедура INSERT.
Синтаксис:
INSERT(S:String;var D:String;Pos:Integer);
Вставляет строку S в строку D начиная с символа с номером
Pos. Если Pos больше длины D то S и D сливаются. Если длина
результата при этом больше максимальной длины D то в D
записываются только самые левые символы.
4.3. Процедура STR.
Синтаксис:
STR(I:Integer;var S:String);
STR(R:Real;var S:String);
Преобразует I или R из числа в строку и записывает эту строку
в S.
ВНИМАНИЕ!
Процедура
Str
не
дожна
входить
в
функции,
вызываемые в процедурах WRITE и WRITELN.
4.4. Процедура VAL.
Синтаксис :
VAL(S:String;var R:Real;var P:Integer);
VAL(S:String;var I,P:Integer);
Преобразует строковую переменную S в число (тип зависит от
типа переменной I или R соответственно). Если в строке S ошибок
нет, то P равно 0, иначе значение R (или I) неопределено, а P
присваевается номер первого ошибочного символа.
4.5. Функция CONCAT.
Синтаксис:
CONCAT(S1,S2,...,Sn:String):String;
Возвращает строку, полученную конкатенацией (слиянием) строк
S1,...,Sn. Если длина результата больше 255 то возникает ошибка
времени выполнения.
4.6. Функция COPY.
Синтаксис:
COPY(S:String;Pos,Len:Integer):String;
Возвращает строку , полученную из Len символов строки S
начиная с позиции Pos. Если Pos больше,чем длина строки S то
возвращается пустая строка. Если Pos + Len больше ,чем длина
строки S то возвращаются только символы , принадлежащие строке S.
4.7. Функция LENGTH.
Синтаксис:
LENGTH(S:String):Integer;
Возвращает длину строки S.
4.8. Функция POS.
Синтаксис:
POS(Pattern,Sourse:String):Integer;
Возвращает номер символа , начиная с которого Pattern входит
в Sourse. Если вхождения нет, то возвращается 0.
Рассмотрим примеры программ по теме "Строки".
Пример 4.1. Написать программу, которая записывает строку в
обратном порядке и выводит ее на экран.
Программа 4.1.
PROGRAM PR;
VAR A,B : STRING;
I,N : INTEGER;
BEGIN
WRITELN('Введите строку: ');
READLN(A);
N:=LENGTH(A);
B:=''; {Вначале B пустая строка}
FOR I:=1 TO N DO B:=B+A[N+1-I];
WRITELN(B)
END.
Замечание: Этого же результата можно достигнуть с помощью
следующего цикла
FOR I:=1 TO N DO B:=A[I]+B;
Пример 4.2. Подсчитать число вхождений некоторого слова в
заданный текст.
Программа 4.2.
PROGRAM PR42;
VAR A,B,C : STRING;
P,N,D : INTEGER;
BEGIN
WRITELN('Введите текст: ');
READLN(A);
B:=A;
WRITELN('Введите: ');
READLN(C);
N:=0;
D:=LENGTH(C);
P:=POS(C,B);
WHILE P>0 DO BEGIN
N:=N+1;
DELETE(B,P,D);
P:=POS(C,B)
END;
WRITELN;
WRITELN('Число вхождений слова "',C,'" в текст :');
WRITELN(A);
WRITELN('равно ',N)
END.
КОНТРОЛЬНАЯ РАБОТА ПО ИНФОРМАТИКЕ N 2
Для
решения
задач
программирования Паскаль.
рекомендуется
использовать
РАЗДЕЛ 1. МАССИВЫ.
ОДНОМЕРНЫЕ МАССИВЫ
1. Ввести с клавиатуры одномерный массив размером N,
компоненты которого являются действительными числами. Найти и
напечатать сумму квадратов компонент массива.
язык
2. Создать одномерный массив А размером N, компоненты
которого являются случайными целыми числами от -50 до 50. Получить
массив В, такого же размера как и А, по следующему правилу:
В[i]=0, если А[i] четное, и В[i]=1, если А[i] нечетное. Вывести на
экран оба массива в отдельных строках.
ДВУМЕРНЫЕ МАССИВЫ
1. Ввести с клавиатуры массив размером N на M, компоненты
которого являются действительными числами. Найти произведение
компонент массива.
2. Создать массив размером N на M, компоненты которого
являются случайными целыми числами от 0 до 100, и найти наибольший
компонент массива среди тех, сумма индексов I+J которых, есть
четное число (A[1,1], A[1,3],..., A[2,2],...)
3. Написать программу, создающюу массив А[10,10], по правилу
А[i,j]=i*j. Вывести полученный массив на экран в виде таблицы
умножения.
РАЗДЕЛ 2. СТРОКИ.
1. Написать программу, подсчитывающую число вхождений
заданной буквы в заданную строку. Буква и строка вводятся с
клавиатуры.
2. Написать программу, удваивающую буквы в введенном слове.
3. Написать программу, печатающую введенное слово в обратном
порядке.
4. Написать программу, заменяющую в произвольном тексте все
цифры на "*".
5. Напишите программу, определяющую, имеются ли в
произвольном слове два идущих подряд одинаковых символа.
6. Напишите программу, удаляющую в произвольном слове все
буквы, стоящие на четных позициях.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К КОНТРОЛЬНОЙ РАБОТЕ ПО ИНФОРМАТИКЕ N 3
ТЕМА: ПРОЦЕДУРЫ И ФУНКЦИИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ПАСКАЛЬ.
1. ПРОЦЕДУРЫ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ТУРБО ПАСКАЛЬ.
Часто
некоторую
последовательность
действий
требуется
повторить
в
нескольких
местах
программы.
Для
удобства
программирования, обеспечения большей компактности программы и
повышения ее наглядности язык программирования Паскаль позволяет
выделить эту последовательность действий из основного текста
программы (из раздела операторов), присвоить ей некоторое имя и
записать ее только один раз. Присвоенное имя используется в
основном тексте программы для вызова этой последовательности
действий.
Такая
именованная
последовательность
операторов
называется процедурой. Если процедура дает одно результирующее
значение и, следовательно, может использоваться в выражениях, то
такая
процедура
называется
функцией.
Остальные
процедуры
называются процедурами-операторами, или просто процедурами.
1. Описание процедуры и обращение к ней.
Описания процедур и функций располагаются в тексте программы
между разделами переменных и операторов. Описание процедур состоит
из двух частей: заголовка процедуры и тела процедуры. Телом
поцедуры является блок. То есть, тело процедуры имеет точно такую
же структуру, что и программа: в нем могут присутствовать все
разделы. Заголовок процедуры начинается со служебного слова
PROCEDURE, за которым следует имя этой процедуры и за ним в
круглых скобках список формальных параметров, которые могут и
отсутствовать. Заголовок процедуры отделяется от ее тела точкой с
запятой. В секции формальных параметров перечисляются имена
формальных параметров с указанием их типа. Все формальные
параметры, а также метки, константы, типы, переменные, процедуры и
функции, описанные в теле процедуры, локальны по отношению к
описанию процедуры. Они не существуют вне описания процедуры. Их
значения становятся неопределенными при выходе из описания
процедуры. Имена формальных параметров, перечисленных в заголовке
процедуры, определены в ее теле и не требуют дополнительного
описания. Если в теле процедуры встречаются некоторые имена, не
описанные в теле процедуры и не являющиеся ее формальными
параметрами, то они считаются глобальными по отношению к данному
описанию процедуры.
Для обращения к описанию процедуры используется оператор
процедуры. Он состоит из имени процедуры и списка фактических
параметров. Фактические параметры отделяются друг от друга
запятыми, а весь список заключается в круглые скобки. Между
формальными
и
фактическими
параметрами
устанавливается
взаимооднозначное соответствие путем их пересчета слева направо.
Число фактических параметров должно равняться числу формальных
параметров. Типы фактических параметров должны соответствовать
типам формальных параметров.
Описание процедуры задает формальную схему обработки, а
оператор процедуры осуществляет настройку этой формальной схемы на
конкретную обработку фактических данных. Выполнение оператора
процедуры состоит в следующем: все формальные параметры заменяются
соответствующими фактическими, после этого создается экземпляр
блока процедуры, который и выполняется.
Пример.
Пусть например задано следующее описание процедуры (эта
процедура подает несколько раз звуковой сигнал):
PROCEDURE BEEP(N:INTEGER);
VAR I:INTEGER;
BEGIN
FOR I:=1 TO N DO WRITE(CHR(7))
END;
Тогда для вызова этой процедуры в разделе операторов можно
применять ее оператор в следующих видах:
BEEP(10);
BEEP(K);
BEEP(I+10);
где I, K - целые числа.
2. Параметры - значения и параметры - переменные.
В языке программирования Турбо Паскаль различают несколько
видов
формальных
параметров:
параметры-значения,
параметрыпеременные,
параметры-процедуры,
параметры-функции
и
нетипизированные параметры-переменные.
Рассмотрим использование параметров-значений и параметровпеременных.
Если
в
списке
формальных
параметров
имени
параметра
предшествует слово VAR, то этот параметр является параметромпеременной. В качестве фактического параметра, соответствующего
формальному
параметру-переменной,
должна
использоваться
переменная. Ее тип должен совпадать с типом, заданным в описании
формального параметра-переменной. Все действия, задаваемые телом
процедуры, выполняются над фактическим параметром-переменной,
который доступен в течении всего времени действия оператора
процедуры.
Если
переменная,
выступающая
в
качестве
фактического
параметра, изменяет свое значение в процессе выполнения процедуры,
то после завершения выполнения процедуры это значение остается
доступным для последующих действий. Следовательно, если некоторый
параметр процедуры представляет собой результат ее выполнения, то
он обязательно должен описываться как формальный параметрпеременная.
Если в списке формальных параметров ничего не предшествует
имени параметра, то он является параметром-значением. Фактическим
параметром,
соответствующем
параметру-значению,
должно
быть
выражение, в частности, просто имя переменной или константа.
Формальный параметр в этом случае - просто локальная переменная
вызываемой процедуры. В качестве начального значения такому
параметру
присваивается
текущее
значение
соответствующего
фактического параметра, то есть значение выражения, вычисленное в
момент обращения к процедуре. Значение формального параметра может
изменяться при выполнении процедуры, однако никакого влияния на
значение фактического параметра это не оказывает. Следовательно,
параметр-значение не может представлять собой результат работы
процедуры.
Если у процедуры нет списка формальных параметров, то она
называется процедурой без параметров.
Пример. Написать программу, вычисляющую произведение двух
квадратных матриц. Матрица (массив) называется квадратной, если у
нее число строк равно числу столбцов.
Program MultMatr; {Умножение матриц}
Const N=3; {N количество строк и столбцов в матрице}
Type Matr = Array[1..N,1..N] of Integer;
Var A,B,C : Matr;
Procedure MultMatr(X,Y:Matr; Var Z:Matr);
{Процедура умножения матриц}
Var I,J,K : Integer;
Begin
For I:=1 to N do
For J:=1 to N do Begin
Z[I,J]:=0;
For K:=1 to N do
Z[I,J]:=Z[I,J]+X[I,K]*Y[K,J];
End
End;
Procedure InpMatr(Var X:Matr);
{Процедура ввода матрицы}
Var I,J : Integer;
Begin
For I:=1 to N do
For J:=1 to N do Begin
Write('Введите X[',I,',',J,']:');
ReadLn(X[I,J])
End
End;
Procedure OutMatr(X:Matr);
{Процедура вывода матрицы}
Var I,J : Integer;
Begin
For I:=1 to N do Begin
For J:=1 to N do
Write(X[I,J],' ');
WriteLn
End
End;
{Основная программа}
Begin
WriteLn(' ***** ПРОИЗВЕДЕНИЕ МАТРИЦ A и B *****');
WriteLn;
WriteLn('Введите матрицу А:');
Writeln;
InpMatr(A);
WriteLn;
WriteLn('Введите матрицу B:');
WriteLn;
InpMatr(B);
MultMatr(A,B,C);
WriteLn('Произведение матриц');
WriteLn;
WriteLn('A:');
OutMatr(A);
WriteLn;
WriteLn('и B:');
OutMatr(B);
WriteLn;
WriteLn('равно:');
OutMatr(C)
End.
2. ФУНКЦИИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ТУРБО ПАСКАЛЬ.
1. Описание функции и обращение к ней.
Описание функции, также как и описание процедуры, состоит из
двух частей: заголовка функции и тела функции. Телом функции
является блок. То есть тело функции имеет точно такую же
структуру, что и программа: в нем могут присутствовать все
разделы. Заголовок функции начинается со слова FUNCTION, за
которым следует имя функции и за ним в круглых скобках список
формальных параметров. Функция вычисляет единственное значение
простого типа. Тип этого значения указывается после двоеточия за
списком формальных параметров. Заголовок функции отделяется от ее
тела точкой с запятой. Рассмотрим пример описания функции:
FUNCTION A(X:T1;Y,Z:T2; VAR B,C,D:T3):T;
<тело функции A>;
здесь A - имя функции; X - формальный параметр-значение типа
T1; Y,Z- формальные параметры-значения типа T2; B,C,D - формальные
параметры-переменные типа T3; T - тип значения функции.
Все сказанное ранее о процедурах, их параметрах, обращении к
ним, справедливо и для функций. Вместе с тем имеются и отличия:
1) описание начинается со служебного слова FUNCTION;
2) в заголовке функции указывается имя типа значения
описываемой функции;
3) в теле функции должен присутствовать хотя бы один оператор
присваивания, в левой части которого стоит имя описываемой
функции, причем хотя бы один оператор такого вида должен быть
выполнен. Этот оператор присваивания и определяет значение,
вычисляемое с помощью этой функции.
Пример. Описать функцию, вычисляющую максимум двух чисел.
FUNCTION MAX(X,Y:REAL):REAL
BEGIN
IF X>Y THEN MAX:=X ELSE MAX:=Y
END;
Эту функцию в программе можно применять в следующих видах:
Z:=MAX(X,Y);
A:=MAX(0.5,SIN(1));
WRITE('МАКСИМУМ=',MAX(C,D));
2. Побочные эффекты функций.
Язык
программирования
Турбо
Паскаль
допускает
функции,
которые наряду с вычислением значения функции могут выполнять еще
и такие действия, результат которых обнаруживается и вне функции:
изменять значения глобальных для данной функции переменных,
производить вывод и т.п. Результат выполнения подобных действий
называется побочным эффектом функции. Побочные эффекты могут быть
как полезными, так и вредными. Функции с побочным эффектом
необходимо использовать очень осторожно. В большинстве программ
использование побочного эффекта нежелательно, так как он сильно
затрудняет отладку программ.
Пример. Опишем функцию с побочным эффектом.
FUNCTION MAX1(X,Y:REAL):REAL;
BEGIN
IF X>Y THEN MAX:=X ELSE MAX:=Y;
A:=0;
WRITE('ПРИВЕТ')
END;
Эта функция, кроме вычисления максимума двух чисел, обнуляет
глобальную переменную A и печатает слово 'ПРИВЕТ'.
3. Рекурсивные функции.
Рекурсивное определение некоторого понятия - это случай,
когда какое-либо понятие определяется с использованием этого же
самого понятия. Рекурсивным может быть и определение функции.
Напрмер, факториал можно определить так:
1, при n  0;
n!  
n  ( n  1)!, при n  0.
Язык Турбо Паскаль разрешает рекурсивное описание функций. В
теле функции содержится обращение к этой же описываемой функции.
Пример. Описать функцию f(n)=n! с использованием рекурсий.
FUNCTION FACT(N:INTEGER):REAL;
BEGIN
IF N=0 THEN FACT:=1
ELSE FACT:=N*FACT(N-1)
END;
Отметим, что наличие имени функции с указанием параметров в
правой части некоторого оператора присваивания, свидетельствует об
обращении к той же самой функции в процессе вычисления ее
значения, то есть о рекурсивности определения.
Рекурсивность - это не свойство самой функции, а свойство ее
описания.
Пример.
коэффициентов:
Cnm 
Написать
программу
n!
m!( n  m)!
PROGRAM BINOM;
VAR N,M:INTEGER;
FUNCTION C(A,B:INTEGER):REAL;
FUNCTION FACT(K:INTEGER):REAL;
вычисления
биномиальных
BEGIN
IF K=0 THEN FACT:=1
ELSE FACT:=K*FACT(K-1)
END; {END FACT}
BEGIN
C:=FACT(A)/(FACT(B)*FACT(A-B))
END; {END C}
{основная программа}
BEGIN
WRITELN('Вычисление биномиальных коэффициентов');
WRITE('Введите N:');
READLN(N);
WRITE('Введите M:');
READLN(M);
IF (M>N) OR (M<0) OR (N<0)
THEN WRITELN('Недопустимые M и N')
ELSE WRITELN('C(',N,',',M,')=',C(N,M))
END.
Замечание. Функция C(A,B) содержит
функцию FACT(K) и определена при A≥B≥0.
в
себе
вспомогательную
КОНТРОЛЬНАЯ РАБОТА ПО ИНФОРМАТИКЕ N 3
Для
решения
задач
программирования Паскаль.
рекомендуется
использовать
язык
РАЗДЕЛ 1. ПРОЦЕДУРЫ.
Задание 1.1. Дополнить программу умножения матриц процедурами
сложения матриц и умножения матрицы на число. Выполнить полученную
программу при различных начальных данных.
Задание 1.2. Написать программу, вычисляющую сумму двух Nмерных векторов и произведение N-мерного вектора на число. Ввод
координат вектора, вывод кординат вектора на экран, вычисления
суммы векторов и произведения вектора на число оформить в виде
процедур. Использовать тип
Type Vector : Array [1..N] of Real
Задание 1.3. Написать программу, которая преобразует матрицу
размера N*N, состоящую из случайных целых чисел от -10 до 10, в
матрицу такого же размера в которой положительные элементы первой
матрицы заменены на +1, отрицательные - на -1, нули на нули.
Первоначальная и преобразованная матрицы выводятся на экран.
Создание матрицы из случайных чисел, преобразование матрицы, вывод
матрицы на экран оформить в виде процедур.
РАЗДЕЛ 2. ФУНКЦИИ.
Задание 2.1. Написать программу нахождения максимума N чисел
с использованием функции, находящей максимум двух чисел. N задать
в виде константы.
Задание
2.2.
Написать
программу
вычисления
площади
треугольника по формуле Герона. Вычисление площади по формуле
Герона оформить в виде функции.
Задание 2.3. Написать программу вычисления наибольшего общего
делителя и наименьшего общего кратного двух натуральных чисел.
Вычисление НОД и НОК оформить в виде функций.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К КОНТРОЛЬНОЙ РАБОТЕ ПО ИНФОРМАТИКЕ N 4
ТЕМА: ЗАПИСИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ПАСКАЛЬ.
1. ЗАПИСИ.
Запись в языке программирования Турбо Паскаль - это структура
данных, состоящая из фиксированного числа компонент, называемых
полями. Поля записи могут быть различных типов. Возможность
формирования структуры данных из элементов различных типов делает
записи наиболее общим и гибким типом данных. Записи, как и
массивы,
используются
для
описания
упорядоченной
последовательности величин. Вместе с тем, между массивами и
записями имеются существенные различия. Все компоненты массива
должны быть одного и того же типа. Компоненты записи - поля могут
быть
разных
типов.
Обращение
к
компонентам
массива
происходит по индексам, а к компонентам записи - по именам.
Описать в программе запись можно двумя способами:
1) построив определение нужного типа;
2)
задав
тип
непосредственно
в
объявлении
некоторой
переменной.
Описание записи начинается со служебного слова RECORD и
заканчивается словом END. Между этими словами находится список
полей записи с указанием типов. Таким образом, описание записи
имеет следующий вид:
RECORD
P1:T1;
P2:T2;
...
PN:TN
END;
где P1,P2,...,PN - имена полей записи, а T1,T2,...,TN - их
типы.
Пример описания записи:
TYPE POINT=RECORD
X:REAL;
Y:REAL
END;
DATE=RECORD
DAY:1..31;
MONTH:
(JAN,
FEB,
MAR,
APR,
MAY,
JUN,
JUL, AUG, SEP, OCT, NOV, DEC);
YEAR:INTEGER
END;
Если в записи встречаются поля одного и того же типа, то
допустимо следующее описание:
TYPE POINT=RECORD
X,Y:REAL
END;
Каждому полю записи дается свое имя. Никаких ограничений на
тип поля нет, поэтому компонентой записи может быть массив, запись
и
т.д.
В
структуре
записи
явным
образом
выражена
идея
иерархической подчиненности между ее элементами. Отметим, что
имена полей записи должны быть различны, если они находятся на
одном уровне.
Для доступа к полям записи строится список имен структурных
уровней записи, которые разделяются точками. Пусть, например:
VAR A,B:POINT;
X,Y:DATE;
тогда для обращения к первой координате точки A используется
имя А.X, а ко второй координате точки B - B.Y. С именами полей
возможны все допустимые для данных этого типа действия:
A.X:=5;
A.X:=4.2*B.Y;
X.DAY:=5;
Y.MONTH:=JAN;
X.YEAR:=Y.YEAR+1;
При соблюдении некоторых условий с записью можно обращаться
как с единым объектом. Так, если VAR A,B:T1; где T1- тип записи,
то возможно A:=B. Запись как единый объект часто используется
также в качестве параметра в процедурах и функциях.
Пример программы.
Написать программу, которая:
а) для группы людей создает записи - имя, фамилия, дата
рождения (число, месяц, год);
б) выводит на экран имена и фамилии всех людей этой группы,
родившихся в заданном году;
в) выводит на экран все данные о людях этой группы с заданным
именем.
Program Man;
Const
N=5; {количество человек в группе}
Type
name_rec = record
first,last:string[15]
end {name};
date_rec = record
day:1..31;
month:1..12;
year:integer
end {date};
man_rec = record
name:name_rec;
date:date_rec
end {man};
= array[1..n] of man_rec;
group
var
i,g : integer;
im : string[15];
a
: group;
Procedure inp_name(var x:name_rec);
Begin
Write ('Имя:');
readln (x.first);
Write ('Фамилия:');
Readln (x.last)
end {inp_name};
Procedure outp_name(x:name_rec);
Begin
Writeln (x.first,' ',x.last)
end {outp_name};
Procedure inp_date(var x:date_rec);
Begin
Write ('Число:');
Readln (x.day);
Write ('Месяц:');
Readln (x.month);
Write ('Год:');
readln(x.year)
End {inp_date};
Procedure outp_date(x:date_rec);
Begin
Writeln (x.day,'-',x.month,'-',x.year)
end {outp_date};
Procedure inp_man(var x:man_rec);
Begin
Writeln ('Введите имя и фамилию:');
inp_name(x.name);
Writeln ('Введите день, месяц и год рождения:');
inp_date(x.date)
end {inp_man};
Procedure outp_man(x:man_rec);
Begin
outp_name(x.name);
write ('родился: ');
outp_date(x.date)
end {outp_man};
{
MAIN PROGRAM
}
Begin
for i:=1 to n do begin
Writeln ('Введите данные на ',i,'-го человека');
inp_man(a[i])
end;
Writeln;
Writeln ('Введите год рождения:');
readln(g);
Writeln;
Writeln ('В этом году родились:');
for i:=1 to n do
if a[i].date.year=g then outp_name(a[i].name);
Writeln;
Writeln ('Введите имя:');
Readln(im);
Writeln;
Writeln ('С этим именем:');
for i:=1 to n do
if a[i].name.first=im then outp_man(a[i])
end.
Изучите
текст
программы.
Проанализируйте
типы
процедуры. Проверьте работу программы. Измените число
группе.
данных,
людей в
2. ОПЕРАТОР ПРИСОЕДИНЕНИЯ.
Для обращения к компонентам записей используются составные
имена. При этом могут получаться очень длинные имена, причем одни
и те же идентификаторы многократно повторяются. Для сокращенной
записи составных имен используется оператор присоединения WITH.
Формат оператора:
WITH <префикс> DO <оператор>
Здесь префикс - это имя одного или нескольких уровней записи.
Префикс присоединяется ко всем именам соответствующей записи,
которые встречаются в операторе, следующим за служебным словом DO.
Если один и тот же префикс необходимо присоединить к именам в
нескольких операторах, то они объединяются в составной оператор с
помощью операторных скобок BEGIN и END. В префиксе может
присутствовать имя переменной, например индекс массива. Причем
внутри оператора WITH ее значение изменяться не может, оно должно
быть фиксированно.
Например, в программе MAN вывод на экран имен и фамилий
людей родившихся в определенном году G осуществлялся следующим
образом:
FOR I:=1 TO N DO
IF A[I].DATE.YEAR=G THEN OUTP_NAME(A[I].NAME);
С помощью оператора присоединения эта конструкция запишется
так:
FOR I:=1 TO N DO
WITH A[I] DO
IF DATE.YEAR=G THEN OUTP_NAME(NAME);
После служебного слова WITH может следовать не один префикс,
а несколько, разделенных запятыми. Так оператор
WITH R1,R2,...,RN DO S;
эквивалентен последовательности операторов
WITH R1 DO
WITH R2 DO
...
WITH RN DO S;
здесь R1,R2,...,RN - префиксы, а S - оператор.
3. ЗАПИСИ С ВАРИАНТАМИ.
В описании записи может присутствовать вариативная часть. Это
означает, что разные переменные, хотя они относятся к одному типу,
могут иметь различные структуры. Вариативная часть начинается
служебным словом CASE и следует за фиксированной частью записи.
Фиксированная часть - это обычная совокупность полей, ее структура
постоянна для всех записей данного типа. Вариативная часть
изменяется в зависимости от значения особого поля называемого
полем признака, или полем тега (tag - англ. - ярлык, этикетка,
бирка). Описание всех полей вариативной части, относящихся к
определенному значению поля тега, должны быть заключены в круглые
скобки. Скобки играют роль ограничителей, указывая начало и конец
соответствующей группы полей. Если какому-то значению поля тега не
соответствуют ни какие вариативные поля, то скобки все равно
остаются. Так как вариативная часть записи всегда расположена в ее
конце, то она не завершается словом END. Служебное слово END
завершающее
описание
записи
одновременно
завершает
и
ее
вариативную часть. В описании поля тега его тип нельзя указывать в
явном виде, он должен быть задан именем.
Например, опишем тип записи - геометрическая фигура, где
фиксированная часть это AREA - площадь, поле тега SHAPE - вид
фигуры, а вариативная часть - данные для вычисления площади (для
фигур различных видов).
TYPE
FIGURE=(TRIANGLE, RECTANGLE, CIRCLE);
GEOMETRIC_FIGURE=RECORD
AREA:REAL;
CASE SHAPE:FIGURE OF
TRIANGLE:(TSIDE1,TSIDE2,ANGLE:REAL);
RECTANGLE:(RSIDE1,RSIDE2:REAL);
CIRCLE:(DIAMETER:REAL)
END;
Пример программы.
Написать программу вычисляющую по вводимым данным площадь
фигур различных видов (треугольник, прямоугольник, окружность).
Program area;
type
figure=(triangle,rectangle,circle);
geometric_figure=record
area:real;
case shape:figure of
triangle:(tside1,tside2,angle:real);
rectangle:(rside1,rside2:real);
circle:(diameter:real)
end;
var gf:geometric_figure;
a:1..3;
procedure inp_tr(var s1,s2,a:real);
begin
writeln('Введите длину первой стороны треугольника:');
readln(s1);
writeln('Введите длину второй стороны треугольника:');
readln(s2);
writeln('Введите величину угла между этими сторонами (в
радианах):');
readln(a)
end { inp_tr };
procedure inp_rec(var s1,s2:real);
begin
writeln('Введите длину первой стороны
прямоугольника:');
readln(s1);
writeln('Введите длину второй стороны
прямоугольника:');
readln(s2)
end { inp_rec };
function inp_cir:real;
var d:real;
begin
writeln('Введите диаметр окружности:');
readln(d);
inp_cir:=d
end { inp_cir };
{ MAIN PROGRAM }
Begin
writeln('Выберете вид фигуры:');
writeln;
writeln('1. Треугольник');
writeln('2. Прямоугольник');
writeln('3. Окружность');
readln(a);
case a of
1:gf.shape:=triangle;
2:gf.shape:=rectangle;
3:gf.shape:=circle
end;
with gf do
case shape of
triangle:inp_tr(tside1,tside2,angle);
rectangle:inp_rec(rside1,rside2);
circle:diameter:=inp_cir
end{case};
with gf do
Begin
case shape of
triangle:area:=1/2*tside1*tside2*sin(angle);
rectangle:area:=rside1*rside2;
circle:area:=pi*diameter*diameter/4
end{case};
writeln('Площадь фигуры равна:',area)
End{with}
end.
Изучите программу. Проанализируйте типы данных.
работу программы.
Проверьте
КОНТРОЛЬНАЯ РАБОТА ПО ИНФОРМАТИКЕ N 4
Для
решения
задач
рекомендуется
использовать
язык
программирования Паскаль.
Задание 1. Допишите программу MAN так, чтобы она также
выводила на печать:
а) всех людей из группы, которые родились в январе заданного
года;
б) всех людей из группы, которые родились с 15 марта по 15
апреля (год рождения не важен).
Задание 2. Напишите программу вычисляющую расстояние между
двумя точками, заданными своими координатами. Точку задать с
помощью типа
TYPE POINT=RECORD
X,Y:REAL
END
Задание
3.
Напишите
программу
проверяющую
корректность
введенной даты. Дату задать с помощью типа
TYPE DATE=RECORD
DAY:1..31;
MONTH: 1..12;
YEAR:INTEGER
END;
Примечание. Год является високосным, если а) делится на 4 и
не делится на 100; или б) делится на 400.
Задание 4. Написать программу, которая в зависимости от вида
фигуры запрашивает необходимые данные и вычисляет объем фигуры.
Вводятся данные на три фигуры, а затем на экран выводятся название
и объем фигуры, имеющий наибольший объем. Геометрические фигуры
могут быть следующих видов:
1) куб - задается длина ребра;
2) прямоугольный параллепипед - задаются длины трех различных
ребер;
3) прямой цилиндр - задаются радиус основания и высота
цилиндра;
4) конус - задается радиус основания и высота конуса.
Типы вводимых фигур произвольны и могут повторяться.
При выполнении задания используйте оператор присоединения
WITH. Фигуру опишите с помощью записи с вариантами (аналогично
программе AREA).
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА ПО ОСНОВАМ ЯЗЫКА ПРОГРАММИРОВАНИЯ TURBOPASCAL.
1. И.А. Бабушкина, Н.А. Бушмелева, С.М. Окулов, С.Ю. Черных
"Практикум по Турбо Паскалю" М., АБФ, 1998.
2. В.М. Бондарев, В.И. Рублинецкий, Е.Г. Качко
"Основы программирования" Харьков, "Фолио", Ростов-на-Дону,
"Феникс", 1997.
3. В.А. Дагене, Г.К. Григас, К.Ф. Аугутис
"100 задач по программированию" М., "Просвещение", 1993.
4. А.М. Епанешников, В.А. Епанешников
"Программирование в среде TURBO PASCAL 7.0" М., "ДИАЛОГ-МИФИ,
1995.
5. В.Н. Пильщиков
"Сборник
упражнений
по
языку
Паскаль"
М.,
"Наука",
Гл.ред.физ-мат.лит., 1989.
6. В.Б. Попов
"Turbo Pascal для школьников" М., "Финансы и статистика",
1996.
7. В.В. Фаронов
"Турбо Паскаль 7.0. Начальный курс" М., "Нолидж", 1999.
8. В.В. Фаронов
"Турбо Паскаль 7.0. Практика программирования" М., "Нолидж",
1999.
Методические указания и контрольные работы составил доцент
кафедры информатики и методики преподавания информатики ОГПУ,
кандидат физико-математических наук Герасименко С.А.
geras@mail.esoo.ru
Download