Работа с текстовыми файлами и файлами прямого доступа
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Цель: приобрести навыки работы с файлами различного типа.

Задание 1

Составить и опробовать процедуру, считывающую текстовый файл с именем "sem1.21?", в котором каждая строка представляет собой фамилию студента и список всех оценок по ОИВТ, полученных им за первый семестр. При этом фамилия отделяется от оценок запятой, так же как и оценки друг от друга. Знак "?" в имени файла надо заменить на порядковый номер вашей группы. Для проверки правильности чтения из каждой строки надо выделять фамилию и распечатывать их в столбик.

 

Задание 2

Дополнить предыдущую процедуру так, чтобы после считывания строки и выделения фамилии остаток строки разбивался на отдельные оценки, из которых создаются следующие числовые массивы:

- оценки за лабораторные работы (по 15 оценок у каждого)

- баллы за самостоятельные работы (по 5 оценок у каждого)

- баллы за собеседования (по 5 оценок у каждого)

- оценки за контролирующие программы (по 9 оценок у каждого)

- балл за итоговую контрольную работу

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

 

Дополнительное задание

Составить и проверить работу процедуры, которая проверяет по полученным массивам корректность выставления оценок и выдает сообщение о том, что все оценки допустимые или полные сообщения о недопустимых оценках. При этом процедура должна производить пересчет неверных оценок. Например, если оценка за лабораторную работу 7 или 10, то ее надо заменить на 5, а оценку -3 за самостоятельную работу надо заменять на оценку -2 и т.д.

Задание 3

Составить процедуру печати информации в виде таблицы.

Задание 4

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

Задание 5

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

 

Дополнительное задание.

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

Лабораторная работа №9

Рекурсивные функции

Цель: приобрести навыки работы с рекурсивными алгоритмами, понять отличие рекурсии и итерации.

 

Теоретические сведения

К функциям можно обращаться тремя способами: из тела основной программы, из тела другой функции, из тела самой функции, т.е. функция может вызывать саму себя. Функции называются рекурсивными, если в описании функции происходит вызов самой себя, а процесс обращения – рекурсией. Продемонстрируем использование рекурсии на примере вычисления значения факториала произвольного натурального числа N.

В математике известно рекурсивное определение факториала:

 

n! = 1 при n = 0;

n! = (n - 1)! × n при n > 0.

 

Это рекурсивное определение можно реализовать с помощью соответствующей рекурсивной функции:

 

function FACTORIAL (VALUE: integer): integer;

begin

iF VALUE = 0 then FACTORIAL := 1

else FACTORIAL := VALUE*FACTORIAL (VALUE - 1)

end;

 

Теперь можно обращаться к этой функции в теле основной программы, как показано в следующем примере:

 

program FINDFACTORIAL;

var N: integer;

begin

writeln ('Введите число');

readln (N);

if N < 0 then writeln ('Нет факториала')

else writeln ('Факториал ', N, ' равен ', FACTORIAL (N))

end.

 

Мы видим, что характерной особенностью построенной функции является наличие в ее теле оператора присваивания:

 

FACTORIAL := VALUE*FACTORIAL (VALUE - 1),

 

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

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

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

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

Данная функция явно носит рекурсивный характер, исходя из ее определения: 

Xn = 1, если n = 0;

Xn = Xn-1 * X, если n > 1.

 

Ниже следует рекурсивная функция вычисления значения степени:

 

function POWER (FACTOR: real; EXPONENT: integer): REAL;

begin

if EXPONENT < 0

then POWER := 1/POWER (FACTOR, abs (EXPONENT))

else

if EXPONENT > 0

then POWER := FACTOR*POWER (FACTOR, EXPONENT - 1)

else POWER := 1

end;

 

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

 

procedure FACTORIAL (VALUE: integer; var F: integer);

begin

iF VALUE = 0 then F := 1

else begin FACTORIAL (VALUE - 1, F);

F := F*VALUE

end;

end;

 

Здесь уже, в отличие от функции FACTORIAL, для вычисления N! необходимо вызвать эту процедуру с помощью оператора процедуры FACTORIAL (N, FN), где FN – переменная для возвращения из процедуры значения N!.

 

 

Пример. Создать рекурсивную функцию поиска i-го члена последовательности, заданной рекуррентной формулой A1=const1, A2=const2, Ai=3Ai-2-Ai-1. Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.

Решение. По условию задачи аргумент может принимать только целые значения, поэтому функция имеет параметр-значение типа Integer. Выход из рекурсии в данном случае осуществляется при двух значениях аргумента (при i=1, i=2), поэтому в рекурсивной функции необходимы два вложенных условных оператора или же оператор выбора case. В приведенном примере использованы операторы if, но попробуйте самостоятельно записать решение с помощью оператора выбора. В основной программе значения аргумента - целые последовательные числа, поэтому следует воспользоваться оператором цикла с параметром for.

program proc_2;

function A (i: Integer): Integer;

begin

if i=1 then A:=1 else

if i=2 then A:=3 else А:=3*A(i-2)-A(i-1)

end;

var i: Integer;

begin

for i:=1 to 10 do Write (A(i),' ');

Readln

end.

 

Задание 1.

Вывести значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.

a) Найти член последовательности, заданной формулой: Di =7+ Di -1 при i>1, где D1 определяется пользователем.

b) Найти член последовательности, заданной формулой: Ai = Ai -1 - Ai -2 при i>2. Значения первого и второго членов последовательности вводятся пользователем.

c) Найти член последовательности, заданной следующим образом:
 y1=0; y2=10; yn=2×yn-1-yn-2, где n>2.

d) Найти член последовательности, заданной формулой Bi =4· Bi -1, при i>1. Значения первого члена последовательности вводится пользователем.


Задание 2.

Дан квадрат со стороной а, диагональ этого квадрата является стороной второго квадрата, диагональ второго квадрата – стороной третьего и т.д. (вложенность квадратов запрашивается при старте программы). Найти длину стороны последнего квадрата, используя функцию вычисления длины диагонали квадрата по его стороне:

Задание 3.

Реализовать в программе рекурсивную функцию, которая в указанной директории производит следующие действия:

· в текущей директории создаётся папка;

· созданная папка становится новой текущей директорией;

· в новой текущей директории создаются 10 файлов с произвольным содержимым (можно использовать функцию random ).

· Рекурсивный вызов

Функция должна вызывать саму себя до тех пор, пока размер исходной директории не будет больше 1 Мб.

Лабораторная работа №10

Дата: 2019-02-02, просмотров: 528.