Листинг 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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|