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

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

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

 
 Ответить  Открыть новую тему 
> Упорядочить строки матрицы, по возрастанию количества одинаковых элементов в каждой строке
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

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


Задача:
Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке (оформить в виде процедуры).

Разбил на подзадачи:
1) Определяем количество одинаковых элементов в строке матрицы.
2) Упорядочиваем строки


Попытался решить 1ю часть так: беру первый элемент строки, сравниваю его со всеми остальными; потом второй, сравниваю со всеми остальными и т.д.
Вот что получилось:


const
CMatrix_size=3;
type
TCounters=Byte;
TFloat=Real;
TMatrix=array[1..CMatrix_Size,1..CMatrix_Size]of TFloat;



procedure Count(Matrix:TMatrix);
var i,j,k:TCounters;
d:Integer;
begin
d:=0;
for i:=1 to CMatrix_size do
begin

for j:=1 to CMatrix_size do
begin
for k:=1 to CMatrix_size do
if ((Matrix[i,j]=Matrix[i,k])) then
inc(d);

end;

Write(d,'; ');
d:=0;
Writeln;
end;
end;



Когда все элементы одинаковые выводится вот что:
9;
9;
9;

Подскажите плиз ошибку...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

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

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


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


Уникум
*******

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

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


Цитата(samec @ 9.11.2008 22:23) *
у тебя будет массив с количествами равных элементов в строке - из которого ты выбираешь максимальный элемент - это и будет максимальное количество одинаковых эелемнтов в строке матрицы smile.gif

Совершенно необязательно делать массив и выбирать из него максимум. Можно сразу искать максимум. Кладем в него ноль, затем в цикле, если количество одинаковых с i+1-ым элементом больше, чем количество одинаковых с i-тым, то обновляем максимум.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

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

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


Цитата(Fedor @ 9.11.2008 18:32) *
Подскажите плиз ошибку...

Ошибок немало.. Я исправил твою прогу (в духе того, что писал в предыдущем мессадже). Посмотри и разберись. Что непонятно - спрашивай.
const
CMatrix_size=4;

type
TCounters=Byte;
TFloat=Real;
TMatrix=array[1..CMatrix_Size,1..CMatrix_Size]of TFloat;

function Count(var Matrix:TMatrix;i:integer):TCounters;
var
j,k,m:TCounters;
d:Integer;
begin
m:=0;
for j:=1 to CMatrix_size do begin
d:=0;
for k:=1 to CMatrix_size do if ((Matrix[i,j]=Matrix[i,k])) then inc(d);
if d>m then m:=d
end
end;

var
i,j:TCounters;
Matrix:TMatrix;

begin
for i:=1 to CMatrix_size do for j:=1 to CMatrix_size do Matrix[i,j]:=2;
for i:=1 to CMatrix_Size do WriteLn(i:3,': ',Count(Matrix,i):3);
ReadLn
end.

Обрати внимание: теперь функция Count возвращает количество максимумов в заданной строке. В теле проги сделай цикл и заполни массив макимумов. Затем по нему сортируй строки.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 2
Пол: Мужской

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


В коде разобрался,сенкс =)
2ю подзадачу без проблем сделала "пузырьковая" сортировка.

ПС: Если вдруг кому-нибудь придется делать подобное, исходничек выложил;)


Прикрепленные файлы
Прикрепленный файл  PROBLEM4.rar ( 891 байт ) Кол-во скачиваний: 451
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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