Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Матрица

Автор: Rom1k 20.05.2007 22:20

Задание:
обнулить строку и столбец матрицы в которой имеется "0"

можно использовать вспомогательный одномерный массив.
ввожу матрицу,а дальше что делать?
помогите,плизззззз!


uses crt;

const
Nmax=10;{Максимальное значение строк и столбцов матрицы}
type
mas=array[1..Nmax,1..Nmax] of integer;
var
A:mas;
N,M:byte;{Кол-во строк и столбцов}

procedure vvod_mas(var a:mas;var n,m:byte);
{Ввод матрицы с запоминанием позиции,для последующего
обнуления строки и столбца}
var i,j:integer;
begin
repeat
Write('Zadaite 4islo strok v matrice (1..',nmax,'): ');
ReadLn(N);
If (N<=0) and (N>Nmax) then
WriteLn('error! povtorite!');
until (N>0) and (N<=Nmax);
repeat
Write('Zadaite 4islo stolbcov (1..',nmax,'): ');
ReadLn(M);
If (M<=0) and (M>Nmax) then
WriteLn('Error! Povtorite!');
until (M>0) and (M<=Nmax);

WriteLn('Zadaite elementi matrici po strokam 4erez probel ');
For i:=1 to N do
begin
Write('Stroka ',i,': ');
for j:=1 to M do
begin
Read(A[i,j]);
end;
end;
end;

procedure vivod(var a:mas;var n,m:byte);
var i,j:integer;
begin
WriteLn('Rezultat: ');
for i:=1 to N do
begin
for J:=1 to M do
Write(a[i,j]:4);
WriteLn;
end; end;

BEGIN{main}
clrscr;
vvod_mas(a,n,m);
vivod(a,n,m);
writeln;
readkey;
end.




Автор: мисс_граффити 20.05.2007 22:27

в которых изначально имеется?
то есть (пример)
1 2
3 0
обнулить вторую строку и второй столбец? или обнулить, а потом опять смотреть?

множествами нельзя пользоваться?

Автор: Rom1k 21.05.2007 1:50

Цитата(мисс_граффити @ 20.05.2007 19:27) *

в которых изначально имеется?
то есть (пример)
1 2
3 0
обнулить вторую строку и второй столбец? или обнулить, а потом опять смотреть?

множествами нельзя пользоваться?


не знаю.О множествах не упоминалось.Да.Пример работы проги дана матрица
Цитата

1 2 3
6 4 3
5 0 0

результат
Цитата

1 0 0
6 0 0
0 0 0

Автор: Rom1k 21.05.2007 2:16

кто-нибудь поможет????????

Автор: Tan 21.05.2007 2:48

http://forum.pascal.net.ru/index.php?showtopic=17021

Автор: volvo 21.05.2007 2:55

{ сама процедура ... }
procedure process(var a: mas; n, m: byte);
var
i, j, k: integer;
buffer: array[1 .. 2*sqr(nmax)] of integer;
count: integer;
begin
count := 0;
for i := 1 to n do
for j := 1 to m do
if a[i, j] = 0 then begin
inc(count); buffer[count] := i;
inc(count); buffer[count] := j;
end;

i := 1;
while i < count do begin

for k := 1 to n do
a[buffer[i], k] := 0;
for k := 1 to m do
a[k, buffer[i + 1]] := 0;
inc(i, 2);

end;
end;

...
vvod_mas(a,n,m);
process(a, n, m); { и ее вызов ... }
vivod(a,n,m);
...

Автор: Rom1k 21.05.2007 4:00

Tan ах да,я вспомнил,дело в том,что та моя программа не во всех случаях работает
volvo спасибо.щас разберусь

Автор: Lapochka 21.05.2007 4:26

http://forum.pascal.net.ru/index.php?showtopic=17620 У меня должна получитьсяа почти такая же программка, да?(задание номер 2) Может кто нибудь переделает.... rolleyes.gif

Автор: Rom1k 23.05.2007 2:43

[quote name='volvo' date='20.05.2007 23:55' post='103288']

она не корректно работает в некоторых случаях.
Вот мой вариант программы,он проще,но он тоже не корректно работает в некоторых ситуациях

Program z_2;
uses crt;
const
Nmax=10;{Максимальное значение строк и столбцов матрицы}
type
mas=array[1..Nmax,1..Nmax] of integer;
var
A:mas;
N,M:byte;{Кол-во строк и столбцов}
{---------------------------------------------------------------------------}
procedure vvod_mas(var a:mas; n,m:byte);
{Ввод матрицы}
var i,j:integer;
begin
repeat
Write('Задайте число строк в матрице (1..',nmax,'): ');
ReadLn(N);
If (N<=0) or (N>Nmax) then
WriteLn('Ошибка! Повторите!');
until (N>0) and (N<=Nmax);
repeat
Write('Задайте число столбцов в матрице (1..',nmax,'): ');
ReadLn(M);
If (M<=0) or (M>Nmax) then
WriteLn('Ошибка! Повторите!');
until (M>0) and (M<=Nmax);

WriteLn('Задайте элементы матрицы строкам через пробел ');
For i:=1 to N do
begin
Write('Строка ',i,': ');
for j:=1 to M do
begin
Read(A[i,j]);
end;
end;
end;
{---------------------------------------------------------------------------}
procedure obnul(var a:mas;n,m:integer);
var
i,j,k:integer;
b:array[1..nmax*4] of integer;
t:integer;
begin
t:=0;
for i:=1 to n do
for j:=1 to m do
if a[i,j]=0 then begin
t:=t+1;
b[t]:=i;
t:=t+1;
b[t]:=j;
end;{if}

i:=i+1;
while i<t do begin

for k:=1 to n do
a[b[i],k]:=0;
for k:=1 to m do
a[k,b[i+1]]:=0;
i:=i+1;
end;{while}
end;{obnul}
{---------------------------------------------------------------------------}
procedure vivod(var a:mas;var n,m:byte);
var i,j:integer;
begin
WriteLn('Результат: ');
for i:=1 to N do
begin
for J:=1 to M do
Write(a[i,j]:4);
WriteLn;
end; end;
{---------------------------------------------------------------------------}
BEGIN{main}
clrscr;
vvod_mas(a,n,m);
vivod(a,n,m);
readkey;
end.{main}



может что-то можно исправит?!

Автор: volvo 23.05.2007 2:46

Цитата
она не корректно работает в некоторых случаях.
- не принимается... Она тестировалась на достаточном количестве тестов... Приведи пример некорректной работы...

Автор: Rom1k 23.05.2007 2:59

Изображение

Автор: Rom1k 23.05.2007 3:24

вот blink.gif

Автор: volvo 23.05.2007 3:47

И что ты мне этим хочешь сказать?

А вот:
Прикрепленное изображение
и вот:
Прикрепленное изображение

(двумя разными компиляторами)? К тому же я не знаю, ЧТО ты там натворил, когда переводил программу на русский язык... Я приводил решение для того варианта, который был выложен ПЕРЕД моим постом! Поэтому в следующий раз будь аккуратнее в заявлениях типа "программа неправильно работает..."

Автор: Rom1k 23.05.2007 4:04

да.извините.не смог даже правильно списать.Программа работает корректно,спасибо!

Автор: buy stromectol for humans in tij 11.09.2021 2:16

Buy Viagra Super Active Online