Курсовая работа: Некоторые способы разбиения множеств

F^. S :='*'; {и инициализируем его }

F ^. P :=1;

New ( f ^. next ); {выделяем память под второе понятие }

Pot:=f^.next;

Pot ^. s :='(*)'; {и также его инициализируем }

Pot^.p:=1;

Pot^.next:=nil;

for i:=2 to POW do begin { основной цикл программы }

For j :=1 to i do str 1[ j ]:= f ; {устанавливаем начальные указатели понятия, размерности і, на первое понятие }

If i = POW then str 1[1]:= f ^. next ; {если і равно количеству элементов множества, то необходимо изменить указатель на первое подпонятие нашего понятия, так как уже отмечалось выше, понятие, состоящее только из простых подпонятий выводить не надо. Но, такие понятия оставляем для подзадач меньшей размерности, так как в комбинации с решениями других подзадач, получим уже понятие, содержащее не только простые понятия }

While str 1[1]<> nil do begin {пока указатель первого подпонятия не достигнет конца списка подпонятий выполнять }

New ( pot ^. next ); { выделить память под очередное понятие }

Sum :=0; {эта переменная служит в качестве счётчика, который после следующего цикла будет содержать количество элементов в новом понятии }

K 1:=1; {номер первого подпонятия. Первое подпонятие имеет всегда, если можно так выразиться, «более поздний адрес», или, точнее, все подпонятия, следующее за первым, получены раньше или одновременно с ним. Это также касается второго подпонятие относительно третьего, четвёртого и т. д. , третьего относительно четвёртого, пятого и т. д., и т. д. }

If i = pow then pot ^. next ^. s :='' else pot ^. next ^. s :='('; { если і равно количеству элементов множества, то нам не нужны скобки в начале (их договорились опустить) }

While sum < i do begin {пока количество элементов в новом понятии меньше размерности подзадачи, выполнить }

Pot ^. next ^. s := pot ^. next ^. s + str 1[ k 1]^. s ;{добавить в понятие подпонятие с номером k 1}

Sum := sum + str 1[ k 1]^. p ; {добавить размерность, добавленного подпонятия }

Inc ( k 1); {увеличить k 1 на 1 }

End ;

If ( sum > i ) or ( k 1=2) then begin {если количество элементов полученного понятия больше размерности задачи или k 1=2, то есть добавлено только одно понятие в подпонятие, то, чтобы избежать лишних скобок и неправильных решений выполнить }

Dispose ( pot ^. next ); {освободить память, занимаемую этим «неправильным» понятием }

Pot ^. next := nil ;{указать, что предыдущее понятие было последним }

If k 1=2 then break {если k 1=2, то выйти из основного цикла программы }

End

Else begin

If i = POW then begin {если размерность текущей подзадачи равна размерности основной задачи, то }

Writeln ( fil , pot ^. next ^. s ); {записать понятие в файл }

Writeln ( pot ^. next ^. s ); {и вывести на экран }

К-во Просмотров: 329
Бесплатно скачать Курсовая работа: Некоторые способы разбиения множеств