Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите, пожалуйста, с написанием программы на Паскале (http://www.tehnari.ru/f41/t30446/)

romka91 22.11.2009 14:03

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

Смайликом будем считать последовательность символов, удовлетворяющую условиям:

первым символом является либо ; (точка с запятой) либо : (двоеточие) ровно один раз
далее может идти символ – (минус) сколько угодно раз (в том числе символ минус может идти ноль раз)
в конце обязательно идет некоторое количество (не меньше одной) одинаковых скобок из следующего набора: (, ), [, ].
внутри смайлика не может встречаться никаких других символов.
Например, нижеприведенные последовательности являются смайликами:



;---------[[[[[[[[

в то время как эти последовательности смайликами не являются (хотя некоторые из них содержат смайлики):

:-)]

;--

-)

::-(

:-()

В этой задаче надо будет посчитать количество смайликов, содержащихся в данном тексте.



Вводится одна строка текста, которая может содержать маленькие латинские буквы, пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает 100 000 символов.
заранее спасибо

Vladimir_S 22.11.2009 15:09

Цитата:

Сообщение от romka91 (Сообщение 263503)
Длина строки не превышает 100 000 символов.

Сколько символов?!! Вообще-то я до сих пор считал, что Паскаль поддерживает строки длиной не более 255 символов. Ну-ну...

Ну хорошо, будем считать, что это длина не строки, а текста в целом. Тогда решение сводится к последовательному считыванию строк с последующим перебором комбинаций символов между пробелами с отсевом "неправильных". Нудная, рутинная программа. Может быть, Вы всё-таки сами? А?

romka91 22.11.2009 15:19

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

Vladimir_S 22.11.2009 16:46

Ладно, держите вариант решения. Здесь применен следующий метод: исходный текст располагается в файле D:\x . В ходе выполнения программы создаются вспомогательные файлы D:\x1, D:\x2 и D:\x3, которые после использования уничтожаются. Алгоритм:
1. Все "слова" (последовательности символов между пробелами) располагаются в файле х1 каждое в своей строке.
2. Отбираются и переписываются в файл х2 (тоже построчно) те, которые первым символом имеют ":" или ";", а вторым "-", "(", ")", "[" или "]".
3. В файле х3 осуществляется окончательный отбор по указанным в задаче признакам.
4. Подсчитывается количество строк в файле х3 - это и есть искомое число.

Естественно, пути и имена файлов Вы можете подставить свои.

Код:

VAR
 f,f1:TEXT;
 c:CHAR;
 S:STRING;
 i:BYTE;
 SUM:WORD;

BEGIN
 SUM:=0;
 Assign(f,'D:\x');
 ReSet(f);
 Assign(f1,'D:\x1');
 ReWrite(f1);
 REPEAT
  Read(f,c);
  IF c<>' ' THEN Write(f1,c) ELSE WriteLn(f1);
 UNTIL EoF(f);
 Close(f);
 Close(f1);

 Assign(f,'D:\x1');
 ReSet(f);
 Assign(f1,'D:\x2');
 ReWrite(f1);
 REPEAT
  ReadLn(f,S);
  IF ((S[1]=':') OR (S[1]=';')) AND
    ((S[2]='(') OR (S[2]=')') OR (S[2]='[')
    OR (S[2]=']') OR (S[2]='-')) THEN WriteLn(f1,S);
 UNTIL EoF(f);
 Close(f);
 Close(f1);
 Erase(f);

 Assign(f,'D:\x2');
 ReSet(f);
 Assign(f1,'D:\x3');
 ReWrite(f1);
 REPEAT
  ReadLn(f,S);
  IF (S[2]='(') OR (S[2]=')') OR (S[2]='[')
    OR (S[2]=']') OR (S[2]='-') THEN
  BEGIN
    c:=S[2];
    i:=2;
    REPEAT
    INC(i);
    UNTIL (S[i]<>c) OR (i=Length(S));
    IF (c<>'-') AND (i=Length(S)) THEN WriteLn(f1,S);
    IF (c='-') AND (i<Length(S))
    AND ((S[i]='(') OR (S[i]=')') OR (S[i]='[')
      OR (S[i]=']'))THEN
    BEGIN
      c:=S[i];
      REPEAT
      INC(i);
      UNTIL (S[i]<>c) OR (i=Length(S));
      IF (S[i]=c) AND (i=Length(S)) THEN WriteLn(f1,S);
    END;
  END;
 UNTIL EoF(f);
 Close(f);
 Close(f1);
 Erase(f);

 Assign(f,'D:\x3');
 ReSet(f);
 REPEAT
  ReadLn(f,S);
  INC(SUM);
 UNTIL EoF(f);
 Close(f);
 Erase(f);

 WriteLn('Text contains ',SUM,' smiles');
 ReadLn;
END.



Часовой пояс GMT +4, время: 03:27.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.