Скласти програму визначення мінімального числа квітів, необхідних для розфарбування карти довільної конфігурації таким чином, щоб країни з однаковою розфарбуванням не стикалися. Схему меж карти представити масивом. На зовнішніх файлах розташувати 3 - 4 схеми розташування країн. Підсумки представити у вигляді тексту із зазначенням обраних для кожної з країн квітів. Бажано завершити програму графічним додатком.
Змінні:
"num" - номер файла, що обирається користувачем.
"filen" - ім'я файлу.
"g [1 .. 100] - масив, який використовується" генератором перебору всіх варіантів "
"s: array [i, j]" - масив "зв'язків" показує, чи є зв'язок між країнами "i" і "j".
"n" - кількість квітів, що використовуються для розмальовки.
"max - максимально можливу кількість країн (визначається при зчитуванні даних).
"s1, s2, k, j, i, a" - змінні, для роботи "генератора".
"f, f1" - змінні для роботи з файлами.
"function get: integer;"
Функція зчитує поточне число, з файлу пов'язаного зі змінною - "f" і шукає Максимальна кількість з усіх лічених.
Поки рядок =''або символ є:
- Цифрою,
- "-",< Br />
- "."
зчитує символ.
Якщо символ є:
- Цифрою,
- "-",< Br />
- ".",
то він додається в рядок "s".
Рядок цифр "s" перетворюється в число. Якщо "max" менше числа, то "max" прирівнюється зовсiм небагато.
"function pr: boolean;"
Функція перевіряє, чи можна країну - i зафарбувати кольором - g [i] (Чи можна заглиблюватися по дереву).
Перебирає все розфарбовані країни (від "1" до "i-1") і порівнює кольору кожної з них з кольором країни "i".
"function gen (n: integer): boolean;"
Функція, що визначає можливість розмальовки країн "n"-м кол-вом квітів.
Кожному елементу масиву "g" присвоює значення рівне "0". Поточному номеру даної країни "i" задає значення "1".
Повторює дії:
Повторює дію:
До номером кольору даної країни додати "1" ( "g [i]: = g [i] 1;"), поки не можна країну "i" розфарбувати в колір "g [i]" або колір "i"-ї країни не більше числа "n". Якщо колір "i"-ї країни більше числа "n" то:
номером кольору розглянутої
країни прирівнює "0" і
знижує номер даної країни на "1".
Інакше підвищує номер даної країни на "1", поки номер даної країни не дорівнює "1" або номер даної країни не більше кількості країн.
Значення функції одно "True", якщо номер даної країни більше кількості країн.
Основна програма:
Виведення повідомлень користувачеві (див. робочу програму)
Запит номера файлу ( "num").
Виконуються дії в змінну "num" запитується символ натиснутою клавіші, якщо натиснута клавіша не від 1 до 3 то виводиться повідомлення про помилку поки не натиснута клавіша від 1 до 3.
Формується ім'я вихідного файлу filen: = 'input' + num + '. Txt'.
Повідомлення користувачу про вибраний файлі.
Зчитування даних
Відкриється файл "filen" для зчитування даних.
"max: = 0".
Кожній комірці масиву зв'язків привласнюється "брехня"
Поки файл не скінчився зчитуються пара країн, в масив зв'язків з індексами: [країна з меншим номером, з великим] присвоюється значення істина.
Закривається файл "filen".
Блок, який визначає мінімальну кількість квітів.
Початкова кількість квітів = 1.
Повторювати дії:
Підвищити кількість квітів на одиницю.
Ще не можлива розфарбування всіх країн даними кількістю квітів.
Запис даних.
Створити файл "Output.txt". Рахувати в нього кількість квітів. Вважати в нього список розмальовки країн. Закрити файл.
Текст програми
program mag;
uses
crt;
var
num: char;
filen: string;
g: array [1 .. 100] of integer;
s: array [1 .. 100,1 .. 100] of boolean;
max, s1, s2, j, n, i, a: integer;
f: file of char;
f1: text;
(Функція зчитує поточне число,
з файлу пов'язаного з пеpеменной - f. )
function get: integer;
var
k, c: integer;
s: string;
ch: char;
begin
s :=''; k: = 50;
while ((s ='') or (k = 43) or (k = 45) or ((k> 47) and (k
begin
read (f, ch); k: = ord (ch);
if (k = 43) or (k = 45) or ((k> 47) and (k
end;
val (s, c, k);
if max
get: = c;
end;
(Функція перевіряє, чи можна країну - i
зафарбувати кольором - g [i]. )
function pr: boolean;
var j: integer;
begin
pr: = true;
if i> 1 then
for j: = 1 to i-1 do
if s [j, i] then
if g [i] = g [j] then pr: = false;
end;
function gen (n: integer): boolean;
begin
for j: = 1 to max do
g [j]: = 0;
i: = 1;
repeat
repeat
g [i]: = g [i] +1;
until pr or (g [i]> n);
if (g [i]> n) then
begin
g [i]: = 0; i: = i-1;
end
else i: = i +1;
until (i = 1) or (i> max);
gen: = i> max;
end;
begin
clrscr;
writeln ( 'Haжміте цифру, що вказує номер файла');
writeln ( 'з якого будуть счтиваться дані.');
writeln ('');< br />
for i: = 1 to 3 do
writeln ( '', i, '- файл input', i, '. txt');
(Запpос номеp файлу.)
repeat
num: = readkey;
if not ((num = '1 ') or (num = '2') or (num = '3 ')) then
writeln ( 'Ви в чомусь помилилися');
until (num = '1 ') or (num = '2') or (num = '3 ');
filen: = 'input' + num + '. txt';
writeln ('');< br />
writeln ( 'Обрано файл -', filen);
writeln ('');< br />
(Зчитування даних)
Assign (f, filen); Reset (f);
max: = 0;
for s1: = 1 to 100 do
for s2: = 1 to 100 do
s [s1, s2]: = false;
while not eof (f) do
begin
s1: = get; s2: = get;
if s1> s2 then s [s2, s1]: = true else s [s1, s2]: = true;
end;
Close (f);
n: = 1;
repeat
n: = n +1;
until gen (n);
(Виведення даних у файл - 'output.txt'.)
Assign (f1, 'output.txt'); Rewrite (f1);
writeln (f1, 'Число країн =', max);
writeln (f1 ,'');< br />
writeln (f1, 'N Cтрана =', n);
for j: = 1 to max do
writeln (f1, 'КРАЇНИ -', j, ', колір -', g [j], '');
Close (f1);
end.
Koнец.
N країн = 4
країна - 1, колір - 1
країна - 2, колір - 2
країна - 3, колір - 1
країна - 4, колір - 2
країна - 5, колір - 1
країна - 6, колір - 2
країна - 7, колір - 3
країна - 8, колір - 4
країна - 9, колір - 3
країна - 10, колір - 1
країна - 11, колір - 2
країна - 12, колір - 2
країна - 13, колір - 4
країна - 14, колір - 3
країна - 15, колір - 1
1. Дана функція f (x) = a + b * x * Sin (c * x + d), в якій коефіцієнти a, b, c, d визначаються функцією Rnd з використанням процедури Randomize. Постійне k визначається в інтервалі [0.1; 0.2] c кроком 0.01. Скласти програму визначення першої точки перетину прямої y = k * x з функцією f для x> 0.
DEF fnf (x) = a1 + q1 * x * SIN (q2 * x + q3) - k * x
a = 0: b = 110
FOR k =. 1 TO.2 STEP.01
GOSUB pod1
GOSUB pod2
PRINT "при k ="; k
cor = (x1 + x2)/2: y = fnf (cor) + k * x
PRINT "точка перетину"
PRINT "x ="; cor; "y ="; y;
a = x2
NEXT k
PRINT "Точність"; t
END
a = x2
NEXT k
PRINT "Точність"; t
END
pod1: 'відділення коренів в інтервалі а, в'
s = 10 * t: x = a
200: p = fnf (x) * f (x + s)
IF p> 0 THEN 1
x1 = x: x2 = x + s: RETURN
1 x = x + s: IF x
/> RETURN
pod2: 'уточнення кореня'
10 x = (x1 + x2)/2: y = fnf (x)
IF fnf (x1) * y> 0 THEN x1 = x ELSE x2 = x
IF ABS (x2 - x1)> t THEN 10
/> RETURN
Дані:
a = 0
b = 110
точність? .001
Результати:
при k =. 1
точка перетину
x =. 0096875 y =. 7444314
при k =. 11
точка перетину
x =. 0196875 y =. 7470496
при k =. 12
точка перетину
x =. 0296875 y =. 7497169
при k =. 13
точка перетину
x =. 0396875 y =. 7524328
при k =. 14
точка перетину
x =. 0496875 y =. 7551972
при k =. 15
точка перетину
x =. 0596875 y =. 7580096
при k =. 16
точка перетину
x = 6.968751E-02 y =. 7608697
при k =. 17
точка перетину
x = 7.968751E-02 y =. 7637773
при k =. 18
точка перетину
x =. 0896875 y =. 7667319
при k =. 19
точка перетину
x =. 0996875 y =. 7697333
2. Відомі координати вершин чотирикутника A, B, C, D. Знайти точку перетину його діагоналей і найбільший радіус кола, що має центр у цій точці і повністю лежить всередині цього чотирикутника. Координати точок розташувати на гнучкому диску.
Текст програми:
REM Програма знаходження точки перетину діагоналей 4-х кутника
REM та найбільшого радіусу кола лежить в ньому.
CLS
OPEN "a: zad2.dat" FOR INPUT AS # 1
OPEN "a: zad2.txt" FOR OUTPUT AS # 2
DIM r (6)
INPUT # 1, x1, y1, x2, y2, x3, y3, x4, y4
x = ((x3 * y2 - x2 * y3) * (x4 - x1) - (x4 * y1 - x1 * y4) * (x3 - x2))/((y4
- Y1) * (x3 - x2) - (y3 - y2) * (x4 - x1))
y = ((y4 - y1) * (x - x1)/(x4 - x1)) + y1
r (1) = ABS ((x2 - x1) * y - (y2 - y1) * x + x1 * y2 - y1 * x2)/SQR ((x2 - x1) ^
2 + (y2 - y1) ^ 2)
r (2) = ABS ((x3 - x2) * y - (y3 - y2) * x + x2 * y3 - y2 * x3)/SQR ((x3 - x2) ^
2 + (y3 - y2) ^ 2)
r (3) = ABS ((x4 - x3) * y - (y4 - y3) * x + x3 * y4 - y3 * x4)/SQR ((x4 - x3) ^
2 + (y4 - y3) ^ 2)
r (4) = ABS ((x1 - x4) * y - (y1 - y4) * x + x4 * y1 - y4 * x1)/SQR ((x1 - x4) ^
2 + (y1 - y4) ^ 2)
r (5) = ABS ((x3 - x1) * y - (y3 - y1) * x + x1 * y3 - y1 * x3)/SQR ((x3 - x1) ^
2 + (y3 - y1) ^ 2)
r (6) = ABS ((x4 - x2) * y - (y4 - y2) * x + x2 * y4 - y2 * x4)/SQR ((x4 - x2) ^
2 + (y4 - y2) ^ 2)
min = r (1)
FOR i = 2 TO 6
IF r (i) = 0 THEN GOTO 5
IF r (i)
5 NEXT i
PRINT "Точка перетину діагоналей O ("; x; ","; y; ")"
PRINT "Радіус кола лежить в 4-х кутники ABCD, R =", min
PRINT # 2, "Точка перетину діагоналей O ("; x; ","; y; ")"
PRINT # 2, "Радіус кола лежить в 4-х кутники ABCD, R =", min
Дані з диска а:
1,1 2,1 1,2 2,2
Результати:
Точка перетину діагоналей O (1.5, 1.5)
Радіус кола лежить в 4-х кутники ABCD, R =. 5
3. Елементи двовимірного масиву Q (m, n) (m> n) визначаються за однією з формул:
- Якщо номер рядка i <номера стовпця j, то елемент Q (i, j) обчислюється за формулою>
- Якщо i
- Якщо i = j, то Q (i, j) = Log (10 * Rnd)/Sin (Rnd),
- Якщо i> j, то Q (i, j) = Rnd * Q (j, i).
За отриманими таким чином даними знайти і видати на друк:
- Рядок з найбільшим середнім значенням елементів,
- Строку, в якій різниця поруч стоять елементів - найменша,
- Елементи квадратної матриці (n, n), c максимальною сумою діагональних елементів.
Текст програми:
CLS
2 INPUT "Кількість рядків стовпців"; m, n
IF m> = n THEN 1
PRINT "Число строк має бути більше числа стовпців": GOTO 2
1 DIM q (m, m)
FOR i = 1 TO m
FOR j = 1 TO m
IF i
IF i = j THEN q (i, j) = LOG (10 * RND)/SIN (RND)
IF i> j THEN q (i, j) = RND * q (j, i)
NEXT j
NEXT i
FOR i = 1 TO m
FOR j = 1 TO n
PRINT USING "##.### "; q (i, j);
NEXT j
PRINT
NEXT i
DIM s (m)
FOR i = 1 TO m
f = 0
FOR j = 1 TO n
f = f + q (i, j)
NEXT j: s (i) = f/n
NEXT i
PRINT
PRINT "Рядок з найбільшим середнім значенням"
max = s (1)
FOR j = 1 TO n
FOR i = 1 TO m
IF s (i)> = max THEN max = s (i): ii = i
NEXT i
PRINT USING "##.####"; q (ii, j);
NEXT j
PRINT
PRINT
PRINT "Рядок в якій різниця що стоять поруч ел-тов найменша"
min = ABS (q (1, 1) - q (1, 2))
FOR i = 1 TO m
FOR j = 2 TO n
z = ABS (q (i, j - 1) - q (i, j))
NEXT j
IF z> = min THEN 33
min = z: kk = i
33 NEXT i
FOR i = 1 TO n
PRINT USING "##.#### "; q (kk, i);
NEXT i
PRINT
s = 0
FOR i = 1 TO n
s = s + q (i, i)
NEXT i
k = 0
FOR i = 1 TO n
k = k + q (i + 1, i)
NEXT i
k (i) = k
PRINT
PRINT "Ел-ти квадратної матриці (n, n) з макс. Сумою діагональних ел-тов"
max = s
FOR i = 1 TO n
FOR j = 1 TO n
IF k (i)> = s THEN PRINT USING "##.####"; q (i + 1, j);
IF k (i)
NEXT j
PRINT
NEXT i
4. Скласти таблицю значень певного інтеграла
b
? (x * tg (x)/(1 + x2)) * dx при зміні верхньої межі в інтервалі [t1; t2]
a
c кроком s.
Інтегрувати методом трапецій із заданою точністю. На друк видати змінний межа, результат. Друк організувати оператором Print Using.
Текст програми:
CLS
OPEN "a: z4.txt" FOR OUTPUT AS # 1
DEF fna (x) = (x * TAN (x))/(1 + x ^ 2)
INPUT "Нижня межа інтегралу"; a
INPUT "Введіть зміна верхньої межі інтегралу, b"; t1, t2
INPUT "Введіть крок"; s
INPUT "Точність"; t
FOR b = t1 TO t2 STEP s
PRINT "Верхня межа"; a; "Точність"; t
PRINT # 1, "Верхня межа"; a; "Точність"; t
GOSUB INT2
PRINT USING "b =####.##### INTEGR =####.#####"; b; IN1
PRINT # 1, USING "b =####.##### INTEGR =####.#####"; b; IN1
NEXT b
END
INT1:
dx = (b - a)/(n - 1)
IN1 = (fna (a) + fna (b))/2
x = a
5 x = x + dx
IN1 = IN1 + fna (a + dx)
IF x
IN1 = IN1 * dx
/> RETURN
INT2:
n = 100
45 GOSUB INT1: R = IN1
n = n + 20: GOSUB INT1
IF ABS (R - IN1)> t THEN 45
/> RETURN
Дані:
Нижня межа інтегралу? 2
Введіть зміна верхньої межі інтегралу, b? 3,5
Введіть крок? .9
Точність? .001
Результати:
Верхня межа 2 Точность.001
b = 3.00000 INTEGR = -0.86889
Верхня межа 2 Точность.001
b = 3.90000 INTEGR = -1.64549
Верхня межа 2 Точность.001
b = 4.80000 INTEGR = -2.32331