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

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

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

 
 Ответить  Открыть новую тему 
> Задача про двумерный массив, дубль два
TAHK
сообщение 11.12.2005 21:25
Сообщение #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 
 К началу страницы 
+ Ответить 
APAL
сообщение 11.12.2005 23:49
Сообщение #2


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

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

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


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

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

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

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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.12.2005 1:32
Сообщение #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
 К началу страницы 
+ Ответить 
TAHK
сообщение 12.12.2005 9:51
Сообщение #4





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

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


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

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

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

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

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





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

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


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

Сообщение отредактировано: TAHK - 12.12.2005 20:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.12.2005 21:33
Сообщение #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

 



- Текстовая версия 19.07.2025 14:51
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"