Федеральное агентство по образованию РФ
Государственное образовательное учреждение среднего профессионального образования
Орский индустриальный колледж
Основы алгоритмизации и программирования
Методические указания к выполнению лабораторных работ
Фрейз И.И. |
Орск 2008
Содержание
Лабораторная работа №1. Линейные программы. 3
Лабораторная работа №2. Разветвляющиеся вычислительные процессы. Условный оператор IF. 8
Лабораторная работа №3. Организация циклов. 30
Лабораторная работа №4. Организация циклов.(продолжение)
33
Лабораторная работа №5. Одномерные массивы.. 39
Лабораторная работа №6. Преобразование массивов. 43
Лабораторная работа №7. Сортировка массива. 48
Лабораторная работа №8. Сортировка массива. 49
Лабораторная работа №9. Сортировка массива. 50
Лабораторная работа №10. Двумерные массивы. 52
Лабораторная работа №11: Подпрограммы. 54
Лабораторная работа №12. Использование подпрограмм в Паскале. 57
Лабораторная работа №13-14. Строки. 60
Лабораторная работа № 15. Исследовательско - практическая работа. 64
Лабораторная работа №16. Решение задач. 67
Лабораторная работа №17. Анализ самостоятельной работы. Работа над ошибками. 69
Лабораторная работа18. Использование множеств для решения задач в Паскале. 72
Лабораторная работа №19. Множества . (Продолжение) 74
Лабораторная работа №20. Тип данных Record (запись). 76
Лабораторная работа №21. Решение задач на типизированные файлы. 80
Лабораторная работа №22. Графика Турбо – Паскаля. 83
Лабораторная работа №23. Программирование в графическом режиме. 84
Содержание. 85
Лабораторная работа №1. Линейные программы.
Цель: Освоить работу в среде Turbo Pascal и научиться писать самые простые программы – линейные.
Ход работы.
Для начала рассмотрим программу, выполняющую расчет по простейшей формуле.
Программа перевода суммы в рублях в доллары и евро.
program valuta;
const
kurs_dollar=29.8;
kurs_evro=36.6;
var
rouble,dollar,evro:real;
begin
writeln('Введите сумму в рублях');
readln(rouble);
dollar:=rouble/kurs_dollar;
evro:=rouble/kurs_evro;
writeln('Рублей: ',rouble:8:2,
' Долларов: ',dollar:7:2,
'Евро: ',evro:7:2);
readln; end.
Пример программы расчета по заданной формуле:
program formula;
var
a,x,y:real; {Исходные данные и результат}
temp:real; {Промежуточная переменная}
begin
writeln('Введите a и x:');
readln(a,x);
writeln('Исходные данные:'); {Контрольный вывод исходных данных}
writeln(a= ',a:6:2.' x=',x:6:2);
temp:=2*sin(2*a)/cos(2*a);
y:=(sqrt(pi*x)-exp(0.2*sqrt(a))+temp+
1.6e3*ln(sqr(x))/ln(10))/
(temp*1/cos(x));
writeln('Результат: y=',y:6:2);
readln;
end.
Итоги
Приступая к написанию программы, четко определите, что является ее исходными данными и что требуется получить в результате.
Выбирайте тип переменных с учетом диапазона и требуемой точности представления данных.
Давайте переменным имена, отражающие их назначение.
Ввод с клавиатуры предваряйте приглашением, а выводимые значения – пояснениями. Для контроля сразу же после ввода выводите исходные данные на дисплей.
До запуска программы подготовьте тестовые примеры, содержащие исходные данные и ожидаемые результаты. Отдельно проверьте реакцию программы на неверные исходные данные.
При записи выражений обращайте внимание на приоритет операций.
Разделяйте данные при вводе пробелами, символами перевода строки или табуляции.
Тщательно форматируйте текст программы и снабжайте его содержательными комментариями.
Индивидуальное задание
Написать программу для расчета по двум формулам. Предварительно подготовьте тестовые примеры для второй формулы с помощью калькулятора (результаты вычисления по обеим формулам должны совпадать).
Вариант 1
…………………………………………………………………………………………………
Вариант 2
…………………………………………………………………………………………………
Вариант 3
…………………………………………………………………………………………………
Вариант 4
…………………………………………………………………………………………………
Вариант 5
…………………………………………………………………………………………………
Вариант 6
…………………………………………………………………………………………………
Вариант 7
…………………………………………………………………………………………………
Вариант 8
…………………………………………………………………………………………………
Вариант 9
…………………………………………………………………………………………………
Вариант 10
…………………………………………………………………………………………………
Вариант 11
…………………………………………………………………………………………………
Вариант 12
…………………………………………………………………………………………………
Вариант 13
…………………………………………………………………………………………………
Вариант 14
…………………………………………………………………………………………………
Вариант 15
…………………………………………………………………………………………………
Вариант 16
…………………………………………………………………………………………………
Вариант 17
…………………………………………………………………………………………………
Вариант 18
…………………………………………………………………………………………………
Вариант 19
…………………………………………………………………………………………………
Вариант 20
Лабораторная работа №2. Разветвляющиеся вычислительные процессы. Условный оператор
IF.
Цель: Научиться применять оператор ветвления IF при составлении программ.
Ход работы.
Формат оператора:
If выражение
then оператор_1 [
else оператор_2 ]
Сначала вычисляется выражение, которое должно иметь логический тип. Как правило, в выражении используются знаки операций отношения
(<, >, =,<>, <=, >=). Если требуется проверить несколько условий, их объединяют знаками логических операций
and (и), or(или), xor (исключающее ИЛИ) и not (отрицание).
|
Если выражение имеет значение true, выполняется первый оператор, иначе – второй. Ветвь else может отсутствовать. После выполнения операторов из соответствующей ветви управление передается оператору, следующему за условным.
Задача 2.1. Вычисление значения функции
…………………………………………………………………………………………………Пример программы, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика на интервале [-3;3].
|
Начинать решение задачи необходимо с четкого описания ее исходных данных и результатов. В данном случае это очевидно: исходными данными
является вещественное значение аргумента х, который определен на интервале [-3;3], а результатом
– вещественное значение функции у. Поэтому для представления этих величин в программе следует выбрать тип real.
Перед написанием программы следует составить алгоритм ее решения – сначала в общем виде, а затем постепенно детализируя каждый шаг. Такой способ, называется нисходящей разработкой, позволяет создавать простые по структуре программы. Сначала запишем функцию в виде формул:
program calc_fun;
var x,y:real;
begin
writeln('Введите значение аргумента:');
readln(x);
if (x<-3) or (x>3) then begin
writeln('Значение должно принадлежать интервалу [-3;3]');
exit
end;
if x<-2 then y:=-2*x-5
else if x<0 then y:=-sqrt(1-sqr(x+1))-1
else if x<1 then y:=x-1
else y:=sqrt(1-sqr(x-2));
writeln('Для x=',x:6:2, ' значение функции y=',y:6:2);
readln;
end.
Задача 2.2. Выстрел по мишени
…………………………………………………………………………………………………
|
Дана заштрихованная область и точка с координатами (х,у). Написать программу, определяющую, попадает ли точка в область. Результат вывести в виде текстового сообщения.
Запишем условия попадания точки в область в виде формул. Область можно описать как круг, пересекающийся с треугольником. Точка может попадать либо в круг, либо в треугольник, либо в их общую часть:
;
Первое условие задает попадание точки в круг, второе – в треугольник. Переменные х,у – вещественного типа. Программа для решения задачи выглядит следующим образом:
program shot;
var x,y:real;
begin
writeln ('Введите значения x,y:');
readln(x,y);
if (sqr(x)+sqr(y)<=1) or (x<=0) and (x<=0) and(y<=0) and(y>=-x-2)
then
writeln ('Точка попадает в область')
else
writeln('Точка не попадает в область');
readln;
end.
Индивидуальные задания
Задание 1
1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
2
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
3
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
4
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
5
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
6
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
7
Задание 1
…………………………………………………………………………………………………..Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
8
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
9
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
10
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
11
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
12
Задание 1
………………………………………………………………………………………………….
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
13
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
14
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
15
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
16
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
17
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
18
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
19
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
20
Задание 1
…………………………………………………………………………………………………
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
21
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
2
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
3
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
4
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
5
Задание 2
………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
6
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
7
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
8
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
9
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
10
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
11
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
12
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
13
Задание 2
………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
14
Задание 2
………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
15
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
16
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
17
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
18
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
19
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
20
Задание 2
…………………………………………………………………………………………………
Написать программу, которая определяет, попадает ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
Лабораторная работа №3. Организация циклов.
Цикл – это фрагмент программы, повторяемый многократно. В Паскале три оператора цикла – while,
repeat и
for
. Все циклы имеют схожую структуру (Рис. 1)
Рис. 1 Рис. 2
Операторы, ради многократного выполнения которых организуется цикл, называются телом цикла
. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла. Один проход цикла называется итерацией
. На этапе начальных установок (до входа в цикл) задаются значения переменных, которые в нем используются. Эти значения могут задаваться явно или неявно. Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации (для этого применяется процедура continue ) , так и цикла в целом (процедура break и оператор goto). Передавать управление извне внутрь цикла не рекомендуется, потому что при этом не выполнятся начальные установки. Иными словами, выйти из цикла можно в любой момент, а войти – только в начало.
Цикл с предусловием
while
В цикле с предусловием проверка условия продолжения цикла выполняется перед телом цикла
(Рис.2) Если при входе в цикл условие не выполняется, он не будет выполнен ни разу. Оператор цикла имеет вид
While выражение
do оператор
Выражение должно быть логического типа. Если результат вычисления выражения равен true
, выполняется расположенный после служебного слова do
простой или составной оператор. Эти действия повторяются до того момента, пока результатом выражения не станет значение false
. После окончания цикла управление передается следующему за ним оператору.
Задача 3.1. Печать таблицы значений функции
Написать программу печати таблицы значений функции sin для аргумента, изменяющегося в заданных пределах с заданным шагом.
Исходными данными являются начальное значение аргумента Х, конечное значение аргумента и шаг изменения аргумента dX. Все величины – вещественные и могут принимать любые значения на числовой оси. Результатом работы программы должна быть таблица, состоящая из двух столбцов – значений аргумента и соответствующих им значений функции.
program tabl_fun;
var
Xn,Xk:real; {Начальное и конечное значения аргумента}
dx:real; {Шаг изменения аргумента}
x,y:real; {текущие значения аргумента и функции}
begin
writeln('Vvedite Xn,Xk,dX'); {Приглашение ко вводу данных}
readln(Xn,Xk,dX); {ввод исходных данных}
writeln('___________________________'); {заголовок таблицы}
writeln('______X_____|_______Y______');
writeln('___________________________');
x:=Xn; {первое значение аргумента =Хn}
while x<=Xk do begin {заголовок цикла}
y:=sin(x); {вычисление значения функции}
writeln('|',x:7:2,' |',y:7:2,' |'); {вывод строки табл.}
x:=x+dx; {переход к следующему значению аргумента} end;
writeln('___________________________') ;
readln; end.
Выполнить программу для Хn=-4, Xk=4, dx=1.
Индивидуальные задания
Задание 1
Вычислить и вывести на экран в виде таблицы значения функции, заданной графически (см. задание 1 лабораторной работы №2), на интервале от до с шагом dx. Интервал и шаг задать таким образом, чтобы проверить все ветви программы. Таблицу снабдить заголовком и шапкой.
Задание 2
Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень из задания 2 лабораторной работы «2.
Лабораторная работа №4. Организация циклов.(продолжение)
Задача 3.2. Вычисление суммы ряда
…………………………………………………………………………………………………………………
Написать программу вычисления значения функции
sin с помощью степенного ряда с точностью по формуле
Этот ряд сходится на всей числовой оси. Для достижения заданной точности требуется суммировать члены ряда до тех пор, пока абсолютная величина очередного члена не станет меньше или равна .
Запишем в общем виде формулу для вычисления n – го члена ряда:
На первый взгляд может показаться, что придется организовать циклы для расчета факториала и степеней. При этом можно получить очень большие числа, при делении которых друг на друга произойдет потеря точности, поскольку количество значащих цифр, хранимых в ячейке памяти, ограничено. Кроме того, большие числа могут переполнить разрядную сетку.
Мы поступим по-другому. Легко заметить, что (n+1) – й член ряда вычисляется после n-го, поэтому программа получится более простой и эффективной, если находить член ряда не «с нуля», а умножением предыдущего члена на некоторую величину.
Найдем эту величину. Для этого сначала запишем формулу для (n+1)-го члена ряда, подставив в предыдущее выражение (n+1) вместо n:
Теперь найдем выражение, на которое надо будет умножить C , чтобы получить С:
=
Запишем алгоритм вычисления суммы ряда в словесной форме:
1. Ввести исходные данные (аргумент и точность).
2. Задать начальные значения номеру члена ряда, первому члену ряда и сумме ряда.
3. Организовать цикл в котором:
1) Вычислить очередной член ряда;
2) Добавить его к сумме ряда;
3) Перейти к следующему члену ряда;
4) Проверить, достигнута ли точность вычислений.
4. Вывести значение функции.
Определить заранее, сколько членов ряда потребуется просуммировать для достижения точности, невозможно, поскольку при анализе условия выхода используется переменная, вычисляемая на каждой итерации цикла. Такие циклы потенциально опасны, поэтому для предотвращения зацикливания полезно предусмотреть аварийный выход из цикла по достижении некоторого максимально допустимого количества итераций с печатью предупреждающего сообщения.
Ниже приведен текст программы с комментариями. На каждой итерации требуется хранить значение одного члена ряда, поэтому все члены ряда формируются в одной и той же переменной с:
program sinus;
const MaxIter=500; {максимально допустимое количество итераций}
var x,eps:double; {аргумент и точность}
c,y:double; {член ряда и его сумма}
n:integer; {номер члена ряда}
done:boolean; {признак достижения точности}
begin
writeln('Введите аргумент и точность:');
readln(x,eps);
done:=true;
c:=x; {первый член ряда}
y:=c; {начальное значение суммы}
n:=1;
while abs(c)>eps do begin
c:=-c*sqr(x)/2/n/(2*n+1); {очередной член ряда}
y:=y+c; {добавление члена ряда к сумме}
inc(n); {переход к следующему члену ряда}
if n<=MaxIter then continue;
writeln('ryd rasxoditsya');
done:=false;break {аварийный выход из цикла}
end;
if done then
writeln('Аргумент:',x:10:6,#13#10,
'Значение функции:',y:10:6,#13#10,
'Вычислено с точностью',eps:8:6,'за',n,'итераций');
readln;
end.
Первый член ряда равен х, поэтому, чтобы при первом проходе цикла значение второго члена вычислялось правильно, начальное значение n должно быть равно 1.Максимально допустимое количество итераций удобно задать с помощью именованной константы. Для аварийного выхода изх цикла применяется процедура break, которая обеспечивает переход к первому после цикла оператору. Символы #13#10 при выводе вызывают переход на следующую строку.
Контрольный пример для х=7.5 и eps=0,00001.
Индивидуальное задание
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от до с шагом dx с точностью . Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.
1.
2.
3.
4.
5.
6.
7.
8. x>1.
9.
10. arthx=
11. arthx=
12.
13.
14.
15.
16.
17.
18.
19. arcsinx =
20.
21.
22.
23.
24.
25.
26.
27.
28. x>1.
29.
30. arthx=
31. arthx=
32.
Лабораторная работа №5. Одномерные массивы
Цель:
познакомить студентов с понятием структурированных переменных, их особенностями, ввести понятие массива, рассмотреть приемы работы с данными типа массив.
До настоящего момента мы использовали в программах простые переменные стандартных типов данных. В этом случае каждой области памяти для хранения одной величины соответствует свое имя. Если переменных много, программа, предназначенная для их обработки, получается длинной и однообразной. Поэтому в любом процедурном языке есть понятие массива
— ограниченной совокупности однотипных величин. Элементы массива располагаются в памяти непрерывным блоком и имеют одно и то же имя (рис.). Различают элементы по порядковому номеру (индексу).
Пять простых переменных:
a |
b |
c |
d |
e |
Массив из пяти элементов:
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
|
a |
Рис.
Простые переменные и массив
Описание массива
Чтобы описать массив, надо сообщить компилятору:
o сколько в нем элементов;
o какого типа эти элементы;
o как они нумеруются.
Массив не является стандартным типом данных, поэтому он задается в разделе описания типов:
type имя_типа
= аrrау [тип_индекса]
of тип_элемента
Здесь tуре — признак начала раздела описания типов, array и of — ключевые слова, тип индекса задается в квадратных скобках, например:
type mas = аrrау [1 .. 10] of rеаl;
Здесь описан тип массива из вещественных элементов, которые нумеруются от 1 до 10. После задания типа его можно использовать точно так же, как любой стандартный тип, то есть описывать с его помощью переменные, например:
var a, b : mas;
Компилятор, встретив такой оператор, выделит по 60 байт под каждый из массивов а и b (10 элементов по 6 байт). К элементу массива обращаются, указав его имя, за которым в квадратных скобках записывается порядковый номер элемента:
а[4] b[i]
С элементом массива можно делать все, что допустимо для переменных того же типа.
ВНИМАНИЕ:
Тип элементов массива может быть любым, кроме файлового, тип индексов — интервальным, перечисляемым или byte. При описании типа индексов можно использовать только константы или константные выражения. Переменные не допускаются, потому что место под массив резервируется до выполнения программы.
Если тип массива используется только в одном месте программы, можно задать тип прямо при описании переменных, например:
const n = 100:
var x,у : array [1 . . n] of integer;
С массивами в целом можно выполнять только одну операцию — присваивание.
При этом массивы должны быть одного типа, например:
х := у;
Задача 4.1. Количество элементов между минимумом и максимумом
………………………………………………………………………………………………………………..
Написать программу, которая для 10 целочисленных элементов определяет, сколько положительных элементов располагается между максимальным и минимальными элементами.
Запишем алгоритм в самом общем виде:
1. Считать исходные данные в массив.
2. Определить, где расположены его максимальный и минимальный элементы, то есть найти их индексы.
3. Просмотреть все элементы, расположенные между ними. Если элемент массива больше нуля, увеличить счетчик элементов на единицу.
Перед написанием программы полезно составить тестовые примеры, чтобы более наглядно представить себе алгоритм. Ниже представлен массив из 10 чисел и обозначены искомые величины:
6 |
-8 |
15 |
9 |
-1 |
3 |
5 |
-10 |
12 |
2 |
макс |
+ |
+ |
+ |
мин |
Для этого примера программа должна вывести число 3.
Порядок расположения элементов в массиве заранее не известен — сначала может следовать как максимальный, так и минимальный элемент, более того, они могут совпадать. Поэтому прежде чем искать количество положительных элементов, требуется определить, какой из этих индексов больше, чтобы просматривать массив от меньшего номера к большему.
Рассмотрим подробно принцип поиска максимального элемента
в массиве. Он весьма прост. Очевидно, что для его отыскания нужно сравнить между собой все элементы массива. Поскольку компьютер может сравнивать одновременно только два числа, элементы выбираются попарно.
Например, сначала первый элемент сравнивается со вторым, затем тот из них, который оказался больше — с третьим, тот, который оказался больше — с четвертым, и так далее до последнего элемента.
Иными словами, при каждом сравнении из двух чисел выбирается наибольшее. Поскольку его надо где-то хранить, в программе описывается переменная того же типа, что и элементы массива. После окончания просмотра массива в ней окажется самый большой элемент. Для того чтобы все элементы сравнивались единообразно, перед началом просмотра в эту переменную заносится первый элемент массива.
Сформулируем алгоритм поиска максимума:
1. Принять за максимальный первый элемент массива.
2. Просмотреть массив, начиная со второго элемента.
3. Если очередной элемент оказывается больше максимального, принять его за максимальный.
Для решения поставленной задачи нам требуется знать не значение максимума, а его положение в массиве, то есть индекс:
Как видите, в этой программе в переменной imax запоминается номер максимального из просмотренных элементов. По этому номеру осуществляется выборка элемента из массива.
Запишем уточненный алгоритм решения нашей задачи:
1. Определить, где в массиве расположены его максимальный и минимальный элементы:
o задать начальные значения индексов искомых максимального и минимального элементов;
o просмотреть массив, поочередно сравнивая каждый его элемент с ранее найденными максимумом и минимумом. Если очередной элемент больше ранее найденного максимума, принять этот элемент за максимум (то есть запомнить его индекс). Если очередной элемент меньше ранее найденного минимума, принять этот элемент за минимум.
2. Определить границы просмотра массива для поиска положительных элементов, находящихся между его максимальным и минимальным элементами:
o если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе — индексу минимума;
o если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе — индексу максимума.
3. Определить количество положительных элементов в найденном диапазоне:
o обнулить счетчик положительных элементов;
o просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.
Для экономии времени значения элементов массива при отладке задаются путем инициализации.
program num_positive_1;
uses crt;
const
n=10;
a:array[1..n] of integer=(1,3,-5,1,-2,1,-1,3,8,4);
var
i:integer; {индекс текущего элемента}
imax:integer; {индекс максимального элемента}
imin:integer; {индекс минимального элемента}
ibeg:integer; {начало интервала}
iend:integer; {конец интервала}
count:integer; {количество положительных элементов}
begin
clrscr;
for i:=1 to n do write(a[i]:3);writeln; {отладочная часть}
imax:=1;imin:=1; {начальные значения номеров макс. и мин. эл-ов}
for i:=1 to n do begin
if a[i]>a[imax] then imax:=i; {новый номер максимума}
if a[i]<a[imin] then imin:=i; {новый номер минимума}
end;
writeln ('max=',a[imax],' min=',a[imin]); {отладочная печать}
if imax<imin then ibeg:=imax else ibeg:=imin; {левая граница}
if imax<imin then iend:=imin else iend:=imax; {правая граница}
writeln('ibeg=',ibeg,' iend=',iend); {отладочная печать}
count:=0;
for i:=ibeg+1 to iend-1 do {подсчет кол-ва положительных}
if a[i]>0 then inc(count);
writeln('Количество положительных: ',count);
readln;
end.
Замечание: inc(x) – увеличивает на 1;
dec(x) – уменьшает на 1.
Лабораторная работа №6. Преобразование массивов.
Цель: Приобретение основных навыков при решение задач на массивы.
…………………………………………………………………………………………………
Задача 6.1. Создать массив случайных чисел из 30 элементов. Произвести сортировку по невозрастанию и неубыванию. Найти минимальный и максимальный элементы, определить номера этих элементов. Если этих элементов несколько, то создать массив минимальных и максимальных чисел. Подсчитать сумму всех элементов массива и найти среднее арифметическое.
Задание: Уметь объяснить работу программы.
uses crt;
const n=30;
var a,mn,mx: array[1..n] of integer;
min,max,imin,imax,i,j,sum,t:integer;
sred:double;
begin
clrscr;
randomize;
writeln;writeln;
writeln('Исходный массив');writeln;
sum:=0;
for i:=1 to n do begin
a[i]:=random(101);
write(a[i],' ');
sum:=sum+a[i];
end;
sred:=sum/n;
writeln;
writeln;
writeln('Сумма элементов массива=',sum,' ','Среднее ариф-ое=',sred);
min:=a[1];max:=a[1];
for i:=2 to n do begin
if a[i]<min then min:=a[i];
if a[i]>max then max:=a[i];
end;
imin:=0; imax:=0;
for i:=1 to n do begin
if a[i]=min then inc(imin);
if a[i]=max then inc(imax);
end;
if imin>1 then begin writeln;writeln('Массив мин-ых эл-ов');
for i:=1 to imin do begin
mn[i]:=min;
write(mn[i],' ');
end;end
else begin for i:=1 to n do if a[i]=min then begin imin:=i; break;end;
writeln;
writeln('Мин-ый=',min,' номер мин-го=',imin);end;
if imax>1 then begin writeln;writeln('Массив максим-ых эл-ов');
for i:=1 to imax do begin
mx[i]:=max;
write(mx[i],' ');
end;end
else begin for i:=1 to n do if a[i]=max then begin imax:=i; break; end;
writeln;
writeln('Макс-ый=',max,' номер макс-го=',imax);end;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]<a[j] then begin t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
writeln;
writeln('Сорт-ка1');
for i:=1 to n do write(a[i],' ');
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then begin t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
writeln;
writeln;
writeln('Сортировка2');
for i:=1 to n do write(a[i],' ');
readln;
end.
Задача 6.2. Написать программу, которая «сжимает» целочисленный массив из 10 элементов, удаляя из него элементы, меньшие заданной величины. Освободившиеся в конце массива элементы заполнить нулями.
…………………………………………………………………………………………………
Исходный массив:
6 |
-8 |
15 |
9 |
-1 |
3 |
5 |
-10 |
12 |
2 |
Допустим, требуется удалить из него все элементы, значение которых меньше 5. Результат должен иметь вид
6 |
15 |
9 |
5 |
12 |
0 |
0 |
0 |
0 |
0 |
Проще всего решать эту задачу с использованием дополнительного массива того же типа, что и исходный. В этом случае при просмотре исходного массива элементы, которые требуется оставить, помещаются один за другим во второй массив, после чего он присваивается исходному. Однако для массивов большой размерности выделение двойного объема памяти может оказаться слишком расточительным. Поэтому, предлагаю решить задачу по следующему алгоритму:
1) Просматривая массив, определить номер самого первого из удаляемых элементов.
2) Если таковой есть, сдвигать каждый последующий элемент массива на первое «свободное» место, обнуляя оставшуюся часть массива.
Индивидуальное задание. (у преподавателя)
Вариант 1
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
вещественных элементов, вычислить:
1) сумму отрицательных элементов массива;
2) произведение элементов массива, расположенных между максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.
Вариант 2
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
вещественных элементов, вычислить:
1) сумму положительных элементов массива;
2) произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
Вариант 3
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
целочисленных элементов, вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом – все отрицательные (элементы, равные нулю, считать положительными).
Вариант 4
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
вещественных элементов, вычислить:
1) сумму элементов массива с нечетными номерами;
2) сумму элементов массива, расположенных между первым и последним отрицательными элементами.
Сжать массив, удалив из все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
вещественных элементов, вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего положительного элемента.
Сжать массив, удалив из все элементы, модуль которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 6
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n
вещественных элементов, вычислить:
1) минимальный элемент массива;
сумму элементов массива, расположенных между первым и последним положительными элементами]. Освободившиеся в конце массива элементы заполнить нулями.
Лабораторная работа №7. Сортировка массива.
Цель: Рассмотреть различные методы сортировки массивов. Сравнить их эффективность.
Линейная сортировка (сортировка отбором)
Идея линейной сортировки по невозрастанию заключается в том, чтобы, последовательно просматривая весь массив, отыскать наибольшее число и поменять его местами с первым элементом. Затем просматриваются элементы массива, начиная со второго, снова находится наибольший, который меняется местами со вторым и т. д.
I Программа линейной сортировки по невозрастанию
const n=20;
m: array [1..n] of byte =
(9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);
var i,j,buf,l: byte; a: integer;
begin
writeln(‘Исходный массив:’);
for i:=l to n do write (‘_’, m[i]);
writeln; readln;
a:=0; { обнуляем счетчик итераций };
{ изменение размера неотсортированной части массива }
for i:=l to n-1 do
{ сравниваем поочередно i-й элемент неотсортированной части массива }
{ со всеми от i+1-го до конца }
for j:=i+l to n do
begin
a:=a+l;
if m[i]<rn[j] then { если в неотсортированной части массива }
{ нашли элемент, больший, чем i-й, то меняем их местами }
begin
buf := m[i]; { buf — буфер обмена }
m[i] := m[j] ; m[j] := buf;
end;
for 1:=1 to n do write (‘__‘, m[l]); { после сортировки }
writeln(‘; итерация # ' ',a); end.
По последнему значению a определяем, что для данного массива линейная сортировка по невозрастанию выполняется за 190 итераций.
Лабораторная работа №8. Сортировка массива.
Цель: Рассмотреть различные методы сортировки массивов. Сравнить их эффективность.
Сортировка методом "пузырька"
Один из самых популярных методов сортировки — "пузырьковый" основан на том, что в процессе исполнения алгоритма более "легкие" элементы массива постепенно "всплывают". Особенностью данного метода является сравнение, а затем, если нужно, и перестановка соседних элементов.
const n=20;
m: array [1..count] of byte =
(9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);
var i,j,buf,l: byte; a: integer;
begin
riteln('Исходный массив:');
for i:1 to n do write(' ',m[i]);
writeln; readln;
a:=0;
for i:=2 to n do
begin
for j:=n downto i do
begin
a:=a+l;
if m[j-l]<in[j] then{ если элемент справа больше элемента }
{слева, то "вытесняем" его влево — пузырек "всплывает" }
begin
buf:=m[j-l]; { перестановка элементов }
m[j-l] :=m[j];
m[j]:=buf;
for i:=1 to n do write(' ',m[l]);
writeln(‘; итерация # ',a);
end;
end;
end;
end.
Определить количество итераций.
Лабораторная работа №9. Сортировка массива.
Цель: Рассмотреть различные методы сортировки массивов. Сравнить их эффективность.
Метод быстрой сортировки с разделением.
Оба выше рассмотренных метода достаточно просты и наглядны, но не эффективны. Значительно быстрее работает алгоритм сортировки К. Хоора, который называют сортировкой с разделением или "быстрой сортировкой". В основу алгоритма положен метод последовательного дробления массива на части и обмен элементами между частями.
Алгоритм метода является очень сложным и требует знания процедур и рекурсии,,
поэтому приведем его здесь с минимальными комментариями в тексте самой программы.
Программа быстрой сортировки.
uses crt;
const n=20;
m: array [1..n] of byte =
(9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5) ;
var i,a: integer;
procedure quicks (first, last: integer) ;
var i,j,x,buf,1:integer;
begin
i:=first; { левая граница массива — первый элемент }
j:=last; { правая граница массива — последний элемент }
x:=m[ (first+last) div 2]; ( определить середину массива }
repeat
while m[i]>x do i:=i+l;
while x>m[j] do j:=j-l;
{ увеличить число итераций обмена элементов }
а:=а+1; if i<=j then
begin { обменять местами элементы }
buf:=Tti[i]; m[i]:=m[j]; m[j]:=buf;
i:=i+l; j:=j-l;
for 1:=1 to n do write (' ',in[l]);
writeln{'; итерация # ',a);
end;
until i>j;
{рекурсивый вызов процедуры quicks }
if first<j then quicks (first, j) ;
{ рекурсивный вызов процедуры quicks }
if i<last then quicks(i,last);
end; {конец сортировки }
begin { начало основной программы }
clrscr; { очистка экрана }
writeln('Исходный массив:');
for i:=l to n do write (' ',in[i]);
writeln; readln;
a:=0;
quicks (1, count) ; { вызов процедуры сортировки quicks }
writeln; writeln('Отсортированный массив:');
for i:=l to n do write (' ',m[i]);
writeln; readln;
end.
По последнему значению a определяем, что для данного массива сортировка по невозрастанию выполняется за 28 итераций.
Лабораторная работа №10. Двумерные массивы.
Цель: освоение двумерных массивов.
Итак, мы рассмотрели одномерные массивы. Элементы массива могут, в свою очередь, также быть массивами, например:
Const n=4;m=3;
Type mas = array[1..n] of integer;
Mas2 = array[1..m] of mas;
Обычно это записывается так:
Type mas2 = array[1..m,1..n] of integer;
Здесь описан тип массива, состоящего из m массивов, каждый из которых содержит n целых чисел. Иными словами, это матрица из m строк и n столбцов, или двумерный массив
.
Задача 7.1. Минимальный по модулю элемент
……………………………………………………………………………………………………
Написать программу, которая находит минимальный по модулю элемент вещественной матрицы размером 5
8 и его координаты
.
В результате выполнения этой программы должно получиться три числа: значение элемента, имеющего минимальную абсолютную величину (величина вещественного типа), а также целочисленные номера строки и столбца, на пересечении которых этот элемент расположен.
Алгоритм
1. Ввести матрицу.
2. Принять элемент, расположенный на пересечении первой строки и первого столбца, за искомый (для этого запомнить его модуль, номер строки и номер столбца).
3. Поочередно просмотреть все элементы матрицы; если модуль очередного элемента оказывается меньше сохраненного, принять этот элемент за искомый (то есть запомнить его модуль, номер строки и номер столбца).
4. Вывести результаты.
Программа:
program min_abs_1;
uses crt;
const m=5;n=8;
var
a:array[1..m,1..n] of real;
i,j:integer; {текущие значения индексов строки и столбца }
im,jm:integer; {значения индексов минимального элемента}
minmod:real; {буфер для хранения минимального модуля}
begin clrscr; randomize;
for i:=1 to m do
for j:=1 to n do a[i,j]:=random(101); {ввод элементов массива}
writeln;writeln('Исходный массив');
for i:=1 to m do begin
for j:=1 to n do write (a[i,j]:6:1);writeln end;writeln;
minmod:=abs(a[1,1]); {начальные установки}
im:=1;jm:=1;
for i:=1 to m do {цикл перебора всех строк}
for j:=1 to n do {цикл просмотра строки (меняется номер столбца)}
if abs(a[i,j])<minmod then begin
minmod:=abs(a[i,j]);im:=i;jm:=j; {обновление минимума} end;
writeln ('Минимальный по модулю элемент : ',minmod:6:1,' Его координаты: ',im:3,jm:3);
readln; end.
Размеры массива заданы именованными константами m и n, что позволяет легко их изменять.
Для ввода матрицы требуется организовать вложенные циклы. Порядок их следования не важен, главное, чтобы он совпадал с порядком ввода исходных данных. Для приведенной последовательности циклов элементы должны вводиться по строкам.
Задание: Измените программу так, чтобы она находила указанную величину не для всей матрицы, а для каждой ее строки.
Алгоритм ее работы будет выглядеть так:
1. Ввести матрицу.
2. Для каждой строки матрицы:
- принять элемент, расположенный на пересечении этой строки и первого столбца, за искомый (для этого запомнить его номер столбца);
- просмотреть строку матрицы; если модуль очередного элемента оказывается меньше сохраненного, принять этот элемент за искомый (то есть запомнить его номер столбца);
- вывести результаты.
Как видите, в этом случае для каждой строки матрицы повторяются одни и те же действия - присвоение начальных значений, просмотр строки и вывод результатов. Номер строки при обновлении минимума можно не запоминать, потому что он хранится в переменной цикла. Для разнообразия не будем сохранять в отдельной переменной и минимальный модуль.
Лабораторная работа №11: Подпрограммы.
Цель: Решение задач в виде отдельных подпрограмм, для упрощения отладки и возможной модификации программ.
Подпрограмма представляет собой самостоятельную программную единицу, обращение к которой осуществляется по имени.
Логически законченные части программы оформляются в виде подпрограмм. Они нужны для того, чтобы упростить структуру программы и облегчить ее отладку.
Подпрограмма —
это фрагмент кода, к которому можно обратиться по имени. Она описывается один раз, а вызываться может столько раз, сколько необходимо. Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве аргументов.
В Паскале имеется два вида подпрограмм: процедуры и функции. Они определяются в соответствующих разделах описания до начала блока исполняемых операторов.
Само по себе описание не приводит к выполнению подпрограммы. Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов
записывается в том месте программы, где требуется получить результаты работы подпрограммы. Подпрограмма вызывается по имени, за которым следует список аргументов
в круглых скобках. Если аргументов нет, скобки не нужны. Список аргументов при вызове как бы накладывается на список параметров, замещая его, поэтому они должны, попарно соответствовать друг другу.
Подобно тому, как можно при вычислении по одной и той же формуле получить разные результаты, подставляя разные значения аргументов, при каждом вызове подпрограммы можно передавать ей разные данные. Важно только, чтобы их количество и тип соответствовали тому, что требуется подпрограмме для работы.
Структура процедуры аналогична структуре основной программы: в ней есть заголовок, разделы описаний и операторов:
procedure
имя (список параметров): {
заголовок }
разделы описаний
begin
раздел операторов
end
;
Задача. Даны два массива целых чисел. Оформить ввод и вывод элементов в виде процедуры и найти максимальный элемент каждого массива с помощью функции.
uses crt;
type mas=array[1..35] of integer;
var a,b:mas;
maxA,maxB,i:integer;
procedure WWOD(var d:mas;n:byte);
begin for i:=1 to n do
d[i]:=random(100);
end;
procedure WIWOD(var d:mas;n:byte);
begin writeln ('Massiv');
for i:=1 to n do
write(d[i]:5);
end;
function Max(var d:mas;n:byte):integer;
var p:integer;
begin p:=d[1];
for i:=2 to n do
if d[i]>p then p:=d[i];
max:=p;
end;
begin clrscr;
randomize;
WWOD(a,20);
WWOD(b,35);
writeln;
WIWOD(a,20);
maxA:=Max(a,20);
writeln('Maksimal A=',maxA);
writeln;
WIWOD(b,35);
maxB:=Max(b,35);
writeln('Maksimal B=',maxB);
readln;
end.
В отчете по лабораторным работам написать комментарии к отдельным блокам программы.
Задачи для самостоятельного решения.
Даны два массива из 10 целых чисел каждый. Определить, в каком из них больше положительных элементов.
Дана целочисленная прямоугольная матрица. Определить:
1. количество строк, не содержащих ни одного нулевого элемента (оформить в виде функции);
2. максимальное из чисел, встречающихся в заданной матрице более одного раза (оформить в виде процедуры).
Рекомендации: Размерности массивов следует задать именованными константами. Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Использование глобальных переменных в подпрограммах не допускается. Вывод результатов работы подпрограмм должен выполняться в главной программе.
Лабораторная работа №12. Использование подпрограмм в Паскале.
Цель работы:
1) Получить необходимые навыки при использовании операторов в среде Turbo Pascal;
2) Научиться создавать, корректировать и выполнять простые программы с использованием подпрограмм.
!!! Выучите формальные и фактические параметры.
Задача 1. Составьте программу, в которой при помощи функции находится max(2x, 3x-10,max(x при заданных с терминала x,a.
uses crt;
type mas=array[1..4] of real;
function Max(d:mas;n:integer):real;
var i:integer;mx:real;
begin mx:=d[1]; for i:=2 to n do
if d[i]>mx then mx:=d[i];
max:=mx;
end;
var x,t:integer;
mx:real;
a,b,c:mas;
begin clrscr;
write('ВВедите x,t');
readln(x,t);
a[1]:=sqr(x)-x;
a[2]:=exp(3*ln(x))-sqr(x)-3*x;
c[3]:=Max(a,2);
writeln('Max(x^2-x,x^3-x^2-3x)=',c[3]:6:2);
b[1]:=t-x;
b[2]:=x-t;
c[4]:=Max(b,2);
writeln('Max(a-x,x-a)=',c[4]:6:2);
c[1]:=2*x;
c[2]:=3*x-10;
mx:=Max(c,4);
writeln('Max(2x,3x-10,max(x^2-x,x^3-x^2-3x),max(a-x,x-a))=',mx:6:2);
readln;
end.
Задача 2. Составьте программу, в которой при помощи функции находится максимальный элемент для массивов А(22), Р(12), Т(33), затем общий максимальный элемент, затем при помощи процедуры все отрицательные элементы каждого из трех массивов замените на модуль первого элемента соответствующего массива для массивов А(22), Р(12), Т(33). Предусмотреть вывод на экран исходных и измененных массивов.
uses crt;
type mas=array[1..33] of integer;
var a,p,t,m:mas;
i,maxi:integer;
procedure WWOD(var d:mas;n:byte);
begin for i:=1 to n do
d[i]:=random(101)-50;
end;
procedure WIWOD(var d:mas;n:byte);
begin
for i:=1 to n do
write(d[i]:5);
end;
function Max(var d:mas;n:byte):integer;
var mx:integer;
begin mx:=d[1];
for i:=2 to n do
if d[i]>mx then mx:=d[i];
max:=mx;
end;
procedure zamena(var d:mas;k:byte);
begin
for i:=1 to k do if d[i]<0 then d[i]:=abs(d[1])
end;
begin clrscr;
randomize;
WWOD(a,22); WWOD(p,12); WWOD(t,33);
writeln;
writeln ('Massiv A');
WIWOD(a,22);
m[1]:=Max(a,22);writeln;
writeln('Maksimal A=',m[1]);
writeln;
writeln ('Massiv P');
WIWOD(p,12);
m[2]:=Max(p,12);writeln;
writeln('Maksimal P=',m[2]);
writeln;
writeln ('Massiv T');
WIWOD(t,33);
m[3]:=Max(t,33);writeln;
writeln('Maksimal T=',m[3]);
maxi:=Max(m,3);
writeln('Max=',maxi);writeln;
zamena(a,22);
writeln('Noviy A');
WIWOD(a,22);
zamena(p,12);writeln;
writeln('Noviy P');
WIWOD(p,12);
zamena(t,33);writeln;
writeln('Noviy T');
WIWOD(t,33);
readln;
end.
Задача 3. В матрице А(4,8) определить с помощью функции разность между максимальным и минимальным элементом каждой строки и записать в дополнительный столбец в основной программе. Предусмотреть вывод начального массива и массива после дозаписи.
Лабораторная работа №13-14. Строки.
Цель: Освоить на практике новый тип данных – строка, научиться работать с текстом.
Теоретическая часть.
Понятие строки и размещение в памяти.
Описание строки.
Действия над строками. Операторы.
Примеры программ.
Определение. Строки – это структурируемый тип данных, представляющий собой последовательность из набора символов кодовой таблицы. Всего 255 символов. По устройству данный тип очень близок понятию массив.
A: string[5]
5 |
О |
С |
Е |
Н |
Ь |
- строка
B: array[1..5] of char
О |
С |
Е |
Н |
Ь |
- массив из символов
В отличие от массива первый (т.е. нулевой) байт памяти содержит информацию по количеству символов в строке. Поэтому, если строка описана длиной 10 символов, то любые символы введенные с терминала или добавляемые к строке после 10 будут игнорироваться.
I способ
Type <название типа 1> = string[10];
<название типа 2> = string;
(до 255)
Var <идентификатор>:<название типа>;
II способ
Var <идентификатор>: string[ ];
зарезерв длина
Замечание. Если две строки А и В описаны одинаково, то разрешено присвоение A:=B. Однако сравнение двух строк разрешается посимвольно. Обращение к каждому символу в строке аналогично доступу к каждому элементу в массиве.
Var A:string;
A[1] – первый символ
A[2 – второй символ
…
A[i – I – ый символ
Действия над строками.
a) Можно складывать, причем сложение строк неперестановочно: . Сложение наз-ся конкатенация. Concat – равносильно сложению нескольких строк. Результат в 1 –ой строке concat(a1,a2,a3)
b) Присвоение
c) Разрешается сравнение строк, при этом учитывается номер каждого символа из кодовой таблицы.
Пример 'кот'<'котомка'
'котт' > 'кота'
'аа' < 'ааа'
'а' < 'я'
Все символы русского и латинского алфавитов имеют коды соответствующих их порядку, т.е. 'А' < 'В'
Разрешены процедуры и функции над строками.
1) Copy (st,p,n)
Из строки st копируется n символов в память, начиная с позиции p.
2) Delete (st,p,n)
Из строки st удаляется n символов, начиная с p.
3) Insert(st1,st2,p)
Вставить строку st1 в st2, начиная с позиции p.
4) Length (st)
Вычисляет длину строки st.
5) Pos (st1,st2)
Находит позицию первого появления строки st1 в строке st2.
6) Str(n,st)
Процедура перевода цел. Переменной n в строку st.
7) Val(st,n,m)
Процедура переводит содержимое строки st в целочисленную переменную n, причем m – номер ошибочного символа.
Составить программу, позволяющую сформировать массив из слов данного предложения. Подсчитать количество слов, начинающихся с буквы Т.
uses crt;
var
s:string;
x:char;
n,i,m:byte;
mas:array[1..10] of string;
begin clrscr;
s:='Уж небо осенью дышало';
n:=length(s);m:=1; mas[m]:=' '; {Обнуление нового слова}
for i:=1 to n do
if s[i]=' ' then begin
m:=m+1;
mas[m]:=' ';
end
else mas[m]:=mas[m]+s[i];
n:=0;
for i:=1 to m do
begin
writeln(mas[i]);
if mas[i,1] in ['T','t'] then inc(n)
end;
writeln('Количество слов, начин-ся с c T=',n);
readln;
end.
Индивидуальное задание:
1) Записать все слова строки T в одномерный массив. Подсчитать количество слов, количество букв в которых нечетно.
uses crt;
const raz=[' ',',','.',';','-',':','!','?'];
var t:string;
mas:array[1..15] of string;
i,n,m:byte;
begin clrscr;
writeln('Vvedite stroku');
readln(t);
n:=length(t); m:=1;
mas[m]:='';
for i:=1 to n do
if t[i] in raz then begin
while(t[i] in raz) do inc(i);
inc(m);mas[m]:=t[i];
end
else mas[m]:=mas[m]+t[i];
writeln;
writeln;
writeln('Massiv:');
for i:=1 to m do writeln(mas[i],' ',length(mas[i]));
n:=0;
for i:=1 to m do
if odd(length(mas[i])) then inc(n);
writeln('Kol-vo netetn slov=',n);
readln;
end.
2) Ввести строку A: string с клавиатуры. Заменить все встретившиеся строчные буквы на такие же прописные и вывести строку А после изменения.
3) Написать программу, определяющую, сколько раз встретилось заданное слово в текстовом файле, длина строки в котором не превышает 80 символов. Текст не содержит переносов слов.
Лабораторная работа № 15. Исследовательско - практическая работа.
Цель:
закрепление знаний, развитие навыков самостоятельной работы.
Ход урока.
На данном уроке закрепляются знания, полученные на предыдущем уроке, и проводится самостоятельная исследовательская работа.
Для закрепления знаний можно воспользоваться программой, предлагаемой в качестве поддержки урока
program А8; {Строковые переменные}
uses crt;
var i,m:integer;
c,ch:char; s,s1: string;
begin
ClrScr;
GotoXY(10,3);
Writeln ('Вы работаете с программой демонстрации
строковых переменных'); Writeln; Writeln(‘ Введите 7-10 символов.');
GotoXY(5,8);
Readln(s);
Writeln;
Writeln(‘ Вы ввели строку символов: ',s);
Writeln;
i:=length(s);
m:=Round(i/2);
if m<>0 then c:=s[m];>
Writeln(‘ Количество символов в строке: ',i);
Writeln;
Writeln(‘ В середине строки есть символ: ',с);
Writeln;
Writeln(‘ Последний символ строки:
',copy(s,length(s),l));
Writeln;
Write(‘ А вот ваша строка "задом наперед":'); ".
for m:=i downto 1 do write(s[m]);
Writeln; si :="; Writeln;
for m:=0 to i do
begin if (ord(s[m])>127) and (ord(s[m])<176) then
1sl:=sl+s[m];
if (ord(s[m])>223) and (ord(s[m])<240) then
sl:=sl+s[m];
end;
if length(s1)<>O then Writeln(‘ В строке есть русские буквы: ',s1);
Writeln;
sl:=";
for m:=0 to i do if (ord(s[m])>47) and (ord(s[m])<58) thensl:=sl+'s[m];
if length(sl)oO then WritelnC В строке есть цифры: ',sl);
sl:=";
for m:=0 to i do
begin if (ord(s[m])>64) and (ord(s[m])<91) then sl:=sl+s[m]; if (ord(s[m])>96) and (ord(s[m])<123) then
sl:=sl+s[m];
end;
Writeln;
if length(sl)oO then Writeln(' В строке есть латинские
буквы: ',sl);
if (ord(s[lJ)>128) and (ord(s[l])<159) then Writeln('Привет,',s+'!'); ch:=ReadKey end.
Необходимо решить задачи:
1. Вызовите программу А8, исполните ее. Обратите внимание, как в программе проводится формирование строки из отдельных символов, как из строковой переменной выделяются отдельные символы и как работают основные функции и процедуры.
2. Придумайте свои варианты обработки информации в форме строк символов.
3. Составьте программу, преобразующую число в строку символов и строку символов-цифр в число.
После этого даем студентам задание:
1. В процедуре Val(s,x,Gode) используется переменная code типа word. Она принимает значение О, если преобразование строки в число проведено успешно. Определите назначение этой переменной в случае, если при преобразовании строки в число обнаружен символ, который не является атрибутом числа.
2. При записи идентификаторов и операторов прописные и строчные буквы не различаются. Выясните, различаются ли прописные и строчные буквы в значениях строковых переменных, в частности, при операциях сравнения.
3. При нажатии клавиши Enter в файл записывается символ конца строки, не имеющий изображения на экране дисплея. Найдите информацию об использовании стандартной функции eoln, распознающей этот символ.
Домашнее задание:
повторить [1] п. 14.4., 14.3; подготовиться к контрольной работе. Выполнить решение задач:
Составить алгоритм, подсчитывающий количество тех слов в строке из N букв, в которых третьей является заданная буква Ь. Слова разделены пробелами. Других знаков препинания нет.
Лабораторная работа №16. Решение задач.
Цель:
закрепление знаний, подготовка к контрольной работе.
Ход урока;
Проверка домашнего задания с анализом выполненных ими программ. Студенты, успешно справившиеся с домашним заданием, предлагаем перейти к решению задач.
Примерные тексты задач.
Задана строка, содержащая буквы и числа. Найти произведение всех чисел заданной строки (использовать тип данных long, int для вывода произведения).
Составить алгоритм, подсчитывающий количество тех слов в строке из N букв, в которых третьей является заданная буква ь. Слова разделены пробелами. Других знаков препинания нет.
Написать программу, которая по введенному коду выдает на экран символ.
Написать программу, которая выведет следующую конструкцию из символов:
а
аб
абс
абсд
…
аб...я.
Домашнее задание:
повторить процедуры работы со строковыми величинами и приемы обработки массивов, просмотреть решение задач на строковые величины и двумерные массивы, подготовиться к контрольной работе.
Лабораторная работа №17. Контрольная работа «Строковые величины и двумерные массивы».
Цель:
проверка знаний студентов, навыков самостоятельного решения задач и умения применять полученные знания на практике.
Студентам предлагаем несколько вариантов работы, в каждом из которых две задачи.
Вариант 1.
1. Имеется двумерный массив целых положительных чисел. Найти номер строки, для которой среднеарифметическое значение ее элементов максимально.
2. Составить алгоритм, подсчитывающий для заданного текста частоту вхождения всех букв русского алфавита.
Вариант 2.
1. Найти номер строки и столбца двумерного массива для максимального элемента этого массива.
2. Написать программу, которая введенное с клавиатуры слово напечатает следующим образом:
школа
к л
о о
л л
алокш
Вариант 3.
1. Найти сумму элементов двумерного массива вещественных чисел с(15,15), расположенных на главной диагонали.
. 2. Написать программу, которая перевернет введенное с клавиатуры слово или фразу.
Домашнее задание на данном уроке не задается.
Лабораторная работа №17. Анализ самостоятельной работы. Работа над ошибками.
Цель:
проанализировать наиболее характерные ошибки, развивать навыки самостоятельного анализа проблем и выбора метода их решения.
Ход урока:
На данном уроке необходимо проанализировать ошибки, допущенные студентами в ходе выполнения самостоятельной работы, разобрать причины, вызвавшие эти ошибки. Провести работу по исправлению допущенных ошибок. В том случае, если с какой-либо из задач не справилось большинство учащихся, ее выполнявших, то целесообразно привести решение этой задачи на доске с подробным анализом решения.'
После исправления ошибок предлагаем учащимся проверить работу их программ на компьютере (провести тестирование программ).
Примерные варианты решения задач:
Вариант 1.
1. program vll; uses crt;
var a:array[1..50,1..50] of integer; i,j,n,m,s,k:integer; sr:real; begin clrscr;
write('ввeдитe количество строк и столбцов'); readln (m,n); randomize; for i:=l to m do for j:=l to n do a[i,j]:=random(50); clrscr;
writeln ('исходный массив'); for i:=l to m do
begin forj:=l to ndo write(a[ij]:4); writeln; end; sr:=-5; {так как массив
положительных чисел}
writeln; for i:=l to mdo
begin .^' s:=0; ' forj:=l to ndo
J s:=s-i-a[i,j]; writeln(s/n:6:2); {распечатка средних арифметических для контроля} ifs/n>sr then begin
sr:=s/n; k:=i; end; end;
writeln;
writeln('иcкoмaя строка-' ,k); repeat until keypressed; end.
2.
program vl 2;
uses crt;
var fr,bukv,z:string; a:array[l..32] of integer;
i,k: integer;
{определение номера буквы}
procedure por(var znach: integer;x:string;bukv:string); • var i: integer;
begin
znach:=0
i:=l;
while (i<=32) and (znach=0) do
if x=copy(bukv,i, 1) then znach:=i
else i:=i+l; end;
{исполняемая часть} begin clrscr;
wгiteln('ввeдитe фразу'); readln(fr);
Ьику:='абвгдежзийклмнопрстуфхцчшщъыьэюя'; for i:=l to 32 do a[i]:=0; for i:=l to length(fr) do begin por(k,copy(fr,i,l),bukv); {просмотр фразы и определение вхождения}
ifk>Othena[k]-a[k]+l;
end; writeln;
write ('абвгдежзийклмнопрстуфхцчшщъэюя'); writeln;
for i:=l to 32 do write(a[i]:2); repeat until keypressed; end.
Вариант
2.
1. program v21; uses crt;
vara:array[1..50,1..50] of real; i,j,n,m,k,l:integer; max:real;
begin : clrscr;
write('ввeдитe размер массива m,n'); readln(m,n); randomize; I
for i:=l to mdo r forj:-l to n do ' a[ij]:=random(50); ' clrscr;
; writpln ('исходный массив'); 1; for i:=l to mdo •:■ begin
for j:=l ton do
write(a[ij]:6:2);
writeln;
end; max:=a[l,ll;
for i:=l to m do
forj.-l ton do
if max<a[i,j] then begin
max:=a[i,j];k:=i;l:=j; end;
writeln('мaкcимaльный элемент равен ',max:6:2,');
writeln( 'oh находится в ', к,'строке ', 1 'столбце');
repeat until keypressed;
end.
2.
program v22; uses crt;
yar fr:string;i,n,k:integer; begin clrscr
writeln('ввeдитe слово'); ; read(fr); gotoxy(4,12); write(fr);
for i:=2 to length(fr) do begin gotoxy (4,11 +i); write(copy(fr,i, 1)) gotoxy(4+length(fr)-l ,11+i); write(copy(fr,length(fi-)-i+1,1)); end; for i:=2 to length(fr)-l do begin
gotoxy(3+i,l l+length(fr)); write(copy(fr,length(fr)-i+l,l)); end; repeat until keypressed; end.
Вариант
3.
1. program v31;
uses crt; ,
var c:array[1..15,1..15] ofreal; ij:integer; s:real; begin clrscr; randomize; for i:=l to 15 do forj:=l to 15 do c[i,j]:=random(50); clrscr;
writeln ('исходный массив'); for i:=l to 15 do begin
forj:=l to 15 do
write(c[i,j]:6:2);
writeln; end; s:=0; fori:=l to 15 dp
s:=s+c[i,i]; '
writeln('Искомая сумма-,s: 10:2); repeat until keypressed; end.
2.
programv32 uses crt;
var fr:string;i: integer; begin
clrscr; .
vvrite('BBeflHTe слово или фразу'); readln(fr); writeln;
for i:=l to length(fr) do write(copy (fr,length(fr)-i+1,1)); repeat until keypressed; end.
Домашнее задание:
повторить основные типы данных, строковые, массивы.
Лабораторная работа18. Использование множеств для решения задач в Паскале.
Цель работы:
Получить первые необходимые навыки при использовании операторов в среде Турбо-Паскаль.
Научиться создавать, корректировать и выполнять простые программы с использованием названных структурных типов.
Ход выполнения лабораторной работы.
1) Прочитайте теорию по данной теме (см. лекции или учебник). Отметьте в отчете для лабораторных все, что считаете важным.
2) Загрузите язык Паскаль. Наберите в разных окнах программы, приведенные ниже. Запустите разобранные программы, поэкспериментируйте над ними…
3) Запишите в отчет выполненные индивидуальные задания.
4) Защитите лабораторную работу.
!!! Повторите материал по теме «Множества».
Задача 1. В произвольном тексте А: string определить, какие цифры встречаются, вывести их.
Подсказка: Пусть DI – тип множества всех встретившихся символов – цифр. Сначала DI=[]. Затем, просматривая текст, все цифры добавляются во множество DI. Они будут встречаться там в одном экземпляре, сколько бы одинаковых цифр не встретилось бы в тексте ( по свойствам множества).(Наберите программу и объясните приведенное решение).
Type XX=set of ‘0’..’9’;
Var s:char ; a:string; DI:XX; n,i:byte;
Begin write(‘Введите текст’);
Readln(A);
DI:=[]; n:=length(a);
For i:=1 to n do
If a[i] in [‘0’..’9’] then DI:=DI+[a[i]];
If DI=[] then writeln (‘В тексте цифр нет’) else writeln (‘В тексте следующие цифры’);
For s:=’0’ to ‘9’ do
If s in DI then write(s:3);
End.
Задача 2. Сформировать множества А и В, базовый тип которых 0..50, по заданному числу элементов для каждого множества. Найти число и сумму элементов, принадлежащих одновременно и А и В; выведите на экран все элементы множества А, не принадлежащие В.
Подсказка.
Допустим
n – количество элементов для множества А. Тогда при формировании А можно использовать цикл
k:=0;
Repeat…
until
k>=
n, где
k – это счетчик для множества.
Задача 3. Решить Задачу 2, если известно, что рассматриваются множества А и В, базовый тип которых – буквы русского и латинского алфавитов.
Подсказка. Для формирования множества из букв воспользуемся кодовой таблицей и все необходимые диапазоны кодов букв поместим в дополнительное множество М. Тогда при формировании В (или А) можно использовать тот же способ, что и в предыдущей задаче, например:
type mnog=set of char;
var a,b:mnog;
m:set of 0..255;
y,x,k,n:byte;
begin
m:=[65..90,97..122,128..175,224..239];
writeln;
writeln('Vvedite kol-vo elementov mn-va B);
readln(n); b:=[];
repeat
k:=0;
x:=random(255);
if x in M then B:=B+[chr(x)];
for y:=0 to 255 do
if chr(y) in b then k:=k+1;
until k>=n;
writeln ('Mn-vo B');
for x:=0 to 255 do
if chr(x) in B then write (chr(x):5);
writeln;
…
Лабораторная работа №19. Множества . (Продолжение)
Цель: показать практическое использование этого типа данных при решении задач.
Множества можно описать в разделе описания типов:
type
имя множества = set of
тип элементов;
var
идентификатор переменной : имя множества;
или же в разделе переменных:
var
идентификатор переменной : set of
имя типа элементов;
Тип элементов задается диапазоном или перечислением идентификаторов (в последнем случае обязательны круглые скобки), например:
type den = set of 1..5;
этим мы определили множество с именем den, значениями которого могут быть наборы целых чисел в диапазоне от 1 до 5: [], [1], [2], [3], [4], [5], [1,2], [2,3], [1,3], [2,3] ,[1,2,3], [1,2,3,4,5] и другие сочетания (в данном случае упорядоченные по возрастанию). Для экономии времени можно взять меньший диапазон значений.
var а: den; описана переменная типа множества den.
Описание в разделе переменных может выглядеть так:
Var s: set of'А'..'В';
Описана переменная s как множество, значениями которого могут быть: [], ['А'],['В'] и ['А','В'].
Или
var kinder : set of (inna,ivan);
Описана переменная kinder как множество, значениями которого могут быть: [], [inna],[ ivan] и [inna, ivan].
Множество можно описать в разделе констант:
const p=[3,7,9]; (простая константа)
типизированная константа так:
const m:set=[‘a’..’z’];
или так: const mn0:set of char=[‘a’..’z’];
Всe элементы множества должны иметь одинаковый тип (char, boolean, ограниченный, перечисляемый). Элементами множества могут быть выражения. Число элементов множества называют мощностью множества (число элементов до 255, поэтому в описании множества нельзя указать типы integer и real). Порядок следования элементов и способ их записи не играет роли: одинаковы множества [1,2,3], [3,2,1], [3,1,2], [1+2,1,2], [1..3], [3,3,3,1,2,3], но, если множество обозначается как диапазон, важно, чтобы начальный элемент был меньше, чем конечный, иначе множество будет считаться пустым. Например, ['z'..'а'] - пустое множество.
[ ] - также пустое множество.
При работе с множествами можно использовать следующие правила или операции:
* - пересечение множеств; с:=a*b, где а и b - переменные типа множество.
+ - объединение множеств; с:= а+ b ;
- - разность множеств; с:=а- b ;
=, <>, >=, <= - проверки на равенство, неравенство и т.д.
а> b и т.д.
in - проверка на принадлежность; d in а.
Практическая работа.
label 1;
type mn=set of char;
var ml,m2,m3,m4:mn;
a,b,m:integer;
c:char;
u:boolean;
bs:string[5];
begin
l:ClrScr;
GotoXY(10,4); ,
Writeln('Bы работаете с программой демонстрации операций с множествами');
Writeln;
WritelnC Создадим два множества, в каждом из которых по 5-10 символов:');
т1:=П; ,
т2:=[];
тЗ:=[];
т4:=['д';Д'Д','и];
Writeln; ;
WriteC Введите мощность (число элементов) множества ml:');
repeat
GotoXY(55,8);
ClrEol;
Readln(bs);
val(bs,b,a);
until (a=0) and ((b>l) and (b<20));
WritelnC При вводе элементов множества клавишу Enter использовать не надо');
WriteC Вводите множество ml из ',Ь,' символов:');
for m:=l to b do WriteC Проверка вхождения: ml >= m2 ');
u:=(ml >= m2);
Writeln(u);
Writein; ,
WriteC Введите какой-либо символ:');
c:=ReadKey;
Write(c);
Writein;
WriteC Проверка вхождения:',c,'inml ');
u:=c in ml;
Writeln(u);
WriteC Проверка вхождения:',c,'in m2 ');
u:~c in m2;
Writeln(u);
Writein;
Writein;
WriteC Еще будете работать с программой? (д/н)');
c:=ReadKey;
if с in m4 then Goto 1;
end.
После загрузки предлагаем им познакомиться с описанием программы, но не заостряем внимание на самой структуре, так как нас интересует работа операций.
Предлагаем учащимся запустить программу и в дальнейшем следовать указаниям программы.
После выполнения этой работы предлагаем учащимся выполнить еще одну работу, предварительно объяснив им условие задачи:
Задано множество целых положительных чисел от J до п . Создать из элементов этого множества такие подмножества, элементы которых удовлетворяют следующим условиям:
элементы подмножества не больше 10;
элементы подмножества кратны 8;
Лабораторная работа №20. Тип данных
Record (запись).
Цель: познакомить студентов со структурированным типом данных record, подготовиться к изучению файловых переменных.
И.Ф.О. |
Год рождения |
Стаж |
Пол Мужской |
Номер отдела |
Иванов Петр Иванович |
1980 |
3,5 |
Да |
2 |
Сидорова Светлана Анатольевна |
1975 |
8 |
Нет |
5 |
Для описания данных, когда с одним значением связывается набор данных разного типа, используется понятие запись. В ряде языков программирования аналогичное понятие называется структура.
Запись
– это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи.
В отличие от массивов компоненты (поля записи) могут быть разного типа. В качестве компонентов можно использовать данные простого и сложного типа.
2. I способ
Type <название типа> = record
|
<имя компонента 1>:<тип компонента 1 >;
<имя компонента 2>:<тип компонента 2 >;
…
<имя компонента n>:<тип компонента n >;
end;
var
< идентификатор >: <тип>;
II способ
var < идентификатор>: record
…
end;
Замечание
В качестве поля (компоненты) записи может использоваться другая запись. В этом случае ее описание либо указывается сразу после двоеточия либо описана выше в разделе type.
Пример type Data=record
Day:byte;
Month:byte;
Year:word;
End;
Type Rabotnic=record
Dr:Data;
Fio:string;
Pol:booleon;
Otd:integer
End;
Var x,y:rabotnic;
3. Обращение к конкретным полям записи производится при помощи уточнения через точку.
Например
x.fio
y.otd
x.dr.day
y.dr.year
Для упрощения работы с записью в Паскале используется оператор with .. do. Он позволяет указать переменную типа запись, а затем напрямую использовать название полей записи.
Пример with x, dr do …fio…
Begin … otd…
…year…
End
Варианты
With x do
With x.dr do
4. В массиве GRUP(24), описывающих данные на студентов
Имя Фамилия
Дата рождения
Адрес
Телефон
Составить программу, позволяющую вывести данные на всех студентов, затем данные на студентов 1980 года рождения и проживающих по пр.Ленина.
uses crt;
type STUDENT=record
ifa:string;
data:record
day:byte;
month:byte;
year:word;
end;
adres:string;
tel:word
end;
var GRUP:array[1..24] of student;
i:byte;
x:STUDENT;
begin clrscr;
writeln('Создание массива данных');
for i:=1 to 3 do
begin
writeln('Имя,Фамилия');
readln(x.ifa);
writeln('День рождения');
readln(x.data.day);
writeln('Месяц рождения');
readln(x.data.month);
writeln('Год рождения');
readln(x.data.year);
writeln('Адрес');
readln(x.adres);
writeln('Телефон');
readln(x.tel);
GRUP[i]:=x;
end;
writeln('Имя Фамилия':15,'День Месяц Год Адрес':20,'Телефон');
for i:=1 to 3 do with GRUP[i] do
writeln(ifa:15,data.day:4,data.month:4,data.year:6,adres:15,tel:7);
writeln;writeln('Данные студентов, рожденные после 1980 г. и
проживающие на пр.Ленина');
for i:=1 to 3 do
with GRUP[i] do
if(data.year>1980) and(copy(adres,1,9)='пр.Ленина') then
writeln(ifa:15,data.day:4,data.month:4,data.year:6,adres:15,tel:7);
readln;
end.
Лабораторная работа №21. Решение задач на типизированные файлы.
Цель: Рассмотреть цикл задач, связанных с типизированным типом файлом, в том числе задачу на создание простейшей базы данных.
Задача 1. Создать простейшую базу данных на основе типизированных файлов записей. Требуется - создать файл записей с заданным именем, поместив в него сведения о студентах потока (номер группы, фамилия, имя и три отметки за семестр). На основе файла выяснить процент успеваемости на "4" и "5" (количество студентов без "3", отнесенное к общему числу учащихся). Требуется также создать файл записей с заданным именем, поместив в него сведения о плохо успевающих студентах потока (с оценками "2" и "3") — номер группы, фамилия, имя, средний балл семестра, и вывести его записи на экран.
uses crt;
type stud=record
group:byte;
surname:string[20];
name:string[20];
{массив оценок: за семестр ставятся 3 оценки (от 2 до 5 баллов)}
oc:array[1..3] of 2..5;
end;
foolstud=record
group:byte;
surname:string[20];
name:string[20];
srarif:real;
end;
file_typ1=file of stud; file_typ2=file of foolstud;
var f1:file_typ1;f2:file_typ2;
namefile1,namefile2:string[12];
s:stud;
fs:foolstud;
i,nomrec:integer;
procedure read_data(var s:stud);
{Ввод записи по студенту}
begin
clrscr;
with s do
begin
writeln('Окончание ввода -0, как n группы');
write('N группы: '); readln(group);
if group <>0 then
begin
write('Фамилия:');readln(surname);
write('Имя:');readln(name);
writeln('Оценки:');for i:=1 to 3 do read(oc[i]);
end;
end;
end;
procedure copy_data(s:stud;var fs:foolstud);
{Копирование записи по студенту - задолжнику}
begin
with fs do
begin
group:=s.group; surname:=s.surname; name:=s.name;
{вычисление среднего арифметического элеиентов массива оценок}
srarif:=(s.oc[1]+s.oc[2]+s.oc[3])/3;
end;
end;
procedure write_list(var f:file_typ2);
{вывод записей по плохо успевающим студентам на экран}
begin
reset(f); seek(f,0);
writeln('Плохо успевающие:');
writeln('Группа ','Фамилия':16,'Имя':8,'Средний балл':18);
while not eof(f) do
begin
{чтение текущей записи из файла }
read(f,fs);
{вывод текущей записи на экран}
with fs do writeln(group:4,surname:15,name:10,srarif:16:2);
end;
end;
procedure create_file(var f:file_typ1; var n:integer);
{ввод записей по всем студентам в файл}
begin
n:=0; rewrite(f); read_data(s);
while s.group<>0 do
begin
{вывод текущей записи в файл}
write(f,s); inc(n);
{ввод записи по новому студенту}
read_data(s);
end;
close(f);
end;
procedure write_data(var f1:file_typ1;var f2:file_typ2;n:integer);
{вывод записей по плохо успевающим студентам в файл}
{подсчет % успевающих студентов}
var priz:char; k:integer;
begin
reset(f1); rewrite(f2); k:=0;
while not eof(f1) do
begin
read(f1,s);
{ПРИЗНАК УЧЕБЫ СТУДЕНТА}
PRIZ:='n';
for i:=1 to 3 do if (s.oc[i]>=2) then priz:='y';
if priz='y' then
begin
copy_data(s,fs);write(f2,fs) end
else inc(k);
end;
close(f1);close(f2);
clrscr;writeln('На "4" и "5" учатся',k/n*100:3:0,'%студентов');
end;
begin
clrscr;
write('Введите имя файла общей ведомости:');readln(namefile1);
assign(f1,namefile1);
create_file(f1,nomrec);
write('Введите имя файла ведомости задолжников:');readln(namefile2);
assign(f2,namefile2);
write_data(f1,f2,nomrec);
write_list(f2);
end.
Комментарии
Для каждого студента данные о номере его группы, фамилии, имени и отметках содержатся в полях записи stud: переменных group, surname, name и массиве ос соответственно. Для плохо успевающего студента данные о номере его группы, фамилии, имени и среднем балле содержатся в полях записи foolstud: переменных group, surname, name и sredarif соответственно. Создание типизированного файла базы данных на студентов потока выполняется процедурой create_file, а заполнение полей записи по отдельному студенту - процедурой read_data. Формирование типизированного файла базы данных на плохо успевающих студентов потока выполняется процедурой write_data, которая также подсчитывает процент обучающихся на "4" и "5". Процедура copy_data выполняет вспомогательную роль, копируя поля записи студента в соответствующие поля записи задолжника и вычисляя средний балл по оценкам семестра. Данные из файла задолжников выводятся процедурой write_list.
Лабораторная работа №22. Графика Турбо – Паскаля.
Цель: Рассмотреть основные операторы модуля
GRAPH, реализовать их в конкретных программах
Выполнение работы.
1. Набрать программу и описать действие операторов в виде комментариев.
Program Animacia;
Uses crt,graph;
const
osn:array[1..14] of integer =(485,355,605,355,605,375,385,375,385,365,485,365,485,355);
kab:array[1..14] of integer=(485,365,485,305,455,305,445,335,395,345,395,365,485,365);
ok1:array[1..10] of integer=(480,335,467,335,467,308,480,308,480,335);
ok2:array[1..10] of integer=(463,335,448,335,457,308,463,308,463,335);
var dr,md,kod,i:integer;
size:word;
p:pointer;
Procedure Fillcolor (a,b:byte);
begin
setcolor(a);
setfillstyle(1,b);
end;
begin
dr:=Detect;
initGraph(dr,md,'C:bp.7bgi');
kod:=graphresult;
if kod=0 then
begin
fillcolor(0,11);bar(0,0,639,399);
fillcolor(0,10);bar(0,400,639,479);
fillcolor(14,14);pieslice(590,50,0,359,40);
fillcolor(15,15);pieslice(50,50,0,359,30);
pieslice(160,50,0,359,50);
pieslice(150,50,0,359,40);
fillcolor(6,6);bar(495,325,625,355);
fillcolor(8,8);
fillpoly(7,kab);
fillcolor(9,9);
fillpoly(5,ok1);
fillpoly(5,ok2);
fillcolor(0,0);
circle(425,375,25);
circle(565,375,25);
floodfill(425,375,0);
floodfill(565,375,0);
fillcolor(7,7);
circle(425,375,10);
circle(565,375,10);
floodfill(425,375,7);
floodfill(565,375,7);end;
repeat until keypressed;
end.
Лабораторная работа №23. Программирование в графическом режиме.
Цель: практическое знакомство с операторами графического режима в Паскале.
Программа изображает график функции. Для того чтобы можно было быстро настроить программу на любой вид функциональной зависимости, используем отдельную функцию для задания функциональной зависимости, в которой легко можно изменить одну строку. Сам график строим в виде отрезков прямых. Для многих функций такой график получается лучше, чем при прорисовке по отдельным точкам, к тому же это прекрасная возможность продемонстрировать действие процедур moveto и lineto, которые работают с текущим графическим указателем. Использование масштабных коэффициентов придает универсальность процедуре построения графика. При этом считаем, что график занимает все экранное пространство (ровно 640 точек) вне зависимости от введенного интервала изменения аргумента.
Программа для построения графиков функций.
uses graph;
var gd,gm:integer;
function f(x:real):real; {задание функции}
begin
f:=x*x; {здесь может быть любая функция}
end;
procedure drawgrafik(a,b:real); {a,b – начальное и конечное значения x}
var x,dx,max,min,koef:real;
k,x0,y0:integer; {x0,y0 – положение осей координат}
begin
dx:=(b-a)/639; {определили шаг изменения х (640 точек на графике, а интервалов 639)}
x:=a; max:=f(a); min:=f(a);
for k:=1 to 640 do {определяем область значений f(x)}
begin
if f(x)>max then max:=f(x);
if f(x)<min then min:=f(x);
x:=x+dx;
end;
koef:=479/(max-min); {коэффициент по оси х}
x:=a;
moveto(0,round(479-koef*(f(a)-min))); {начальное значение указателя}
for k:=1 to 639 do {строим график}
begin
x:=x+dx;
lineto(k,round(479-koef*(f(x)-min)));
end;
x0:=round(639*a/(a-b));
line(x0,0,x0,479); {ось y}
y0:=round(479-479*(min/(min-max)));
line(0,y0,639,y0); {ось х}
end;
begin
gd:=detect; initgraph(gd,gm,'');
drawgrafik(-4,4);
readln;closegraph
end.
Содержание
Рапаков Г.Г., Ржеуцкая С.Ю. Turbo Pascal для студентов и школьников. - СПб.:БХВ -Петербург, 2005. - 352 с.:ил.
Павловская Т.А. Паскаль. Программирование на языке высокого уровня: Учебник для вузов. - СПб.:Питер,2003. -393 с.
Павловская Т.А. Паскаль. Программирование на языке высокого уровня: Практикум. - СПб.:Питер,2006. -317 с.:ил.
Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов. - СПб.: Питер, 2003.-640 с.
Немнюгин С.А. Turbo Pascal: Учеб. - СПб.: Питре,2000. - 496 с.
Немнюгин С.А. Turbo Pascal: Практикум - СПб.: Питре,2002. - 256 с.