Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

Найти макс из чисел, встречающееся в матрице более 1-го раза   Найти похожие ветки 

 
sergeyst ©   (2007-06-20 13:10) [0]

Написал:  
 MinNumb := Matr[1,1];
 for i := 1 to dimension do
   for j := 1 to dimension do
     if Matr[i,j] < MinNumb then
       MinNumb := Matr[i,j];
ищу и считаю совпадения:
 MaxNumb := Matr[1,1];
 CountMaxNumb := 0;
 for i := 1 to dimension do
   for j := 1 to dimension do
     if (Matr[i,j] > MaxNumb) then
     begin
       MaxNumb := Matr[i,j];
       CountMaxNumb := 1;
     end
     else if (Matr[i,j] = MaxNumb) then
       CountMaxNumb := CountMaxNumb + 1;
если максимальное число встречается один раз вызываю ReplaceMaxNumb  
if CountMaxNumb = 1 then
   MaxNumb := ReplaceMaxNumb(MaxNumb)
 else
   MaxNumbNotFound := False; //}
 WriteLn("Amount of the lines, not containing nor one zero element - ",CountLineNotZero);
 if MaxNumbNotFound then
   Writeln("Maximum number, meeting more one times not found")
 else
   WriteLn("Maximum number, meeting more one times - ", MaxNumb);

function ReplaceMaxNumb(MaxN: Integer): Integer;
var
 i, j: Integer;
 Max: Integer;
 CMN: Integer;
begin
 if MaxN = MinNumb then Exit;
 Max := MinNumb;
 CMN := 0;
 for i := 1 to dimension do
   for j := 1 to dimension do
   begin
     if (Matr[i,j] > Max) and (Matr[i,j] < MaxN) then
     begin
       Max := Matr[i,j];
       CMN := 0;
     end;
     if (Matr[i,j] = Max) then
       CMN := CMN + 1;
   end;

   if CMN > 1 then
   begin
     Result := Max;
     MaxNumbNotFound := False;
   end
   else
     ReplaceMaxNumb(Max);
end;  //}
Но чего-то не так работает ReplaceMaxNumb. Не подскажите где ошибка, а лучше алгоритм по-лучше?


 
sergeyst ©   (2007-06-20 13:19) [1]

А, ошибки, вроде, нет - просто при больших значениях возн.переполнение стека. А вот алгоритм ужасен.
???


 
sergeyst ©   (2007-06-20 13:28) [2]

Нет, не стек, а строка:
MaxNumb := ReplaceMaxNumb(MaxNumb)
безо всякой причины возвращает 0, хотя в функции все выч-я проходят правильно. И почему?


 
db2admin ©   (2007-06-20 13:29) [3]

карманная сортировка?


 
sergeyst ©   (2007-06-20 13:31) [4]


> карманная сортировка?

т.е.?


 
Kolan ©   (2007-06-20 13:54) [5]

> Найти макс из чисел, встречающееся в матрице более 1-го
> раза

Я бы сделал так:

Завел бы объектик:

TNumber = class
private
 FValue: Double;
 FCount: Integer;
&#133
end;


и список таких объектов:
TNumberList = class(TObjetcList)
&#133
public
 procedure AddNumber(Value: Double);
end;


procedure  TNumberList.AddNumber(Value: Double);
begin
 for I := 0 to Count &#151;1 do
   if Items[I].Value = Value then
   begin
     Items[I].Count := Items[I].Count + 1;
     Exit;  
   end;
 Add(TNumber.Create(Value));
end;

Тоесть сохраняем все числа и если такое число уже сохранено, то увеличиваем Count.

Просматриваешь всю матрицу и пользуешься AddNumber.

Далее полученый список просматриваешь по условию &laquo;Найти макс встречающееся в матрице более 1-го &#132;
var
 Max: Double;
begin
 Max := NaN;
 for I := 0 to MyNumList.Count &#151; 1 do
   if (MyNumList[I].Count > 1) then
   begin
     if IsNaN(Max) or (MyNumList[I].Value > Max) then
       Max := MyNumList[I].Value          
   end;
end;


PS
Писал прям тут ессно&#133


 
exactly   (2007-06-20 13:57) [6]

отсортируй да один раз пройдись по отсортированному массиву справа налево...


 
db2admin ©   (2007-06-20 14:12) [7]

sergeyst ©   (20.06.07 13:31) [4]
данную задачу я бы решал с помощью алгоритма карманной сортировки,
в инете наверняка есть алгоритм ctrl+c ctrl+v и твоя курсовая решена


 
db2admin ©   (2007-06-20 14:13) [8]

exactly   (20.06.07 13:57) [6]
ни че не даст


 
sergeyst ©   (2007-06-20 14:14) [9]


> Kolan ©   (20.06.07 13:54) [5]

Не получится - попросили сделать для TurboPascal


> exactly   (20.06.07 13:57) [6]


Попросила девочка-первокурсница. Я не знаю как это-то ей объяснить, да еще сортировка...

И в половине случаев работает нормально, а в половине - нет. Может кто заметит где ошибка?  Получается так, что MaxNumbNotFound = False(т.е. найдено число), а ReplaceMaxNumb возвращает 0. Не пойму в чем дело. Правильный ответ выдает когда MaxNumb близок к максимальному числу из массива, если нужное число где-то посередине ответ=0.


 
sergeyst ©   (2007-06-20 14:44) [10]


> db2admin ©   (20.06.07 14:12) [7]

Да, лучше...
Всем спасибо.


 
sergeyst ©   (2007-06-20 14:46) [11]

ЗЫ. И все же, никто не знает почему
> sergeyst ©   (20.06.07 14:14) [9] ?


 
Servelat ©   (2007-06-20 15:01) [12]

>     Result := Max;



> Не получится - попросили сделать для TurboPascal


В TP 7.0, если мне не изменяет мой склероз, никакого Result небыло =).


> все же, никто не знает почему


Полагаю, что просто лень собирать эти неудобоваримые обрывки кода из [0] в нечто рабочее. Выложи куда-нибудь нормальный компилирующийся проект, и вечером, за чашкой чая, если не будет других дел, можно было бы на него взгянуть.


> Нет, не стек, а строка:
> MaxNumb := ReplaceMaxNumb(MaxNumb)
> безо всякой причины возвращает 0, хотя в функции все выч-
> я проходят правильно. И почему?


А что тебе сказала долгая и тщательная пошаговая отладка?


 
sergeyst ©   (2007-06-20 15:24) [13]


> А что тебе сказала долгая и тщательная пошаговая отладка?

Что при выходе из функции:
     ReplaceMaxNumb := Max;
как и положено, а вот сюда
MaxNumb := ReplaceMaxNumb(MaxNumb)
в некоторых случаях долетает 0.


 
MBo ©   (2007-06-20 15:34) [14]

function FindMaxRep(A: array of Word): Word;
var
 Accum: array[0..High(Word) div 8] of Byte;
 i, ByteNum: Integer;
 Bit: Byte;
 AMax: Word;
begin
 AMax := 0;
 for i := 0 to High(Accum) do
   Accum[i] := 0;
 for i := Low(A) to High(A) do begin
   ByteNum := A[i] shr 3;
   Bit := 1 shl (A[i] and 7);
   if (Accum[ByteNum] and Bit) <> 0 then begin
     if A[i] > AMax then
       AMax := A[i];
   end
   else
     Accum[ByteNum] := Accum[ByteNum] or Bit;
 end;
 FindMaxRep := AMax;
end;


 
sergeyst ©   (2007-06-20 15:44) [15]


> MBo ©   (20.06.07 15:34) [14]

Ничего не понял. Абсолютно!!! Можно комментарии?


 
db2admin ©   (2007-06-20 15:51) [16]

sergeyst ©   (20.06.07 15:44) [15]
тебе все равно не поверят что на первом курсе ты решил задачу побитовыми сдвигами


 
sergeyst ©   (2007-06-20 15:53) [17]


> тебе все равно не поверят что на первом курсе ты решил задачу
> побитовыми сдвигами

первый курс не я. Ладно, где про эти сдвиги написано? Жутко интересно!!! И также непонятно :(


 
db2admin ©   (2007-06-20 15:56) [18]

справка Дельфи
F1 + shr

ну побитовые операции в теории надо знать


 
MBo ©   (2007-06-20 16:02) [19]

Accum - хранит информацию о том, первый ли раз встречается число, для каждого из возможных чисел - в одном бите ради экономии памяти.

ByteNum := A[i] shr 3;
Bit := 1 shl (A[i] and 7);

можно заменить на (более медленный вариант, если компилятор не оптимизирует)

ByteNum := A[i] div 8;
Bit := 1 shl (A[i] mod 8);


 
sergeyst ©   (2007-06-20 16:07) [20]


> F1 + shr

inglish = 0

> ну побитовые операции в теории надо знать

я и спрашиваю про теорию. Знаю только, что *2 или /2 и только, а вот что в
MBo ©   (20.06.07 15:34) [14]  написано совсем невьезжаю.
Зачем ByteNum  делить на 8?
Bit := 1 shl (A[i] and 7); - ?


 
MBo ©   (2007-06-20 16:13) [21]

>Зачем ByteNum  делить на 8?
информация о восьми числах хранится в одном байте массива Accum, т.е о числах 0..7  - в нулевом байте, 8..15 - в первом и т.д.

а Bit определяет номер бита для числа.


 
MBo ©   (2007-06-20 16:16) [22]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=838


 
sergeyst ©   (2007-06-20 16:19) [23]


> информация о восьми числах хранится в одном байте массива
> Accum, т.е о числах 0..7  - в нулевом байте, 8..15 - в первом
> и т.д.

Ничего не понял! Получается сжатие в 8 раз?


 
MBo ©   (2007-06-20 16:27) [24]

>Получается сжатие в 8 раз?
Да



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
2-1182513679
cosinus
2007-06-22 16:01
2007.07.22
Помогите с EnumChildWindows ...


15-1182302301
SerJaNT
2007-06-20 05:18
2007.07.22
Firewall в Win2000 Server


2-1182938100
Q8
2007-06-27 13:55
2007.07.22
Поиск по Query


2-1182746059
Washington
2007-06-25 08:34
2007.07.22
Копирование баз Access


3-1176980413
nod
2007-04-19 15:00
2007.07.22
update sql с подзапросом