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


Смотрю...
*****

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

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


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

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

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

Сообщение отредактировано: APAL -


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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





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

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


Цитата(APAL @ 12.12.2005 1:49) *

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

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

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

А где можно найти пример оформления хорошего программного кода?
Процедуры я еще не знаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





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

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


Что-то не очень получается у меня посчитать сразу при вводе количество нулей. Подскажите, пожалуйста.

Сообщение отредактировано: TAHK -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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;

В результате получаешь то же самое, что и в своей предыдущей программе, но без лишних циклов
 К началу страницы 
+ Ответить 

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

 





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