Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программирование с использованием строк. [D7, XP]


Страницы:   1 2

Boortwint ©   (2010-03-19 11:04:00) 

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

Ума не приложу с чего надо начинать. С делфи дружу совсем немного и со стороками работать не доводилось. Перелопатил уйму книжек, но подсказки для решения этой задачи я не нашел.
Дайте, пожалуйста, алгоритм решения задачи. А то уже 2 дня на месте стою.


Sha   (2010-03-24 11:40:00) [1]

> Не забудьте, что может быть группа символов, прилегающая к правому краю строки.

Помню.

> И еще там пробелы могут быть, если верить автору.

Это очень похоже на фантазии и выдумывание на ходу.
В условии задачи нет ни слова про пробелы:
  Дана строка, состоящая из групп нулей и единиц.
  Найти и вывести на экран группы с четным количеством символов
.

Если в строке будут другие символы, будут сделана попытка их вывода при условии, что группа содержит четное число одинаковых символов. Анализ на непечатные символы отсутствует.


И. Павел   (2010-03-23 17:48:00) [2]


> И. Павел ©   (23.03.10 17:44) [36]

Первый пункт - я не доглядел :)


И. Павел   (2010-03-23 17:44:00) [3]


> Sha ©

Не забудьте, что может быть группа символов, прилегающая к правому краю строки.
И еще там пробелы могут быть, если верить автору.


Sha   (2010-03-23 16:44:00) [4]

Сорь, забыл проверку на четность, надо так:
procedure TForm1.Button2Click(Sender: TObject);
var
 s: string;
 first, last: integer;
begin;
 Memo1.Clear;
 s:=Edit1.Text;
 first:=1;
 for last:=1 to Length(s) do
   if s[first]<>s[last+1] then begin;
     if (last xor first) and 1 <> 0 then Memo1.Lines.Add(Copy(s,first,last-first+1));
     first:=last+1;
   end;
 end;


Sha   (2010-03-23 16:35:00) [5]

procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
 first, last: integer;
begin;
 Memo1.Clear;
 s:=Edit1.Text;
 first:=1;
 for last:=1 to Length(s) do
   if s[first]<>s[last+1] then begin;
     Memo1.Lines.Add(Copy(s,first,last-first+1));
     first:=last+1;
   end;
 end;


Плохиш   (2010-03-23 14:35:00) [6]


> Спасибо большое. Код работает.

Поздравляю, всё-таки дождался подачки.


Boortwint   (2010-03-23 12:17:00) [7]

Спасибо большое. Код работает. Осталось только переделать его под свой интерфейс. ))


Boortwint   (2010-03-23 12:17:00) [8]

Спасибо большое. Код работает. Осталось только переделать его под свой интерфейс. ))


Anatoly Podgoretsky   (2010-03-22 19:25:00) [9]


> Я понимаю, что код выше - бред сумашедшего, в которого я
> превращаюсь, долбаясь над этой задачей.

Зачем ты так, береги здоровье.


И. Павел   (2010-03-22 19:22:00) [10]

Извиняюсь, забыл тег code:

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
  i:integer;
  CurSim:char;
  CurStr:string;
begin
Memo1.Clear;
s:=Edit1.Text+' ';
if length(s)=1 then exit;
CurStr:='';
CurSim:=s[1];
for i:=1 to length(s) do
Begin
  if (s[i]='1') or (s[i]='0') then
  Begin
    if (s[i]=CurSim) then CurStr:=CurStr+s[i]
    else begin
           if (length(CurStr) mod 2 = 0) and (length(CurStr) <> 0) then Memo1.Lines.Add(CurStr);
           CurStr:=s[i];
           CurSim:=s[i];
          end;
  end
  else
  Begin
    if (i>1) and ((s[i-1]='0') or (s[i-1]='1')) then
    Begin
      if (length(CurStr) mod 2 = 0) and (length(CurStr) <> 0) then Memo1.Lines.Add(CurStr);
      CurStr:='';
      CurSim:=' ';
    end;
  end;
end;
end;


И. Павел   (2010-03-22 19:21:00) [11]

Вот функция - писалась на скорую руку- вроде бы работает, но могут быть ошибки, а время проверять нет :( Если кто-то заметит ошибку - напишите. Исходная строка вводится в Edit1, результат выводится в Memo1.

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
   i:integer;
   CurSim:char;
   CurStr:string;
begin
 Memo1.Clear;
 s:=Edit1.Text+' ';
 if length(s)=1 then exit;
 CurStr:='';
 CurSim:=s[1];
 for i:=1 to length(s) do
 Begin
   if (s[i]='1') or (s[i]='0') then
   Begin
     if (s[i]=CurSim) then CurStr:=CurStr+s[i]
     else begin
            if (length(CurStr) mod 2 = 0) and (length(CurStr) <> 0) then Memo1.Lines.Add(CurStr);
            CurStr:=s[i];
            CurSim:=s[i];
           end;
   end
   else
   Begin
     if (i>1) and ((s[i-1]='0') or (s[i-1]='1')) then
     Begin
       if (length(CurStr) mod 2 = 0) and (length(CurStr) <> 0) then Memo1.Lines.Add(CurStr);
       CurStr:='';
       CurSim:=' ';
     end;
   end;
 end;
end;


Boortwint   (2010-03-22 18:50:00) [12]

Ничего такого не написано.

До сих пор стою на одном месте.  но попытки, определенно, есть.



procedure TForm1.ComboBox1Click(Sender: TObject);
var st,tmp:string;
    i,nst,k,ost:integer;
begin                                                    nst:=ComboBox1.ItemIndex;             //определение номера выбранной строки
 st:=ComboBox1.Items[nst];          //занесение выбранной строки в переменную st
                       
   for i:=1 to Length(st) do
   begin
   f:=i;                                     //задаем переменную, чтобы потом определить количество элементов в группе.
   if (st[i]='0') or (st[i]='1') then
begin
repeat st[i]:=st[i+1]
until SrtToInt(st[i])<>StrToInt(st[i+1]) //это бред. Здесь хочу сказать, что цикл прекращается, когда следующий элемент становится отличным от предыдущего, т.е. группа нулей (единиц) заканчивается и начинается новая группа.
   end
if (st[i+1]-f{начало отсчета}/2)= ????//чему-то равно. Здесь нужно показать, что выражение целочислено, то есть количество элементов - четное
// Дальше пока не интересно
   end;

Я понимаю, что код выше - бред сумашедшего, в которого я превращаюсь, долбаясь над этой задачей. Но буду верить, что кто-нибудь поймет мою идею и доведет ее до ума.
Ну, или предложит адекватный путь решения задачи, втоптав в грязь мой вариант.
Спаситель, где ты?


Демо   (2010-03-20 15:28:00) [13]


> Boortwint ©   (19.03.10 11:04) 
> Дана строка, состоящая из групп нулей и единиц. Найти и
> вывести на экран группы с четным количеством символов.


А может в задании ещё и необходимый инструмент написан? Например, конечные автоматы?


И. Павел   (2010-03-19 17:28:00) [14]


> Но в ней же есть группа из четырех нулей.

Зачем тогда в условии сказано, что есть 2 цифры? Для такой логики хватило бы и одной.
А вообще это автору должно быть виднее, я надеюсь.


Медвежонок Пятачок   (2010-03-19 17:18:00) [15]

В начале идет группа из пяти нулей - ее отбрасываем.

Но в ней же есть группа из четырех нулей.
А уже в ней есть целых две группы из двух нулей.


И. Павел   (2010-03-19 17:12:00) [16]


> Непонял, чем нули взётые в группу круглее начальных нулей,
>  выкинутых из группы?

Видимо имелось ввиду, что группа должна состоять из одинаковых цифр. Получаем 3 группы из четного числа одинаковых цифр:

111111
00
1111

В начале идет группа из пяти нулей - ее отбрасываем.

Хотя конечно интересно, что именно должна представлять из себя "группа".


Плохиш   (2010-03-19 16:57:00) [17]


> Теперь дошло. Спасибо. то есть получается что-то вроде "00000111111001111000111"
> Должно выводить "111111001111", то есть группа с четными
> числом символов. Правильно?

Непонял, чем нули взётые в группу круглее начальных нулей, выкинутых из группы?


Медвежонок Пятачок   (2010-03-19 13:27:00) [18]

Тогда как???

00 00 11 11 11 00 11 11 00 01 11

группы из четного количества


И. Павел   (2010-03-19 13:26:00) [19]


> Нет

Тогда как??? Если всего есть 2 знака, как можно определить, что началась новая граппа, если не по смене знака?


Медвежонок Пятачок   (2010-03-19 13:25:00) [20]

сначала скажи что такое группа


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо