Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача про двумерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
TAHK
дана задача.
Дана матрица вещественного типа А(n,m), значения которой расположены в диапазоне от -15 до 20. Удалить из матрицы ту строку, в которой наибольшее количество нулей. Если таких строк несколько, то удалить каждую из них.
вот мое решение, но тока для случая, в котором надо удалить только одну строку, но и она не очень хорошо работает. Удаляет только если ноль в первой строке... что я делаю не так?

program udal;
uses crt;
label m1;
var
a:array[1..99,1..99] of real;
q,i,n,m,j,k,max,nstr:word;
f:boolean;
begin
clrscr;
m1:
f:=false;
writeln('‚Введите кол-во строк (m) и столбцов (n)');
readln(m,n);
max:=0;
writeln('Please, input elements');
for i:=1 to m do begin
for j:=1 to n do
readln(a[i,j]);
end;
For i:=1 to m do begin
k:=0;
for j:=1 to n do begin
if a[i,j]=0 then
k:=k+1;
end;
if max<k then begin f:=true;
nstr:=i;
max:=k;
end else break;

end;
if f=true then begin
for i:=nstr to m-1 do begin
for j:=1 to n do
a[i,j]:=a[i+1,j];
end;
for i:=1 to m-1 do begin
for j:=1 to n do
write('',a[i,j]:5:2);
writeln;
end;
end else
for i:=1 to m do begin
for j:=1 to n do
write('',a[i,j]:5:2);
writeln;
end;
writeln('for continue press 1');
readln(q);
if q=1 then goto m1
end.
APAL
ИМХО: Громоздко все как-то, наверняка и лишние переменные найдутся.

(каюсь, лениво в таком плохо читаемом виде что либо разбирать)

Попробуй немного поменять алгоритм - например можно оптимизировать, начиная подсчет нулей уже в процессе ввода данных - результат: как минимум на два цикла меньше...
Потом, оформить "удаление" строки в виде процедуры - проще будет "разбирать полеты"...
volvo
TAHK,
Цитата
что я делаю не так?
Вот это:
if max<k then begin
f:=true;
nstr:=i;
max:=k;
end
{ else break; } { <--- Совершенно лишнее !!! }
как только ты убираешь эту ветку else (и, соответственно, НЕ выходишь из цикла перебора строк, как только в первой строке не найден ноль), программа начинает корректно удалять ОДНУ строку при любых данных...

Кроме этого... Уже после того, как цикл поиска нулей окончен, и в ветке then и в ветке else условия
if f=true then begin...
выполняются почти одинаковые действия по распечатке матрицы... этого можно избежать, просто уменьшив M на 1, если была удалена строка, и потом печатать после условия совершенно одинаково:
if f=true then begin

for i:=nstr to m-1 do begin
for j:=1 to n do
a[i,j]:=a[i+1,j];
end;
m := m - 1;

end;

{ и уже здесь можно печатать матрицу вне условия... }
for i:=1 to m do begin
for j:=1 to n do
write('',a[i,j]:5:2);
writeln;
end;


Ну, и последнее: вместо goto в твоем случае вполне можно обойтись обычным
Repeat ... Until
TAHK
Цитата(APAL @ 12.12.2005 1:49) *

ИМХО: Громоздко все как-то, наверняка и лишние переменные найдутся.

(каюсь, лениво в таком плохо читаемом виде что либо разбирать)

Попробуй немного поменять алгоритм - например можно оптимизировать, начиная подсчет нулей уже в процессе ввода данных - результат: как минимум на два цикла меньше...
Потом, оформить "удаление" строки в виде процедуры - проще будет "разбирать полеты"...

А где можно найти пример оформления хорошего программного кода?
Процедуры я еще не знаю.
TAHK
Что-то не очень получается у меня посчитать сразу при вводе количество нулей. Подскажите, пожалуйста.
volvo
max := 0;

for i:=1 to m do begin

k := 0;
{ сразу подсчитать число введенных нулей }
for j:=1 to n do begin
readln(a[i,j]);
if a[i, j] = 0 then k := k + 1;
end;

{ и сравнить с макс. на текущий момент значением... }
if k > max then begin
f:=true; nstr:=i; max:=k;
end

end;

В результате получаешь то же самое, что и в своей предыдущей программе, но без лишних циклов
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.