Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Файлы и динамические списки


Автор: KasMP 7.5.2008, 18:50
Цитата
Дан текстовый файл, содержащий программу на языке Паскаль.
Создать модуль, содержащий все пользовательские функции, которые более одного раза вызывались в этой программе (вызовы в одном цикле считаются за один). Считать, что функции используют лишь стандартные типы данных.

Интересная задачка smile .

Я так понимаю, вся соль в том, что, например, у if есть веточки then и else (у case еще больше возможных веточек, но сути это не меняет) и, следовательно, будут использованы ВА, содержащиеся только в одной ветви каждой развилки; также могут быть циклы while, не выполнившиеся ни разу; еще некоторые ВА могут содержать в себе вызовы других ВА (но это нам узнать не удасться, т.к. самого модуля у нас нет -> придется не обращать на это внимание).

Есть еще какие-то подобные случаи? И при чем тут динамические списки smile ?

P.S.. Вообще я поздно узнала об этой задачке, сдавать мне ее уже не светит (вместо нее дали какую-то фигню в два счета!).
Но внутренняя сущность очень хочет найти решение smile . Давайте сделаем это вместе smile . Буду благодарна за участие smile .

Автор: Akina 10.5.2008, 22:05
Это с каких это пор If/Case стали циклами? Циклы - это For/Do (While - частный случай Do).

Автор: KasMP 10.5.2008, 23:07
Akina, я это прекрасно понимаю!!! Я ни в коем разе не говорила, что if/case - циклы.

Про if/case я говорила к тому, что возможна такая ситуация:
Код

if <условие1> then
    begin
    ...
    ВА1
    ...
    if <условие2> then
        begin
        ...
        ВА2
        ...
        end
      else
        begin
        ...
        ВА1
        ...
        end;
    ...
    ВА2
    ...
    end
  else
    begin
    ...
    ВА1
    ...
    end;

Условие1 верно, условие2 верно: ВА1 - 1 раз, ВА2 - 2 раза;
Условие1 верно, условие2 неверно: ВА1 - 2 раза, ВА2 - 1 раз;
Условие 1 неверно: ВА1 - 1 раз, ВА2 - 0 раз.

Т.е. условия пришли мне в голову всвязи с тем, что на каждой развилки будут использованы ВА, содержащиеся только в одной из ветвей; а развилки могут иметь подразвилки...
Пожалуйста, читайте внимательнее.

 smile  smile 

Автор: KasMP 12.5.2008, 14:02
up

Автор: Akina 12.5.2008, 14:34
Цитата(KasMP @  11.5.2008,  00:07 Найти цитируемый пост)
Пожалуйста, читайте внимательнее.

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

Автор: KasMP 12.5.2008, 14:52
Задание этого предполагать не может хотя бы потому, что тогда его сложность будет значительно ниже сложности задачек, обычно даваемых этим преподавателем (да и динамический список будет плохо увязываться с алгоритмом).
Цитата(Akina @  12.5.2008,  14:34 Найти цитируемый пост)
На самом деле Вы бы прекратили мудрить, а?

Может вы и побольше меня понимаете в задачках, но при этом все-таки остаетесь человеком, как и я. Никто не давал одному человеку права разговаривать в таком тоне с другим.
Пожалуйста, не надо так делать.

Автор: skyboy 27.5.2008, 01:19
Цитата(KasMP @  12.5.2008,  13:52 Найти цитируемый пост)
Задание этого предполагать не может хотя бы потому, что тогда его сложность будет значительно ниже сложности задачек

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

.*\(.*?\)

причем, замечание насчет циклов делает неважным синтаксический анализ файла(определение циклов), но определение строк все ещё необходимо: чтоб не считать вызовом функции нечто внутри строки.
вообще говоря, я бы сделал конечный автомат, который посимвольно бы обработал текст.
P.S. Совсем забыл, надо ещё декларацию функции не посчитать за вызов. 
т.е. 
Код

function\s*.*\(.*?\)

вызовом не считается.
Цитата(KasMP @  12.5.2008,  13:52 Найти цитируемый пост)
Никто не давал одному человеку права разговаривать в таком тоне с другим.

не заводись, не надо.
абсолютно никто здесь не пытается тебе нагрубить. Akina справдливо, хотя, возможно, и резковато, заметил, что ты сама себе усложняешь задачу, делая е` практически невозможной smile ну, по крайней мере, в данном случае. 
не надо считать, что "простые" задачи унижают твое достоинство.
надо просто решить - и все smile

Автор: KasMP 28.5.2008, 14:08
Женя, привет smile  smile !
Спасибо больше за хороший ответ smile, ты как всегда на высоте smile : и по теме написал, и почему так получается пояснил, и психологию "поправил" smile , и все это одновременно мягко и точно smile !

Пока отложу задачку до конца сессии smile . Потом решу smile  smile .

Автор: skyboy 28.5.2008, 16:03
кстати, насчет корректности условия.
вот у нас есть функция без параметров.
Код

somefunction;

как определить, что это - функция, если у нас нет текста объявления этой функции? а если это переменная? 
потому 
- либо надо добавить условие: вызов функции без параметров все равно должна сопровождаться "()"
- либо надо условиться не учитывать такие "сокращенные варианты" вызова
иначе - без (практически)компиляции не определишь(надо взять все uses и найти все объявленные функции и переменные-функции). не думаю, что вам ставили задачу написать полноценный лексический + синтаксический анализатор smile

Автор: KasMP 30.5.2008, 20:50
skyboy, продумаем все эти моменты (пока мы хотя бы разобрались с заданием smile ).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)