Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простенькая программа на Delphi со строками:), чё-то меня тупит:( 
V
    Опции темы
Palladin
Дата 17.6.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Вообщем попросили сделать задачу на delphi:

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

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

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

Это сообщение отредактировал(а) RooR - 17.6.2006, 21:30


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Sunvas
Дата 18.6.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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


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

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

Это сообщение отредактировал(а) Sunvas - 18.6.2006, 01:56


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Palladin
Дата 18.6.2006, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



нет не совсем воод такой 

допустим 

111111 00000 11111 0000000 1111111 00000 000000 11111 11111


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

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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Golden Hands
Дата 18.6.2006, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



На вскидку:

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

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

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

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

Все.



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


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
CHIKIST
Дата 18.6.2006, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



 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;
 
PM MAIL   Вверх
Sunr1se
Дата 18.6.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 6
Всего: 13



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

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;
  

Это сообщение отредактировал(а) Sunr1se - 18.6.2006, 13:23
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Palladin
Дата 18.6.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Palladin
Дата 18.6.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Guedda
Дата 18.6.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Код

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;
 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Демо
Дата 18.6.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Код

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;
 


--------------------
    
PM MAIL ICQ Skype   Вверх
Sunr1se
Дата 18.6.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 6
Всего: 13



RooR, не знаю, я свой код тестил. Работал как часы smile 
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Palladin
Дата 18.6.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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

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

чё за хня smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Palladin
Дата 18.6.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Sunr1se
Дата 18.6.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 6
Всего: 13



Дело в том, что у TStringList нет свойства Tag. Оно есть только у наследников TComponent. 
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Zero
Дата 18.6.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Хех... 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;
  

Это сообщение отредактировал(а) Zero - 18.6.2006, 18:32
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.