![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, уважаемые форумчане. Помогите пожалуйста разобраться с заданием по строковым типам данных.
Задание: Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с 5 символами. Моя версия алгоритма: Код:
begin
n:=0;
probel:=0;
label1.text:="vvedite stroku!";
stroka:=messagebox1.text;
kol_nulei_v_gruppe:=0;
kol_edinic_v_gruppe:=0;
kol_nulevix_grup:=0;
kol_edini4nix_grup:=0;
//самый большой общий цикл-
while length(stroka)>0 do
begin
// здесь считаю группы из нулей-
repeat
if (pos(' ',stroka))<>1 then begin
while (pos('0',stroka)=1) and (length(stroka)>0) do
kol_nulei_v_gruppe:=kol_nulei_v_gruppe+1;
until kol_nulei_v_gruppe=5; kol_nulevix_grup:=kol_nulevix_grup+1; end;
//здесь считаю группы из единиц-
repeat
if (pos(' ',stroka))<>1 then begin
while (pos('1',stroka)=1) and (length(stroka)>0) do
kol_edinic_v_gruppe:=kol_edinic_v_gruppe+1;
until kol_nulei_v_gruppe=5; kol_edini4nix_grup:=kol_edini4nix_grup+1; end;
end;
//в конце пытаюсь подсчитать сколько всего групп получилось ->
obwee_kol_grup:=kol_nulevix_grup+kol_edini4nix_grup;//ну далее делаю вывод требуемого количества. можно ли как нибудь "упростить" алгоритм, господа? Спасибо за внимание. Последний раз редактировалось Admin, 12.11.2010 в 22:36. |
|
#2
|
|||
|
|||
|
извиняюсь, совсем забыл про теги. )
![]() |
|
#3
|
|||
|
|||
|
Цитата:
да, можно, используйте TStringList |
|
#4
|
|||
|
|||
|
Как вариант:
Код:
Var
iWord,CountWord, CountGroup : integer;
...
...
CountGroup:=0;
CountWord := Get_CountWords_In_WideString(Stroka); //кол-во слов(групп) в строке
for iWord:=1 to CountWord do
begin
if length(trim(Get_Word_From_WideString(Stroka, iWord)))=5 then begin
//Длина слова (группы)=5
CountGroup:=CountGroup+1; //увеличиваем счетчик слов (групп)
end;
end;
//***********************************
function Get_CountWords_In_WideString(Sx : WideString; UnChar: WideString=' '; YesAllTrim_Before: boolean=true) : integer;
//Определить кол-во слов в строке Sx. UnChar - множество разделителей
var
InWord : byte;
i : integer;
begin
Result:=0;
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
InWord := 0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then Result:=Result+1; //переход на начало слова
InWord:=1; //Мы внутри слова
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
end;
end;
end;
end;
function Get_Word_From_WideString(Sx : WideString; NumWord : integer; UnChar: WideString=' '; YesAllTrim_Before: boolean=true) : WideString;
//Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей
//YesAllTrim_Before - если TRUE, то перед анализом удалить из строки левые и правые пробелы
Var
InWord : byte;
NumWordCur, i : integer;
begin
Result:='';
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
if NumWord>0 then begin
InWord := 0;
NumWordCur:=0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then NumWordCur:=NumWordCur+1; //мы - на начале слова
InWord:=1; //Мы внутри слова
if NumWordCur=NumWord then begin //Это - наше слово
Result:=Result+Sx[i]; //и мы его выдираем из строки
end;
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
if NumWordCur=NumWord then begin //Это было - наше слово
i:=length(Sx)+1; //поэтому, выходим из цикла и функции
end;
end;
end;
end;
end;
end; |
|
#5
|
|||
|
|||
|
Спасибо огромное, уважаемые. Очень очень благодарен.
|
|
#6
|
|||
|
|||
|
ЧТо то помоему вы тут намудрили господа, мой вариант без StringList
![]() Код:
procedure TForm1.Button1Click(Sender: TObject);
var st,st1:string;
fl:boolean;
i,countG:integer;
begin
CountG:=0; // Кол-во групп
st:='00000 11111 11111 1 00000'; // Строка в которой ищем группы
i:=1; //Позиция разделителя 1 чтоб вошли в цикл
st:=st+' '; // Добавляем в конец разделитель для определения последней группы
while i>0 do //Сообственно сам цикл
begin
i:=pos(' ',st);//Ищем ближ. разделитель
st1:=copy(st,1,i-1); //Записываем то что лежит в строке с 1-го символа до разделителя
if length(st1)=5 then CountG:=CountG+1; //Проверяем кол-во Вгруппе если 5 то групп +1
Delete(st,1,i); //Удаляем то что уже посчитали
end;
label1.Caption:=inttostr(CountG); //Выводим
end; |
|
#7
|
|||
|
|||
|
Какие точные функции, какие определения. Но Roamer, очень сложно.
Вариант Black Raider-a понятен. В любом случае - премного благодарен. ![]() |
|
#8
|
|||
|
|||
|
А я только понял
. |