Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Informatika / 10 - Файлы_Массивы_Подпрограммы

.pdf
Скачиваний:
17
Добавлен:
14.03.2016
Размер:
392.78 Кб
Скачать

Л. Р.

Студент

Иванов И. И.

Группа

ХХ-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