
Informatika / 10 - Файлы_Массивы_Подпрограммы
.pdf
Л. Р. |
Студент |
Иванов И. И. |
|
Группа |
ХХ-999 |
||
«типизированные файлы, |
|
|
|
Дата |
дд.мм.гг |
||
массивы и подпрограммы» |
|||
|
|
||
|
Допуск |
|
|
|
|
|
|
|
Выполнение |
|
|
|
|
|
|
|
Отчет |
|
|
|
|
|
Условие задачи
Ввести файлы F1 и F 2, вывести их. Сформировать квадратную матрицу A1N1×N1 максимально возможного размера из положительных элементов этих
файлов и аналогичную матрицу A2N 2×N 2 из отрицательных элементов
файлов. Главную диагональ матрицы, в которой больше четных элементов заменить на максимум соответствующего файла (для A1 файла F1, а для
A2 - F 2). (прим.: при решении использовать подпрограммы)
Тестовые примеры
Входные данные:
файл F1
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
|
6 |
|
-3 |
|
4 |
|
-6 |
0 |
0 |
4 |
|
3 |
|
4 |
|
-5 |
|
||
файл F2 |
|
|
|
|
|
|
|
|
-5 -10 |
|
|
|
|
|
-4 |
2 |
-1 |
0 |
3 |
5 |
|||||||||
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
-4 |
|
3 |
|
4 |
Выходные данные:
вфайле F1 положительных 10
вфайле F1 отрицательных 3
вфайле F2 положительных 10
вфайле F2 отрицательных 5 матрица A1 имеет размерность: 4 матрица A2 имеет размерность: 2 Матрица A1 после формирования:
|
|
1 |
|
|
2 |
|
3 |
|
|
4 |
|
|
|
|
5 |
|
|
6 |
|
4 |
|
|
4 |
|
|
|
|
3 |
|
|
4 |
|
2 |
|
|
3 |
|
|
|
|
4 |
|
|
5 |
|
6 |
|
|
3 |
|
|
Матрица A2 после формирования: |
||||||||||||
|
-3 |
|
-6 |
|
|
|
|
|
|
|
||
в |
-5 |
|
-4 |
|
|
|
|
|
|
|
||
матрице A1 больше четных |
||||||||||||
максимум файла |
|
F1:6 |
|
|||||||||
Матрица A1 после |
формирования: |
|||||||||||
|
|
2 |
3 |
|
4 |
|
|
|||||
6 |
|
|
|
|||||||||
|
5 |
|
6 |
4 |
|
4 |
|
|
||||
3 |
|
4 |
|
6 |
|
3 |
|
|
||||
4 |
5 |
|
6 |
|
|
6 |
|
|
1

Блок-схема
Основная программа
Начало
Assign(F1,'F1.dat')
VvodF(F1,'F1')
Assign(F2,'F2.dat')
VvodF(F2,'F2')
VivodF(F1,'F1')
VivodF(F2,'F2')
PodschetPolOtr(F1,
Npol1, Notr1)
Вывод Npol1, Notr1
Вывод Npol2, Notr2
N1:=trunc(sqrt(Npol1+Npol2))
Вывод N1
N2:=trunc(sqrt(Notr1+Notr2))
Вывод N2
1
1
i1:=1
j1:=0
i2:=1
j2:=0
formMxFromFile(F1,A1,A2,
i1,j1,i2,j2)
formMxFromFile(F2,A1,A2,
i1,j1,i2,j2)
VivodMx(A1,N1,N1,'A1')
VivodMx(A2,N2,N2,'A2')
PodschetChet(A1,N1,N1)>
PodschetChet(A2,N2,N2)
'в матрице A1 |
|
|
|
'в матрице A1 |
|||
больше четных' |
|
|
|
больше четных' |
|||
|
|
|
|
|
|
|
|
maxF1:=MaxInF(F1) |
|
|
|
|
maxF1:=MaxInF(F1) |
|
|
|
|
|
|
|
|
|
|
вывод maxF1 |
|
|
|
вывод maxF1 |
|||
|
|
|
|
|
|
|
|
ZamenaDiag(A1,N1,maxF1) |
|
|
|
|
ZamenaDiag(A1,N1,maxF1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VivodMx(A1,N1,N1,'A1') |
|
|
|
|
VivodMx(A1,N1,N1,'A1') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
close(F2)
close(F3)
Конец
2

процедура для ввода файла
процедура для вывода файла
procedure VvodF(var F:TF; const
name:Tname) procedure VivodF(var F:TF; const name:Tname)
Rewrite(F) |
|
Ввод buf (1-я |
reset(F) |
|
|
компонента файла) |
|
|
Not EOF(F) |
buf ≠ 999 |
|
|
F←buf |
F←buf |
|
Ввод buf (след. |
Вывод buf |
компонента файла) |
|
Выход |
Выход |
|
|
функция для подсчета числа четных в матрице |
|
Name |
VvodF |
F |
function PodschetChet(const A:T2m; const N,M:byte):integer
kCh:=0
|
Name |
VivodF |
F |
i := 1 , N |
|
|
|
j := 1 , M |
|
|
|
|
A |
|
|
A[i,j] mod 2 = 0 |
N |
PodschetChet |
kCh |
|
M |
|
|
kCh:=kCh+1 |
|
|
|
PodschetChet := kCh |
|
|
|
Выход |
|
|
|
3

процедура для подсчета числа положительных и |
|
отрицательных в файле |
функция поиска максимума в файле |
|
|
procedure PodschetPolOtr(var F:TF; |
|
var Npol,Notr: integer) |
function MaxInF(var F:TF):integer |
|
Reset(F) |
|
kP:=0 |
|
kO:=0 |
|
NOT EOF(F) |
|
buf ← F |
|
buf>0 |
kP:=kP+1 |
kO:=kO+1 |
|
Npol:=kP |
|
Notr:=kO |
|
Выход |
|
Npol |
F |
PodschetPolOtr |
|
Notr |
|
Reset(F) |
|
|
max ← F |
|
|
NOT EOF(F) |
|
|
buf ← F |
|
|
buf>max |
|
max:=buf |
|
|
|
MaxInF:=max |
|
|
Выход |
|
F |
PodschetPolOtr |
max |
4

формирование матриц из файла |
замена главной диагонали матрицы на ch |
|
|
procedure formMxFromFile(var F:Tf; |
procedure ZamenaDiag(var A:T2m; |
var A1,A2:T2m; var i1,j1,i2,j2:byte) |
const N: byte; const ch:integer) |
|
|
A1 |
Reset(F) |
|
F |
|
|
||
|
A2 |
|
||
i1 |
|
|
||
|
i1 |
|
||
j1 |
formMxFromFile |
|
||
j1 |
NOT EOF(F) |
|||
i2 |
|
|||
|
|
|||
|
i2 |
|
||
j2 |
|
|
||
|
j2 |
|
||
|
|
buf ← F |
||
|
|
|
||
|
|
|
buf>0 |
|
|
|
j1:=j1+1 |
|
|
|
|
j1>N1 |
|
|
|
j1 := 1 |
|
|
|
|
i1:=i1+1 |
|
|
|
|
|
A1[i1,j1]:=buf |
|
|
|
|
|
buf<0 |
|
|
|
j2:=j2+1 |
|
|
|
|
j2>N2 |
|
|
|
j2 := 1 |
|
|
|
|
i2:=i2+1 |
|
|
|
|
|
A1[i1,j1]:=buf |
|
|
|
|
|
Выход |
|
|
|
|
5 |
kCh:=0
i := 1 , N
A[ i, i ]:=ch
|
Выход |
|
A |
|
|
N |
ZamenaDiag |
A |
Ch |
|
|
процедура для вывода матрицы
procedure VivodMx(const A:T2m; const N,M: byte; const name:Tname)
|
'Матрица ',name, |
|
|
'после формирования:' |
|
|
i := 1 , N |
|
|
j := 1 , M |
|
|
Вывод A[i, j] |
|
|
Выход |
|
A |
|
|
N |
VivodMx |
|
M |
||
|
||
Name |
|
Листинг программы на Pascal
program MaxMInExch; const L=10;
type T2M = array[1.. L,1..L] of integer; Tname = string[4];
TF = file of integer; var A1,A2: T2M;
F1,F2 :TF; N1,N2,i1,i2,j1,j2:byte;
maxF1,maxF2,Npol1,Notr1,kchet1,kchet2,Npol2,Notr2:integer;
// процедура для ввода файла
procedure VvodF(var F:TF; const name:Tname); var buf:integer;
begin rewrite(F);
writeLn('введите первую компоненту файла ', name); writeLn('999 - окончание ввода');
readLn(buf); while buf<>999 do
begin write(F,buf);
writeLn('введите следующую компоненту:'); readLn(buf);
end;
end;
// процедура для вывода файла
procedure VivodF(var F:TF; const name:Tname); var buf:integer;
begin reset(F);
writeLn('Выводим файл ', name); while not EOF(F) do
begin read(F,buf); write(buf:5);
end;
writeLn;
end;
// процедура для подсчета числа положительных и отрицательных в файле
procedure PodschetPolOtr(var F:TF; var Npol,Notr: integer); var kP,kO:byte;
buf:integer; begin
reset(F);
kP:=0; // положительные kO:=0; // отрицательные while not EOF(F) do
begin
6
read(F,buf); if buf>0 then
inc(kP)
else if buf<0 then inc(kO);
end;
// передаем полученные значения в глобальный модуль
Npol:=kP;
Notr:=kO;
end;
//функция поиска максимума в файле function MaxInF(var F:TF):integer; var max,buf:integer;
begin reset(F); read(F,max);
while not EOF(F) do begin
read(F,buf); if buf>max then
max:=buf;
end;
MaxInF:=max;
end;
//процедура для вывода матрицы
procedure VivodMx(const A:T2m; const N,M: byte; const name:Tname);
var i,j:byte; begin
writeLn('Матрица ',name,' после формирования:'); for i:=1 to N do
begin
for j:=1 to M do write(A[i,j]:4);
writeLn;
end;
end;
// функция для подсчета числа четных в матрице
function PodschetChet(const A:T2m; const N,M:byte):integer; var kCh:integer;
i,j:byte; begin
kCh:=0; // четные for i:=1 to N do
for j:=1 to M do
if A[i,j] mod 2 = 0 then inc(kCh);
// передаем полученные значения в глобальный модуль
PodschetChet := kCh;
7
end;
// замена главной диагонали матрицы на ch
procedure ZamenaDiag(var A:T2m; const N: byte; const ch:integer);
var i:byte; begin
for i:=1 to N do A[i,i]:=ch;
end;
// формирование матриц из файла
procedure formMxFromFile(var F:Tf; var A1,A2:T2m; var i1,j1,i2,j2:byte);
var buf:integer; begin
reset(F);
while not EOF(F) do begin
read(F,buf); if buf>0 then
begin inc(j1);
if j1>N1 then begin
j1:=1;
inc(i1);
end;
A1[i1,j1]:=buf;
end;
if buf<0 then begin
inc(j2);
if j2>N2 then begin
j2:=1;
inc(i2);
end;
A2[i2,j2]:=buf;
end;
end;
end;
// основная программа begin
cls;
//инициализация файла F1 Assign(F1,'F1.dat'); VvodF(F1,'F1');
//инициализация файла F2 Assign(F2,'F2.dat'); VvodF(F2,'F2'); VivodF(F1,'F1');
8
VivodF(F2,'F2'); PodschetPolOtr(F1, Npol1, Notr1);
writeLn('в файле F1 положительных ', Npol1); writeLn('в файле F1 отрицательных ', Notr1); PodschetPolOtr(F2, Npol2, Notr2);
writeLn('в файле F2 положительных ', Npol2); writeLn('в файле F2 отрицательных ', Notr2); N1:=trunc(sqrt(Npol1+Npol2));
writeLn('матрица A1 имеет размерность: ', N1); N2:=trunc(sqrt(Notr1+Notr2));
writeLn('матрица A2 имеет размерность: ', N2);
i1:=1;
j1:=0;
i2:=1;
j2:=0;
formMxFromFile(F1,A1,A2,i1,j1,i2,j2);
formMxFromFile(F2,A1,A2,i1,j1,i2,j2);
VivodMx(A1,N1,N1,'A1');
VivodMx(A2,N2,N2,'A2');
if PodschetChet(A1,N1,N1)>PodschetChet(A2,N2,N2) then begin
writeLn('в матрице A1 больше четных'); maxF1:=MaxInF(F1);
writeLn('максимум файла F1:',maxF1); ZamenaDiag(A1,N1,maxF1); VivodMx(A1,N1,N1,'A1');
end else
begin
writeLn('в матрице A2 больше четных'); maxF2:=MaxInF(F2);
writeLn('максимум файла F2:',maxF2); ZamenaDiag(A2,N2,maxF2); VivodMx(A2,N2,N2,'A2');
end;
close(F1);
close(F2);
end.
9
Список задач для лабораторной работы «типизированные файлы, массивы и подпрограммы»
1.Ввести 2 квадратные матрицы A1N1×N1 и A2N 2×N 2 , вывести их. Далее
переписать в файл F построчно ту из матриц, у которой модуль суммы отрицательных элементов под побочной диагональю окажется больше. В конец файла дописать полученные суммы. (в случае равенства предпочтение отдать матрице A1). Полученный файл вывести. (прим.: при решении использовать подпрограммы)
2. Ввести 3 файла Fx , Fy и Fz одинаковой длины M . Вывести их друг под другом. Сформировать из этих файлов двумерный массив A3×M в котором верхняя строка
– последовательно записанные элементы файла Fx , средняя – элементы Fy , а нижняя,
соответственно, элементы Fz . Матрицу отсортировать по первой строке и вывести ее как до, так и после преобразования. (прим.: при решении использовать подпрограммы)
3. Ввести 3 файла F1, F 2 , F3 , вывести их. Упорядочить их по убыванию методом пузырька. Переписать в одномерный массив BK элементы того файла, чья
сортировка потребует наибольшее число перестановок (в случае равенства переписать первый среди равных). Массив B вывести. (прим.: при решении использовать подпрограммы)
4.Ввести 2 файла Fx и Fy одинаковой длины M ≥ 2 . Вывести их друг под
другом. Далее сократить размер каждого из файлов на 1 заменяя в нем компоненты разностью соседних ячеек (от правой отнять левую). Файлы вывести. После этого сформировать одномерный массив BM −1 элементами которого являются частные от
деления соответствующих элементов Fy на Fx . Полученный массив вывести. (прим.: при решении использовать подпрограммы)
5. Ввести файл F1, из положительных элементов которого сформировать другой файл F 2 читая F1 от конца к началу. Из этих файлов сформировать, соответственно, квадратные матрицы A1N1×N1 и A2N 2×N 2 максимально возможного размера
записывая в них элементы построчно. В полученных матрицах поменять местами первую строку и главную диагональ. В процессе решения задачи выводить файлы и матрицы как до, так и после преобразований. (прим.: при решении использовать подпрограммы)
6. Ввести 2 числа N ≤7 и M ≤7 . Сформировать 2 квадратные матрицы AN×N и BM ×M по правилу ai, j =(i + j −1)! (факториал числа), вывести их. Переписать в файл F четные строки матрицы A и нечетные столбцы матрицы B , файл вывести. После этого
каждую третью компоненту файла заменить значением |
суммы |
N +M |
и вновь его |
|
вывести. (прим.: при решении использовать подпрограммы |
|
|
|
|
7. |
Ввести файлы Fx1 и Fx2 вещественных |
чисел, |
вывести |
их. Дважды |
протабулировать функцию y = 2x2 +4 сначала читая значения x из файла Fx1, а затем из файла Fx2 (для корректной табуляции файл нужно предварительно отсортировать по возрастанию). Во время табуляции сформировать двумерные массивы A12×N1 и A22×N 2 (на
экран вывести именно эти 2 матрицы минуя вывод при вычислении y (x)). В данных
10