Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Задача 13.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.
Дата добавления: 2014-11-14; просмотров: 350; Нарушение авторских прав Мы поможем в написании ваших работ! |