Как найти все слова в строке паскаль

1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

1

Найти все различные слова в строке

14.12.2009, 16:00. Показов 6228. Ответов 31


Студворк — интернет-сервис помощи студентам

не могли бы вы помочь с задачей на строки??Дано предложение.Найти все его различные слова.Пожалуйста помогите..



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.12.2009, 16:00

31

кот Бегемот

Платежеспособный зверь

8818 / 4245 / 1618

Регистрация: 28.10.2009

Сообщений: 11,385

14.12.2009, 16:12

2

Цитата
Сообщение от LenaLop
Посмотреть сообщение

не могли бы вы помочь с задачей на строки??Дано предложение.Найти все его различные слова.Пожалуйста помогите..

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
a:string;
b:array[1..100]of string;
i,k,f,j:integer;
begin
readln(a);
a:=' '+a;
for i:=1 to length(a) do
if a[i]=' 'then inc(k)else b[k]:=b[k]+a[i];
for i:=1 to k do
begin;
f:=0;
for j:=1 to k do
if (i<>j)and (b[i]=b[j]) then f:=1;
if f=0 then writeln (b[i]);
end;
readln;
end.



1



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

14.12.2009, 16:52

 [ТС]

3

alexevt, Спасибо большое!!!!!!!!!!Вы меня очень выручили!!!!!!



0



кот Бегемот

Платежеспособный зверь

8818 / 4245 / 1618

Регистрация: 28.10.2009

Сообщений: 11,385

14.12.2009, 16:54

4

А код, видимо неточный. Я неверно понял задание. Программа находит только неповторяющиеся слова. Сейчас исправлю.

Добавлено через 1 минуту

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
a:string;
b:array[1..100]of string;
i,k,f,j:integer;
begin
readln(a);
a:=' '+a;
for i:=1 to length(a) do
if a[i]=' 'then inc(k)else b[k]:=b[k]+a[i];
for i:=1 to k do
begin;
f:=0;
for j:=1 to i do
if (i<>j)and (b[i]=b[j]) then f:=1;
if f=0 then writeln (b[i]);
end;
readln;
end.



1



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

14.12.2009, 17:05

 [ТС]

5

alexevt, вы бы только не могли мне объяснить,какие тут переменные зачем??

Добавлено через 6 минут
тут пример.Если мы ввели предложение например:корова пошла корова надо,чтобы вывело только :корова пошла



0



кот Бегемот

Платежеспособный зверь

8818 / 4245 / 1618

Регистрация: 28.10.2009

Сообщений: 11,385

14.12.2009, 17:15

6

не волнуйтесь, всё работает именно так, как надо. Код, написанный выше выведет
корова
пошла
а тот, что ниже: корова пошла
пояснения:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
a:string; {строка}
b:array[1..100]of string; {массив слов}
i,k,f,j:integer; {счётчики и флажок(f)}
begin
readln(a);{ввели слово}
a:=' '+a;{добавили пробел в начало, чтобы перед всеми словами был пробел (легче считать)}
for i:=1 to length(a) do  {перебираем все символы}
if a[i]=' 'then inc(k)else b[k]:=b[k]+a[i];  {если встречаем пробел, на счётчике слов появляется следующая цифра, если не пробел, добавляем к слову букву из строки}
for i:=1 to k do   {перебираем все слова}
begin;
f:=0;
for j:=1 to i do
if (i<>j)and (b[i]=b[j]) then f:=1; {если до этого слова оно уже встречалось, то f=1}
if f=0 then write (b[i],' ');{если не встречалось, то f=0, тогда мы его печатаем}
end;
readln;
end.



1



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

14.12.2009, 17:18

 [ТС]

7

ой,ОГРОМНОЕ СПАСИБО!!Благодаря Вам,я завтра надеюсь даже получу зачет))



0



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

17.12.2009, 17:07

 [ТС]

8

как дописать программу так,чтобы,если за словом стоит,.!”;%:?*((),т.е разные символы и цифры,комп принимал не за различные слова?Например:если набрать:Привет Привет!,чтобы он ничего не выводил,потому что это одинаковые слова.

Добавлено через 12 минут
alexevt, не могли бы вы мне помочь опять?



0



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

18.12.2009, 19:45

 [ТС]

9

alexevt, нашли?))



0



yanyk1n

4341 / 1473 / 680

Регистрация: 12.03.2009

Сообщений: 5,310

18.12.2009, 19:47

10

Цитата
Сообщение от alexevt
Посмотреть сообщение

if a[i]=’ ‘ then inc(k)else b[k]:=b[k]+a[i];

вместо a[i]=’ ‘ добавьте:

Pascal
1
a[i] in [' ',',','.','"',';',':','&','?','!','*','(',')']



1



Inadequate

Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.12.2009, 19:50

11

Лучший ответ Сообщение было отмечено как решение

Решение

k1ry4, множества обозначаются так

Pascal
1
a[i] in [',','.']



3



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

18.12.2009, 19:56

 [ТС]

12

значит как я поняла…a[i]=’ ‘ удаляем и вместо этого пишем a[i] in…да??



0



4341 / 1473 / 680

Регистрация: 12.03.2009

Сообщений: 5,310

18.12.2009, 19:57

13

Так точно, в квадратных скобках через запятую в апострофах перечисляем все необходимые символы, которые будем игнорировать



1



Inadequate

Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.12.2009, 20:03

14

LenaLop, не совсем так… Вот я переделал код alexevt‘a под Ваш случай

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const
  c=[',','.',' ',':','&','='];{äîïèñàòü íóæíûå}
var
  a,temp:string;
  b:array[1..128]of string;
  i,j,k:integer;
  fl:boolean;
begin
  readln(a);
  k:=0;
  for i:=1 to length(a) do
  begin
    if not (a[i] in c) then
      temp:=temp+a[i];
    if (a[i] in c) or (i=length(a)) then
      if temp<>'' then
      begin
        fl:=true;
        for j:=1 to k do
          if b[j]=temp then
            fl:=false;
        if fl then
        begin
          inc(k);
          b[k]:=temp;
          write(temp,' ');
        end;
        temp:=''
      end;
  end;
  readln;
end.



2



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

18.12.2009, 20:07

 [ТС]

15

спасибо)))у меня в паскале опять неправильно выводит,но я думаю из-за того что у меня паскаль такой…А так вроде так и должно быть)0Большое спасибо!!!!!



0



Платежеспособный зверь

8818 / 4245 / 1618

Регистрация: 28.10.2009

Сообщений: 11,385

18.12.2009, 20:09

16

сейчас попробуем



1



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.12.2009, 20:11

17

LenaLop, да видимо у Вас что-то с паскалем, потому как я сейчас все еще раз проверил, все работает. А паскаль рекомендую Вам скачать вот здесь.



0



1 / 1 / 0

Регистрация: 02.12.2009

Сообщений: 38

18.12.2009, 20:12

 [ТС]

18

k1ry4, вы бы мне не могли исправить ошибке в другой программе..пожалуйста..называется из заданного на множестве точек выбрать 3 различные так



0



Retired

7726 / 2558 / 671

Регистрация: 17.10.2009

Сообщений: 5,100

18.12.2009, 20:14

19

Хотя опять же у Вас довольно неоднозначно написанно задание… Вам нужно было вывести слова, которые встречаются в строке один раз или Вам нужно было вывести первые повторы слов?



0



Платежеспособный зверь

8818 / 4245 / 1618

Регистрация: 28.10.2009

Сообщений: 11,385

18.12.2009, 20:14

20

Допишите нужные символы в программу Inadequate , например так:

c=[‘,’,’.’,’ ‘,’:’,’&’,’=’,’!’,’?’,’;’]

и всё будет хорошо. проверено



2



program str1;

var
str, word, newWord: string;
i, j, number, correctWord : integer;
isIdenticaly: boolean;

begin
correctWord := 0;
writeln (‘Введите строку’);
readln(str);
writeln (‘Введите cлово’);
readln(word);

//количество возможных слов и соответственно итераций цикла
number:= Length(str)-(Length(word)-1);

//Тут мы запускаем цикл, который повторится столько раз, сколько возможно получить слов такой же длины, как искомое слово
for i:=1 to number do
begin

isIdenticaly:= true; //Это переменная которая изначально равна true, но меняет значение на false если символ искомого слова не соответствует символу нового слова

//тут запускаем цикл внутри цикла, который проверяет каждую букву нового слова на соответствие символу искомого слова
for j:=0 to (Length(word)-1) do
begin

if (str[i+j] <> word[j+1]) then
begin
isIdenticaly:= false; //В этом месте мы меняем true на false если хоть один символ слова отличается от искомого
break;
end;

end;
if (isIdenticaly = true) then // Тут мы проверяем, если эта переменная осталась true до этого момента, значит все символы соответствуют
begin
correctWord:= correctWord + 1;
end;
end;

writeln(correctWord); //выводим количество найденных подходящих слов

end.

      1. Выделение слов из строки

Под словами будем понимать последовательности
символов разделенных пробелами (кроме,
соответственно, первого и последнего
слов).

Пусть s=’мама мыла раму’. Признаком конца
слова можно считать пробел, кроме
последнего слова. Чтобы не обрабатывать
последнее слово специальным образом,
добавим в конец строки оператором S:=s+’
‘ символ «пробел».

Просмотрим все элементы строки и если
символ не пробел, то добавляем его к
строке t. Если пробел, то в t уже целое
слово. Выдаем его на экран, и начинаем
формировать в t новое слово. Перед
формированием «очищаем» слово t (t:=”-
пустая строка).

Var s, r, t: string;

i: integer;

Begin

Readln(s);

s:=s+’ ‘; t:=”; {tпустая строка}

For i:=1 to length(s) do

If s[i]<>’ ‘ then t:=t+s[i]

else Begin

Writeln(t);

t:=”;

End;

readln

End.

Используем эту идею для решения более
сложной задачи: найти в строке самое
длинное слово – палиндром. Для этого
формируем как прямое слово t:=t+s[i],
так и обратноеr:=s[i]+r.
Кроме того, последовательно проверяем
длины слов и ищем самое длинное.

Var s, r, t, wmax: string;

i, lmax, l: integer;

Begin

Readln(s); s:=s+’ ‘;

r:=”;{“обратное”
слово-пустая строка}

t:=”;{“прямое”
слово-пустая строка }

wmax:=”;{искомое слово –
пустая строка}

For i:=1 to length(s) do

Ifs[i]<>’
‘then{символ не равен
пробелу}

Begin

r:=s[i] + r; t:=t + s[i]

End

else Begin

If r = t then

If length(r)>length (wmax)

thenwmax:=r;

r:=”;t:=”;
{готовимся формировать новые слова}

End;

Write(wmax);

Readln

End.

Теперь представим, что «очень много»
символов последовательно записано в
текстовом файле (на олимпиадах обычно
бывает именно так). Тогда последним
символом окажется код #26 (признак конца
файла). Но, если при создании файла в
конце строки будет нажата клавиша
«Enter», то в конце файла могут появиться
и символы #13 (CR) или (и) #10 (LF). Не забудьте
об этом при участии в соревнованиях,
именно из этого символа команда СГАУ
на четвертьфинале чемпионата мира сдала
программу только с третьей попытки,
заработав 40 минут штрафного времени.
Обязательно закрывайте выходной файл,
иначе результат в нем может не появиться.

Используем стандартные файлы ввода и
вывода. Тогда их можно не описывать и
не указывать их имена в операторах ввода
и вывода

Будем считывать символы из файла
последовательно и по алгоритму,
изложенному выше, решим задачу.

Var r, t, wmax: string;

ch: char;

Begin

Assign (input, ‘input.txt’); Reset(input);

Assign (output, ‘output.txt’); Rewrite(output);

r:=”; t:=”; wmax:=”;

Repeat

Read (ch);

If (ch<>’ ‘)and(ch<>#26)and(ch<>#10)and(ch<>#13)
then

Begin r:=ch+r; t:=t+ch End

else Begin

If r=t then

If length (r)>length (wmax) then wmax:=r;

r:=”; t:=”;

End;

Until (ch=#26) or (ch=#10) or (ch=#13);

Write (wmax);

Close (output);

End.

Соседние файлы в предмете Программирование на Pascal

  • #
  • #
  • #
  • #
  • #
  • #

>
Как найти слова в строке?
, Нужно найти слова и их длину

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
03.02.04, 20:51

    Из заданного предложения распечатать все слова, длина которых больше пяти символов!


    Eiden



    Сообщ.
    #2

    ,
    03.02.04, 21:13

      Несложно, но муторно :)
      Если учесть, что исходная строка читается с клавиатуры, то

      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.

      Хм, не так муторно, как думал :)
      Проверяйте, мож где ошибся.


      Vesper



      Сообщ.
      #3

      ,
      04.02.04, 05:47

        Цитата

        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? Тогда оно выведется.
        Вроде все.


        Eiden



        Сообщ.
        #4

        ,
        04.02.04, 09:26

          Неудивительно, я теперь только на 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 – 04.02.04, 09:29


          Юлия



          Сообщ.
          #5

          ,
          04.02.04, 16:16

            Скажите а каким образом предложение разбито не слова??


            Eiden



            Сообщ.
            #6

            ,
            04.02.04, 18:25

              Оно разбито на слова. Слово – последовательность символом русского или латинского алфавита.


              Юлия



              Сообщ.
              #7

              ,
              04.02.04, 18:43

                Хорошо, а что тогда является разделителeм для слов!??


                Some1



                Сообщ.
                #8

                ,
                04.02.04, 19:38

                  А как обычно:
                  Мы смотрим в строке символы. Если текущий символ – буква слова, то начинаем искать все последующие буквы, пока они не кончатся, и очередная, которую мы проверим не станет “небуквой”. Тогда слово кончилось. Мы выясним его длину, и если она подходит условию, то увеличим специальный счётчик, который считает такие слова. Ну а дальше опять проверяем все символы что идут далее. Если мы находим один из символов, который буква, то повторяем всё заново.

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


                  Юлия



                  Сообщ.
                  #9

                  ,
                  04.02.04, 20:00

                    Temp:=” —-Непонятно что присваивается??

                    Программу почему то циклит, можете кто-то показать хоть пример как надо вводить предложение!!!
                    Может быть я не так ввожу!!!!!!?? :huh:


                    Some1



                    Сообщ.
                    #10

                    ,
                    04.02.04, 20:57

                      Ну вот. Точно работает. Только принцип немного другой – проверяем с конца строки к началу. Что вобщем-то одно и то-же:

                      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.


                      Юлия



                      Сообщ.
                      #11

                      ,
                      06.02.04, 18:47

                        Покажите пожалуйста в данной программе пример ввода предложения!!


                        Eiden



                        Сообщ.
                        #12

                        ,
                        06.02.04, 20:23

                          Цитата

                          Temp:=” —-Непонятно что присваивается??

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

                          Как программу циклит?


                          Vesper



                          Сообщ.
                          #13

                          ,
                          07.02.04, 07:41

                            кстати, программу циклит из-за того, что 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 – 07.02.04, 07:41


                            Eiden



                            Сообщ.
                            #14

                            ,
                            07.02.04, 09:44

                              Цитата

                              кстати, программу циклит из-за того, что i не увеличивается, если мы вышли из цикла по “не-символу”.

                              Угу, точно, спасибо! Просто привык такие вещи через цикл с постусловием делать (там i точно увеличивается), а тут что-то не подумал. :rolleyes:

                              Сообщение отредактировано: Eiden – 08.02.04, 20:24


                              Юлия



                              Сообщ.
                              #15

                              ,
                              08.02.04, 18:23

                                Всем спасибо за помощь!!!! :D

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Pascal
                                • Следующая тема

                                [ Script execution time: 0,0723 ]   [ 15 queries used ]   [ Generated: 25.05.23, 02:07 GMT ]  

                                Как найти в определенном предложении всё слова, где присутствуют цифры.
                                То есть в итоге вывести количество таких слов.
                                Делал вот так но что то не работает

                                Function num_count(s:string):integer;
                                Var i,num:integer;
                                n:0..9;
                                word:string;
                                begin
                                num:=0;
                                word:='';
                                for i:=1 to Length(S) do //просматриваем всю строку
                                begin
                                if(S[i]=' ') then    //если пробел то новое слово
                                  word:=''
                                else
                                begin
                                  //если находим цифру то прибавляем счетчик
                                if Pos(inttostr(n),word)<>0 then
                                num:=num+1;
                                word:=word+S[i];
                                Continue;
                                end;
                                
                                Result:= num;
                                end;end;
                                

                                задан 15 дек 2011 в 13:18

                                zerpico's user avatar

                                2

                                Вариант выше при пробелах подряд в середине и конце строки ошибается

                                А так же использует долгие функции

                                Вот приемлимый код по скорости и объему кода

                                function num_count(s:string):integer;
                                var
                                  i,num,len:integer;
                                
                                begin
                                  num:=0;
                                  i:=1;
                                  len:=length(s);
                                
                                   while (i<=len) do
                                        if (s[i] in ['0'..'9'] )
                                         then
                                            begin
                                            inc(num);
                                            while ( (s[i] <> ' ') and (i<=len) ) do inc(i);
                                            end
                                         else inc(i);
                                
                                  result:= num;
                                end;
                                

                                ответ дан 15 дек 2011 в 16:37

                                botanegg's user avatar

                                Поправил.

                                    Function num_count(s:string):integer;
                                    Var
                                      i,num:integer;
                                    begin
                                
                                      num:=0;
                                
                                      i:=1;
                                
                                     While (S[Length(S)]=' ') Do // удаляю пробелы в конце
                                       Delete(S, Length(S), 1);
                                
                                // Вместо предыдущего цикла в Delphi можно использовать S:=Trim(S);
                                
                                        While (i<=Length(S)) Do
                                          Begin
                                            If (S[i]=' ') Then
                                              Begin
                                                Repeat // теперь не ошибётся
                                                  delete(S, 1, 1);
                                                Until (S[1]<>' ');
                                                i:=1;
                                              End;
                                
                                            if (S[i] In ['0'..'9']) then
                                              Begin
                                                num:=num+1;
                                                If (Pos(' ', S)=0) Then
                                                  Break // можно написать так
                                                  {Begin // или так
                                                    Result:= num;
                                                    Exit;
                                                  End}
                                                Else
                                                  delete(S, 1, Pos(' ', S));
                                                i:=1;
                                              End
                                            Else
                                              Inc(i);
                                          End;
                                
                                      Result:= num;
                                    end;
                                

                                Теперь мой вариант не ошибается, если пробелов в центр строки натыкать, хотя достаточно велик по объёму кода (оптимизацией я тут не занимался – написал то, что первое в голову пришло).

                                ответ дан 15 дек 2011 в 13:30

                                DelphiM0ZG's user avatar

                                DelphiM0ZGDelphiM0ZG

                                3,03714 серебряных знаков18 бронзовых знаков

                                2

                                Добавить комментарий