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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2008, 15:37   #1
Армана
Пользователь
 
Аватар для Армана
 
Регистрация: 22.11.2008
Сообщений: 24
Вопрос Помогите найти ошибку (Delphi)

Помогите, пожалуйста найти ошибку.(Delphi)
Дана строка, состоящая из групп нулей и единиц, разделенных пробелами. Найти и вывести на экран самую короткую группу.

Вот мой код. Программа запускается, но работает неправильно.
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function FindMinGroup(Str: string): string;
var
i, counter: integer;
FirstMin: integer; //начало самой маленькой группы
FirstMinTemp: integer;
FirstDig: string;
CounterMin: integer; //размер этой группы
begin
FirstDig := '';
Counter := 0;
CounterMin := 20;
for i := 1 to length(Str) do
begin
if FirstDig = '' then
begin
FirstDig := Str[i];
FirstMinTemp := i;
end;
if Str[i] = FirstDig then
Inc(Counter)
else
begin
if Counter < CounterMin then
begin
CounterMin := Counter;
FirstMin := FirstMinTemp;
end;
FirstDig := '';
FirstMinTemp := 0;
Counter := 0;
end;
end;
for i := FirstMin to FirstMin + CounterMin do
Result := Result + Str[i];
end;


procedure TForm1.FormCreate(Sender: TObject);
begin

Edit1.Clear; Edit2.Clear;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then Edit2.Text:=FindMinGroup(Edit1.Text );
end;

end.
Армана вне форума Ответить с цитированием
Старый 23.11.2008, 19:29   #2
Армана
Пользователь
 
Аватар для Армана
 
Регистрация: 22.11.2008
Сообщений: 24
По умолчанию

народ хоть че-нить напишите
Армана вне форума Ответить с цитированием
Старый 23.11.2008, 20:40   #3
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Мой вариант:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    Str: string;
    Parts: array of string;
    procedure GetShortest;
  public
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetShortest;
end;

procedure TForm1.GetShortest;
var
  I, LastSpace: integer;
  tmp: string;
begin
  Str := Edit1.Text;
  I := 0;
  LastSpace := 1;
  SetLength(Parts, 0);
  repeat
    begin
      inc(i);
      if (Str[i] = ' ') then
      begin
        SetLength(Parts, length(Parts) + 1);
        Parts[High(Parts)] := trim(copy(Str, LastSpace, I - LastSpace));
        LastSpace := I;
      end;
    end;
  until i = Length(Str);
  tmp := Parts[0];
  for I := 1 to High(Parts) do
    if Length(Parts[i]) < Length(tmp) then
      tmp := Parts[i];
  ShowMessage(tmp);
end;

end.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 23.11.2008, 21:11   #4
Армана
Пользователь
 
Аватар для Армана
 
Регистрация: 22.11.2008
Сообщений: 24
По умолчанию

Большое спасибо. Твой код работает идеально. Жаль только не могу найти у себя ошибку .
Армана вне форума Ответить с цитированием
Старый 23.11.2008, 21:55   #5
Армана
Пользователь
 
Аватар для Армана
 
Регистрация: 22.11.2008
Сообщений: 24
По умолчанию

Как оказалось не совсем идеально. Твой код работает абсолютно также, как и мой. Т.е. он работает правильно до тех пор пока самую короткую группу не ставить последней. Тогда он выводит не ее, а самую короткую до нее
Армана вне форума Ответить с цитированием
Старый 23.11.2008, 22:04   #6
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Цитата:
Как оказалось не совсем идеально. Твой код работает абсолютно также, как и мой. Т.е. он работает правильно до тех пор пока самую короткую группу не ставить последней. Тогда он выводит не ее, а самую короткую до нее
Ага. Сорри. Одна маленькая единичка все напортила (вернее ее отсутствие) =)
Код:
procedure TForm1.GetShortest;
var
  I, LastSpace: integer;
  tmp: string;
begin
  Str := Edit1.Text;
  I := 0;
  LastSpace := 1;
  SetLength(Parts, 0);
  repeat
    begin
      inc(i);
      if (Str[i] = ' ') or (i = Length(Str)) then
      begin
        SetLength(Parts, length(Parts) + 1);
        Parts[High(Parts)] := trim(copy(Str, LastSpace, I - LastSpace + 1));
        LastSpace := I;
      end;
    end;
  until i = Length(Str);
  tmp := Parts[0];
  for I := 1 to High(Parts) do
    if Length(Parts[i]) < Length(tmp) then
      tmp := Parts[i];
  ShowMessage(tmp);
end;
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 23.11.2008, 22:24   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я, похоже, уже опоздал. но всё таки..
Армана, а попробуйте ещё Ваш код, только чуток подправленный... ;-))

Код:
function FindMinGroup(MyStr: string): string;
var
  i, counter: integer;
  FirstMin: integer; //начало самой маленькой группы
  FirstMinTemp: integer;
  FirstDig: string;
  CounterMin: integer; //размер этой группы
  S1 : string;
begin
  FirstDig := '';
  Counter := 0;
  CounterMin := 2000;
  for i := 1 to length(MyStr) do
  begin
    if FirstDig = '' then
    begin
      FirstDig := MyStr[i];
      FirstMinTemp := i;
    end;
    if MyStr[i] = FirstDig then
      Inc(Counter)
    else
    begin
      if Counter < CounterMin then
      begin
        CounterMin := Counter;
        FirstMin := FirstMinTemp;
      end;
      FirstDig := MyStr[i];
      FirstMinTemp := i;
      Counter := 1;
    end;
  end;
  for i := FirstMin to FirstMin + CounterMin-1  do
    Result := Result + MyStr[i];
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2008, 23:01   #8
Армана
Пользователь
 
Аватар для Армана
 
Регистрация: 22.11.2008
Сообщений: 24
По умолчанию

Спасибо всем
Армана вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку (Delphi) Rigard Помощь студентам 4 23.07.2008 03:06
Помогите найти ошибку! Студентка@ Помощь студентам 3 21.05.2008 14:21
Помогите найти ошибку Дима82 Помощь студентам 4 19.05.2008 15:05
help!!! Помогите найти ошибку!!! linker13 Общие вопросы Delphi 2 07.07.2007 23:15