Консультация № 181440
19.12.2010, 10:38
55.41 руб.
0 12 0
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:

Выполнить над прямоугольной матрицей B размером m*n последовательность действий:
а) заменить заданным вектором столбцы матрицы B, содержащие хотя бы один нулевой элемент;
б) в полученной матрице вычислить суммы элементов строк, номера которых задаются целочисленным вектором

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

исходные данные в файле должны быть примерно такими:

4 5 { размерность массива}

2 3 4 5 6
0 0 0 0 0
2 3 4 5 6
0 0 0 0 0

1 2 3 4 5 {вектор }

Приложение:
вот есть программа, ее только надо переделать....помогите пожалуйста...заранее Большое Спасибо!!!


Program Matrix;
Uses Crt;

Const
cMaxSize = 10;

Type
TIndexRange = 1..cMaxSize;

TVector = array [TIndexRange] of Integer;
TMatrix = array [TIndexRange, TIndexRange] of Integer;

Var
f : text;

mat : TMatrix;
vec : TVector;

m : TIndexRange;
n : TIndexrange;

s : string;

{
Процедура аварийного завершения программы
}
Procedure Fatal (msg : string);
begin
writeln (#13#10, msg);
Halt (1);
end;

{
Функция перевода числа в строку (для использования в выражениях)
}
Function Num2Str (n : Integer; w : Byte) : string;
var
s : string;

begin
Str (n : w, s);
Num2Str := s;
end;

{
Процедура считывания матрицы и вектора из файла
Входные параметры : нет
Выходные параметры : матрица, вектор, кол-во строк и столбцов
}
Procedure ReadData (var mat : TMatrix; var vec : TVector; var m : TIndexRange; var n : TIndexRange);
var
s : string;

i : TIndexRange;
j : TIndexRange;

begin
read (f, m); { Считываем первое число - количество столбцов }
read (f, n); { Считываем второе число - количество строк }

{ Считываем матрицу }
for j := 1 to n do
begin
for i := 1 to m do
begin
read (f, mat [j, i]);
write (mat [j, i] : 3, ' ');
end;
writeln;
end;

if not eoln (f) then readln (f, s);

{ Считываем вектор }
for i := 1 to n do
begin
read (f, vec [i]);
write (vec [i], ' ');
end;

writeln;

Close (f);
end;

{
Процедура изменения матрицы согласно заданию: замена столбцов с нулевыми элементами на заданный вектор
}
Procedure ChangeMatrix (var mat : TMatrix; vec : TVector; m : TIndexRange; n : TIndexRange);
var
i : TIndexRange;
j : TIndexRange;

{
Процедура замены столбца на вектор
}
procedure ChangeColumn (m : TIndexRange);
var
i : TIndexRange;

begin
for i := 1 to n do mat [i, m] := vec [i];
end;

begin
for i := 1 to m do
for j := 1 to n do
{ достаточно найти первый 0 в столбце }
if mat [j, i] = 0 then begin
ChangeColumn (i);
break;
end;
end;

{
Процедура суммирования элементов строк, указанных в векторе
}
Procedure SumMatrixRow (mat : TMatrix; vec : TVector; m : TIndexRange; n : TIndexRange);
var
i : TIndexRange;
j : TIndexRange;

b : Boolean; { признак обработки хотя бы одной строки }

{
Функция вычисления суммы элементов строки матрицы
}
function SumRow (n : TIndexRange) : Integer;
var
i : TIndexRange;
s : Integer;

begin
s := mat [n, 1];

for i := 2 to m do s := s + mat [n, i];

SumRow := s;
end;

{
Процедура вывода строки на экран и в файл
}
procedure Print (s : string; ln_flag : Boolean);
begin
if ln_flag then begin
writeln (s);
writeln (f, s);
end
else begin
write (s);
write (f, s);
end;
end;

begin
{$I-}
Append (f);
{$I+}
if IOResult <> 0 then Fatal ('Не могу дописать файл!');

Print ('Измененная матрица:', true);

for j := 1 to n do
begin
for i := 1 to m do
Print (Num2Str (mat [j, i], 3) + ' ', false);

Print ('', true);
end;

b := false;

Print ('Сумма элементов строк матрицы, заданных вектором:', true);

for i := 1 to n do
if (vec [i] > 0) and (vec [i] <= n) then begin
Print ('Строка ' + Num2Str (vec [i], 2) + ' --> ' + Num2Str (SumRow (vec [i]), 6), true);
b := true;
end;

if not b then Print ('Значения вектора не соответствуют номерам строк матрицы!', true);
end;

Begin
ClrScr;
write ('Введите имя файла с данными: '); readln (s);
{$I-}
Assign (f, s); Reset (f);
{$I+}
if IOResult <> 0 then Fatal ('Не могу открыть файл ' + s + '!');
ReadData (mat, vec, m, n);
ChangeMatrix (mat, vec, m, n);
SumMatrixRow (mat, vec, m, n);
Close (f);
Readkey;
end.

Обсуждение

Неизвестный
19.12.2010, 13:07
общий
Отличие от №181169 только в том, что нужно изменить код предложенного Вами варианта? А что требуется изменить?
Неизвестный
19.12.2010, 13:18
общий
да, нужно изменить код....эта программа считывает из одного файла начальную матрицу, размерность матрицы(количество строк и столбцов) и вектор...выводит на экран...далее над ними производятся операции...выводится измененная матрица и сумма строк...и измененная матрица и сумма строк записывается в этот же исходный файл..... А нужно переделать так, чтоб из одного файла считывались начальные данные(размерность матрицы, начальная матрица, вектор) выводилось все на экран и в другой файл должна записывать результат(текст задачи, размерность матрицы, начальная матрица, вектор, измененная матрица и сумма строк)
Неизвестный
20.12.2010, 05:52
общий
Я переделал ее...вот такая получилась.....помогите пожалуйста с блок схемой

Program Matrix;
Uses Crt;
Const
cMaxSize = 10;
Type
TIndexRange = 1..cMaxSize;

TVector = array [TIndexRange] of Integer;
TMatrix = array [TIndexRange, TIndexRange] of Integer;
Var
f : text;
f1 : text;
mat : TMatrix;
vec : TVector;

m : TIndexRange;
n : TIndexrange;

s : string;

{********************************************************************}

{Функция перевода числа в строку (для использования в выражениях) }

Function Num2Str (n : Integer; w : integer) : string;
var
s : string;

begin
Str (n : w, s);
Num2Str := s;
end;

{****************************************************************}
{Процедура считывания матрицы и вектора из файла
Входные параметры : нет
Выходные параметры : матрица, вектор, кол-во строк и столбцов }

Procedure ReadData (var mat : TMatrix; var vec : TVector; var m : TIndexRange; var n : TIndexRange);
var
s : string;

i : TIndexRange;
j : TIndexRange;

begin
writeln('Выполнить над прямоугольной матрицей B размером m*n последовательность действий: ');
writeln('а) заменить заданным вектором столбцы матрицы B, содержащие хотя бы один нулевой элемент; ');
writeln('б) в полученной матрице вычислить суммы элементов строк, номера которых задаются целочисленным вектором. ');
writeln(f1, 'Выполнить над прямоугольной матрицей B размером m*n последовательность действий: ');
writeln(f1, 'а) заменить заданным вектором столбцы матрицы B, содержащие хотя бы один нулевой элемент; ');
writeln(f1, 'б) в полученной матрице вычислить суммы элементов строк, номера которых задаются целочисленным вектором. ');

read (f, m); { Считываем первое число - количество столбцов }
read (f, n); { Считываем второе число - количество строк }
writeln('Количество столбцов: ', m);
writeln(f1, 'Количество столбцов:', m);
writeln('Количесвто строк: ',n);
writeln(f1,'Количесвто строк:', n);
{ Считываем матрицу }
writeln(' Начальная матрица');
writeln(f1, 'Начальная матрица');
for j := 1 to n do
begin
for i := 1 to m do
begin
read (f, mat [j, i]);
write (f1, mat [j, i] : 3);
write (mat [j, i] : 3);

end;
writeln;
end;
if not eoln (f) then readln (f, s);
{ Считываем вектор }
write('Вектор равен: ');
write(f1,'Вектор равен: ');
for i := 1 to n do
begin
read (f, vec [i]);
write (vec [i]:3);
write (f1,vec[i]:3);
end;
writeln;
Close (f);
end;

{*****************************************************************************}
{Процедура изменения матрицы согласно заданию: замена столбцов с нулевыми элементами на заданный вектор }

Procedure ChangeMatrix (var mat : TMatrix; vec : TVector; m : TIndexRange; n : TIndexRange);
var
i : TIndexRange;
j : TIndexRange;

{
Процедура замены столбца на вектор
}
procedure ChangeColumn (m : TIndexRange);
var
i : TIndexRange;
begin
for i := 1 to n do mat [i, m] := vec [i];
end;
begin
for i := 1 to m do
for j := 1 to n do
{ достаточно найти первый 0 в столбце }
if mat [j, i] = 0 then begin
ChangeColumn (i);
break;
end;
end;

{************************************************************}
{Процедура суммирования элементов строк, указанных в векторе }

Procedure SumMatrixRow (mat : TMatrix; vec : TVector; m : TIndexRange; n : TIndexRange);
var
i : TIndexRange;
j : TIndexRange;

b : Boolean; { признак обработки хотя бы одной строки }


{*****************************************}
{Функция вычисления суммы элементов строки матрицы }

function SumRow (n : TIndexRange) : Integer;
var
i : TIndexRange;
s : Integer;
begin
s := mat [n, 1];
for i := 2 to m do s := s + mat [n, i];
SumRow := s;
end;

{********************************************************}
{ Процедура вывода строки на экран и в файл }

procedure Print (s : string; ln_flag : Boolean);
begin
if ln_flag then begin
writeln (s);
writeln (f1, s);
end
else begin
write (s);
write (f1, s);
end;
end;
begin
Append (f1);
Print ('Измененная матрица:', true);
for j := 1 to n do
begin
for i := 1 to m do
Print (Num2Str (mat [j, i], 3) + ' ', false);
Print ('', true);
end;
b := false;
Print ('Сумма элементов строк матрицы, заданных вектором:', true);
for i := 1 to n do
if (vec [i] > 0) and (vec [i] <= n) then begin
Print ('Строка ' + Num2Str (vec [i], 2) + ' --> ' + Num2Str (SumRow (vec [i]), 6), true);
b := true;
end;
if not b then Print ('Значения вектора не соответствуют номерам строк матрицы!', true);
end;

Begin
ClrScr;
Assign (f, 'in2.txt'); Reset (f);
assign (f1, 'out.txt'); rewrite(f1);
ReadData (mat, vec, m, n);
ChangeMatrix (mat, vec, m, n);
SumMatrixRow (mat, vec, m, n);
{Close (f);}
close(f1);
Readkey;
end.
Неизвестный
21.12.2010, 15:09
общий
пожалуйста, помогите с блок схемой
давно
Мастер-Эксперт
325460
1469
22.12.2010, 15:25
общий
есть какие наработки по блок-схеме???
актуальна еще помощь?
Об авторе:
to live is to die
Неизвестный
22.12.2010, 16:40
общий
нет...нету...помогите пожалуйста.....помощь актуальная еще
Неизвестный
23.12.2010, 15:08
общий
Адресаты:
Сделаете?
давно
Мастер-Эксперт
325460
1469
23.12.2010, 15:40
общий
будет возможность заняться данным вопросом только завтра.
и нужно будет обсудить некоторые моменты с автором вопроса.
если можно продлить консультацию?
или, если беретесь Вы, я не против.
Об авторе:
to live is to die
Неизвестный
23.12.2010, 16:14
общий
Адресаты:
Уже продлил... Боюсь, что не смогу - мне завтерва отчета факультетский сдавать, оооочень надеюсь, что успею.... Одна матерные слова... и выражения
давно
Мастер-Эксперт
325460
1469
27.12.2010, 12:41
общий
предлагаю нарисовать алгоритм каждой функции, в графическом виде, а потом подумаем как это собрать, идет так?
или нужен один алгоритм всей программы.
Об авторе:
to live is to die
давно
Мастер-Эксперт
325460
1469
29.12.2010, 13:17
общий
похоже, рисунки уже не актуальны, какие идеи с ответом на поставленный вопрос?
Об авторе:
to live is to die
Неизвестный
29.12.2010, 15:36
общий
Ау! Если не ответите, вопрос удалим как ненужный
Форма ответа