Предлагаем учащимся запустить программу и в дальнейшем следовать указаниям программы.
После выполнения этой работы предлагаем учащимся выполнить еще одну работу, предварительно объяснив им условие задачи:
Задано множество целых положительных чисел от J до п . Создать из элементов этого множества такие подмножества, элементы которых удовлетворяют следующим условиям:
Цель: познакомить студентов со структурированным типом данных record, подготовиться к изучению файловых переменных.
Для описания данных, когда с одним значением связывается набор данных разного типа, используется понятие запись. В ряде языков программирования аналогичное понятие называется структура.
В отличие от массивов компоненты (поля записи) могут быть разного типа. В качестве компонентов можно использовать данные простого и сложного типа.
2. I способ
<имя компонента 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.7\bgi');
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 точек) вне зависимости от введенного интервала изменения аргумента.