Студопедия

Главная страница Случайная лекция


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

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



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




Задача 13.1

Читайте также:
  1. В каких случаях задача определения напряжений считается плоской?
  2. Введение. Доктрина информационной безопасности России о системах, функциях и задачах государства
  3. Гидравлическая теория смазки 13.1. Ламинарное движение жидкости в узких щелях
  4. Глава II. Транспортная задача
  5. Двойственная задача ЛП.
  6. Задача 1
  7. Задача 1
  8. Задача 1
  9. Задача 1.

Практикум 13. Типизированные файлы.

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

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

Задача 13.1.

Создать пополняемый файл записей о результатах соревнований спортсменов-биатлонистов, содержащий информацию о спортсмене (Фамилия И. О., спортивный клуб) и результатах (время на дистанции, количество пораженных мишеней на трех рубежах). Выполнить сортировки

• По фамилии И.О.

• По времени на дистанции.

• По количеству пораженных мишеней на трех рубежах.

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

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

Этап 1. Создание файла и первая запись в файл. На этом этапе в соответствии с условиями задачи конструируется запись с типом TSportMan. Строковые поля записи FIO и Club объявлены статическими строками фиксированной длины, поскольку динамические строки, адресуемые указателями, не могут быть полями записи файла. Поле времени на дистанции Time объявлено с типом real, чтобы можно было использовать формат времени «минуты : секунды» с указанием секунд после десятичной точки. Результаты на трех рубежах объявлены в виде диапазона базового типа байт от 0 – полный промах, до 5 – все пять мишеней поражены. Для обработки в оперативной памяти объявлена переменная SportMan и образ файла – массив записей a размерностью ns. Наконец, самое главное в этой программе, о чем надо помнить – это режим открытия файла Rewrite, который при каждом запуске программы уничтожает старое содержимое файла. Смысл остальных действий понятен из листинга программы. Для вывода массива предусмотрена процедура форматного вывода OutA с заголовком Caption.

Листинг 13.1а. Создание файла, первая запись в файл и форматный вывод. Заголовок программы опущен.

const nmax=1000;

Type TSportMan = record

FIO : string[50];

Club : string[50];

Time : real;

bh, bm, bl : 0..5;

end;

Ta = array[1..nmax] of TSportMan;

// Процедура форматного вывода массива.

Procedure OutA(Caption : string; a : Ta; ns : word);

Var i : word;

Begin

writeln(Caption:40);

writeln('FIO':20, 'Club':20, 'Time(min.sec)':15,

'bh':5, 'bm':5, 'bl':5);

for i:=1 to ns do

with a[i] do

writeln(FIO:20, Club:20, Time:15:2,

bh:5, bm:5, bl:5);

End;

 

Var a : Ta;

SportMan : TSportMan;

ns : word;

fs : File of TSportMan;

BEGIN

// Открытие файла для первой записи.

AssignFile(fs, 'Biathlon.dat');

Rewrite(fs);

with SportMan do

begin

write('FIO = '); readln(FIO);

write('Club = '); readln(Club);

write('Time (min.sec) ='); readln(Time);

write('bh bm bl (0..5)='); readln(bh, bm, bl);

end;

write(fs, SportMan);

CloseFile(fs);

// Вывод первой записи.

Reset(fs);

read(fs, a[1]);

OutA('Results', a, 1);

CloseFile(fs);

readln;

END.

Этап 2. На этом этапе в программу добавляется фрагмент кода для добавления новых записей в конец файла и управления вводом. Обязательно необходимо изменить процедуру открытия нового файла на процедуру Reset. Для установки позиции записи в конец файла использована процедура Seek, которая имеет вторым параметром число записей файла, определяемое функцией FileSize. Управление вводом осуществляется в двух местах программы. Вначале запрашивается ввод символьной переменной ch. И если в ответ ввести симол 'n', то дальнейший ввод игнорируется. В противном случае запрашивается ввод значений полей новой записи. Для выхода из режима ввода необходимо в поле FIO ввести пустую строку, нажав клавишу ENTER. В конце программы записи считываются в массив и выводятся вместе с заголовком.

Листинг 13.1б. Текст основной программы с фрагментами открытия файла для чтения/записи и управления вводом. Заголовок программы и разделы описаний опущены. В разделе описаний переменных необходимо добавить объявление ch : char;.

BEGIN

// Открытие файла для чтения/записи.

AssignFile(fs, 'Biathlon.dat');

Reset(fs);// !!! ВНИМАНИЕ !!!

Seek(fs, FileSize(fs));

write('Input data? y/n '); Readln(ch);

if ch <> 'n' then

while True do

begin

writeln('Continue Input? No: Enter/'+

'Yes: Any String');

with SportMan do

begin

write('FIO = '); readln(FIO);

if FIO = '' then Break;

write('Club = '); readln(Club);

write('Time (min.sec) ='); readln(Time);

write('bh bm bl (0..5)='); readln(bh, bm, bl);

end;

write(fs, SportMan);

end;

CloseFile(fs);

// Чтение из файла и формирование массива.

Reset(fs);

ns:=0;

while not EoF(fs) do

begin inc(ns); read(fs, a[ns]); end;

CloseFile(fs);

// Вывод массива.

OutA('Results', a, ns);

readln;

END.

Этап 3. Для выполнения сортировки достаточно иметь одну функцию с передачей в нее критерия сравнения записей через процедурный тип, объявление которого необходимо добавить в раздел объявления типов.

Type TFSortR=Function(r1, r2 : TSportMan) : Boolean;

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

Листинг 13.1в. Окончательный вариант программы. Заголовок, часть подпрограмм и разделов описаний опущена.

// Процедура сортировки.

Procedure SortR(Var a : Ta; n : word; FSort : TFSortR);

Var i, j : word; buf : TSportMan;

Begin

for i:=1 to n-1 do

for j:=i to n do

if FSort(a[i], a[j]) then

begin

buf:=a[i]; a[i]:=a[j]; a[j]:=buf;

end;

End;

// Критерий сортировки по полю FIO.

Function SortFIO(r1, r2 : TSportMan) : Boolean;

Begin

if r1.FIO>r2.FIO then Result:=True else Result:=false;

End;

// Критерий сортировки по полю Time.

Function SortTime(r1, r2 : TSportMan) : Boolean;

Begin

if r1.Time>r2.Time then Result:=True else Result:=false;

End;

// Функция подсчета суммы баллов на трех рубежах.

Function SumB(r : TSportMan) : byte;

Begin Result:=r.bh+r.bm+r.bl; End;

// Критерий сортировки по сумме баллов.

Function SortBall(r1, r2 : TSportMan) : Boolean;

Begin

if SumB(r1)>SumB(r2) then Result:=True else Result:=false;

End;

// Среднее арифметическое времени на дистанции.

Function AverTime(a : Ta; n : word) : real;

Var i : word;

Begin

result:=0;

for i:=1 to n do

result:=result+a[i].Time;

result:=result/n;

End;

// Среднее арифметическое суммы баллов.

Function AverBall(a : Ta; n : word) : real;

Var i : word;

Begin

result:=0;

for i:=1 to n do

result:=result+SumB(a[i]);

result:=result/n;

End;

// Процедура формирования массива спортсменов, чьи

// результаты выше средних.

Procedure Atop(a : Ta; n : word; aT, aB : real;

Var aHi : Ta; Var nHi : word);

Var i : word;

Begin

nHi:=0;

for i:=1 to n do

if (a[i].Time<at) and (SumB(a[i])>aB) then

begin inc(nHi); aHi[nHi]:=a[i]; end;

End;

// Глобальные переменные и основная программа.

Var a, aHi : Ta;

SportMan : TSportMan;

ns, nHi : word;

fs : File of TSportMan;

ch : char;

aT, aB : real;

BEGIN

AssignFile(fs, 'Biathlon.dat');

Reset(fs); Seek(fs, FileSize(fs));

write('Input data? y/n '); Readln(ch);

if ch <> 'n' then

while True do

begin

writeln('Continue Input? No: Enter/'+

'Yes: Any String');

with SportMan do

begin

write('FIO = '); readln(FIO);

if FIO = '' then Break;

write('Club = '); readln(Club);

write('Time (min.sec) ='); readln(Time);

write('bh bm bl (0..5)='); readln(bh, bm, bl);

end;

write(fs, SportMan);

end;

CloseFile(fs);

// Чтение из файла и формирование массива.

Reset(fs);

ns:=0;

while not EoF(fs) do

begin

inc(ns);

read(fs, a[ns]);

end;

CloseFile(fs);

// Вывод файла.

OutA('Results', a, ns);

// Сортировка по полю FIO.

SortR(a, ns, SortFIO);

OutA('Results Sort FIO', a, ns);

// Сортировка по полю TIME.

SortR(a, ns, SortTime);

OutA('Results Sort Time', a, ns);

// Сортировка по сумме баллов.

SortR(a, ns, SortBall);

OutA('Results Sort Ball', a, ns);

// Формирование и вывод массива спортсменов, имеющих

// результаты выше средних значений.

aT:=AverTime(a, ns);

aB:=AverBall(a, ns);

writeln(' Aver Time=', aT:7:3,

' Aver Ball=', aB:7:3);

Atop(a, ns, aT, aB, aHi, nHi);

OutA('Results Half Hi ', aHi, nHi);

readln;

END.


<== предыдущая страница | следующая страница ==>
Тема 14. Споры о социальном обеспечении | 

Дата добавления: 2014-11-14; просмотров: 350; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.006 сек.