1.Текст программы на Паскале хранится в файле на диске. Составить программу обработки текста программы: а)определить максимальную степень вложенности циклов в программе; б)определить общее количество строк и количество символов, отличных от пробела; в)удалить из текста программы все комментарии.
2.Текст программы на Паскале хранится в файле на диске. Составить программу обработки текста программы: а)первые буквы служебных слов сделать заглавными; б)текст комментария заменить на номер комментария по порядку; в)переписать текст программы в новый файл с минимальным количеством пробелов, сохранив их только там, где они необходимы.
3.Текст программы на Паскале хранится в файле на диске. Распечатать на экране текст программы таким образом, чтобы в каждой строке размещался только один оператор. Организовать смещение операторов относительно операторных скобок, как это принято в Паскале.
Помогите сделать какую-нибудь одну !
 
 
 
 
  Первая, на мой взгляд, самая простая.
А циклы в ней имеются в виду все или конкретно какие-то. (for, while, repeat)
 
 
 
 
  Я думаю, что нужна степень вложенности по каждому типу циклов, то есть вывести на экран по FOR - столько-то циклов, по WHILE - столько и т.д.
Добавлено (14.05.04 21:00):
Жду дапамоги хоть по первой, а то свою курсовую я сюда уже закинул, чтобы помогли, а до этого мне еще одну из этих трех надо сдать, чтобы до курсовой собственно допустили.
 
 
 
 
  первая пока
Код
{
1.Текст программы на Паскале хранится в файле на диске. Составить программу
 обработки текста программы:
+ а)определить максимальную степень вложенности циклов в программе;
 б)определить общее количество строк и количество символов,отличных от пробела;
 в)удалить из текста программы все комментарии.
}
Program Format_Text_Program_Pascal;
Uses CRT;
var
 F,f2:text; {файл с текстом программы}
 filename:string; {путь к файлу}
 s:string; {читаемая строка из файла}
 NZ,i,ii,j,k,stringys,charsys:byte;
 z:boolean;
 c:char;
 koment:boolean;
 {-------------------}
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;
{PROGRAM BEGIN ...}
Begin
 repeat
  ClrScr;
  Writeln('Введите путь к файлу');
  readln(filename);
  Assign(f,filename);
  {$I-} Reset(f); {$I+}
 until IOResult=0;  {повторяем если произошла ошибка}
 While NOT EOF(F) do
 begin
  ReadLn(f,s);
  Inc(stringys);
  {Ищем символы исчитаем их}
  For k:=1 to Ord(s[0]) do If s[k]<>' ' then inc(chsrsys);
  {для избежания ошибок приводим строку к верхнему регистру}
  s:=UpStr(s);
  For I:=1 to ORD(S[0]) do
  begin
   If ((s[i]='F') and (s[i+1]='O') and (s[i+2]='R')) or
      ( (s[i]='W') and (s[i+1]='H') and (S[i+2]='I') and (s[i+3]='L')
         and (s[i+4]='E')) or
      ( (s[i]='R') and (S[i+1]='E') and (S[I+2]='P') and (S[I+3]='E')
         and (s[i+4]='A') and (s[i+5]='T') then
   begin
    {Значит цикл "открылся"}
    j:=i+1;   {запомним, где цикл отрылся, а на 1 больше, чтобы потом заново
    его не посчитать }  Inc(NZ); {увелич. счетчик вложенности циклов}
    For ii:=j to ORD(s[0]) do
    begin
     If ((s[ii]='E') and (s[ii+1]='N') and (s[ii+2]='D')) or
        ((s[ii]='U') and (S[ii+1]='N') and (S[ii+2]='T') and
         (s[Ii+3]='I') and (s[ii+4]='L')) then
     begin
      {цикл "закрылся"}
      Dec(NZ)
     end
    end
   end
  end
 end; CLose(F);
 Writeln('Информация о файле . . . . . . . . . . . . . .',filename);
 Writeln('Вложенность циклов равна . . . . . . . . . . .',NZ);
 Writeln('Колическво строк равно . . . . . . . . . . . .',stringys);
 Writeln(Количество символов, отличных от пробела равно ',charsys);
 Writeln('-------------------------------------------------------');
 writeln;
 writeln('сейчас файл будет перезаписан - из него будут удалены коментарии');
 Assign(f2,'datafile.tmp');
 Rewrite(f2);
 Reset(f);
 While not Eof(f) do
 begin
  read(f,c);
  If c= '{' then  koment:=true;
  If (c=('}') and (koment=true) then koment:=false;
  If koment=false then write(f,c)
 end;
 Close(f); Close(f2);
 Erase(f);
 Rename(f2,filename);
 Writeln('Программа выполнена.');
end.
  
 
 
 
  Комментарии могут еще обозначаться так:
Код
(* cvbcxvhdfg *)
  
 
 
 
  Да, вот это проблемма, я забыл про это.
(Кто же додумался коментарии двумя символами делать. Ох уж эти борландцы)
 
 
 
 
  Я думаю, что комментарии типа (*  *) можно не учитывать, так как мы таких не нигде не видели и нам не говорили о них.
 
 
 
 
  Ну тогда как следует протестируйте эту прогу, я ее не проверял.
(писал в блокноте)
 
 
 
  trminator
  15.05.2004 22:44
  
 
  Код
(***************************************
 * Такие комментарии встречаются
 * достаточно часто: очень стильно
 * выглядит комментарий на несколько
 * строк, оформленный так. Он выделяется
 * в коде даже без подсветки =)
 ***************************************)
  
 
 
 
  Oleg_Z несколько замечаний...
1. интересно, а что твоя прога скажет насчет такой вложенности?
Код
for i:=1 to n do
  for j:=1 to m do
    while x<z do inc(x);
2. после inc(nz) наверное надо вставить строчку
  if maxnz<nz then maxnz:=nz; 
и выводить соответственно...
3. если уж не нравится length(s), то и ord(s[0]) не используй, пиши уж byte(s[0]) - так вообще никаких функций не вызывается 

4. вместо конструкций if (s[i]='A') and (... проще написать
  if copy(s,i,5)='WHILE' then ...
конструктивные предложения будут чуть попозже...
 
 
 
 
 
  1. Да он не правильно посчитает.
2. не уверен, надо попробовать
3. хорошо, это просто привычка, что б ее...  
 4. Я не любля встроенных функций и процедур, вы же меня знаете, мне лишь бы что то переделать.  
 Цитата
конструктивные предложения будут чуть попозже... 
Посмотрим, может будет намного лучше моего варианта. 
Я вообщем подозревал, что с вложенностью будут проблеммы.
 
 
 
 
 
  а я люблю компактность + читабельность, поэтому лучше так: s[i]+s[i+1]+s[i+2]='END'  
  
 
 
 
  у меня вообще со всем проблемы (если это кого-то интересует).
я тут откопал исходник программы которая очень красиво форматирует по ширине, но она делает текст с переносами. между прочим в прямом смысле, т.е.
делит слова по слогам (не совсем правильно конечно), ставит знак переноса и кидает его на следующую строку. исходник если надо могу скинуть по e-mail
а тут поместить не решусь, ибо занимает он около 850 строк.
 
 
 
 
  короче, надо кроме for и while считать еще и beginы циклов и отдельно остальные beginы, чтоб в endах не запутаться...
 
 
 
 
  форматирование текста по ширине путем вставки пробелов - это вообще элементарная задача, с переносами конечно посложнее, но не намного, главное правила переноса слов повторить по русскому 

, или воспользоваться словарями ворда
 
 
 
 
 
  это для вас задача элементарная. а мне месяц мучений над задачей сократил жизнь наверное на 3 года долгой и счастливой жизи.
 
 
 
 
  Цитата
. а мне месяц мучений над задачей сократил жизнь наверное на 3 года долгой и счастливой жизи. 
Задачи еще никого не кусали и не убивали  
 Программа форматирования текста по ширине лежит готовая здесь:
http://forum.pascal.net.ru/index.php?showtopic=1949Только надо строку пробелами дополнить? Или и так пойдет?
 
 
 
 
 
  А насчет вложенности циклов никаких реализаций кроме 
Oleg_Z нету??
Попробовал написать для неформатированного просто дофига просчета и условий. Может быть стоит его сначала отформатировать по правилам, что-то типа:
1. For i:=1 to 12 do 
begin
end;
2. While i<9 do
begin
end;
3. Repeat
Until KeyPressed;
В том плане, что при последующей обработке мы знали что по любому, для первого случая: если после do что-то есть, то цикл FOR без конструкции begin/end. Тоже самое для остальных;
Также не стоит забывать слово CASE и, вероятно, еще какие-нибудь, ща не помню  

 в том плане, что оно дает нам END.
Первоначально я использовал принцип нисходящего массива для регистрации текущих циклов и глобальную переменную LOOP, обозначающую признак первичного массива, так что насчет ЛЕГКОМЫСЛЕННЫХ ЗАЯВЛЕНИЙ по поводу простоты первой задачи стоит очень подумать...
В целом свой алгоритм я выложил...а задача интересная.
 
 
 
 
 
  Цитата
так что насчет ЛЕГКОМЫСЛЕННЫХ ЗАЯВЛЕНИЙ по поводу простоты первой задачи стоит очень подумать...
Согласен с вами. Я думаю, что если бы это задание было простым, здесь уже вариантов 10 лежало. А то только мой, и то плохенький.
Цитата
В целом свой алгоритм я выложил...а задача интересная. 
Опять-таки согласен с вами, GLuk, мне кажется, что все алгоритмы, касающиеся обработки текста, очень интересны.
 
 
 
 
 
  Oleg_Z: Обращайся ко мне пожалуйста на ТЫ, на ВЫ конечно приятно, но чуть пафосно.. 
 Все остальные задания простые, только не догнал краями насчет третьей задачи;
"Организовать смещение операторов относительно операторных скобок, как это принято в Паскале"
Что это значит??
Паскаль изучал далеко не по школьной программе, может по этому?
 
 
 
 
 
  GLuk, скорее всего имется в виду "красивое" расположение операторов.
Пример:
было
Код
for i:=1 to 10 do
Begin
k:=1;
While k<10 do
Inc(a);
End;
стало
Код
for i:=1 to 10 do
Begin
  k:=1;
  While k<10 do
    Inc(a);
End;
  
 
 
 
  Господин APAL прав. Именно это и означает смещение операторов. В принципе, мне нужно обязательно: задача форматирования текста по ширине и одна из этих трех (но точно правильно сделанные). Это по учебному плану требуется, а то через 10 дней сессия начинается, а я еще работы не сдал и курсач. А все остальное по желанию.
 
 
 
 
  Цитата(Jaxx @ 18.05.04 12:02)
 Господин APAL прав. Именно это и означает смещение операторов. В принципе, мне нужно обязательно: задача форматирования текста по ширине и одна из этих трех (но точно правильно сделанные). Это по учебному плану требуется, а то через 10 дней сессия начинается, а я еще работы не сдал и курсач. А все остальное по желанию. 
Ну если хватит и одной, лови...
Надеюсь удаление комментариев добавишь сам. Самая простая вроде бы  ;)
 
 
 
   
  Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, 
нажмите сюда.