Процедура создания массива записей по содержимому StringGrid 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Процедура создания массива записей по содержимому StringGrid



Эта процедура обеспечивает обмен информацией между компонентом StringGrid и массивом записей. Алгоритм процедуры заключается в циклическом вызове написанной ранее процедуры считывания записи из StringGrid. Ниже приводится код этой процедуры.

// Процедура формування масиву по змісту StringGrid

procedure getArrayFromGrid(var ar: TAttArray; var count: integer;

sg: TStringGrid);

var i: integer;

Begin

count:= sg.RowCount-1;

for i:= 1 to count do

ar[i]:= recordFromRowGrid(sg, i);

end;

Процедура отображения массива в компоненте StringGrid

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

// Процедура відображення масиву у StrinGrid

procedure showArrayInGrid(sg: TStringGrid; const ar: TAttArray;

count: integer);

var i: integer;

Begin

if count = 0 then exit;

sg.RowCount:= count+1;

for I:= 1 to count do

recordToRowGrid(ar[i], sg, i);

end;

Процедура сортировки массива записей по группе и фамилии

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

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

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

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

// Допоміжна функція для cортування за групою та прізвищем

function compareGrFio(r1, r2:TAttRec): boolean;

Begin

if r1.Group <> r2.Group

then result:=r1.Group <= r2.Group

else result:= r1.fio <= r2.fio;

end;

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

// Процедура сортування масиву записiв

// методом бульбашки за групою та прізвищем

procedure sortAttArrayGrFio (var ar:TAttArray;count: integer);

var i, j: integer; r: TAttRec; ok: boolean;

Begin

i:= count;

Repeat

i:=i-1;

ok:= true;

for j:=1 to i do

// Сравниваем записи с помощью функции

if not compareGrFio(ar[j], ar[j+1]) then

Begin

r:=ar[j];

ar[j]:=ar[j+1];

ar[j+1]:=r;

ok:= false;

end;

 

until ok;

end;

 

Наличие этой процедуры позволяет нам написать процедуру, которая будет вызываться при нажатии на кнопку «Упорядочить по группе и фамилии». Код процедуры приведен ниже.

// Сортування за групою та прізвищем

procedure TfrmRecord.btnSortGrFioClick(Sender: TObject);

var ar: TAttArray; count: integer;

Begin

//Беремо масив із StringGrid1

getArrayFromGrid(ar, count, StringGrid1);

// Сортуємо масив за правилом, що задає функція compareGrFio

sortAttArrayGrFio (ar, count);

//Передаємо впорядкований масив у StringGrid2

showArrayInGrid(StringGrid2, ar, count);

end;

Сортировка записей по количеству неудовлетворительных оценок и среднему баллу

Для этой сортировки можно также предварительно написать соответствующую функцию сравнения. Ниже приведена такая функция.

// Допоміжна функція для cортування за результатами атестації

function compareResult(const r1, r2:TAttRec): boolean;

Begin

if r1.neud <> r2.neud

then result:= r1.neud < r2.neud

else result:= r1.srBall > r2.srBall;

end;

Наличие этой функции позволяет нам написать процедуру сортировки, которая будет отличаться от рассмотренной выше только именем функции, вызываемой для сравнения. Вместо вызова compareGrFio(ar[j], ar[j+1]), в процедуре сортировки нужно будет написать compareResult(ar[j], ar[j+1]). Кроме того, у процедуры должно быть другое имя, например, sortAttArrayResult.

10.2.10 Выборка студентов какой-нибудь группы, имеющих средний балл выше 4

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

// Допоміжна процедура відбору студентів заданої групи,

// що мають середній бал більше ніж 4

procedure createRecordArrayMoreThen4(const ar: TAttArray; count: integer;

gr:TGroup; var ar4: TAttArray; var count4:integer);

var i: integer;

Begin

count4:= 0;

for i:=1 to count do

if (ar[i].group = gr) and (ar[i].srBall >=4) and (ar[i].neud = 0)

Then begin

count4:= count4 + 1;

ar4[count4]:= ar[i];

end;

end;

Наличие этой процедуры позволяет нам написать процедуру обработки события нажатия на кнопку «Выбрать ударников какой-то группы». Код процедуры приведен ниже.

// Процедура вибору хорошистів групи

procedure TfrmRecord.btn4Click(Sender: TObject);

var ar, ar4: TAttArray; count, count4: integer; gr: TGroup;

Begin

//Беремо масив із StringGrid1

getArrayFromGrid(ar, count, StringGrid1);

// Запит на введення назви групи

gr:= inputBox('Поиск "хорошистов"', 'Введите группу', 'КС051');

// Створюємо масив хорошистів групи

createRecordArrayMoreThen4(ar, count, gr, ar4, count4);

// Сортуємо масив за правилом, що задає функція compareResult

sortAttArrayResult (ar4, count4);

//Передаємо впорядкований масив у StringGrid2

showArrayInGrid(StringGrid2,ar4, count4);

end;

10.2.11 Подсчет числа студентов, имеющих более 2-х неудовлетворительных оценок и вывод упорядоченного списка этих студентов

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

// Допоміжна процедура відбору студентів,

// що мають кількість заборгованностей більше ніж 2

procedure createRecordArrayMoreThen2(const ar: TAttArray;

c ount: integer; gr:TGroup; var ar2: TAttArray; var count2:integer);

var i: integer;

Begin

count3:= 0;;

for i:=1 to count do

if ar[i].neud > 2

Then begin

count2:= count2 + 1;

ar2[count2]:= ar[i];

end;

end;

Наличие этой процедуры позволяет нам написать процедуру обработки события нажатия на кнопку «Подсчитать количество имеющих более 3-х хвостов». Код процедуры приведен ниже.

// Процедура вибору хвостистів

procedure TfrmRecord.btn2Click(Sender: TObject);

var ar, ar2: TAttArray; count, count2: integer; gr: TGroup;

Begin

//Беремо масив із StringGrid1

getArrayFromGrid(ar, count, StringGrid1);

// Створюємо масив хвостистів групи

createRecordArrayMoreThen2(ar, count, gr, ar2, count2);

// Сортуємо масив за правилом, що задає функція compareResult

sortAttArrayResult (ar2, count2);

//Передаємо впорядкований масив у StringGrid2

showArrayInGrid(StringGrid2, ar2, count2);

//Виводимо кількість хвостистів у ShowMessage

ShowMessage(intToStr(count2)+' cтудентов имеют более 2-х неуд.')

end;

10.3 Задание для самостоятельной работы

В лабораторной работе следует создать проект, в соответствии с требованиями варианта из таблицы 10.1. Номер варианта выбирается по последней цифре номера зачетной книжки. Обработку записей следует проводить в массиве. Компоненты TStringGrid использовать только для считывания записей и вывода результатов.

Таблица 10.1 – Задания для самостоятельной работы
Содержание записей проекта и требования к обработке
  Номер комнаты в общежитии, количество компьютеров, наличие холодильника, количество жильцов. Сортировка обменом по номеру комнаты. Комплексная сортировка по количеству жильцов ↓ + по наличию холодильника ↓ + по количеству компьютеров ↓. Выборка комнат, где на каждого жильца не менее 1-го компьютера. Подсчет общего числа компьютеров и холодильников.
  Фамилия работника, оклад, надбавка в целых %, премия. Сортировка выбором по фамилии. Комплексная сортировка по суммарной выплате ↑ + по фамилиям ↓. Выборка лиц, у которых суммарная выплата выше заданного значения. Подсчет общей суммы выплат.
  Фамилия студента, дата (в виде строки символов гг-мм-дд), расходы на завтрак, обед, ужин в студенческой столовой. Комплексная сортировка вставкой по дате ↓ + по фамилии ↓. Комплексная сортировка по фамилии ↓ + по сумме расходов за день ↑. Выборка данных о ежедневных суммарных расходах, для студента. Подсчет суммарных расходов студента за месяц.
  Фамилия студента, группа, контракт или бюджет, средний балл. Комплексная сортировка обменом по группе ↓ + по фамилии ↓. Комплексная сортировка по полю контракт или бюджет + по среднему баллу. Выборка студентов, у которых средний балл ниже заданного. Вычисление среднего балла для заданной группы.
Продолжение таблицы 10.1
  Номер комнаты в общежитии, жилая площадь, число жильцов, наличие балкона. Сортировка выбором по номеру комнаты. Комплексная сортировка по наличию балкона + по площади, приходящейся на одного жильца. Выборка комнат, где площадь на одного жильца меньше санитарной нормы. Подсчет количества жильцов в общежитии.
  Номер корпуса, номер аудитории, количества мест, наличие экрана. Комплексная сортировка вставкой по номеру корпуса + номер аудитории. Комплексная сортировка по наличию экрана + количество мест. Выборка аудиторий с ТСО с числом мест не менее заданного. Подсчет общего количества мест в заданном корпусе.
  Фамилия спортсмена, результат на 100-метровке, результат по прыжкам в длину, результат по прыжкам в высоту. Сортировка обменом по каждому виду и определение места спортсмена в данном виде. Сортировка по сумме мест во всех видах.
  Дата (в виде строки символов гг-мм-дд), температура воздуха днем, атмосферное давление, влажность. Сортировка выбором по дате. Комплексная сортировка по температуре + по давлению + по влажности. Определение среднего арифметического для температуры заданного месяца. Вывод дней месяца, когда температура превышала среднее значение.
  Фамилия больного, номер палаты, температура, давление, пульс. Сортировка вставкой по фамилии. Комплексная сортировка по палате + по температуре + по давлению + по частоте пульса. Подсчет числа больных с температурой выше заданной. Вывод списка больных с давлением выше допустимого.
  Группа, фамилия старосты, количество контрактников, количество бюджетников. Сортировка обменом по группам. Комплексная сортировка по общему количеству студентов в группе + по количеству бюджетников. Вывод перечня групп с общим количеством студентов. Подсчет общего количества контрактников и бюджетников.

10.4 Содержание отчета

– Наименование работы.

– Цель работы.

– Краткая характеристика типа «Запись».

– Интерфейс созданного проекта.

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

– Результаты тестирования проекта в виде копий окон.

– Выводы.

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

– Характеристика типа «Запись». Описание типа, доступ к полям. Операции над записями.

– Работа с массивами записей.

– Объяснение текстов подпрограмм модуля и связей их с событиями и другими подпрограммами.

– Написать процедуру для реализации запроса к массиву записей по указанию преподавателя.

– Написать процедуру для реализации сортировки массива записей по правилу, заданному преподавателем.

11 ЛАБОРАТОРНАЯ РАБОТА № 11.
РАБОТА С ТИПИЗИРОВАНЫМИ ФАЙЛАМИ

Цели работы:

– Ознакомиться с принципами организации записей и хранением информации в типизированных файлах.

– Познакомиться со способами описания типизированных файлов в Object Pascal.

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

– Освоить алгоритмы обработки типизированных файлов.

11.1 Краткие теоретические сведения

Под файлом понимается именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, диска CD), представляющая собой последовательность байтов.

Любой файл имеет такие характерные особенности:

– у него есть имя, что дает возможность программе работать одновременно с несколькими файлами;

– файл не знает, то есть не содержит информацию о том, какого типа данные в нем находятся. Интерпретация последовательности байтов в файле зависит от программы, которая обрабатывает файл.;

– длина файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

– Файл содержит специальный признак конца файла.

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

Типизированный файл - это последовательность данных одного типа.

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

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



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 265; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.48.62 (0.058 с.)