Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Программирование с использованием строк.   Найти похожие ветки 

 
Boortwint ©   (2010-03-19 11:04) [0]

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

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


 
Плохиш ©   (2010-03-19 11:06) [1]

String - это Array of char.


 
Anatoly Podgoretsky ©   (2010-03-19 11:08) [2]

А еще надо знать циклы, индексы, сравнения и условные операторы. Кроме того надо еще уметь и выводить на экран. Видишь какая сложная штука эта программирование.


 
И. Павел ©   (2010-03-19 11:16) [3]

Алгоритм примерно такой:
Идешь по строке слева-направо, если текущий символ - первый, или отличен от предыдущего - то:
1. Если это не первый символ и счетчик mod 2 = 0 то выводишь блок.
2. Счетчик:=1.
3. Блок:=Текущий символ.
Иначе:
1. Блок:=Блок+текущий символ
2. Счетчик:=Счетчик+1


 
Boortwint ©   (2010-03-19 11:16) [4]

Это понятно все. Меня интересует вот какой вопрос:
Допустим, есть строка "0000111 11011011 101011010"
По моему мнению нужно создать алгоритм, который считает цифры с первого элемента до пробела. Первый пробел у нас на 8 месте. Получается 8-1=7 количество цифр - нечетное.
Меня интересует как после одной группы цифр можно продолжить цикл проверки остальных групп.
Следующая группа: первый элемент 9 по счету, пробел - 17. 17-9=8. => количество четное.

Подскажите, несу ли я бред и нужен другой алгоритм, или можно все же реализовать мой вышеописанный метод?


 
И. Павел ©   (2010-03-19 11:17) [5]

И еще: Если это последний символ и счетчик mod 2=0, то выводишь блок


 
И. Павел ©   (2010-03-19 11:17) [6]


> Дана строка, состоящая из групп нулей и единиц

При чем тут пробелы?


 
И. Павел ©   (2010-03-19 11:20) [7]


> И. Павел ©   (19.03.10 11:16) [3]

+Если встретили пробел то
1. Если счетчик mod 2 = 0 то выводишь блок
2. Обнуляешь счетчик
3. Обгуляешь блок


 
Медвежонок Пятачок ©   (2010-03-19 11:21) [8]

uses RegExpr;

procedure FindEvenGroups(const InputStr : string; AResultList : TStrings; LengthLimit: integer);
var i : integer;
begin
with TRegExpr.Create do
 try
  for i := 1 to LengthLimit do
   begin
    Expression := Format("0{%d}|1{%d}",[i,i]);
    if (not Odd(i)) and Exec(InputStr) then AResultList.Add(Match[0]);
   end;
 finally
  Free;
 end;
end;


 
Медвежонок Пятачок ©   (2010-03-19 11:25) [9]

Допустим, есть строка "0000111 11011011 101011010"

Дана строка, состоящая из групп нулей и единиц.

Взаимоисключающие параграфы


 
Плохиш ©   (2010-03-19 11:31) [10]


> Boortwint ©   (19.03.10 11:16) [4]


> Меня интересует как после одной группы цифр можно продолжить
> цикл проверки остальных групп.
> Следующая группа: первый элемент 9 по счету, пробел - 17.
>  17-9=8. => количество четное.
>
> Подскажите, несу ли я бред и нужен другой алгоритм, или
> можно все же реализовать мой вышеописанный метод?

Можно, я не против.

Так бы сразу и говорил, что разрешения спрашиваешь :-)


 
Плохиш ©   (2010-03-19 11:31) [11]


> Медвежонок Пятачок ©   (19.03.10 11:25) [9]

Ладна, к словам не придирайся...


 
Boortwint ©   (2010-03-19 13:13) [12]


> Медвежонок Пятачок ©   (19.03.10 11:25) [9]
> Допустим, есть строка "0000111 11011011 101011010"Дана строка,
>  состоящая из групп нулей и единиц.Взаимоисключающие параграфы


А если нет пробелов, то как тогда разбить строку на "группу нулей и единиц"?


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


> Дана строка, состоящая из групп нулей и единиц.

Граппа нулей, потом группа единиц и т.д. Я так сначала понял вопрос.


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

А если нет пробелов, то как тогда разбить строку на "группу нулей и единиц"?

по границам групп. началу и концу


 
Boortwint ©   (2010-03-19 13:20) [15]


> И. Павел ©   (19.03.10 13:15) [13]
> > Дана строка, состоящая из групп нулей и единиц.Граппа
> нулей, потом группа единиц и т.д. Я так сначала понял вопрос.
>


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


 
И. Павел ©   (2010-03-19 13:23) [16]


> Правильно?


Да :)


 
Медвежонок Пятачок ©   (2010-03-19 13:23) [17]

Нет


 
Boortwint ©   (2010-03-19 13:24) [18]

Тогда помогите, пожалуйста. Как провести проверку четности\нечетности количества элементов в группе.


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

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


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


> Нет

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


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

Тогда как???

00 00 11 11 11 00 11 11 00 01 11

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


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


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

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


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


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

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

111111
00
1111

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

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


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

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

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


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


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

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


 
Демо ©   (2010-03-20 15:28) [26]


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


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


 
Boortwint ©   (2010-03-22 18:50) [27]

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

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



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-22 19:21) [28]

Вот функция - писалась на скорую руку- вроде бы работает, но могут быть ошибки, а время проверять нет :( Если кто-то заметит ошибку - напишите. Исходная строка вводится в 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;


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

Извиняюсь, забыл тег 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;


 
Anatoly Podgoretsky ©   (2010-03-22 19:25) [30]


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

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


 
Boortwint ©   (2010-03-23 12:17) [31]

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


 
Boortwint ©   (2010-03-23 12:17) [32]

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


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


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

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


 
Sha ©   (2010-03-23 16:35) [34]

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;


 
Sha ©   (2010-03-23 16:44) [35]

Сорь, забыл проверку на четность, надо так:
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;


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


> Sha ©

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


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


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

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


 
Sha ©   (2010-03-24 11:40) [38]

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

Помню.

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.062 c
15-1275150659
Vitalii_____
2010-05-29 20:30
2010.08.27
Форумы по CUDA на русском


15-1269675632
Игорь
2010-03-27 10:40
2010.08.27
Джеки Чан в рекламе АВ Касперского


2-1265719492
00110011
2010-02-09 15:44
2010.08.27
TStream


2-1265737593
dmitry1208197320
2010-02-09 20:46
2010.08.27
Как скопировать данные из Exel в таблицу?


15-1272135270
Alik
2010-04-24 22:54
2010.08.27
Первод кода с++ в Delphi