Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.068 c
15-1272460353
Amoeba_
2010-04-28 17:12
2010.08.27
Академики шарлатаны. ФО РАН посвящается.


2-1271100027
Иван
2010-04-12 23:20
2010.08.27
ADO конект


2-1271995058
MAX_76
2010-04-23 07:57
2010.08.27
Помогите решить задачу -запуск Делфи-приложения с саита


2-1268915355
@!!ex
2010-03-18 15:29
2010.08.27
Как отрисовать TBitMap c прозрачностью?


15-1271004598
Константинов
2010-04-11 20:49
2010.08.27
Недоступность ресурсов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский