Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.11.2010, 22:28
ardon ardon вне форума
Прохожий
 
Регистрация: 12.11.2010
Сообщения: 5
Репутация: 10
По умолчанию Работа со строчками

Здравствуйте, уважаемые форумчане. Помогите пожалуйста разобраться с заданием по строковым типам данных.
Задание:
Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с 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: Пользуемся тегами!

//ну далее делаю вывод требуемого количества. можно ли как нибудь "упростить" алгоритм, господа? Спасибо за внимание.

Последний раз редактировалось Admin, 12.11.2010 в 22:36.
Ответить с цитированием
  #2  
Старый 12.11.2010, 22:39
ardon ardon вне форума
Прохожий
 
Регистрация: 12.11.2010
Сообщения: 5
Репутация: 10
По умолчанию sorry.

извиняюсь, совсем забыл про теги. )
Ответить с цитированием
  #3  
Старый 12.11.2010, 22:49
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
//ну далее делаю вывод требуемого количества. можно ли как нибудь "упростить" алгоритм, господа?

да, можно, используйте TStringList
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #4  
Старый 12.11.2010, 22:50
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Как вариант:
Код:
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  
Старый 12.11.2010, 22:56
ardon ardon вне форума
Прохожий
 
Регистрация: 12.11.2010
Сообщения: 5
Репутация: 10
По умолчанию Мое почтение, господа.

Спасибо огромное, уважаемые. Очень очень благодарен.
Ответить с цитированием
  #6  
Старый 12.11.2010, 23:04
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

ЧТо то помоему вы тут намудрили господа, мой вариант без 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  
Старый 12.11.2010, 23:16
ardon ardon вне форума
Прохожий
 
Регистрация: 12.11.2010
Сообщения: 5
Репутация: 10
По умолчанию спасибо большое.

Какие точные функции, какие определения. Но Roamer, очень сложно.
Вариант Black Raider-a понятен. В любом случае - премного благодарен.
Ответить с цитированием
  #8  
Старый 12.11.2010, 23:18
ardon ardon вне форума
Прохожий
 
Регистрация: 12.11.2010
Сообщения: 5
Репутация: 10
По умолчанию без стринг лист-а!

А я только понял .
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025