Інструкція If... Then... Else... » Pascal - основи програмування

Основи програмування на мові Pascal

 

Спонсори

Інструкція If... Then... Else...

Для організації розгалуження в програмах на мові Паскаль існує точно така сама структура, як і в шкільній алгоритмічній мові, але записується вона, звичайно, англійською мовою, тобто, якби ми сформулювали попередню задачу так:

    Задача 1. Використовуючи команду розгалуження скласти програму знаходження модуля числа.

То наш розв’язок мав би вигляд:


program module;
var а : real;
begin
        readln (a);
        if а < 0 then  а := –a;
        writeln (‘ Модуль введеного числа ’, a);
        readln;
end.

В загальному вигляді конструкція розгалуження має вигляд:


if  < умова >  then  < дія1 > 
else  < дія2 >;

    В загальному випадку після слова then, так само як і після слова else може стояти не одна дія, а декілька. В цьому випадку всі команди, що йдуть після відповідного слова слід брати в операторні дужки begin ... end. Якщо в деякому розгалуженні має місце нове розгалуження, то кажуть, що таке розгалуження є складним або вкладеним. Необхідно пам’ятати ще два правила:

  • перед командою else крапку з комою ні в якому випадку ставити не можна;
  • команда else завжди стосується останнього оператора if, для якого немає команди else.

    Для того, щоб не порушувати останнє правило, слід записувати текст програми в структурованому вигляді, при якому else писати тільки під if, і, крім того, кожен наступний вкладений оператор if записувати трохи правіше від попереднього. В цьому випадку ви практично ніколи не припуститесь помилки.

    Для прикладу розв’яжемо повністю класичну задачу з шкільного курсу інформатики, яку ми вже згадували раніше.

 

    Задача 2. Скласти програму розв’язання квадратного рівняння.

    Розв’язання : В загальному вигляді квадратне рівняння має вигляд:

                                                                                  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.

    Детально розібравшись з усіма видами запису команди розгалуження на прикладі щойно приведеної програми ви позбавите себе від неприємних несподіванок у майбутньому.

 

    Задача 3. На площині задано три точки своїми координатами. Чи лежать точки на одній прямій.

    Розв’язання: Розв’язок здається напрошується: знайти відстань між всіма трьома точками і якщо сума двох з них дорівнює третій, то точки лежать на одній прямій, в противному випадку – ні. Що ж , перевіряємо:


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.

    Зверніть увагу на скільки стало менше змінних і виконуваних операцій. Ідея ж розв’язку полягала в тому, що ми до відомого рівняння прямої  застосували правило пропорції і перенесли співмножники в одну сторону, в результаті чого отримали лінійне рівняння з двома невідомими. Після цього замість довільної точки прямої (х,у)  підставили значення координат третьої точки. Якщо точка належить прямій, то отримане рівняння повинно дорівнювати нулю.

    Дану просту задачу ми привели з однією метою: відмітити той важливий момент, що очевидне не завжди найкраще. Крім того, потрібно завжди дотримуватись правила (і не тільки при програмуванні): рішив поставлену задачу – добре, але пошукай інший спосіб – практично завжди він є! Знайшовши декілька способів розв’язання постав себе перед вибором – а який з них кращий? Ось вам ще одна демонстрація необхідності робити вибір в реальному житті. А якщо дотримуватись цього правила при вирішенні життєвих проблем, то запевняємо – успіх вам гарантовано!

Розглянемо ще одну цікаву задачу, яка також легко розв’язується з застосуванням рівняння прямої.

 

    Задача 4. Два відрізки задано координатами своїх кінців. Визначити, чи перетинаються дані відрізки.

    Розв’язання: Згадайте те, про що ми говорили раніше: очевидне не завжди найкраще! А це значить, що нам не потрібно шукати точку перетину відрізків, ми поступимо іншим чином. Будемо розглядати точки кінців одного відрізку відносно іншого відрізку. З геометрії відомо, що два відрізки перетинаються тоді і тільки тоді, коли кінці одного відрізку лежать в різних півплощинах відносно прямої, що проходить через інший відрізок. Причому потрібно розглядати обидва відрізка. Той факт, що дві точки лежать відносно прямої в різних півплощинах можна записати з використанням рівняння прямої таким чином:

    Для точок С і 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.

скачать dle 10.4фильмы бесплатно Наступна сторінка » Інструкція Case Попередня сторінка » Структура “якщо... то... інакше...”