На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Как найти слова в строке? , Нужно найти слова и их длину
    Из заданного предложения распечатать все слова, длина которых больше пяти символов!
      Несложно, но муторно :)
      Если учесть, что исходная строка читается с клавиатуры, то
      ExpandedWrap disabled
         
        Program zadacha;
         
        Const
         Syms = [';','.',',',' ',':','-'];
         
        Var
         Source, Temp : String  ;
         I            : Byte    ;
         Done         : Boolean ;
         
        Begin
         Write('Enter string: ');
         ReadLn(Source);
         Done := False;
         I := 1;
         Temp := '';
         Repeat
          While (Not (Source[I] in Syms)) And (I<=Length(Source)) Do
           Begin
            Temp := Temp + Source[I];
            Inc(I);  
           End;
          If I = Length(Source) Done := True;
          If Length(Temp) > 5 Then WriteLn(Temp);
          Temp := '';
         Until Done;
        End.


      Хм, не так муторно, как думал :)
      Проверяйте, мож где ошибся.
        Цитата
        Eiden, 4.02.04, 01:13
        If I = Length(Source) Done := True;

        Then забыл :)

        Цитата
        Eiden, 4.02.04, 01:13
        While (Not (Source[I] in Syms)) And

        Имхо лучше проверять на ['A'..'Z','a'..'z'] и без not. А вдруг там есть длинное число, скажем 100000? Тогда оно выведется.
        Вроде все.
          Цитата
          Then забыл

          Неудивительно, я теперь только на C++ кодю :) Хорошо хоть в скобки не беру условие (хотя разницы никакой).

          Цитата
          Имхо лучше проверять на ['A'..'Z','a'..'z'] и без not. А вдруг там есть длинное число, скажем 100000? Тогда оно выведется.


          Да, согласен. Но тогда уж и на 'А'..'Я','а'..'п','р'..'я'.

          В итоге в коде исправляем две строчки:

          ExpandedWrap disabled
            Syms = ['A'..'Z','a'..'z','А'..'Я','а'..'п','р'..'я']


          ExpandedWrap disabled
            While (Source[I] in Syms) And (I <= Length(Source)) Do


          Ну про тот Then не забыть :)
          Сообщение отредактировано: Eiden -
            Скажите а каким образом предложение разбито не слова??
              Оно разбито на слова. Слово - последовательность символом русского или латинского алфавита.
                Хорошо, а что тогда является разделителeм для слов!??
                  А как обычно:
                  Мы смотрим в строке символы. Если текущий символ - буква слова, то начинаем искать все последующие буквы, пока они не кончатся, и очередная, которую мы проверим не станет "небуквой". Тогда слово кончилось. Мы выясним его длину, и если она подходит условию, то увеличим специальный счётчик, который считает такие слова. Ну а дальше опять проверяем все символы что идут далее. Если мы находим один из символов, который буква, то повторяем всё заново.

                  Добавлено в :
                  Разделителем для слов является набор символов - разделителей. В нашем примере это переменная паскаля, типа set - тоесть набор символов. В ней заключён набор разделителей вроде точки. Пробела, запятой. Посмотри в тексте программы. Так вот в процессе проверки мы сравниваем каждый символ с этим набором. Если он находится в этом наборе то делаем одни действия, если нет, то другие (Читай выше).
                    Temp:='' ----Непонятно что присваивается??

                    Программу почему то циклит, можете кто-то показать хоть пример как надо вводить предложение!!!
                    Может быть я не так ввожу!!!!!!?? :huh:
                      Ну вот. Точно работает. Только принцип немного другой - проверяем с конца строки к началу. Что вобщем-то одно и то-же:
                      ExpandedWrap disabled
                        const
                          prepen=[';',':','!','?',',','.',' ','"','-'];
                        var
                          s:string;
                          p,o:byte;
                        begin
                          write('Введите предложение: ');
                          readln(s);
                          p:=length(s);
                          repeat
                            if s[p] in prepen then dec(p) else
                            begin
                              o:=p;
                              while (p>0) and not (s[p] in prepen) do dec(p);
                              if o-p=5 then writeln(copy(s,p+1,5));
                            end;
                          until p=0;
                        end.
                        Покажите пожалуйста в данной программе пример ввода предложения!!
                          Цитата
                          Temp:='' ----Непонятно что присваивается??


                          присваивается пустая строка, то есть ничего. Переменная типа String (строка) как бы обнуляется.

                          Как программу циклит?
                            кстати, программу циклит из-за того, что i не увеличивается, если мы вышли из цикла по "не-символу". То есть строчку
                            Цитата
                            Eiden, 4.02.04, 01:13
                            If I = Length(Source) Done := True;

                            надо заменить на
                            ExpandedWrap disabled
                              If I = Length(Source) Then Done := True Else Inc(I);

                            ЗЫ: Опять Then пропустил. Ну это не страшно.
                            Сообщение отредактировано: vesper1 -
                              Цитата
                              кстати, программу циклит из-за того, что i не увеличивается, если мы вышли из цикла по "не-символу".


                              Угу, точно, спасибо! Просто привык такие вещи через цикл с постусловием делать (там i точно увеличивается), а тут что-то не подумал. :rolleyes:
                              Сообщение отредактировано: Eiden -
                                Всем спасибо за помощь!!!! :D
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 1,0835 ]   [ 14 queries used ]   [ Generated: 22.06.25, 00:37 GMT ]