Сортировка и поиск на free pascal...помогите(((

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Сортировка и поиск на free pascal...помогите(((

Сообщение vitek » 08.06.2010 15:39:45

Задание по теме- сортировка и поиск на free pascal.
В одномерном массиве найти количество различающихся чисел меньших числа а.
Помогите :( :( :(
vitek
незнакомец
 
Сообщения: 4
Зарегистрирован: 25.05.2010 19:26:03

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение Timid » 08.06.2010 16:15:46

Проблема-то в чем? Алгоритм придумать или за тебя написать?
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение vitek » 08.06.2010 18:42:19

Проблема заключается в отсутствии лекции по теме- сортировка и поиск, и как следствие знаний по теме((( поэтому собственно и прошу помоч...
vitek
незнакомец
 
Сообщения: 4
Зарегистрирован: 25.05.2010 19:26:03

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение скалогрыз » 08.06.2010 21:59:23

да вообще! система образования никакая совершенно!!

vitek, твой код здесь:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

const
  MAX = 10;

type
  PMassiv = ^TMassiv;
  TMassiv = record
    a     : Integer;
    prev  : PMassiv;
    next  : PMassiv;
  end;
   
  TDynamicMassiv = array of TMassiv;
 
  { TDynamicMassivObject }

  TDynamicMassivObject = class(TObject)
    d   : TDynamicMassiv;
    procedure SetSize;
    procedure AddItem(a: Integer; N: Integer);
  end;

var
  gl : Integer = 0; 
  global :  TDynamicMassivObject;
const
  THIRD_NUMBER = 9;
 
function getRandom: Integer;
var
  k : Integer;
begin
  k:=6;
  case gl of
    0: getRandom:=10;
    1: Result:=6;
    2: getRandom:=4;
    3: Result:= THIRD_NUMBER;
    4: getRandom:=7;
    6: getRandom:=1;
    7: Result:= 12;
    8: getRandom:=2;
    9: Result:= 3;
  else
    if gl=5 then Result:=k
    else Result:=random(10);
  end;
  inc(gl);
end;
 
{ TDynamicMassivObject }

procedure TDynamicMassivObject.SetSize;
begin
  global:=Self;
  SetLength(global.d, MAX);
end;

procedure TDynamicMassivObject.AddItem(a: Integer; N: Integer);
begin
  N:=N-1;
  d[N].a:=a;
  if N<MAX-1 then d[N].next:=@d[N+1]
  else d[N].next:=PMassiv(0);
  if N>0 then d[N].prev:=@d[N-1]
  else d[N].prev:=PMassiv(0);
end;
 
procedure ZapolnitMassiv;
var
  i : Integer;
  o: TDynamicMassivObject;
begin
  o:=TDynamicMassivObject.Create;
  o.SetSize;
  for i:=1 to MAX do
    o.AddItem(getRandom, i);
end;

function GetIndex(p: PMassiv): Integer;
var
  i : Integer;
begin
  for i:=0 to length(global.d)-1 do
    if @global.d[i]=p then begin
      Result:=i;
      Exit;
    end;
  Result:=-1;
end;

procedure FindMenshe(A: integer);
var
  w : array [0..65535] of Boolean;
  i : Integer;
  p : PMassiv;
begin
  for i:=0 to 65535 do w[i]:=False;
  p:=@global.d[0]; 
 
  while p<>nil do begin
    if p^.a<A then 
      w[p^.a]:=True;
    i:=GetIndex(p);
    if i<0 then begin
      if p^.Next=nil then
        p:=p^.Next;
    end else  begin
      inc(i);
      p:=@global.d[i];
    end;
  end;   
 
  for i:=0 to 65535 do
    if w[i] then write(i,' ');
  writeln;
end;

procedure Print;
var
  i : Integer;
begin
  for i:=0 to length(global.d)-1 do
    write(global.d[i].a,' ');
  writeln;
end;

var
  a : Integer;
begin
  ZapolnitMassiv;
  Print;
  writeln('vvedite chislo A:');
  readln(a);
  FindMenshe(a);
end.

скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение Timid » 08.06.2010 22:21:14

скалогрыз, ты что, как в этом коде разберется "нормальный нуб"? Особенно если он о сортировке ничего не знает? 8)

Лучше как-то так:
Код: Выделить всё
type
  TDynamicIntegerArray=array of integer;
var
  SourceArray,SearchBuffer:TDynamicIntegerArray;
  A,LLength,LSize,I,J,K:integer;
...
begin
...
   // Здесь в SourceArray нужно поместить исходный массив
   // А в А - граничное число
...
  LLength:=Length(SourceArray);
  SetLength(SearchBuffer,LLength); // для быстроты выделяем под буферный массив столько же места, сколько под основной
  LSize:=0; // в этой переменной будет реальное количество данных в буферном массиве
  for I:=0 to LLength-1 do begin // пройдемся по всем элементам исходного массива   
    K:=SourceArray[I];
    if (K<A) then begin
      J:=0;
      while (J<LSize) do begin // просмотрим все внесенные данные буферного массива
         if (K=SearchBuffer[J]) then begin
           J:=LSize+1; // гарантированный выход+1. J=LSize используется для индикации, что ни одного совпадения не было найдено
         end else begin
            inc(J);
         end;     
         if (J=LSize) then begin // счетчик открутился до конца, ни одного совпадения не найдено
           SearchBuffer[LSize]:=K;
           inc(LSize);
         end; 
      end;
    end;
  end;
  MessageDlg('Ваш ответ ='+IntToStr(LSize));
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение VirtUX » 09.06.2010 16:02:58

Да ужжж... скалогрыз умеет сделать зарядку для мозгов :) Странно, что в коде нет проверки на вкл./выкл. писишника...
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение Odyssey » 09.06.2010 16:59:29

скалогрыз молодец, он здорово экономит людям время, и заодно поднимает настроение.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение скалогрыз » 10.06.2010 11:23:56

а в решении баг! как обычно - из-за невнимательного чтения!

алгоритм выписывает все различающиеся числа, вместо того, чтобы написать их количество! :(
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение GrayEddy » 10.06.2010 11:51:43

Хороший стеб! :)
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение Timid » 10.06.2010 15:01:38

А у меня нет 8)
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Сортировка и поиск на free pascal...помогите(((

Сообщение скалогрыз » 10.06.2010 16:39:23

2 vitek.
для решения задачи делаешь следующее:

* сортируешь массив по возрастанию.
* проходишь от первого элемента до больше или равного искомому А (либо до конца массива).
* при проходе считаешь количество не повторяющихся символов. т.к. массив отсортированный делается это легко: если предыдущий элемент не равен текущему, то увеличиваешь счётчик на единицу.

собственно всё! цикл while изучал, сортировку пузырьком должен знать :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru