Текущий архив: 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;
…
end;
и список таких объектов:TNumberList = class(TObjetcList)
…
public
procedure AddNumber(Value: Double);
end;procedure TNumberList.AddNumber(Value: Double);
begin
for I := 0 to Count —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.
Далее полученый список просматриваешь по условию«Найти макс встречающееся в матрице более 1-го „
var
Max: Double;
begin
Max := NaN;
for I := 0 to MyNumList.Count — 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
Писал прям тут ессно…
← →
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