IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задача про двумерный массив, дубль два
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


дана задача.
Дана матрица вещественного типа А(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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






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
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.09.2025 18:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name