Текущий архив: 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.55 MB
Время: 0.065 c