|
Программа на Delphi (с процедурами-заглушками, кроме процедур ввода и вывода).
Национальный исследовательский университет «МЭИ»
Типовой расчет «Процедуры, функции, модули»
Вариант 22
Задание выполнил: Тимофеев Сергей Эдуардович
Студент группы A-08-12
Проверил: ____________________________
Оценка:______________________________
Замечания:______________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
Москва 2012 НИУ «МЭИ»
Абстракция A0.
1.Условие.
Кроме матрицы А дана матрица В такого же размера. Если каждый элемент матрицы А больше соответствующего элемента матрицы В, присвоить элементам С[1], C[2],…, C[n] значения по правилу
2.Уточненная постановка задачи.
Даны две вещественные квадратные матрицы A и В одинакового размера (n строк и n столбцов). Если элементы матрицы А больше соответствествующих элементов матрицы В (f=true), создать и вывести вещественную матрису С размером n на 1, где С[i]это сумма i-ыхстрок матриц А и В. В противном случае, вывести сообщение о том, что элементы матрицы А не больше соответствующих элементов матрицы В.
Примеры.
Пример 1. Все элементы матрицы А больше соответствующих элементов матрицы В.
n=3
A = B =
Создаем и выводим массив С:
С =
Пример 2. Есть элементы матрицы А, не большие соответствующих элементов В.
m=3
n=3
A = B =
Выводим сообщение:
«Элементы матрицы А не больше соответствующих элементов матрицы В»
Таблица данных
Класс
| Имя
| Описание (смысл), диапазон, точность
| Тип
| Структура
| Формат
|
Входные данные
| m
| Число строк в матрицах
0<m<=10
| цел
| простая переменная
| XX (:2)
| n
| Число столбцов в матрицах
0 <n<= 10
| цел
| простая переменная
| X X(:2)
| А
| Первая матрица, |Aij |<=1000
Точн. 0.1
| вещ
| двумерный массив
| +ХХХХ.Х(:8:1)
| В
| Вторая матрица, |Вij |<=1000
Точн. 0.1
| вещ
| двумерный массив
| +ХХХХ.Х(:8:1)
|
Выходные данные
| С
| Созданная матрица, |Сij|<20000
Точн. 0.1
| вещ
| одномерный массив
| +ХXXX.Х (:8:1)
| Промежу-точные данные
| dat
| Файл с исходными данными с именем вида dat#.txt
| Текст.
| файл
| ---
| res
| Файл с отчетом с именем вида res#.txt
| Текст.
| файл
| ---
| ii
| Строка с некорр. A[ii,jj], 0<ii>=10
| цел
| простая переменная
| XX (:2)
| jj
| Столбец с некорр. A[ii,jj], 0<jj>=10
| цел
| простая переменная
| XX (:2)
| f
| =True, если все эл-ты А больше соответствующих эл-в В. В противном случае =False
| лог
| простая переменная
| ---
| flagA
| = True, если есть некорректные Aij, в противном случае False
| лог
| простая переменная
| ---
| flagB
| = True, если есть некорректные Bij, в противном случае False
| лог
| простая переменная
| ---
|
5.Входная форма. (Файлы dat<№ теста>.txt)
<m> <n>
<A[1,1]> <A[1,2]> . . . <A[1,n]>
<A[2,1]> <A[2,2]> . . . <A[2,n]>
. . . . . . . . . . . . . . . .
<A[m,1]> <A[m,2]> . . . <A[m,n]>
<B[1,1]> <B[1,2]> . . . <B[1,n]>
<B[2,1]> <B[2,2]> . . . <B[2,n]>
. . . . . . . . . . . . . . . .
<B[m,1]> <B[m,2]> . . . <B[m,n]>
|
6.Выходная форма (Файлы res<№ теста>.txt)
Размер матриц A и B: <m> <n>
Матрица А:
<A[1,1]> < A [1,2]> . . . < A [1,n]>
< A [2,1]> < A [2,2]> . . . < A [2,n]>
. . . . . . . . . . . . . . . .
< A [m,1]> < A [m,2]> . . . < A [m,n]>
Матрица В:
<B[1,1]> < B [1,2]> . . . < B [1,n]>
< B [2,1]> < B [2,2]> . . . < B [2,n]>
. . . . . . . . . . . . . . . .
< B [m,1]> < B [m,2]> . . . < B [m,n]>
Матрица С:
<C[1]>
<C[2]>
. . . . . . . . . . . . . . . .
<C[m]>
Некорректный размер матриц.
Задача не решалась
Некорректный элемент матрицы А
A[<ii>, <jj>] = <A[ii,jj]>
Задача не решалась
Некорректный элемент матрицы В
B[<ii>, <jj>] = <B[ii,jj]>
Задача не решалась
Элементы матрицы А не больше соответствующих элементов матрицы В
|
Имена входного и выходного файлов передаются как параметры программы:
Первый – имя файла с исходными данными
Второй – имя файла для вывода исходных данных и результатов
Аномалии
№
| Описание
| Условие возникновения
| Реакция
|
| Некорректный размер матриц
| (m<1) or (m>10) or (n<1) or (n>10)
| Обр 7
|
| Есть некорректный элемент в матрицах
| $ii$jj (|A[ii,jj]|>1000) or (|B[ii,jj]|>1000)
| Обр 8, либо Обр 9
|
Функциональные тесты
№ теста
| Входные данные
| Ожидаемый результат
| Смысл теста
|
| m=20 n=3
| Обр 7
| Аномальная ситуация 1 (m>10)
|
| m=4 n= -1
| Обр 7
| Аномальная ситуация 1 (n<1)
|
| m= -3 n=11
| Обр 7
| Аномальная ситуация 1 (m<1,n>10)
|
| m=2 n=3
A =
B =
| Обр 8
| Аномальная ситуация 2 (A13>1000)
|
| m=2 n=2
A =
B =
| Обр 9
| Аномальная ситуация 2 (В11< -1000)
|
| m=2 n=2
A =
B =
| Обр 8
Обр 9
| Аномальная ситуация 2 (А21< -1000, В12>1000)
|
| m=1 n=1
A =
B =
| Матрица С:
8.0
| Матрицы состоят из одного элемента.
|
| m=3 n=2
A =
B =
| Матрица С:
4.6
-15.0
5.0
| Случай, когда все элементы А больше соответствующих элементов В
|
| m=3 n=3
A =
B =
| Обр 10
| Случай, когда есть элементы А не большие соответствующих элементов В
|
| m=10 n=10
A =
B =
| Матрица С:
19999.0
-19999.0
19999.0
-19999.0
19999.0
-19999.0
19999.0
-19999.0
19999.0
-19999.0
| Максимальная нагрузка. (Максимальные m,n
максимальные и минимальные значения матрицы С)
|
Метод
Отделим ввод-вывод от обработки данных (собственно решения задачи).
То есть, разделим нашу задачу на десять подзадач:
1. Подзадача А0.1. Ввести из файла (обр.1) и проверить размер матрицы (обр.7)
2. Подзадача А0.2.1 Ввести матрицу А из файла (обр.2.1).
3. Подзадача А0.2.2. Ввести матрицу В из файла (обр.2.2).
4. Подзадача А0.3.1. Вывести матрицу А (обр. 4.2)
5. Подзадача А0.3.2. Вывести матрицу В (обр.5.2)
6. Подзадача А0.4.1. Проверить значения элементов матрицы А (обр.8)
7. Подзадача А0.4.2. Проверить значения элементов матрицы В (обр.9)
8. Подзадача А0.5. Проверить, все ли эл-ты А больше соответстветствующих эл-ов В.
9. Подзадача А0.6. Создать матрицу С.
10. Подзадача А0.7. Вывести матрицу С (обр.6.2).
Сейчас, на нулевом уровне, опишем ввод-вывод простых переменных и массивов (А0.1, A0.2.1, A0.2.2, A.0.3.1, A.0.3.2, A.0.7) и логику решения задачи вцелом. Остальные четыре задачи оставим в виде абстракций.
Все подзадачи кроме первой выполним в виде процедур, расположенных в отдельном модуле.
Алгоритм
(n<1)Ú(n>10)Ú(m<1)Ú(m>10)
| Ввод матрицы А из файла
VvodMas(dat,m,n,A)
| Ввод матрицы В из файла
VvodMas(dat,m,n,В)
| Проверка элементов матрицы А
ProvMas(A,m,n,flagA,ii,jj)
| Вывод матрицы А
VivodMas(res,m,n,A,'A')
| Вывод матрицы В
VivodMas(res,m,n,В,'В')
| Сравнение элементов А и В
Sravnenie(m,n,A,B,f)
| Создание матрицы С
SozdanieC(m,n,A,B,C)
| Вывод матрицы С
VivodC(res,m,C)
| Проверка элементов матрицы В
ProvMas(В,m,n,flagВ,ii,jj)
|
Программа на Delphi (с процедурами-заглушками, кроме процедур ввода и вывода).
Имена входного и выходного файлов передаются как параметры программы:
Первый – имя файла с исходными данными
Второй – имя файла для вывода исходных данных и результатов
*********************Файл основной программы Project2.dpr**************************
program Project2;
{$APPTYPE CONSOLE}
uses Unit1; {там все константы, типы, процедуры и функции}
var {раздел описания переменных -----------------------------------------------------------------}
A,B:mas;
C:mas2;
dat,res:TextFile;
m,n,ii,jj:byte;
f,flagA,flagB:boolean;
begin {раздел операторов -----------------------------------------------------------------}
AssignFile(dat,paramstr(1));reset(dat);
AssignFile(res,paramstr(2));rewrite(res);
{ввод m,n --------------------------------------------------------------------------------------------}
readln(dat,m,n);
writeln(res,'Размер матриц A и B: ',m,'x',n); {Обр.3}
if (m<1) or (m>mnmax) or (n<1) or (n>mnmax) then
Begin
writeln(res,'Некорректный размер матриц.'#13#10,'Задача не решалась'); {Обр.7}
CloseFile(dat);
CloseFile(res);
Halt;
end;
{ввод и вывод матриц A и B --------------------------------------------------------------------}
VvodMas(dat,m,n,A);
VvodMas(dat,m,n,B);
closeFile(dat);
VivodMas(res,m,n,A,'A');
VivodMas(res,m,n,B,'B');
{ Проверка элементов матриц------------------------------------------------------------------- }
ProvMas(A,m,n,flagA,ii,jj);
ProvMas(B,m,n,FlagB,ii,jj);
If flagA or flagB then
Begin
If flagA then
Begin
Writeln(res,'Некорректный элемент матрицы A'); {Обр.8}
Writeln(res,'A[', ii , ',' , jj , '] = ' , A[ii,jj]:8:1);
Writeln(res,'Задача не решалась');
end;
If flagB then
Begin
Writeln(res,'Некорректный элемент матрицы B'); {Обр.9}
Writeln(res,'B[', ii , ',' , jj , '] = ' , B[ii,jj]:8:1);
Writeln(res,'Задача не решалась');
end;
closeFile(res);
Halt;
end;
Sravnenie(m,n,A,B,f); { Проверка, все ли эл-ты А больше соответстветствующих эл-ов В }
If not(f) then
writeln(res,'Элементы матрицы А не больше соответствующих элементов матрицы В') {Обр.10}
Else
Begin
{Создание и вывод матрицы С-----------------------------------------------------------------}
SozdanieC(m,n,A,B,C);
VivodC(res,m,C); {Обр.6.2}
end;
closeFile(res);
End.
****************Модуль Unit1.pas со всеми процедурами и функциями**********************
unit Unit1;
interface
const mnmax=10;
type
mas=array[1..mnmax,1..mnmax] of real;
mas2=array[1..mnmax]of real;
{Ввод матрицы из файла. Файл уже открыт}
procedure VvodMas(var dat:TextFile; const m,n:byte; out X:mas);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| dat
| dat
| TextFile
| m
| m
| byte
| n
| n
| byte
| X
| A(B)
| mas
|
{Проверка элементов матрицы}
procedure ProvMas(var X:mas; const m,n:byte; out flag:boolean; out ii,jj:byte);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| Х
| А(В)
| mas
| m
| m
| byte
| n
| n
| byte
| flag
| flagA(flagB)
| boolean
| ii
| ii
| byte
| jj
| jj
| byte
|
{Вывод матрицы}
procedure VivodMas(var res:TextFile; const m,n:byte; var X:mas; const ch:char);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| res
| res
| TextFile
| m
| m
| byte
| n
| n
| byte
| X
| A(B)
| mas
| ch
| ‘A’(‘B’)
| char
|
{ Проверка, все ли эл-ты А больше соответстветствующих эл-ов В }
procedure Sravnenie(const m,n:byte; const X,Y:mas; out f:boolean);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| m
| m
| byte
| n
| n
| byte
| Х
| A
| mas
| Y
| B
| mas
| f
| f
| boolean
|
{Создание матрицы С}
procedure SozdanieC(const m,n:byte; var X,Y:mas; out C:mas2);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| m
| m
| byte
| n
| n
| byte
| Х
| A
| mas
| Y
| B
| mas
| C
| C
| mas2
|
{Вывод матрицы С}
procedure VivodC(var res:TextFile; const m:byte; var C:mas2);
Таблица соответствия параметров
Формальные параметры
| Фактические параметры
| Тип
| res
| res
| TextFile
| m
| m
| byte
| C
| C
| mas2
|
implementation
procedure VvodMas;
var i,j:byte;
begin
for i:=1 to m do
begin
for j:=1 to n do read(dat,X[i,j]);
readln(dat);
end;
end;
procedure ProvMas;
Var i, j: byte;
{описания других локальных переменных}
Begin
{Заглушка} writeln(’ Заглушка – Проверка элементов матрицы’);
{В скобках указаны результаты для матрицы В}
{тест 4} // flagA:=true;(flagB:=false;) ii:=1; jj:=3;
{тест 5} // flagA:=false;(flagB:=true;)( ii:=1; jj:=1;)
{тест 6} // flagA:=true;(flagB:=true;) ii:=2; jj:=1;(ii:=1; jj:=2)
{остальные тесты} //flagA:=false; (flagB:=false;)
End;
procedure VivodMas;
var i,j:byte;
begin
writeln(res,'Матрица ',ch,':');
for i:=1 to m do
begin
for j :=1 to n do
write(res,X[i,j]:8:1);
writeln(res);
end;
end;
procedure Sravnenie;
Var i, j: byte;
{описания других локальных переменных}
Begin
{Заглушка} writeln(’ Заглушка – Проверка условия, что все элементы А больше соответствующих В’);
{тест 7} // f:=true;
{тест 8} // f:=true;
{тест 9} // f:=false;
{тест 10} //f:=true;
End;
procedure SozdanieC;
Var i, j: byte;
{описания других локальных переменных}
Begin
{Заглушка} writeln(’ Заглушка – Создание матрицы С’);
{тест 7} // C[1]=8.0;
{тест 8} // C[1]:=4.6; C[2]:= -15.0; C[3]:=5.0;
{тест 10} //C[1]:=19999.0; C[2]:= -19999.0 … C[9]:=19999.0; C[10]:= -19999.0;
End;
procedure VivodC;
var i:byte;
begin
writeln(res,'Матрица С:');
for i:=1 to m do writeln(res,C[i]:8:1);
end;
end.
Абстракция А0.4
1.Условие. Проверить, есть ли в матрице элементы, абсолютная величина которых больше 1000
2.Уточненная постановка задачи.
Дана вещественная матрица X из m строк и n столбцов. Проверить (flag), есть ли в матрицы элементы, абсолютная величина которых больше 1000. Если есть, то присвоить flag значение True и найти номер строки (ii) и столбца (jj) первого такого элемента, иначе присвоить flag значение False.
3.Примеры. (В скобках результаты для матрицы В)
Тест 4 есть некорректный элемент X[1,3]=1001, flag=True (f=false)
Тест 5 есть некорректный элемент flag=false; (X[1,1]= -2000, flag=True)
Тест 6 есть некорректный элемент X[2,1]= -1050, flag=true, (X[1,2]= 2000, flag= True)
Таблица данных
Класс
| Имя
| Описание (смысл), диапазон, точность
| Тип
| Структура
|
Входные данные
| X
| Заданная матрица, |Xij|<=5000
Точн. 0.1
| вещ
| Двухмерный массив (10х10)
| m
| число строк в матрице A, 1£m£10
| цел
| простая переменная
| n
| число столбцов в матрице A,1£n£10
| цел
| простая переменная
|
Выходные данные
| ii
| Строка с некорр. X[ii,jj], 1£ii£10
| цел
| простая перем
| jj
| Столбец с некорр. X[ii,jj], 1£jj£10
| цел
| простая перем
| flag
| = True, если есть некорректные Xij, в противном случае False
| лог
| простая переменная
| Промежу-точные данные
| i
| Номер текущей строки,
1£i£10
| цел
| простая переменная
| j
| Номер текущего столбца,
1£j£10
| цел
| простая переменная
| | | | | | | 5.Входная форма.
нет ввода/вывода
Выходная форма
нет ввода/вывода
Аномалии
нет ввода/вывода
Тесты
Тест 4 есть некорректный элемент X[1,3]=1001, flag=True (flag=false)
Тест 5 есть некорректный элемент flag=false; (X[1,1]= -2000, flag=True)
Тест 6 есть некорректный элемент X[2,1]= -1050, flag=true, (X[1,2]= 2000, flag= True)
Метод
Истина, если есть в матрице элемент |Xi,j|>1000;
Ложь, если нет такого элемента
|
Пусть flag =
Предположим сначала, что такого элемента в матрице нет (Flag:=False)
Затем будем просматривать строки, начиная с первой (i:=1)
Пока не просмотрены все (i≤m) и не найден такой элемент (flag=False)
В каждой строке будем просматривать элементы, начиная с первого (j:=1)
Пока не просмотрены все (j≤n) и не найден такой элемент (flag=False)
Если рассматриваемый элемент Xij по модулю больше 1000
То
искомый элемент найден! (flag:=True)
Запоминаем его местонахождение (ii:=i; jj:=j)
Переходим к следующему элементу в строке (j:=j+1)
Переходим к следующей строке
Найденные значения flag, ii, jj будут искомыми.
Алгоритм
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|