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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2014, 00:45   #1
stranic007
Новичок
Джуниор
 
Регистрация: 14.12.2014
Сообщений: 2
Восклицание написать программу, реализующую сортировку массива методом Шелла

нужно написать программу, реализующую сортировку массива методом Шелла. при проверке выдает ошибку: [Error] Unit1.pas(149): Undeclared identifier: 'ShellSortInt'
привожу текст программы:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    strngrd1: TStringGrid;
    strngrd2: TStringGrid;
    lbl2: TLabel;
    lbl3: TLabel;
    strngrd3: TStringGrid;
    lbl4: TLabel;
    edt1: TEdit;
    edt2: TEdit;
    lbl5: TLabel;
    btn1: TButton;
    lbl6: TLabel;
    edt3: TEdit;
    lbl7: TLabel;
    edt4: TEdit;
    btn2: TButton;
    edt5: TEdit;
    lbl8: TLabel;
    lbl9: TLabel;
    edt6: TEdit;
    edt7: TEdit;
    lbl10: TLabel;
    lbl11: TLabel;
    edt8: TEdit;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  count:Integer;

implementation

{$R *.dfm}
procedure ShellSort(a:array of Integer);//сортируем входной массив по возрастанию
 var i,j,c,x : integer;

begin
 for i := 0 to count-1 do
      begin
        j:= i-x;
        while  j>0 do
           if A[j]>A[j+x] then
           begin
              c:= A[j];
              A[j]:=A[j+x];
              A[j+x]:=A[j];
              j:=j-x
           end
           else  j:=0  ; { останов проверки}
       x:= x div 2  ;
  end;
  for i := 0 to count-1 do begin
      Form1.strngrd2.Cells[i,0]:=IntToStr(a[i]);
      end;
end;



procedure ShellSortDec(a:array of Integer);//сортируем входной массив по убыванию
var i,j,x,c : integer;
begin

  for i := 0 to count-1 do
  begin
        j:= i-x;
        while  j>0 do
           if A[j]>A[j+x] then
           begin
              c:= A[j];
              A[j]:=A[j+x];
              A[j+x]:=A[j];
              j:=j-x
           end
           else  j:=0  ; { останов проверки}
       x:= x div 2
  end;
  for i := 0 to count-1 do begin
      Form1.strngrd3.Cells[i,0]:=IntToStr(a[i]);
      end;
end;
function FindInc(a:array of Integer):AnsiString;//выполняет поиск образца в отсортированном по возрастанию массиве
var
  i,j,x,k : Integer;
  str: AnsiString;
begin
  x := StrToInt(Form1.edt4.Text);
  k:=-1;
  i:=0;
  while((i<=count-1) and (x>=a[i])) do
  begin
    if(x=a[i])then begin k:=k+1; str:=str+' '+IntToStr(i); end;
    i:=i+1;
  end;
  if(k=-1)then str :='Нет такого элемента';
  Form1.edt7.Text:=IntToStr(k);
  Result:= str;
end;
function FindDec(a:array of Integer):AnsiString;//выполняет поиск образца в отсортированном по убыванию массиве
var
  i,j,x,k : Integer;
  str: AnsiString;
begin
  x := StrToInt(Form1.edt4.Text);
  k:=-1;
  i:=0;
  while((i<=count-1) and (x<=a[i])) do
  begin
    if(x=a[i])then begin k:=k+1; str:=str+' '+IntToStr(i); end;
    i:=i+1;
  end;
  Form1.edt7.Text:=IntToStr(k);
  if(k=-1)then str :='Нет такого элемента';
  Result:= str;
end;
procedure TForm1.btn1Click(Sender: TObject);//выполняет сортировку
var range,i:Integer;
a:array of Integer;
d1: TDateTime;//используется для подсчета времени
begin
  if((Length(edt1.Text)>0) and (Length(edt2.Text)>0)) then
  begin
      count := StrToInt(edt1.Text);
      range := StrToInt(edt2.Text);
      btn2.Enabled:=True;
      SetLength(a,count);
      Randomize;
      strngrd1.ColCount := count;
      strngrd2.ColCount := count;
      strngrd3.ColCount := count;
      for i := 0 to count-1 do strngrd1.Cells[i,0] := IntToStr(Random(range));
      for i := 0 to count-1 do a[i]:= StrToInt(strngrd1.Cells[i,0]);
      d1:=Now;
      ShellSortInt(a);
      ShellSortDec(a);
      edt3.Text:=FloatToStr(MilliSecondsBetween(d1,Now))+' ms';
  end;
end;

procedure TForm1.btn2Click(Sender: TObject);//осуществляет поиск образца
var
i :Integer;
a:array of Integer;
d1: TDateTime;//используется для подсчета времени
begin
  if(Length(edt4.Text)>0)then
  begin
    SetLength(a,count);
    for i := 0 to count-1 do a[i]:= StrToInt(strngrd2.Cells[i,0]);
    d1:=Now;
    edt5.Text:=FindInc(a);
    for i := 0 to count-1 do a[i]:= StrToInt(strngrd3.Cells[i,0]);
    edt8.Text:=FloatToStr(MilliSecondsBetween(d1,Now))+' ms';
    edt6.Text:=FindDec(a);
  end;
end;
end.

Последний раз редактировалось Stilet; 15.12.2014 в 08:06.
stranic007 вне форума Ответить с цитированием
Старый 15.12.2014, 01:19   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

И что непонятно ? И в самом деле вы используете ( вроде как вызываете процедуру) ShellSortInt, а нигде ее не описываете.
type_Oleg вне форума Ответить с цитированием
Старый 15.12.2014, 10:03   #3
stranic007
Новичок
Джуниор
 
Регистрация: 14.12.2014
Сообщений: 2
По умолчанию

процедуру описал. теперь ругается по другому поводу:
[Error] Unit1.pas(37): Unsatisfied forward or external declaration: 'TForm1.ShellSortInt'

37 procedure ShellSortInt(a:array of Integer);
38 procedure ShellSortDec(a:array of Integer);

не уверен в правильности описания процедур, подскажите как надо
stranic007 вне форума Ответить с цитированием
Старый 15.12.2014, 10:33   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Ой мама, роди меня обратно!
Код:
// Метод пузырька
void MethodBubble(double *array, int x)
{
  bool y = true;
  double k;
  while(y)
  {
  y = false;
  for(int i=0; i<x-1; i++)
    if(array[i] > array[i+1])
    {
      k = array[i];
      array[i] = array[i+1];
      array[i+1] = k;
      y = true;
    }
  }
}
//------------------------------------------------------
// Сортировка методом Шелла
void ShellMethod(double *array, int x)
{
  int len = x;
  double c;
  long d=len, i,j;
  do
  {
    d=d/2;
    i=0;
    while ((j=i+d)<len)
    {
      if (array[i]>array[j])
      {
	c=array[i];
	array[i]=array[j];
	array[j]=c;
      };
      i++;
    };
  }while (d>1);
  // Сортировка пузырьком
  MethodBubble(array, x);
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
Задали написать программу на Qt, реализующую контейнер с расширяемой разрядностью. Dmitriu Помощь студентам 0 08.01.2012 12:00
Сортировка массива строк методом Шелла mikebrownen Общие вопросы C/C++ 4 22.10.2011 21:08
Через сортировку Шелла создать программу по убыванию Novenkaja Помощь студентам 3 29.03.2011 21:34
Прогамма должна выполнять сортировку имен в лексикографическом порядке методом Хоора и Шелла. ser_b Помощь студентам 2 27.05.2010 21:26