Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 22.11.2009, 14:03   #1 (permalink)
romka91
Новичок
 
Регистрация: 22.11.2009
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите, пожалуйста, с написанием программы на Паскале

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

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

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



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

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

:-)]

;--

-)

::-(

:-()

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



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

Старый 22.11.2009, 14:03
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Тут может содержаться интересующая вас информация

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

Старый 22.11.2009, 15:09   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Ну хорошо, будем считать, что это длина не строки, а текста в целом. Тогда решение сводится к последовательному считыванию строк с последующим перебором комбинаций символов между пробелами с отсевом "неправильных". Нудная, рутинная программа. Может быть, Вы всё-таки сами? А?
Vladimir_S вне форума   Ответить с цитированием
Старый 22.11.2009, 15:19   #3 (permalink)
romka91
Новичок
 
Регистрация: 22.11.2009
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

сам-то постараюсь, ну просто строка берется из текста...
а можно пожалуйста сам цикл только, а остальное уже навешу...просто не совсем понимаю что там должно быть
romka91 вне форума   Ответить с цитированием
Старый 22.11.2009, 16:46   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ладно, держите вариант решения. Здесь применен следующий метод: исходный текст располагается в файле 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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.