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

0 / 0 / 0

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

Сообщений: 8

1

Определить, есть ли в тексте заданное слово

21.08.2012, 20:41. Показов 9624. Ответов 19


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

Не могу сделать без ошибок и все тут(
Выручайте…



0



296 / 274 / 194

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

Сообщений: 570

21.08.2012, 20:49

2

Цитата
Сообщение от Даша Мат.фак
Посмотреть сообщение

Не могу сделать без ошибок и все тут(
Выручайте…

Покажи свой код с ошибкой,а мы подскажем как исправить.



1



Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

21.08.2012, 21:28

4

Ev[G]eN, Думаю ссылка неудачная. Слова могут разделяться не только пробелами, слова могут переноситься, да и файл читать нужно. Кроме того не нужно проверять все слова, а только найти первое.



0



CodeR

Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 09:03

5

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

Решение

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
Var f:text;
    s,s1,s2:string;
    b:boolean;
    i:byte;
Begin
    Assign(f,'c:in.txt');Reset(f);
    write('Введите слово: ');readln(s2);
    s1:='';b:=false;
    While not Eof(f) do
     Begin
      readln(f,s);
      writeln(s);
      s:=s+' ';
      For i:=1 to Length(s) do
       if not (s[i] in [' ','.','-',':',';','!','?']) then s1:=s1+s[i]
        else 
         Begin
          if s2=s1 then b:=true;
          s1:='';
         End;
     End;
    if b then writeln('В файле есть такое слово')
     else writeln('Нету такого словав файле');
    readln;
End.

Файл in.txt должен быть создан и заполнен в корне диска C:



1



Paster Fob

296 / 274 / 194

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

Сообщений: 570

22.08.2012, 11:40

6

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

Решение

Мой вариант:

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
var f:text;s,st:string;
    n:integer;
begin
  assign(f,'textfile.txt');
  reset(f);
  while not eof(f) do begin
    readln(f,s);
    writeln(s);
  end;
  writeln('введите искомое слово');
  readln(st);
  reset(f);
  while not eof(f) do begin
    readln(f,s);
    n:=pos(st,s);
    if n>0 then begin
      writeln('есть такое слово в тексте');
      break;
    end;
  end;
  if n=0 then writeln('нет такого слова в тексте');
  close(f);
  readln
end.



0



Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 11:42

7

Paster Fob, а теперь создай файл текстовый, набери туда
Runtime exe
Потом введи искомое слово в Run и прога напишет что есть такое слово хотя его нету…



0



Puporev

Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 11:42

8

Pascal
1
 n:=pos(st,s);

Например сторока
сторож из столицы
ищем слово сто
Есть оно в этой строке?



0



Viktorya_rb

22.08.2012, 15:53

9

Да, в предыдущей программе оно будет считаться за слово!

Вот правильный код:

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
var f:text;s,st:string;
    n:integer;
begin
  assign(f,'1.txt');
  reset(f);
  while not eof(f) do begin
    readln(f,s);
    writeln(s);
  end;
  writeln('введите искомое слово');
  readln(st);
  reset(f);
  while not eof(f) do begin
    readln(f,s);
    n:=pos(st,s);
    if (n>0) and (s[n-1]=' ') and (s[n+length(st)+1]=' ') then
    begin
    writeln('есть такое слово в тексте');
    break;
    end
    else writeln('слово отсутствует');
    end;
    if n=0 then writeln('нет такого слова в тексте');
  close(f);
  readln
end.

КонецСвета

Почетный модератор

7966 / 3937 / 2464

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

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

22.08.2012, 16:32

10

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

Решение

как вариант до кучи =)

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
uses crt;
const pr=[' ','.',',',':',';','-','!','?'];
var f: text;
    s,sl: string;
    b: boolean;
    i: byte;
begin
assign(f,'D:in.txt');
reset(f);
write('Слово: '); readln(sl);
b:=false;
while not eof(f) do
      begin
      readln(f,s); writeln(s);
      s:=' '+s+' ';
      if not b then
         begin
         for i:=1 to length(s) do
             if (copy(s,i,length(sl))=sl) and (s[i-1] in pr)
             and (s[i+length(sl)] in pr) then b:=true;
         end;
      end;
close(f);
if b then writeln('Слово есть в файле') else writeln('Слова нет в файле');
end.



1



0 / 0 / 0

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

Сообщений: 8

22.08.2012, 19:05

 [ТС]

11

Проект project1.exe вызвал класс исключения ‘RunError(2)’

В чем проблема?

ps: мне нужно создать файл, а не привязать его…

Голова пухнет уже..все переделать пыталась, ничего не выходит(



0



Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 19:11

12

Цитата
Сообщение от Даша Мат.фак
Посмотреть сообщение

Проект project1.exe вызвал класс исключения ‘RunError(2)’

Если нужно в Делфи, то туда бы и писали, а здесь Паскаль.



0



CodeR

Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 20:59

13

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

Решение

Цитата
Сообщение от Даша Мат.фак
Посмотреть сообщение

Проект project1.exe вызвал класс исключения ‘RunError(2)’
В чем проблема?
ps: мне нужно создать файл, а не привязать его…
Голова пухнет уже..все переделать пыталась, ничего не выходит(

Сразу надо говорить…

Delphi
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
33
34
35
36
37
38
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
Var f:text;
    s,s1,s2:string;
    b:boolean;
    i:byte;
Begin
    Assign(f,'c:in.txt');Rewrite(f);
    Repeat
     write('Vvedite stroku texta(okonchanie vvoda,vvod pustoi stroki): ');readln(s);
     if s<>''then writeln(f,s);
    Until s='';
    Close(f);
    write('Vvedite slovo: ');readln(s2);
    Assign(f,'c:in.txt');Reset(f);
    s1:='';b:=false;
    While not Eof(f) do
     Begin
      readln(f,s);
      writeln(s);
      s:=s+' ';
      For i:=1 to Length(s) do
       if not (s[i] in [' ','.','-',':',';','!','?']) then s1:=s1+s[i]
        else 
         Begin
          if s2=s1 then b:=true;
          s1:='';
         End;
     End;
    if b then writeln('V faile est" takoe slovo')
     else writeln('V faile net takogo slova');
    Close(f);
    readln;
end.



0



Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 21:01

14



0



Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 21:11

15

Puporev, а Lazarus идентичен Delphi?мой код там от компилируется?



0



Puporev

Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 21:21

16

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

Решение

Artem7, Я там не знаю есть ли консоль, а с формой точно как в Делфи.

Добавлено через 2 минуты
Да, есть консоль, сейчас проверю код.

Добавлено через 5 минут
Проверил, все работает, ничего не исправлял, только для красоты здесь

Pascal
1
writeln('Vvedite stroku texta(okonchanie vvoda,vvod pustoi stroki): ');readln(s);

а то строку нужно вводить на краю…

Добавлено через 43 секунды
Выглядит это так.

Delphi
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };
 
type
 
  { TMyApplication }
 
  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;
 
{ TMyApplication }
 
procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h','help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;
 
  // parse parameters
  if HasOption('h','help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;
 
  { add your program here }
 
  // stop program loop
  Terminate;
end;
 
constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;
 
destructor TMyApplication.Destroy;
begin
  inherited Destroy;
end;
 
procedure TMyApplication.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ',ExeName,' -h');
end;
 
var
  Application: TMyApplication;
 
{$R *.res}
Var f:text;
    s,s1,s2:string;
    b:boolean;
    i:byte;
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
 Assign(f,'c:in.txt');Rewrite(f);
    Repeat
     writeln('Vvedite stroku texta(okonchanie vvoda,vvod pustoi stroki): ');readln(s);
     if s<>''then writeln(f,s);
    Until s='';
    Close(f);
    write('Vvedite slovo: ');readln(s2);
    Assign(f,'c:in.txt');Reset(f);
    s1:='';b:=false;
    While not Eof(f) do
     Begin
      readln(f,s);
      writeln(s);
      s:=s+' ';
      For i:=1 to Length(s) do
       if not (s[i] in [' ','.','-',':',';','!','?']) then s1:=s1+s[i]
        else
         Begin
          if s2=s1 then b:=true;
          s1:='';
         End;
     End;
    if b then writeln('V faile est" takoe slovo')
     else writeln('V faile net takogo slova');
    Close(f);
    readln;
end.



0



Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 21:27

17

Puporev, спасибо, да на счёт строки не заметил…



0



Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 21:31

18

Не смотри что кода много, все что кроме твоего создано автоматом.



0



Фрилансер

3417 / 2814 / 3000

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

Сообщений: 8,546

Записей в блоге: 1

22.08.2012, 21:32

19

Puporev,

Не по теме:

вот это да…вот тебе и Lazarus с консолью



0



Почетный модератор

64287 / 47586 / 32739

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

Сообщений: 115,182

22.08.2012, 21:36

20

Так он и с формой такой страшный, это же по сути Free Pascal с наворотами…



0



Раздел: Стандартные функции Паскаля

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Функция Pos в Паскале ищет подстроку в строке.
Синтаксис функции имеет довольно много вариантов для разных типов данных:

function Pos(const substr : shortstring; 
             const s : shortstring) : SizeInt;

function Pos(C : Char;
             const s : shortstring) : SizeInt;

function Pos(const Substr : ShortString;
             const Source : AnsiString) : SizeInt;

function pos(const substr : shortstring;
             c : Char) : SizeInt;

function Pos(const Substr : AnsiString;
             const Source : AnsiString) : SizeInt;

function Pos(c : Char;
             const s : AnsiString) : SizeInt;

function Pos(const Substr : UnicodeString;
             const Source: UnicodeString) : SizeInt;

function Pos(c : Char;
             const s : UnicodeString) : SizeInt;

function Pos(c : UnicodeChar;
             const s : UnicodeString) : SizeInt;

function Pos(c : AnsiString;
             const s : UnicodeString) : SizeInt;

function Pos(c : UnicodeString;
             const s: AnsiString) : SizeInt;

function Pos(c : ShortString;
             const s : UnicodeString) : SizeInt;

function Pos(const Substr : WideString;
             const Source : WideString) : SizeInt;

function Pos(c : Char;
             const s : WideString) : SizeInt;

function Pos(c : WideChar;
             const s : WideString) : SizeInt;

function Pos(c : WideChar;
             const s : AnsiString) : SizeInt;

function Pos(c : AnsiString;
             const s : WideString) : SizeInt;

function Pos(c : WideString;
             const s : AnsiString) : SizeInt;

function Pos(c : ShortString;
             const s : WideString) : SizeInt;

function Pos(c : Char;
             const v : Variant) : SizeInt;

function Pos(s : ShortString;
             const v : Variant) : SizeInt;

function Pos(a : AnsiString;
             const v : Variant) : SizeInt;

function Pos(w : WideString;
            const v : Variant) : SizeInt;

function Pos(w : UnicodeString;
             const v : Variant) : SizeInt;

function Pos(v : Variant;
             const c: Char) : SizeInt;

function Pos(v : Variant;
             const s : ShortString) : SizeInt;

function Pos(v : Variant;
             const a : AnsiString) : SizeInt;

function Pos(v : Variant;
             const w : WideString) : SizeInt;

function Pos(v : Variant;
             const w : UnicodeString) : SizeInt;

function Pos(v1 : Variant;
             const v2 : Variant) : SizeInt;

Вся эта куча вариантов взята из документации. Так что просьба не критиковать за излишние подробности )))

Функция Pos возвращает индекс подстроки Substr в строке S, если строка S содержит в себе подстроку Substr. Если подстрока Substr не найдена в строке, то функция возвращает 0. Поиск чувствителен к регистру.

Как найти подстроку в строке

Разумеется, сделать это можно без использования специальных функций.

Проще всего найти в строке символ — это можно сделать простым перебором символов в строке.

Найти вхождение подстроки из нескольких символов будет сложнее. Но тоже возможно — существуют специальные алгоритмы.

Однако зачем “изобретать велосипед”, если есть готовые функции. Такие, например, как функция Pos.

С помощью этой функции можно найти символ или подстроку в строке.

Как часто приходится это делать? Зависит от специфики вашей работы.

Если вы работаете, например, с математикой, то почти никогда.

Если же вы работаете с большими объёмами текстовой информации, с файлами, то довольно часто.

Итак, пример:

S := 'abcdefgcde';
Writeln(Pos('f', S));     //Pos = 6
Writeln(Pos('F', S));     //Pos = 0 - буква F не найдена
Writeln(Pos('cde', S));   //Pos = 3, потому что функция 
                          //возвращает индекс первого 
                          //найденного вхождения
Writeln(Pos('cdf', S));   //Pos = 0 - такой подстроки нет

В принципе, здесь всё понятно. Особых разъяснений не требуется.

Единственное замечание по варианту поиска подстроки cde. Как видите, в исходной строке есть две подстроки cde. Но функция возвращает число 3, то есть индекс первого элемента первой найденной подстроки.

Пример программы:

program posfunc;

var S : string;

begin
//Ищем индекс первого пробела в строке
  S := 'The first space in this sentence is at position : ';
  Writeln(S, Pos(' ', S));  //Pos = 4

//Ищем последнюю букву английского алфавита в строке
  S := 'The last letter of the alphabet doesn''t appear in this sentence ';
  //Так как такой буквы в строке нет, то будет выведено сообщение об этом
  if (Pos('Z', S) = 0) and (Pos('z', S) = 0) then
    Writeln(S);

//Проверяем, что функция Pos действительно чувствительна к регистру
  S := 'abcdefgcde';
  Writeln(Pos('f', S));     //Pos = 6
  Writeln(Pos('F', S));     //Pos = 0 - буква F не найдена
  Writeln(Pos('cde', S));   //Pos = 3, потому что функция 
                            //возвращает индекс первого 
                            //найденного вхождения
  Writeln(Pos('cdf', S));   //Pos = 0 - такой подстроки нет

  ReadLn;
end. 

Как стать программистом 2.0

Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки…
Подробнее…

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

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

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



Сообщ.
#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,0472 ]   [ 15 queries used ]   [ Generated: 27.05.23, 13:51 GMT ]  

                                program lab_pascal;
                                uses Crt;
                                const let=['А'..'Я','а'..'я'];
                                      sl='три';
                                      k=Length(sl);
                                var s:String;
                                jpos:Integer;
                                instr:Boolean;
                                begin
                                instr:=False;
                                ClrScr;
                                Writeln('Введите строку:');
                                Readln(s);
                                jpos:=Pos(sl,s);
                                if (jpos<>0) and (not(s[jpos-1] in let)) and (not(s[jpos+k] in let)) 
                                then instr:=True;
                                if instr then Writeln('Слово присутствует в строке.') 
                                else Writeln('Слово не присутствует в строке.');
                                Readln;
                                end.

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

                                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

                                Понравилась статья? Поделить с друзьями:

                                Не пропустите также:

                              • Суррогатные матери как найти мать
                              • Как найти архив сообщение одноклассники
                              • Как найти клип по отрывку
                              • Как найти фото дтп своего авто
                              • Как найти человека по серий паспорта

                              • 0 0 голоса
                                Рейтинг статьи
                                Подписаться
                                Уведомить о
                                guest

                                0 комментариев
                                Старые
                                Новые Популярные
                                Межтекстовые Отзывы
                                Посмотреть все комментарии