IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Форматирование исходников, Паскаль-программ
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Вот я опять и появился. Теперь у меня задание еще более интересное. Смысл следующий: есть текстовый файл с исходником программы на Паскале, нужно-
1) первые буквы служебных слов сделать заглавными
2) текст комментариев заменить на их номер по порядку
3) переписать текст в новый файл с удалением лишних пробелов.
Я понимаю, что тут может быть только один путь решения: создать массив (или множество) служебных слов, затем считывать текст файла посимвольно (т.к. служебные слова обязательно должны быть отделены от других пробелами или знаками препинания). Я прав? С комментариями попроще: просто найти символ '{' и проверить следующий после него, и если это не '$' то удалить все символы начиная с этого до символа '}'. Удаление пробелов еще проще. Но с первой частью задания у меня небольшие трудности. Решайте! :yes:

В следующий раз давайте более подходящий заголовок


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата(Jaxx @ 6.04.05 11:26)
Но с первой частью задания у меня небольшие трудности. Решайте! :yes:

Посмотри вот эту мою программку... Программа форматирования Паскаль-программ
Может, она натолкнет тебя на идею? ;) Кстати, я выкладывал на форум и программу удаления комментариев. Попробуй поискать и чуть-чуть подправить ее ...

Кстати, не все так просто:
Цитата
С комментариями попроще: просто найти символ '{' и проверить следующий после него, и если это не '$' то удалить все символы начиная с этого до символа '}'.
Есть еще комментарии вида "(* ... *)" smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Насчет (* *) я знаю. Тут смысл будет такой же, только символы другие. А тему я правильно назвал, ибо редактироваться будет текстовый файл, а не исходник. А что если первое задание поменять на немного другое: вывести на экран использованные в тексте служебные слова и для каждого из них вывести количество вхождений в текст.


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Jaxx @ 6.04.05 11:44)
Насчет (* *) я знаю. Тут смысл будет такой же, только символы другие.
А ты в курсе, что есть Nested Comments, что усложняет работу? Ты бы попробовал, а потом посмотрим, просто это, или не очень...

Цитата(Jaxx @ 6.04.05 11:44)
А тему я правильно назвал, ибо редактироваться будет текстовый файл, а не исходник.
Но это не просто текстовый файл, а файл содержащий исходник паскаль-программы. Или тебе не важно, что твоя программа НЕ будет компилироваться после обработки? А если важно, то тема должна называться так, как она называется сейчас...

Цитата(Jaxx @ 6.04.05 11:44)
А что если первое задание поменять на немного другое: вывести на экран использованные в тексте служебные слова и для каждого из них вывести количество вхождений в текст.
Это катастрофически упрощает задачу, т.к. тебе не надо заменять слова в тексте, а достаточно просто запомнить их...
А вот прежде чем запостить что-нибудь, надо решить, что ИМЕННО тебе нужно. Потому как если ты и далее будешь менять условия, то зачем надо начинать думать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Ладно, я все понял. Условие задачи остается начальное. У меня основная сложность заключается в поиске служебных слов. Я составил массив этих слов и массив разделителей (пробел, точка, точка с запятой и т.д.), но не знаю как в массив разделителей добавить знак конца строки и табуляции. Во-вторых, у меня вот какой вопрос (сразу говорю - тупой), файловую переменную какого типа нужно брать- Text? А вашу программку еще не смотрел - я на работе, а тут Паскаля нетути.


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Jaxx, привет! Почти год тебя не было! С возвращением! :thanks:

Цитата
файловую переменную какого типа нужно брать- Text?

Да в принципе любую, но с TEXT будет проще работать smile.gif
Так что ее.

Цитата
но не знаю как в массив разделителей добавить знак конца строки и табуляции.

Ну во-первых проще взять множетсво (и работать с ним проще будет в данном случае, и памяти меньше съест smile.gif )
Во-вторых - зачем тебе знак конца строки? такого нету вообще smile.gif

Что до задачи, то алгоритм можно такой выбрать - разбить текс на слова (алгоритм ф FAQ"e моджернизировать что бьы только слова зарезервированные - из списка брал).
И делаешь по заданию.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Привет и тебе, OlegZ !!! :thanks:
У меня ни на что нет времени. Значит, переменная будет Text. Понял. Насчет конца строки тоже понял. А что с табуляцией? Как ее в массив (множество) записать?


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Я тут вот чего-то написал, правда нифига не работает. Гляньте, да поправьте, а то вроде с виду все должно работать (по крайней мере. идея симпатичная).

uses crt;
const
 cycle:array[1..11] of string=('do','downto','else','for','if','in','repeat','then','to','until','while');
 base:array[1..12] of string=('begin','else','end','function','goto','label','not','or','procedure','program','uses','var');
 spec1:array[1..8] of string=('and','asm','constructor','destructor','external','forward','implementation','inline');
 spec2:array[1..7] of string=('interface','interrupt','nil','object','shl','shr','packed');
 types:array[1..9] of string=('array','case','const','file','record','set','string','type','unit');
 math:array[1..6] of string=('div','mod','of','or','with','xor');
 direct:array[1..6] of string=('absolute','assembler','far','near','private','virtual');
 symbols:array[1..14] of char=('{','}','(',')','=',' ',';',':','+','-','/','*','.',',');
var
 f,f_new:text;
 s,s1:string;
 i:byte;
 kol:byte;
 mas:array[1..59] of string;
 mas2:array[1..59] of byte;
 temp:array[1..59] of string;

procedure massiv(cycle,base,spec1,spec2,types,math,direct:array of string);
var mas2:array [1..59] of byte;
   begin
   for i:=1 to 59 do
    temp[i]:='';
   for i:=1 to 11 do
    mas[i]:=cycle[i];
    for i:=11 to 23 do
    mas[i]:=base[i];
    for i:=23 to 31 do
    mas[i]:=spec1[i];
    for i:=31 to 38 do
    mas[i]:=spec2[i];
    for i:=38 to 47 do
    mas[i]:=types[i];
    for i:=47 to 53 do
    mas[i]:=math[i];
    for i:=53 to 59 do
    mas[i]:=direct[i];
   for i:=1 to 59 do
   mas2[i]:=kol;
end;

begin
clrscr;
 writeln('Vvedite imya faila: ');
 readln(s);
 assign(f,s);
 {$I-} reset(f); {$I+}
  if ioresult<>0 then writeln('Cannot open file to read!');
 writeln('Vvedite imya novogo faila: ');
 readln(s1);
 assign(f_new,s1);
 {$I-} rewrite(f_new); {$I+}
  if ioresult<>0 then writeln('Cannot create file to input!');
  massiv(cycle,base,spec1,spec2,types,math,direct);
  s:=''; s1:='';
  i:=0; kol:=0;
 while not seekeof(f) do begin
readln(f,s);
massiv(cycle,base,spec1,spec2,types,math,direct);
 if s=symbols[i]+mas[i]+symbols[i] then begin
    mas2[i]:=kol+1;
    writeln('slovo' ,mas[i],' vstrechaetsia ',mas2[i],' raz');
    end;
 end;
readln;
end.



--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Ну так что, никто мне не поможет?! Скажите, в где у меня ошибка! Только не говорите, что в генах...Главная проблема - в поиске и определении служебных слов. Остальное - сам справлюсь (по крайней мере постараюсь).

Сообщение отредактировано: Jaxx -


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Jaxx, ты ходил по первой ссылке, которую я тебе дал? Там что, по-твоему служебные слова для красоты в массив собраны? Наверное не просто так, а все-таки там тоже ищутся вхождения служебных слов. Читается файл строка за строкой, каждая строка разбивается на токены, и проверяешь, является ли очередной токен служебным словом. Как - смотри в том исходнике...

А в твоей программе есть проблема:

const
base:array[1..12] of string=('begin','else','end','function','goto','label','not',
'or','procedure','program','uses','var');
spec1:array[1..8] of string=('and','asm','constructor','destructor','external',
'forward','implementation','inline');
...
procedure massiv(cycle,base,spec1,spec2,types,math,direct:array of string);
...
begin
...
for i:=11 to 23 do
 mas[i]:=base[i]; { а что, в Base имеется элемент с индексом > 12 ??? }
for i:=23 to 31 do
 mas[i]:=spec1[i]; { а в Spec1 - с индексом > 8 ??? }
...
{ и так далее... }
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


А зачем разбивать на слова?
вот еще способ без разбиения, прога во всех зарез. словах первую букуву делает большой.
var
zar:array[1..51] of string[15];

function progwork(s:string):string;
var
i:integer;  n:byte;
begin
for i:=1 to 51 do  if pos(zar[i],s)<>0 then begin
 n:=pos(zar[i],s);
 s[n]:= upcase(s[n]);
end;
progwork:=s;
end;

var
f,f1:text; s:string;
begin
zar[1]:='and'; zar[2]:='asm';zar[3]:= 'array';zar[4]:= 'begin';zar[5]:= 'case';
zar[6]:= 'const';zar[7]:= 'constructor';zar[8]:= 'destructor';zar[9]:= 'div';zar[10]:= 'do';
zar[11]:= 'downto';zar[12]:= 'else';zar[13]:= 'end';zar[14]:= 'exports';zar[15]:= 'file';
zar[16]:= 'for';zar[17]:= 'function';zar[18]:= 'goto';zar[19]:= 'if';zar[20]:= 'implementation';
zar[21]:= 'in';zar[22]:= 'inherited';zar[23]:= 'inline';zar[24]:= 'interface';
zar[25]:= 'label';zar[26]:= 'library';zar[27]:= 'mod';zar[28]:= 'nil';zar[29]:= 'not';
zar[30]:= 'object';zar[31]:= 'of';zar[32]:= 'or';zar[33]:= 'packed';zar[34]:= 'procedure';
zar[35]:= 'program';zar[36]:= 'record';zar[37]:= 'repeat';zar[38]:= 'set';zar[39]:= 'shl';
zar[40]:= 'shr';zar[41]:= 'string';zar[42]:= 'then';zar[43]:= 'to';zar[44]:= 'type';zar[45]:= 'unit';
zar[46]:= 'until';zar[47]:= 'uses';zar[48]:= 'var';zar[49]:= 'while';zar[50]:= 'with';zar[51]:= 'xor';
readln(s);
assign(f,s);
assign(f1,'D:\temp1.pas');
{$i-}reset(f);{$i+}
If IOresult<>0 then begin writeln('error'); readln; halt; end;
rewrite(f1);
repeat
 readln(f,s);
 writeln(f1,progwork(s));
until eof(f);
close(F); close(f1);
end.



--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата(Oleg_Z @ 12.04.05 14:54)
прога во всех зарез. словах первую букуву делает большой.

:no: "Во всех зарезервированных словах, записанных только маленькими буквами". А если "FUNCTION a: integer", то что будет с FUNCTION ?

P.S. Вроде типизированные константы еще не отменили ... unsure.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Между прочим, OlegZ, твоя программа работает неправильно. Проверь сам. Ты пропустил проверку зарезервированных слов. То есть, после твоей проги из слова begin получается слово begIn и т.д. Нужно проверить, стоит ли слово отдельно, какие символы и знаки препинания стоят перед ним и после него.
Точнее, после знаков препинания все работает замечательно, а вот если зарезервированное слово входит в состав другого слова - blink.gif

Сообщение отредактировано: Jaxx -


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Цитата(Jaxx @ 12.04.05 16:27)
после знаков препинания все работает замечательно, а вот если зарезервированное слово входит в состав другого слова -  blink.gif

Oleg_Z, вот и ответ на твой вопрос:
Цитата(Olez_Z @ 12.04.05 14:54)
А зачем разбивать на слова?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Вот в этом то и моя проблема. Как проверить, является ли слово действительно зарезервированным. Каким образом проверить символ, идущий перед этим словом и после него?

Сообщение отредактировано: Jaxx -


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Ты меня понимать не хочешь? Я же тебе привел ссылку на рабочий код, который корректно определяет зарезервированные слова, что еще нужно?

Что-то по-моему, тема становится переливанием из пустого в порожнее... Я решение предлагаю - следует вопрос, "а как же это реализовать?"... Я еще раз повторяю - опять "В этом моя проблема".
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Кстати, если функцию progwork, написанную Oleg_Z чуть-чуть подредактировать, то она будет работать гораздо более корректно:
function is_letter(ch: char): boolean;
begin
 is_letter := ch in ['a'..'z', 'A'..'Z', '_'];
end;
function progwork(s:string):string;
var
 i:integer;
 prev_n, n:byte;
 before, after: integer;
begin
 for i:=1 to 51 do begin
   prev_n := 0;
   repeat

     n := pos(zar[i], s);
     if prev_n = n then break;
     before := n - 1;
     after := n + length(zar[i]);

     if n <> 0 then begin
       if ( (before >= 1) and is_letter(s[before]) ) or
          ( (after <= length(s)) and is_letter(s[after]) ) then
       else s[n]:= upcase(s[n]);
     end;
     prev_n := n

   until n = 0;
 end;

 progwork:=s;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Ну раскритиковали smile.gif
Я шаблон для рассуждений дал smile.gif
такие элементы как BegIn легко устраняются путем изменения кода. (проверять на вхождениеодного словав другое).
Так что разбивать на слова необязательно smile.gif

Цитата
Во всех зарезервированных словах, записанных только маленькими буквами". А если "FUNCTION a: integer", то что будет с FUNCTION ?

Ну для этого добавить в программуфункцию:

Код
Function UpStr(S:String):String; {перевод строки в верхний регистр}
Var I:Byte;
Begin
For I:=1 To ORD(S[0]) Do
Begin
 Case S[I] Of
  'a'..'z':S[I]:=Chr(Ord(S[I])-$20);
  'а'..'п':S[I]:=Chr(Ord(S[I])-$20);
  'р'..'я':S[I]:=Chr(Ord(S[I])-$50)
 End
End;
UpStr:=S
End;

И вот эти строчки:
Код
for i:=1 to 51 do  if pos(zar[i],s)<>0 then begin
n:=pos(zar[i],s);
s[n]:= upcase(s[n]);

Заменитиь на:
Код
for i:=1 to 51 do  if pos(UpStr(zar[i]),ipstr(s))<>0 then begin
n:=pos(Upstr(zar[i]),upstr(s));
s[n]:= upcase(s[n]);

smile.gif
Хотя возникает вопрос -если уже в большом регистре слово, зачем первую букву поднимать? smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


А в моём варианте проги, кроме заполнения массива есть ещё какие-нибудь ошибки? Если да, то покажите... :p2:


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






blink.gif А ты проверь, работает она, или нет.
Если работает, то нет ошибок. Или ты думаешь мы как-то по другому будем определять ее корректность?
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.05.2024 1:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name