Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2011, 02:23   #1
byslavik
 
Регистрация: 10.11.2011
Сообщений: 4
По умолчанию Нахождение самого повторяющегося числа в массиве delphi

Подскажите пожалуйста, в чем ошибка? имеется массив, в котором нужно определить число, которое больше всего раз повторяется.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const N=7;
Type
TMas = array[1..1] of integer;
PMas = ^TMas;
var
Form1: TForm1;
a : PMas;
j,i : integer;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var h,m,n,b:integer;
begin
GetMem(a,N*sizeof(integer));
h:=0;
m:=0;
n:=0;
for i:=1 to N do
begin
a[i]:=strtoint(StringGrid1.Cells[i-1,0]);

end;

for b:=1 to N do
for j:=1 to N do
if a[b]=a[j] then
h:=h+1;
if h>n then begin
m:=a[b];;
n:=h;
end;

  label1.Caption:= inttostr(m);
FreeMem(a,N*sizeof(integer));
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
for i:=1 to N do
begin
StringGrid1.Cells[i-1,0]:=IntToStr(Random(10));

end;
end;



end.
                     -
byslavik вне форума Ответить с цитированием
Старый 10.11.2011, 08:39   #2
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

Дальше даже смотреть не стал
Код:
TMas = array[1..1] of integer;
нафига создавать массив из 0 элементов?

а это вообще зачем?
Код:
PMas = ^TMas;

задача-то элементарная.
fbus вне форума Ответить с цитированием
Старый 10.11.2011, 09:06   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

fBus, могу пояснить, почему тип массива из одного элемента (от 1 до 1 всё такие один элемент, меньше компилятор не пропустит). и зачем указатель на этот тип...

Дело в том, что был такой язык - Паскаль. А в нём НЕ БЫЛО динамических массивов. А иногда очень хотелось их использовать.
Вот один из вариантов и показан выше - создать тип массив. Взять на него указатель, выделить памяти столько, сколько нужно для нашего динамического массива и дальше через указатель разименовыывать и работать с этими данными.
Это всё почти нормально... но для Pascal (TurboPascal)! Но не для Delphi! в Delphi есть нормальная "человеческая" реализация динамических массивов. Вот её и нужно использовать!


p.s. а по сути вопроса. я алгоритм поиска ещё не смотрел..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2011, 09:17   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
var h,m,n,b:integer;
begin
GetMem(a,N*sizeof(integer));
Я сейчас точно не помню, а потому хотелось бы уточнить для ДжетМема Эн чему будет равно? Константе объявленной выше или рандому?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.11.2011, 09:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for b:=1 to N do
for j:=1 to N do
По-моему ошибка здесь: Проходят те числа, которые уже участвовали в выявлении количества.
ИМХО стратегию менять:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
 a:array of integer;
 b:array of array[1..2] of integer;  ok:boolean;
 i,j:integer;
begin
 SetLength(a,5);
 randomize;
 For i:=low(a) to high(a) do begin
   a[i]:=random(5);write(a[i]:5);ok:=false;
   for j:=low(b) to high(b) do begin
     if b[j,1]=a[i] then begin inc(b[j,2]);ok:=true;end;
   end;
   if not ok then begin SetLength(b,Length(b)+1);b[high(b),1]:=a[i];b[high(b),2]:=1;end;
 end;
 writeln;writeln;
 For i:=low(b) to high(b) do   writeln(b[i,1]:5,b[i,2]:5);

  { TODO -oUser -cConsole Main : Insert code here }
 readln;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2011, 09:37   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Utkin
Код:
var h,m,n,b:integer;
begin
GetMem(a,N*sizeof(integer));
Я сейчас точно не помню, а потому хотелось бы уточнить для ДжетМема Эн чему будет равно? Константе объявленной выше или рандому?
Utkin, точно! Супер!
Разумеется, возьмётся локальная n.
И значение ещё будет абсолютно случайно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2011, 15:24   #7
byslavik
 
Регистрация: 10.11.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Utkin, точно! Супер!
Разумеется, возьмётся локальная n.
И значение ещё будет абсолютно случайно.
да, действительно! как-то я не заметил

Цитата:
в Delphi есть нормальная "человеческая" реализация динамических массивов
а как можно осуществить по нормальному? просто препод как объяснил, так я и сделал

Вот как сделал и все получилось
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Type
TMas = array[1..1] of integer;
PMas = ^TMas;
var
Form1: TForm1;
a : PMas;
j,i,N : integer;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var h,m,c,b:integer;
begin

N:=7;
GetMem(a,N*sizeof(integer));
h:=0;
m:=0;
c:=0;
for i:=1 to N do
begin
a[i]:=strtoint(StringGrid1.Cells[i-1,0]);
end;

for b:=1 to N do begin
for j:=b+1 to N-1 do
begin
  if a[b]=a[j] then begin
   h:=h+1;
  end;

end;
if h>c then begin
    m:=a[b];
    c:=h;
  end;
end;
  label1.Caption:= inttostr(m);
FreeMem(a,N*sizeof(integer));


end;


procedure TForm1.FormCreate(Sender: TObject);
begin
N:=7;
Randomize;
for i:=1 to N do
begin
StringGrid1.Cells[i-1,0]:=IntToStr(Random(10));

end;
end;

end.
                     -

Последний раз редактировалось byslavik; 10.11.2011 в 15:40.
byslavik вне форума Ответить с цитированием
Старый 10.11.2011, 15:53   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну если препод так сказал для Дельфи делать.... Есть в Дельфи стандартный механизм, называется динамические массивы - адекватная замена Вашим махинациям с GetMem'ами.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi - Нахождение среднего среди большлго числа чисел P.A.S.C.A.L. Помощь студентам 2 08.02.2011 09:04
Поиск наименьшего и самого редкоповторяющегося числа в Memo (Delphi) giga_person Помощь студентам 5 21.03.2010 19:20
Нахождение самого короткого слова Диезушка Помощь студентам 2 20.10.2009 21:43
Улучшить алгоритм нахождения элемента, чаще всего повторяющегося в возрастающем массиве nitrolighter Помощь студентам 6 18.10.2009 13:33