Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Простенькая программа на Delphi со строками:)


Автор: Palladin 17.6.2006, 21:26
Вообщем попросили сделать задачу на delphi:

Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу. 

 Туплю я чёто здесьsmile  кто может напишите код или алгоритм опишитеsmile((((

Код свой не показываю, стыдно очень за такое smile((((( smile  smile  smile  smile  

Автор: Sunvas 18.6.2006, 00:35
Цитата(RooR @  17.6.2006,  21:26 Найти цитируемый пост)
групп нулей и единиц


Цитата(RooR @  17.6.2006,  21:26 Найти цитируемый пост)
Найти и вывести на экран самую короткую группу. 

Я правильно понял:
строка 0000011110000001100000111111110000
самая короткая группа 4(номер группы) - 11(сама группа)
так?  

Автор: Palladin 18.6.2006, 01:58
нет не совсем воод такой 

допустим 

111111 00000 11111 0000000 1111111 00000 000000 11111 11111


так вот примерно найти минимальную группу и вывести куданить

Добавлено @ 01:59 
пробелами группы разделены это упрощает её ещё больше но тчо-то не выходитsmile(( 

Автор: Golden Hands 18.6.2006, 02:26
На вскидку:

Создаешь два массива размерности строки.

Делаешь цикл прохода по строке, в котором сравниваешь текущий и предыдущий символ. Если значения равны, то увеличиваешь счетчик. Если различаются - обнуляешь счетчик (предварительно скинув в массивы значения счетчика и предыдущего символа (от элемента=номеру текущего символа-1)) и считаешь длину уже новой группы. И т.д.

В массиве, где хранятся значения счетчика, находишь минимальный элемент и запоминаешь его номер (n) и значение (z).

Берешь символ с позиции n в строке, и дублируешь его z раз.

Все.



Напиши сперва это, а потом оптимизируем.  smile  

Автор: CHIKIST 18.6.2006, 02:50
 smile 
записываешь строку в переменую a:string
Код

i:=0; //integer
k:=0; //integer
a:=a+' ';
min:=length(a)+1; //integer
mina:=''; //string
while i<=length(a) do begin
    i:=i+1;
    if a[i]=' ' then begin
        if i-k-1<min then begin
           min:=i-k-1; \\ количество символов в группе
           mina:=copy(a,k+1,i-k-1); \\ сама группа
        end;
    end;
end;
 

Автор: Sunr1se 18.6.2006, 13:21
Я тут накатал функцию, с помощью которой можно решить задачу...
В фунцию передаешь всю строку, а возвращает она самую маленькую группу.
Код

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;
  

Автор: Palladin 18.6.2006, 14:41
Чикист твой код не совсем верен, он находит строку, но к сожалению у твоего кода всегда минимальной является первая группаsmile(( Щас попробую по алгоритму Golden Hands:) а потом и до процедуры дойду smile  

Автор: Palladin 18.6.2006, 15:01
Вообщем процедура тоже не пашет так как надоsmile((( Может вы все не поняли задание, короче нужно найти самую КОРОТКУЮ группу допустим строка такая 
1111 0000 1111 0000000 11 000 1
ответом должна быть еденица  

Автор: Guedda 18.6.2006, 15:13
Код

var
  i : Integer;
  Str : string; //Собственно, твоя строка
  First : Integer; //количество символов в группе
  StartPosition : Integer; //Откуда начинать отсчет
begin
  First := 0;
  Second := 100000; //Чтобы можно было первую группу с легкостью записать
  for i := 1 to length(Str) do begin
    if Str[i] <> ' ' then begin
      Inc(First);
      StartPosition := i;
    end
    else begin
      if First < Second then Second := First;
      First := 0;
    end;
  end;
  ShowMessage(copy(Str, StartPosition, Second)); //Выведет тебе наикратчайшую группу
end;
 

Автор: Демо 18.6.2006, 15:27
Код

var
  L: TStringList;
  i: Integer;
  s: String;
  Len,tL: Integer;
begin
  s := '111111 00000 11111 0000000 1111111 00000 000000 11111 11111';
  s := StringReplace(s,' ',#13#10,[rfReplaceAll]);
  L := TStringList.Create;
  try
    L.Text := s;
    Len := 100000;
    for i := 0 to L.Count-1 do
    begin
      tL := Length(L[i]);
      if tL<Len then 
      begin
         L.Tag := i;
         Len := tL;
      end;
    end;
    ShowMessage('Самая короткая группа:'+L[L.Tag]);  
  finally
    L.Free;
  end;
 

Автор: Sunr1se 18.6.2006, 16:17
RooR, не знаю, я свой код тестил. Работал как часы smile 

Автор: Palladin 18.6.2006, 17:12
Гуеда твой пример пашет, сенкс всем большое, всё тема закрыта smile

Добавлено @ 17:27 
Соорри почти работаетsmile((( короче глюк естьsmile) в такой стрке почему-то мин группа является 1 и всёsmile
11111111 00 111111111 

чё за хня smile  

Автор: Palladin 18.6.2006, 17:34
Демо твой пример тоже не пашет, пишет ошибку
[Error] Unit1.pas(81): Undeclared identifier: 'Tag' 

Автор: Sunr1se 18.6.2006, 17:45
Дело в том, что у TStringList нет свойства Tag. Оно есть только у наследников TComponent. 

Автор: Zero 18.6.2006, 18:16
Хех... smile А теперь работающий вариант:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  mint,min,c,i:integer;
  minst,mins,s:string;
begin
  min:=20;
  s:=edit1.Text;
  c:=strtoint(s[1]);
  for i:=1 to length(s) do
    begin
      if inttostr(c)=s[i] then
        begin
          minst := minst + s[i];
          mint:=length(minst);
          continue;
        end
      else
        begin
          if length(s)>=i+1 then c:=strtoint(s[i+1]);
          if min>mint then
            begin
              min:=mint;
              mins:=minst;
            end;
          minst:='';
        end;
    end;
    if min>mint then
      begin
        min:=mint;
        mins:=minst;
      end;
  showmessage('Самая короткая группа: '+mins+' состоит из '+inttostr(min)+' символов');
end;
  

Автор: Palladin 18.6.2006, 18:30
Zero рулит smile наконечто всё действительно работает всем спасибо 

Автор: Zero 18.6.2006, 18:33
PS: упс... одна строка была не так, но щас всё исправлено... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)