Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Листинг 7.2а. Структура программы. Заголовок программы опущен.




Type TFunc=Function(x: real; e: real): real;

// Определение аналитической функции.

// Определение функции, заданной рядом.

// Определение функции вычисления площади под кривой.

// Раздел описания глобальных переменных.

BEGIN

// Вычисление площади для аналитической функции.

// Вычисление площади для ряда.

// Вывод результата для аналитической функции.

// Вывод результата для ряда.

readln;

END.

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

Function y(x, e: real): real;

Begin result:=abs(x*x-sin(x)); End;

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

Function R(x: real; eps: real): real;

Определение функции вычисления площади под произвольной кривой является модификацией функции Sq, которая должна быть отлажена в составе автономной программы в соответствии с требованиями п.1 предыдущего задания. Интерфейс функции изменился за счет добавления точности вычисления ряда epsF и обобщенной функции f процедурного типа. Смысл остальных параметров остался прежним, лишь для точности вычисления площади epsSq использовано более подходящее по смыслу имя.

Function Sq(a, b, epsSq, epsF: real;

f: TFunc; Var s1, s2: real): real;

В цикле суммирования (см. листинг 7.1а) необходимо внести изменения связанные с заменой глобальной функции c одной переменной y(x) на обобщенную функцию с двумя переменными f(x, epsF).

Листинг 7.2б. Фрагмент цикла суммирования для обобщенной функции.

dx:=(b-a)/n; s1:=0; s2:=0;

for i:=1 to n do

Begin

x:=a+dx*(i-1);

y1:=f(x, epsF);

y2:=f(x+dx, epsF);

if y2>y1

Then

begin s1:=s1+dx*y1;

s2:=s2+dx*y2; end

Else

begin s2:=s2+dx*y1;

s1:=s1+dx*y2; end;

end;

Наконец, необходимо заменить в условии выхода по точности имя переменной с eps на epsSq. Раздел описаний локальных переменных функции Sq при необходимости следует дополнить, но если предыдущее задание выполнено в соответствии с требований п.1, то такой необходимости возникнуть не должно.

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

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

Var s1, s2: real;

BEGIN

// Аналитическая функция

writeln(' Sq for y=',

Sq(0, Pi/2, 0.001, 0.0001, y, s1, s2):12:7);

writeln(s1:12:8, s2:12:8);

// Функция, заданная рядом

writeln(' Sq for R=',

Sq(0, Pi/2, 0.001, 0.0001, R, s1, s2):12:7);

writeln(s1:12:8, s2:12:8);

readln;

END.

Задания.

Составить программу решения задачи 7.2 для своего варианта. Вид аналитической функции и интервал взять из заданий к задаче 6.1, а выражение для ряда – из заданий к задаче 6.2. Точность вычисления суммы членов ряда принять 0.0001, а точность вычисления площади под кривой 0,001. Обосновать ответ на вопрос: какое из двух значений точности определяет время счета и почему?

Домашнее задание 2.

Практикум 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.

Задания.

1. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, средний балл успеваемости у которых выше 3.5.

2. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию времени сеанса, на которые есть билеты.

3. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, успеваемость у которых не ниже 4 по всем предметам.

4. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести в алфавитном порядке по названию фильма сведения о сеансах, на которых нет билетов.

5. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о неуспевающих студентах, у которых есть хотя бы одна двойка.

6. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, имеющим хотя бы одну тройку при среднем балле 3.5 и выше.

7. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию времени сеанса, на которые есть билеты.

8. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести в алфавитном порядке по названию фильма сведения о сеансах, на которых нет билетов.

9. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, имеющим только одну тройку.

10. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию времени сеанса, на которые есть билеты.

11. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах с наличием свободных мест в заданный (с клавиатуры) аэропорт назначения в порядке возрастания времени вылета.

12. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах, на которые билеты проданы в алфавитном порядке по аэропорту назначения.

13. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести в алфавитном порядке по названию фильма сведения о сеансах, на которые есть билеты, после заданного времени.

14. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах, на которые есть билеты в алфавитном порядке по аэропорту назначения.

15. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах, на которые есть билеты в порядке возрастания времени вылета.

16. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах, на которые есть не менее 10 билетов в алфавитном порядке по аэропорту назначения.

17. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести в алфавитном порядке по названию фильма сведения о сеансах, на которые есть билеты, после заданного времени.

18. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах до заданного (с клавиатуры) аэропорта, на которые есть билеты по возрастанию времени вылета.

19. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах до заданного (с клавиатуры) аэропорта, на которые есть билеты по возрастанию времени вылета.

20. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах до заданного (с клавиатуры) времени, на которые есть билеты по возрастанию времени вылета.

21. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах после заданного (с клавиатуры) времени, на которые есть билеты по возрастанию времени вылета.

22. Создать пополняемый файл, содержащий расписание вылета самолетов с полями: <Аэропорт назначения>; <время вылета (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Выдать сведения о всех рейсах в алфавитном порядке по аэропорту назначения в заданном (с клавиатуры) интервале времени.

23. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, средний балл успеваемости у которых выше 3.5.

24. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию количества нераспроданных билетов с указанием времени сеанса..

25. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, успеваемость у которых не ниже 4 по всем предметам.

26. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о неуспевающих студентах, у которых есть хотя бы одна двойка.

27. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, имеющим хотя бы одну тройку при среднем балле 3.5 и выше.

28. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, имеющим хотя бы одну тройку.

29. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию количества нераспроданных билетов с указанием времени сеанса..

30. Создать пополняемый файл, содержащий сведения об успеваемости студентов с полями: <Фамилия И.О. студента>; <индекс группы>; <оценка по математике>; <оценка по физике>; <оценка по химии>. Вывести в алфавитном порядке по фамилиям сведения о студентах, имеющим только одну тройку.

31. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести в алфавитном порядке по названию фильма сведения о сеансах, на которые есть билеты.

32. Создать пополняемый файл, содержащий сведения о расписании сеансов кинофильмов в кинотеатре с полями: <Название фильма>; <время сеанса (REAL формат “час.мин”, например 11.40)>; <количество свободных мест>. Вывести названия фильмов по возрастанию времени сеанса, на которые есть билеты.

Домашнее задание 3.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...