Задача А0. Як прочитати числа c, d
і рядок з 10 цифр в зворотному
порядку, зрозуміло з тексту програми.
Program Illusion;
Const n=1; m=10;
Type massiv=array[n..m] of integer;
Var i,s,k,c,d,a,b,t1,t2:word;
m:array[1..10]of byte;
m1,m2,m3,m4: massiv;
BEGIN
for i=1 to 10 do
write(‘Введіть ‘, i, ‘ – ий елемент масиву: ’)
readln(m1[i]);
write (‘ Це даний масив з десяти цифр: ’)
for i=1 to 10 do write(m1[i],’ ‘);
for i=1 to 10 do m[i]:=0; m2[11-i]:= m1[i];
write (‘ Це отриманий масив з десяти цифр, що йдуть у зворотному порядку: ’)
for i=1 to 10 do
write(m2[i],’ ‘);
write(‘Введіть числo c : ’)
readln(t1);
write(‘Введіть числo d: ’)
readln(t2);
for i=1 to 10 do m[i]:=0; m2[11-i]:= m1[i];
s:=0;
while t1<>0 do
begin
s:=s+1;
m[s]:=t1 mod 10;
t1:=t1 div 10;
end;
c:=0;k:=1;
for i:=s downto 1 do
begin
c:=c+m[i]*k;
k:=k*10;
end;
for i=1 to 10 do m[i]:=0;
s:=0;
while t2<>0 do
begin
s:=s+1;
m[s]:=t2 mod 10;
t2:=t2 div 10;
end;
d:=0;k:=1;
for i:=s downto 1 do
begin
d:=d+m[i]*k;
k:=k*10;
end;
Writeln (‘Це числo, з цифрами у зворотному порядку c : ’,с);
Writeln (‘Це числo, з цифрами у зворотному порядку d : ’,d);
Writeln (‘Це числo, d-c: ’, (d-c));
Writeln (‘Це числo, d*c: ’, (d*c));
END.
Задача А1. Скласти програму розв’язання квадратного рівняння.
Розв’язання : В
загальному вигляді квадратне рівняння має вигляд:
ax2 + bx + c = 0
Згадаймо, як ми його
розв’язуємо на уроках математики і точно так само розв’яжемо на мові
програмування з тією відмінністю, що на уроках
математики ви розв’язували конкретне рівняння, а наша програма зможе
розв’язати будь–яке квадратне рівняння (на множині дійсних чисел). Всі
пояснення в коментарях до програми, але нам хотілося б, щоб ви найбільшу увагу
звернули на розміщення і використання команд розгалуження.
program kwur;
label 10,20,30;
var a,b,c,d,x1,x2 : real;
begin
writeln( ‘ Програма розв’’язує квадратнi рiвняння! ’);
writeln(‘ Загальний вигляд квадратного рiвняння: ’);
writeln( ‘ Ax*x + B*x + C =
0 ’);
writeln( ‘ Введiть коефiцiєнти: ’);
10: write( ‘A = ’);readln(a);
if a = 0 then begin
writeln( ‘Цей випадок
роз’’вяжiть самi. ’);
goto 10;
end;
20: write( ‘B = ’);readln(b);
if b = 0 then begin
writeln( ‘ Цей випадок
розв’’яжiть самi. ’);
goto 20;
end;
30: write( ‘C = ’);readln(c);
if c = 0 then begin
writeln( ‘ Цей випадок
розв’’яжiть самi. ’);
goto 30;
end;
d := b*b - 4*a*c;
if d > 0 then begin
writeln( ‘ Рiвняння має два
коренi: ’);
x1 := (-b-sqrt(d))/(2*a);
x2 := (-b+sqrt(d))/(2*a);
writeln( ‘x1 = ’,x1:2:2,
‘ x2 = ’,x2:2:2);
end
else if d = 0 then begin
writeln( ‘ Рiвняння має
один корiнь: ’);
x1 := -b/(2*a);
writeln( ‘x = ’,x1:2:2);
end
else writeln( ‘ Дане рiвняння коренiв не
має. ’);
readln;
end.
Детально розібравшись з
усіма видами запису команди розгалуження на прикладі щойно приведеної програми
ви позбавите себе від неприємних несподіванок у майбутньому.
Задача А2. На площині задано три точки своїми координатами. Чи лежать точки на
одній прямій.
Розв’язання: Розв’язок здається
напрошується: знайти відстань між всіма трьома точками і якщо сума двох з них
дорівнює третій, то точки лежать на одній прямій, в противному випадку – ні. Що
ж , перевіряємо:
program pixel3;
var x1,x2,x3,y1,y2,y3 : integer;
d1,d2,d3 : real;
begin
writeln('Координати точки А:');
write('Ха = ');readln(x1);
write('Ya = ');readln(y1);
writeln('Координати точки B:');
write('Хb = ');readln(x1);
write('Yb = ');readln(y1);
writeln('Координати точки C:');
write('Хc = ');readln(x1);
write('Yc = ');readln(y1);
{ Перевірка на підставі описаного вище способу }
d1 := sqrt(sqr(x1-x2)+sqr(y1-y2));
d2 := sqrt(sqr(x1-x3)+sqr(y1-y3));
d3 := sqrt(sqr(x2-x3)+sqr(y3-y3));
if (d1 = d2 + d3) or (d2 = d1 + d3) or (d3 = d1+d2)
then writeln('На однiй прямiй.')
else writeln('Не на однiй прямiй.');
readln
end.
Але давайте подумаємо, чи
не можна розв’язати задачу іншим способом? Виявляється можна, для цього
потрібно просто пам’ятати рівняння прямої, що проходить через дві точки
виражене через координати, яке вивчалось на уроках геометрії. Ви можете
сказати: так то через дві точки, а в нас їх аж три! Вірно, тим краще! Чому –
спробуйте здогадатись самі і лише після цього приступайте до самостійної
реалізації запропонованого способу. Якщо ж ні – то вам пропонується другий
варіант розв’язання, детально розібравшись з яким ви, мабуть, вже не забудете
рівняння прямої. Отже, спосіб другий:
program pixel3а;
var x1,x2,x3,y1,y2,y3 : integer;
begin
writeln('Координати точки А:');
write('Ха = ');readln(x1);
write('Ya = ');readln(y1);
writeln('Координати точки B:');
write('Хb = ');readln(x2);
write('Yb = ');readln(y2);
writeln('Координати точки C:');
write('Хc = ');readln(x3);
write('Yc = ');readln(y3);
{
Перевірка на підставі рівняння прямої }
if (х1 – х2)*(х3 – х2) – (у1 –
у2) * (у3 – у2) = 0
then
writeln('На однiй прямiй.')
else writeln('Не на однiй прямiй.');
readln
end.
Зверніть увагу на скільки
стало менше змінних і виконуваних операцій. Ідея ж розв’язку полягала в тому,
що ми до відомого рівняння прямої застосували правило пропорції і
перенесли співмножники в одну сторону, в результаті чого отримали лінійне
рівняння з двома невідомими. Після цього замість довільної точки прямої
(х,у) підставили значення координат третьої
точки. Якщо точка належить прямій, то отримане рівняння повинно дорівнювати
нулю.
Дану
просту задачу ми привели з однією метою: відмітити той важливий момент, що
очевидне не завжди найкраще. Крім того, потрібно завжди дотримуватись правила
(і не тільки при програмуванні): рішив поставлену задачу – добре, але пошукай
інший спосіб – практично завжди він є! Знайшовши декілька способів розв’язання
постав себе перед вибором – а який з них кращий? Ось вам ще одна демонстрація
необхідності робити вибір в реальному житті. А якщо дотримуватись цього правила
при вирішенні життєвих проблем, то запевняємо – успіх вам гарантовано!
Розглянемо ще одну цікаву
задачу, яка також легко розв’язується з застосуванням рівняння прямої.
Задача 3. Два відрізки задано координатами своїх кінців.
Визначити, чи перетинаються дані відрізки.
Розв’язання: Згадайте те, про що ми говорили
раніше: очевидне не завжди найкраще! А це значить, що нам не потрібно шукати
точку перетину відрізків, ми поступимо іншим чином. Будемо розглядати точки
кінців одного відрізку відносно іншого відрізку. З геометрії відомо, що два
відрізки перетинаються тоді і тільки тоді, коли кінці одного відрізку лежать в
різних півплощинах відносно прямої, що проходить через інший відрізок. Причому
потрібно розглядати обидва відрізка. Той факт, що дві точки лежать відносно
прямої в різних півплощинах можна записати з використанням рівняння прямої
таким чином:
Для точок С і D відносно
прямої АВ:
((Xc-Xa)(Xb-Xa) - (Yc-Ya)(Yb-Ya))Ч((Xd-Xa)(Xb-Xa) - (Yd-Ya)(Yb-Ya))<0
Для точок A і B відносно прямої
CD:
((Xa-Xc)(Xd-Xc) - (Ya-Yc)(Yd-Yc))Ч((Xb-Xc)(Xd-Xc) - (Yb-Yc)(Yd-Yb))<0
Щоб передбачити випадок,
коли обидва відрізки лежать на одній прямій, або випадок, коли один відрізок
одним своїм кінцем лежить на іншому відрізку, в сформульовані умови необхідно
ще добавити перевірку на рівність нулю (див. попередню задачу). В завершеному
вигляді маємо таку програму:
program line2;
var x1,x2,x3,x4,y1,y2,y3,y4 : integer;
begin
writeln('Координати точки А:');
write('Ха =
');readln(x1);
write('Ya =
');readln(y1);
writeln('Координати точки B:');
write('Хb =
');readln(x2);
write('Yb =
');readln(y2);
writeln('Координати точки C:');
write('Хc =
');readln(x3);
write('Yc =
');readln(y3);
writeln('Координати точки D:');
write('Хd =
');readln(x4);
write('Yd =
');readln(y4);
if
(((x3-x1)*(x2-x1)-(y3-y1)*(y2-y1))*((x4-x1)*(x2-x1)-(y4-y1)*(y2-y1))<=0) and
(((x1-x3)*(x4-x3)-(y1-y3)*(y4-y3))*((x2-x3)*(x4-x3)-(y2-y3)*(y4-y3))<=0)
then
writeln('Перетинаються.')
else writeln('Не
перетинаються');
readln
end.
РОБОТА З ФАЙЛАМИ ПРИ ПРОГРАМУВАННІ НА МОВІ ПАСКАЛЬ
Про те, як
здійснювати операції вводу не з клавіатури та виводу не на екран, ми розповімо
на наступних сторінках у відповідних розділах, пов’язаних з організацією роботи
з файлами та периферійними пристроями. Остання фраза читачам, що вперше читають
книгу з програмування може здатись трохи не зрозумілою, але повірте, що вам
також через деякий час це стане повністю зрозумілим.
Ми ж зараз, дещо
випереджуючи події, розглянемо введення даних з текстового файлу і виведення
даних у текстовий файл. Таке випередження ми можемо пояснити тим, що у багатьох
завданнях, що будуть розглядатись далі, нам прийдеться зчитувати інформацію з
текстового файлу або записувати у нього результати роботи програми. Для
розгляду організації такої роботи знову звернемось до аналогій. Уявіть собі, що
вам для розв’язку фізичної задачі необхідно знайти у довіднику значення деякої
величини, наприклад, густини заліза. Для цього нам потрібно взяти
в руки довідник з фізики, відкрити його і прочитати необхідні дані.
Після цього нам залишиться лише закрити відкритий довідник і
продовжувати далі розв’язувати задачу. Аналогом книги є текстовий файл і робота
з ним повністю відповідає описаному вище способу роботи з довідником. Для
повноти картини сформулюємо і розв’яжемо задачу, у якій і вкажемо команди для
роботи з текстовими файлами.
Задача В1. У текстовому
файлі DANO.TXT знаходиться значення радіусу кулі.
Записати у текстовий файл RESULT.TXT значення її
об’єму.
Розв’язання: Наведемо програму, що вирішує дане
завдання, а в коментарях до неї приведемо необхідні пояснення.
program demo_file;
var f : text; { файлова змiнна для текстового файлу }
R, V : real; { змінні для радіусу і об’єму }
begin
Assign(f,'DANO.TXT'); {Поставили
у відповідність файловій змінній ім’я файлу }
Reset(f); { Відкрили файли тільки для
читання }
Readln(f,R); { Прочитали з файлу значення змінної }
Close(f); { Закрили файл }
V :=
(4*pi*R*R*R)/3; {
Обчислили об’єм }
Assign(f,'RESULT.TXT'); {
Поставили у від–ність файловій змінній новий файл }
Rewrite(f); { Відкрили його для запису }
Write(f,V:5:3); { Записали у файл значення об’єму }
Close(f); { Закрили файл }
end.
Як бачите, нічого складного немає,
потрібно тільки запам’ятати, що всі три дії є обов’язковими, тобто:
n спочатку ставимо у відповідність
файловій змінній ім’я файлу: Assign(f, ’DANO.TXT’);
n відкриваємо файл для читання: Reset(f); або для запису: Rewrite(f);
n зчитуємо або записуємо необхідні дані;
n
по закінченню
роботи закриваємо
файл: Close(f);.
Для повноти
картини звернемо увагу на той факт, що якщо файли розміщуються не в поточній
директорії, то при встановленні відповідності між файловою змінною і назвою
файлу необхідно вказувати також і повний шлях до файлу, наприклад:
Assign(f, ’A:\WORK\DANO.TXT’);
Для повного
засвоєння даного матеріалу рекомендуємо самостійно спробувати зчитати з
текстового файлу та записати у текстовий файл деяку інформацію. Вид інформації
та назви файлів придумайте самі.
Задача В2. Вистроїти
учнів класу по зросту – від вищих
до нижчих.
Для спрощення
вважати, що в класі навчаються
тільки хлопці.
Program sort1;
uses
dos, crt;
const b : array[1..10] of byte =
(172,165,180,174,182,179,183,185,176,181);
var
a : array[1..10] of byte;
i, j, n : integer;
k : byte;
begin
clrscr;
for
i:=1 to 10 do a[i]:=b[i];
{ Нижче
реалізовано
алгоритм сортування методом обміну }
n:=10;
for i:=1 to n-1 do
begin
for j := i+1 to n do
if a[i]<a[j] then
begin
k := a[j];
a[j] := a[i];
a[i] := k;
end;
end; { Кінець сортування }
Тренувальні задачі з програмування
- Складіть програму, яка знаходить кількість усіх трицифрових чисел в десятковій системі числення, цифри яких розташовані в порядку строгого зростання.
- Складіть програму, яка знаходить кількість усіх
трицифрових чисел в десятковій системі числення, цифри яких розташовані в
порядку строгого спадання.
- Складіть програму, яка знаходить перші m чисел, дільниками яких є тільки числа або 2, або 3,
або 5.
- Складіть програму, яка знаходить для натуральних m і n їх найбільший спільний дільник і найменше спільне кратне.
- Складіть програму, яка скоротить
дріб m: n, якщо це можливо.
- Складіть програму, яка округляє до сотень дане натуральне число.
- Складіть програму, яка виясняє, чи являється задане 6-цифрове
натуральне число m щасливим і нещасливим:
по-вінницьки (сума цифр на парних місцях рівна сумі цифр на
непарних місцях).
- Складіть програму, яка виясняє, чи являється задане
6-цифрове натуральне число m щасливим і нещасливим: по-київськи (сума цифр на перших трьох
місцях рівна сумі цифр на останніх трьох місцях рівна).
- Складіть програму, яка виясняє, чи вірно, квадрат
даного числа рівний кубу суми цифр даного числа. Операції над рядками не
виконувати.
- Складіть програму, яка знаходить серед усіх трицифрових
чисел в десятковій системі числення, сума цифр яких рівна заданому цілому m.
- Складіть програму, яка знаходить серед усіх трицифрових
чисел в десятковій системі числення, сума цифр яких рівна заданому цілому m.
- Складіть програму, яка в квадратному масиві 3х3 (nхn) міняє місцями
числа, що знаходяться у верхній та нижній чверті, які обмежені головною та
побічною діагоналями.( за виключенням чисел, що знаходяться на цих
діагоналях.
- Складіть програму, яка
в квадратному масиві 3х3 (nхn) виставляє довільні дев’ять послідовних натуральних
числа так, що суми трьох чисел, що стоять в головній, в побічній
діагоналях, в кожному рядку, і в кожному стовпчику рівні між собою.
Виведіть на екран, окрім самого магічного квадрату і число, що є сумою
трьох чисел, які стоять на головній
діагоналі.
- Складіть програму, яка
в квадратному масиві 3х3 (nхn) виставляє перші дев’ять послідовних членів
арифметичної прогресії (за даним першим елементом n та її різницею d)так, що суми трьох чисел, що стоять в головній, в
побічній діагоналях, в кожному рядку, і в кожному стовпчику рівні між
собою. Виведіть на екран, окрім самого магічного квадрату і число, що є
сумою трьох чисел, які стоять на
головній діагоналі.
- Складіть програму, яка виясняє,
скільки в квадратному масиві 3х3 (nхn) “рівних цілих
чисел”. Додатковий масив не заводьте.
- Складіть програму, яка виясняє,
скільки в квадратному масиві 3х3 (nхn) “парних чисел”.
Додатковий масив не заводьте.
- Складіть програму, яка виясняє,
скільки в квадратному масиві 3х3 (nхn) “непарних
чисел”. Додатковий масив не заводьте.
- Складіть програму, яка виясняє,
скільки в квадратному масиві 3х3 (nхn) “двоцифрових
цілих чисел”. Додатковий масив не заводьте.
- Складіть програму, яка виясняє,
скільки в квадратному масиві 3х3 (nхn) “ чисел, що
націло діляться на задане число m”. Додатковий масив не заводьте.
- Складіть програму, яка знаходить для
всіх цілих чисел квадратного масиву 3х3 (nхn) “найбільший спільний дільник”.
- Складіть програму, яка у
квадратному масив розмірністю 3х3 (nхn) сортує в порядку зростання або в порядку спадання числа в кожному
рядку в залежності від вказівки.
- У масиві розмірністю n
х 12 у кожному рядку міститься
заробітна плата за відповідний місяць. Складіть програму, яка:
- а) підраховує середньомісячний
заробіток кожного робітника на протязі року;
- б) знаходить найменшу і найбільшу
місячну заробітну плату робітника, який має найменший середньомісячний
заробіток на протязі року;
- Виясніть, скільки в двомірному
масиві “цілих чисел”. Додатковий масив не заводьте.
- В заданому масиві розмірністю mxn поміняти у зворотному порядку числа кожного рядка.
Немає коментарів:
Дописати коментар