2> Генерування всіх понять
В
Для реалізації даного завдання на Pascal'е вводимо такі типи даних і змінних:
1) тип k - покажчик на запис, поля якої: s - буде містити поняття; p - кількість елементів у понятті; next - посилання на наступне поняття;
2) змінні f, pot типу k; f - вказує на перше поняття, тобто на просте поняття *; pot - поточний поняття;
3) масив str1 типу k - буде містити посилання на кожне поняття в складеному понятті;
program dyscretics_optimisation (input, output);
uses crt;
const
max = 12;
r: byte = 0;
type
k = ^ el;
El = record
S: string;
P: 1 .. Max-1;
Next: k
End;
Label met;
Var
Pot, f, l: k;
Str1: array [1 .. Max] of k;
Pow: 2 .. Max;
K1, i, j, ll: 1 .. Max;
Sum: 0 .. Max;
Fil: text;
Ki : string [2];
begin
Readln ( POW ); { вводимо кількість простих понять }
Str (POW, ki);
Assign ( fil , ki + '. mvp '); { отримані поняття будемо записувати в файл, що містить у своєму імені кількість елементів множини і з розширенням В«. mvp В» }
Rewrite ( fil );
New ( f ); { виділяємо пам'ять під перше поняття }
Pot: = f;
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 i> { поки кількість елементів у новому понятті менше розмірності підзадачі, виконати }
{ Додати в поняття подпонятіе з номером k 1}
Sum : = sum + s...