![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() А я только понял
![]() ![]() |