22.11.2009, 14:03 | #1 (permalink) |
Новичок
Регистрация: 22.11.2009
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите, пожалуйста, с написанием программы на Паскале
Смайликом будем считать последовательность символов, удовлетворяющую условиям: первым символом является либо ; (точка с запятой) либо : (двоеточие) ровно один раз далее может идти символ – (минус) сколько угодно раз (в том числе символ минус может идти ноль раз) в конце обязательно идет некоторое количество (не меньше одной) одинаковых скобок из следующего набора: (, ), [, ]. внутри смайлика не может встречаться никаких других символов. Например, нижеприведенные последовательности являются смайликами: ;---------[[[[[[[[ в то время как эти последовательности смайликами не являются (хотя некоторые из них содержат смайлики): :-)] ;-- -) ::-( :-() В этой задаче надо будет посчитать количество смайликов, содержащихся в данном тексте. Вводится одна строка текста, которая может содержать маленькие латинские буквы, пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает 100 000 символов. заранее спасибо |
22.11.2009, 14:03 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Тут может содержаться интересующая вас информация Проблемы с написанием программы на языке Турбо Паскаль Помогите написать программы в Паскале. Помогите, пожалуйста, с программой в Паскале Помогите, пожалуйста, исправить программку на Паскале |
22.11.2009, 15:09 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Сколько символов?!! Вообще-то я до сих пор считал, что Паскаль поддерживает строки длиной не более 255 символов. Ну-ну...
Ну хорошо, будем считать, что это длина не строки, а текста в целом. Тогда решение сводится к последовательному считыванию строк с последующим перебором комбинаций символов между пробелами с отсевом "неправильных". Нудная, рутинная программа. Может быть, Вы всё-таки сами? А? |
22.11.2009, 15:19 | #3 (permalink) |
Новичок
Регистрация: 22.11.2009
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
сам-то постараюсь, ну просто строка берется из текста...
а можно пожалуйста сам цикл только, а остальное уже навешу...просто не совсем понимаю что там должно быть |
22.11.2009, 16:46 | #4 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|