Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
1

Вывести все даты, встречающиеся в тексте. Строки

25.10.2011, 22:52. Показов 2874. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните пожалуйста на словах, как реализовать след. программу...

Дана строка S, слова в которой разделены пробелами и знаками препинания. Вывести через запятую все даты, встречающиеся в тексте. Датами будем считать записи видов: дд/мм/гг, д/мм/гг, дд/мм/гггг, д/мм/гггг, которые соответствуют реально существующим датам.

Как найти в данной строке записи вида дд/мм/гг, д/мм/гг, дд/мм/гггг, д/мм/гггг, а потом вывести именно их на экран?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2011, 22:52
Ответы с готовыми решениями:

Вывести строчные гласные буквы, встречающиеся в тексте
Доброго времени суток.Потребовалась ваша помощь. Задание: Составить программу печати по одному...

Вывести слова, встречающиеся в тексте по одному разу
1. Написать программу, которая вводит текст, состоящий из нескольких предложений, и выводит на...

Заменить все прописные русские буквы, встречающиеся в тексте, строчными.
Пусть дан текст,за которым следует восклицательный знак.Замените все прописные русские...

Вывести в Memo все даты месяца по дням недели
Помогите пожалуйста создать программу которая будет выводить Memo все даты месяца по дням...

23
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
25.10.2011, 23:00 2
ищешь знак "/" потом второй такой же, если между ними 2 или одна цифра не больше 12, тогда если слева от него не больше 2 цифр не больше 31 и справа не больше 4 цифр, как то так
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
25.10.2011, 23:04  [ТС] 3
SYSM, а покороче никак? у меня была такая мысль, реализовать сложновато, но реализуемо)
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
25.10.2011, 23:37 4
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
procedure TForm1.Button1Click(Sender: TObject);
var S:string;
i,p:Integer;
Dat:TDate;
begin
S:=Edit1.Text+' ';
For i:=1 to length(S) do
 if S[i]='/' then S[i]:='.'
 else
 if not(S[i] in ['0'..'9']) then
  S[i]:=' ';
p:=pos('  ',S);
while p<>0 do
 begin
 delete(S,p,1);
 p:=pos('  ',S);
 end;
p:=pos(' ',S);
while p<>0 do
 begin
 p:=pos(' ',S);
 try
 Memo1.Lines.Add(DateToStr(StrToDate(copy(S,1,p-1))));
 except
 end;
 delete(S,1,p)
 end;
end;
те же яйца только с боку,
подожди мож еще кто то чего нибудь выдаст
потому что у меня варианты кончились
если только как нибудь по маске искать, но среди стандартных я такого не знаю
1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
26.10.2011, 00:25  [ТС] 5
Спасибо, SYSM =)

Друзья, есть какие-то еще варианты?
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
26.10.2011, 11:16 6
Например, можно решить так. Исходный текст берётся из Мемо1. Найденные записи дат записываются в Мемо2.
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
procedure TForm1.Button1Click(Sender: TObject);
const
  //Множество разделителей слов.
  D = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
  //Множество цифр
  Dd = ['0'..'9'];
  //Множество символов, участвующих в записи дат.
  Dsh = Dd + ['/'];
var
  S : String;
  i, Len, Pos1, j, P1, P2, CntP : Integer;
  F : Boolean;
begin
  Memo2.Clear;
  S := Memo1.Text;
  Len := Length(S);
 
  Pos1 := 0;  //Позиция начала шаблона.
  F := False; //Верность шаблона: True - верен, False - есть нарушения.
  j := 0;     //Счётчик позиций внутри шаблона.
  for i := 1 to Len do begin
    //Пропускаем все символы, которые не могут входить в шаблон.
    if not (S[i] in Dsh) then Continue;
    //Отслеживаем начало шаблона.
    if (i = 1) or (S[i - 1] in D) then begin
      Pos1 := i;
      F := True;
      j := 0;
      CntP := 0;
      P1 := 0;
      P2 := 0;
    end;
    //Не выполняем обработку, если шаблон уже нарушен.
    if not F then Continue;
 
    //---------- Модуль проверки правильности шаблона. ----------
 
    //Счётчик позиций внутри шаблона.
    Inc(j);
    if S[i] = '/' then begin
      Inc(CntP);
      case CntP of
        1 :
        begin
          P1 := j;
          if not (P1 in [2, 3]) then F := False;
        end;
        2 :
        begin
          P2 := j;
          if not ( (P2 - P1) in [2, 3] ) then F := False;
        end;
      else
        F := False;
      end;
      if not F then Continue;
    end;
    //Отслеживаем конец шаблона.
    if (i = Len) or (S[i + 1] in D) then begin
      if not ( (j - P2) in [2, 4] ) then begin
        F := False;
        Continue;
      end;
      //Добавляем найденный экземпляр в Мемо2.
      Memo2.Lines.Add( Copy(S, Pos1, i - Pos1 + 1) );
    end;
 
    //------------------------------------------------------------
  end;
end;
Этот код отслеживает все допустимые шаблоны для записи даты с разделителем '/'. Год и месяц могут быть представлены 1 или 2 цифрами, год может быть представлен 2 или 4 цифрами.
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
26.10.2011, 11:33 7
вообще намного проще использовать для этой задачи регулярные выражения
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
26.10.2011, 13:27 8
Возможно. Если выборка частей текста по шаблонам представляет существенную часть проекта, то да - есть смысл установить и использовать TRegExp.
---
Но ещё надо учитывать, что сама задача по составлению регулярного выражения может оказаться достаточно сложной и требующей хорошего знания синтаксиса.
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
26.10.2011, 13:35 9
не плохая штука, я тут почитал чуток, и написано, что на русском хелп хороший по составлению маски. и таки да, если у тебя куча файлов метровых и хорошенько их трусить нужно, тогда вариант, но обычно все файлы какую никакую, а структуру имеют
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
27.10.2011, 16:04  [ТС] 10
Дело в том, что мне нужно сделать затрагивая только тему "Строковые величины"... Нельзхя затрагивать процедуры и т.д... Как это релизовать?

Думаю, в начале ввести константу, а дальше ее уже искать в строке:

Delphi
1
const drob='/'
Но как дальше?
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
27.10.2011, 16:09 11
без процедур?

может тебе в консольном приложении нужно написать?

а строковые величины затрагиваются в обоих кодах, S:String же в вели
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
27.10.2011, 16:12  [ТС] 12
Ага, сказали без процедур) Использовать только строковые величины, условие и циклы (((
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
27.10.2011, 16:33 13
так Mawrat же писал (ну почти):
Цитата Сообщение от Mawrat Посмотреть сообщение
Например, можно решить так. Исходный текст берётся из Мемо1. Найденные записи дат записываются в Мемо2.
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
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
const
  //Ìíîæåñòâî ðàçäåëèòåëåé ñëîâ.
  D = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
  //Ìíîæåñòâî öèôð
  Dd = ['0'..'9'];
  //Ìíîæåñòâî ñèìâîëîâ, ó÷àñòâóþùèõ â çàïèñè äàò.
  Dsh = Dd + ['/'];
var
  S : String;
  i, Len, Pos1, j, P1, P2, CntP : Integer;
  F : Boolean;
begin
  Writeln('Vvedite Stroku');
  Readln(S);
  Len := Length(S);
 
  Pos1 := 0;  //Ïîçèöèÿ íà÷àëà øàáëîíà.
  F := False; //Âåðíîñòü øàáëîíà: True - âåðåí, False - åñòü íàðóøåíèÿ.
  j := 0;     //Ñ÷¸ò÷èê ïîçèöèé âíóòðè øàáëîíà.
  for i := 1 to Len do begin
    //Ïðîïóñêàåì âñå ñèìâîëû, êîòîðûå íå ìîãóò âõîäèòü â øàáëîí.
    if not (S[i] in Dsh) then Continue;
    //Îòñëåæèâàåì íà÷àëî øàáëîíà.
    if (i = 1) or (S[i - 1] in D) then begin
      Pos1 := i;
      F := True;
      j := 0;
      CntP := 0;
      P1 := 0;
      P2 := 0;
    end;
    //Íå âûïîëíÿåì îáðàáîòêó, åñëè øàáëîí óæå íàðóøåí.
    if not F then Continue;
 
    //---------- Ìîäóëü ïðîâåðêè ïðàâèëüíîñòè øàáëîíà. ----------
 
    //Ñ÷¸ò÷èê ïîçèöèé âíóòðè øàáëîíà.
    Inc(j);
    if S[i] = '/' then begin
      Inc(CntP);
      case CntP of
        1 :
        begin
          P1 := j;
          if not (P1 in [2, 3]) then F := False;
        end;
        2 :
        begin
          P2 := j;
          if not ( (P2 - P1) in [2, 3] ) then F := False;
        end;
      else
        F := False;
      end;
      if not F then Continue;
    end;
    //Îòñëåæèâàåì êîíåö øàáëîíà.
    if (i = Len) or (S[i + 1] in D) then begin
      if not ( (j - P2) in [2, 4] ) then begin
        F := False;
        Continue;
      end;
      //Äîáàâëÿåì íàéäåííûé ýêçåìïëÿð â Ìåìî2.
      writeln( Copy(S, Pos1, i - Pos1 + 1) );
      readln
    end;
 
    //------------------------------------------------------------
  end;
  end.
Этот код отслеживает все допустимые шаблоны для записи даты с разделителем '/'. Год и месяц могут быть представлены 1 или 2 цифрами, год может быть представлен 2 или 4 цифрами.
оно же идеально подходит

или еще и процедуру copy нельзя использовать

тогда и writeln c readln нельзя
0
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
27.10.2011, 16:51 14
на регулярках
Вложения
Тип файла: zip регуляр.zip (335.3 Кб, 24 просмотров)
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
01.11.2011, 13:56  [ТС] 15
Прикол в том, что мне нельзя даже использовать
Delphi
1
Continue
0
SYSM
01.11.2011, 14:05
  #16

Не по теме:

но ведь использовать маты можно? так пошли его куда подальше, это уже клиникой попахивает :-|

1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
01.11.2011, 14:10  [ТС] 17
SYSM, с удовольствием бы) да нельзя, этому преподу еще зачет сдавать... Блин, говорит, что есть более легкий способ ((
0
117 / 117 / 30
Регистрация: 21.10.2011
Сообщений: 308
01.11.2011, 14:36 18
поставить кучу условий и в цикле проработать по символьно всю строку. возможно он просто крутой логик и для него так проще
1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 70
01.11.2011, 15:17  [ТС] 19
SYSM, сказали, что в строке, которая введена с клавиатуры нужно выделить слова, а потом уже их перебирать ))

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
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
const
  Razd = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
  Cifr = ['0'..'9'];
  Data = Cifr + ['/'];
  prep = '.;,:';
var s, slovo: string;
    i, ns, ks: integer;
begin
writeln ('Vvedite stroky'); readln (s);
i:=1;
while i<= length (s) do
   begin
     ns:=i;
     while (i<=length (s)) and (pos (s[i],prep)=0) do inc(i);
 
     ks:=i-1;
     while (i<=length (s)) and (pos (s[i],prep)<>0) do inc(i);
     slovo:=copy (s, ns, ks-ns+1);
   end;
writeln (slovo);
readln
end.
Вот написал, но не правильно кажется отделяет слова...

Добавлено через 23 минуты
А вот, все, изменил, работает отделение слов...

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
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
const
  Razd = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
  Cifr = ['0'..'9'];
  Data = Cifr + ['/'];
  prep ='.,:, ;';
var s, otv, slovo: string;
    i, ns, ks: integer;
begin
writeln ('Vvedite stroky'); readln (s);
i:=1;
otv:='';
while i<= length (s) do
   begin
     ns:=i;
     while (pos (s[i],prep)=0) do inc(i);
 
     ks:=i-1;
     while (pos (s[i],prep)<>0) do inc(i);
     slovo:=copy (s, ns, ks-ns+1);
 
     otv:= otv + slovo + ' ';
     end;
     delete (otv, length (otv), 1);
writeln (otv);
readln
end.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
01.11.2011, 22:32 20
В консольном варианте с некоторыми поправками:
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows;
 
const
  //Множество разделителей слов.
  D = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
  //Множество цифр
  Dd = ['0'..'9'];
  //Множество символов, участвующих в записи дат.
  Dsh = Dd + ['/'];
var
  S : String;
  i, Len, Pos1, j, P1, P2, CntP : Integer;
  F : Boolean;
begin
  //Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  //Если после переключения русские буквы показываются неверно,
  //следует открыть системное меню консольного окна - щелчком мыши в левом
  //верхнем углу окна консоли и выбрать:
  //Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  repeat
    Writeln('Задайте строку:');
    Readln(S);
 
    Writeln('Список найднных записей дат:');
    Len := Length(S);
    Pos1 := 0;  //Позиция начала шаблона.
    F := False; //Верность шаблона: True - верен, False - есть нарушения.
    j := 0;     //Счётчик позиций внутри шаблона.
    for i := 1 to Len do begin
      //Пропускаем разделители.
      if S[i] in D then Continue;
      //Отслеживаем начало шаблона.
      if (i = 1) or (S[i - 1] in D) then begin
        Pos1 := i;
        F := True;
        j := 0;
        CntP := 0;
        P1 := 0;
        P2 := 0;
      end;
      //Не выполняем обработку, если шаблон уже нарушен.
      if not F then Continue;
      //Счётчик позиций внутри шаблона.
      Inc(j);
      case S[i] of
        '/' :
        begin
          Inc(CntP);
          case CntP of
            1 :
            begin
              P1 := j;
              if not (P1 in [2, 3]) then F := False;
            end;
            2 :
            begin
              P2 := j;
              if not ( (P2 - P1) in [2, 3] ) then F := False;
            end;
            else
              F := False;
          end;
        end;
        '0'..'9' : ;
        else F := False;
      end;
      if not F then Continue;
      //Отслеживаем конец шаблона.
      if (i = Len) or (S[i + 1] in D) then begin
        if not ( (j - P2) in [2, 4] ) then begin
          F := False;
          Continue;
        end;
        //Распечатываем слово.
        Writeln( Copy(S, Pos1, i - Pos1 + 1) );
      end;
    end;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Вывод программы:
Код
Задайте строку:
10/X1/2011... 01/10/11XX, /10/11, 1/10/09, !? 102/10/11, 02/10/2009, ... 10/10/111,
4/10/2010 10/10/11112, 10/Y1/2011, 10/1/2011, 5/9/2011
Список найденных записей дат:
1/10/09
02/10/2009
4/10/2010
10/1/2011
5/9/2011
Повторить - Enter. Выход - любой символ + Enter.
Если нужно выделить все слова, независимо от того, являются ли они правильными записями дат, это можно сделать так:
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows;
 
const
  //Множество разделителей слов.
  D = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
var
  S : String;
  i, Len, Pos1 : Integer;
begin
  //Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  //Если после переключения русские буквы показываются неверно,
  //следует открыть системное меню консольного окна - щелчком мыши в левом
  //верхнем углу окна консоли и выбрать:
  //Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  repeat
    Writeln('Задайте строку:');
    Readln(S);
 
    Writeln('Список найденных слов:');
    Len := Length(S);
    Pos1 := 0;  //Позиция начала шаблона.
    for i := 1 to Len do begin
      //Пропускаем разделители.
      if S[i] in D then Continue;
      //Отслеживаем начало слова.
      if (i = 1) or (S[i - 1] in D) then Pos1 := i;
      //Отслеживаем конец слова.
      if (i = Len) or (S[i + 1] in D) then begin
        Writeln( Copy(S, Pos1, i - Pos1 + 1) );
      end;
    end;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Вывод программы:
Код
Задайте строку:
10/X1/2011... 01/10/11XX, /10/11, 1/10/09, !? 102/10/11, 02/10/2009, ... 10/10/111,
4/10/2010 10/10/11112, 10/Y1/2011, 10/1/2011, 5/9/2011
Список найденных слов:
10/X1/2011
01/10/11XX
/10/11
1/10/09
102/10/11
02/10/2009
10/10/111
4/10/2010
10/10/11112
10/Y1/2011
10/1/2011
5/9/2011
Повторить - Enter. Выход - любой символ + Enter.
0
01.11.2011, 22:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2011, 22:32
Помогаю со студенческими работами здесь

Вывести все символы, не встречающиеся в тексте
Здравствуйте.Нужна помощь, нужно написать на php это задание, я не знаю как, даже не представляю....

Вывести все символы встречающиеся в тексте
В файле набрать текст. Вывести все символы встречающиеся в тексте.. Нужна процедура!

Вывести все символы встречающиеся в тексте 2 раза.
В файле f1 набран текст Вывести все символы встречающиеся в тексте 2раза программу оформить в виде...

Вывести на экран все встречающиеся в тексте доменные имена
Дан текст. Вывести на экран все встречающиеся в данном тексте доменные имена (имена в формате...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru