• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите, пожалуйста, с написанием программы на Паскале

  • Автор темы Автор темы romka91
  • Дата начала Дата начала

romka91

Ученик
Регистрация
22 Ноя 2009
Сообщения
2
Реакции
0
Баллы
0
Помогите, пожалуйста, с написанием программы на Паскале

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

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

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



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

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

:-)]

;--

-)

::-(

:-()

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



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

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

Ну хорошо, будем считать, что это длина не строки, а текста в целом. Тогда решение сводится к последовательному считыванию строк с последующим перебором комбинаций символов между пробелами с отсевом "неправильных". Нудная, рутинная программа. Может быть, Вы всё-таки сами? А?
 
сам-то постараюсь, ну просто строка берется из текста...
а можно пожалуйста сам цикл только, а остальное уже навешу...просто не совсем понимаю что там должно быть
 
Ладно, держите вариант решения. Здесь применен следующий метод: исходный текст располагается в файле 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.
 
Назад
Сверху