![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программирование с использованием строк. [D7, XP]
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]сначала скажи что такое группа