Алгоритмы линейной и разветвляющейся структуры



 
Пример 1.1. Простейший алгоритм, запрашивающий имя и затем приветствующий его обладателя.
 
Тест
 
Данные
Результат
Имя = "Тимур"
"Привет, Тимур!"
 
Демонстрация
 
Школьный АЯ
алг Знакомство (арг лит Имя, рез лит t) 
нач
  вывод "Как тебя зовут ?"
  ввод Имя
  t := "Привет, " + Имя + "!"    | "+" - операция сцепки
  вывод t
кон
 
Turbo Pascal
Program Hello;
Var Name: String;  {Описание переменной Name строкового типа}
BEGIN 
  Write('Как тебя зовут ? '); {Вывод на экран текста вопроса}
  ReadLn(Name);               {Ввод c клавиатуры имени}
  WriteLn('Привет, ', Name, '!'); {Вывод на экран приветствия}
  ReadLn
END.
Здесь последний оператор ReadLn позволяет видеть на экране результаты работы программы, пока не будет нажата клавиша <Enter>.
 
Результаты работы Pascal-программы
 
Как тебя зовут ? Тимур   <Enter>
Привет, Тимур ! 
QBasic
CLS
INPUT "Как тебя зовут ? ", Name$
PRINT "Привет, "; Name$; "!"
END
 
Пример 1.2. Определить объём и площадь боковой поверхности цилиндра с заданными радиусом основания R и высотой H.
 
Тест
 
Данные
Результат
R = 1
H = 1
V = 3.14
S = 6.28
 
Демонстрация
Школьный АЯ
алг Цилиндр (арг вещ R, H, рез вещ V, S)
нач вещ Pi
   Pi := 3.14 
   V := Pi * R**2 * H 
   S := 2 * Pi * R * H 
кон
 
Turbo Pascal
Program Cylinder;
  Uses Crt; {Подключение библиотеки Crt}
  Var
    R, {радиус основания цилиндра}
    H, {высота цилиндра }
    V, {объем цилиндра }
    S: Real; {площадь боковой поверхности цилиндра}
BEGIN
  ClrScr; {Вызов из библиотеки Crt процедуры очистки экрана}
  Write('Введите высоту цилиндра : ');  ReadLn(H);
  Write('Введите радиус основания : '); ReadLn(R);
  V := Pi * R * R * H;
  S := 2 * Pi * R * H;  WriteLn;
  WriteLn('Объем цилиндра = ', V : 5 : 2); {Здесь 5 - общее 
      количество позиций, занимаемых переменной V при выводе,
      а 2 - количество позиций в дробной части значения V}
  WriteLn('Площадь боковой поверхности = ', S : 5 : 2);
  ReadLn
END.
 
QBasic
CLS
INPUT "Введите высоту цилиндра : ", H
INPUT "Введите радиус основания : ", R
V = 3.14 * R ^ 2 * H
S = 2 * 3.14 * R * H : PRINT
PRINT "Объем цилиндра = "; V
PRINT "Площадь боковой поверхности = "; S
END
 
Пример 1.3. Даны три точки на плоскости. Определить, какая из них ближе к началу координат.
 
Система тестов
 
/TR>
Номер теста Данные Результат
xAyAxByBxCyC Otvet
1 2122-13"Это точка A"
2 2221-13"Это точка B"
3 22-1321"Это точка C"
 
Демонстрация
Школьный АЯ
алг Точки(арг вещ xA,yA,xB,yB,xC,yC, рез лит Otvet)
нач вещ DistA,DistB,DistC
  ввод xA,yA,xB,yB,xC,yC
  DistA := sqrt(xA**2 + yA**2)
  DistB := sqrt(xB**2 + yB**2)
  DistC := sqrt(xC**2 + yC**2)
  если (DistA < DistB) и (DistA < DistC)
    то Otvet := "Это точка А"
    иначе если DistB < DistC
            то Otvet := "Это точка B"
            иначе Otvet := "Это точка C"
          все
  все
  вывод Otvet
кон
 
Turbo Pascal
Program Points;
  Uses Crt;
  Var xA, yA, xB, yB, xC, yC, DistA, DistB, DistC : Real;
BEGIN ClrScr;
  WriteLn('Введите координаты точки А:');
  Write('x = '); ReadLn(xA); Write('y = '); ReadLn(yA);
  WriteLn('Введите координаты точки B:');
  Write('x = '); ReadLn(xB); Write('y = '); ReadLn(yB);
  WriteLn('Введите координаты точки C:');
  Write('x = '); ReadLn(xC); Write('y = '); ReadLn(yC); 
  DistA := sqrt(sqr(xA) + sqr(yA));
  DistB := sqrt(sqr(xB) + sqr(yB));
  DistC := sqrt(sqr(xC) + sqr(yC));
  WriteLn; Write('Ответ : ');
  If (DistA < DistB) and (DistA < DistC)
     then WriteLn( 'Это точка А.')
     else If (DistB < DistC)
             then WriteLn('Это точка B.')
             else WriteLn('Это точка C.');
  ReadLn
END.
 
Пример 1.4. Найти произведение цифр заданного целого четырехзначного числа.
 
Система тестов
 
Номер теста
Проверяемый 
случай
Число
Результат
1
Число положительное
2314
P = 24
2
Число отрицательное
-1245
P = 40
 
Демонстрация
Школьный АЯ
алг Произведение цифр (арг цел Num, рез цел P)
нач цел i, j, k, l
  Num := abs(Num)             | abs - абсолютная величина
  i := div(Num, 1000)         | i - первая цифра
                              | div - частное от деления с остатком
  j := mod(div(Num, 100), 10) | j - вторая цифра
                              | mod - остаток от деления с остатком 
  k := mod(div(Num, 10), 10)  | k - третья цифра
  l := mod(Num, 10)           | l - четвертая цифра
  P := i * j * k * l;
кон
 
Turbo Pascal
Program DigitsProduct;
Uses Crt;
Var Number,      {заданное число}
    i, j, k, l,  {цифры числа}
    P : Integer; {произведение цифр}
BEGIN ClrScr;
  Write( 'Введите четырехзначное число : ' ); ReadLn(Number);
  Number:=Abs(Number);
  Write( 'Цифры числа ' , Number , ' : ' );
  i := Number div 1000; Write(i:3);       {первая цифра}
  j := Number div 100 mod 10; Write(j:3); {вторая цифра}
  k := Number div 10 mod 10; Write(k:3);  {третья цифра}
  l := Number mod 10; WriteLn(l:3);       {четвертая цифра}
  P := i * j * k * l ;
  WriteLn( 'О т в е т : произведение цифр равно ' , P );
  ReadLn
END.
 
QBasic
CLS
INPUT "Введите четырехзначное число : ", Number
PRINT : PRINT "Цифры числа "; Number; ": ";
Number = ABS(Number)
i = FIX(Number / 1000): PRINT i ; ' FIX - целая часть аргумента
j = FIX(Number / 100) MOD 10 : PRINT j ;
k = FIX(Number / 10) MOD 10 : PRINT k ;
l = Number MOD 10 : PRINT l
P = i * j * k * l
PRINT : PRINT "О т в е т : произведение цифр равно " ; P
END
 
Пример 1.5. Решить квадратное уравнение ax2+ bx + c = 0.
 
Система тестов

 
Номер теста
Проверяемый случай
Коэффициенты
Результаты
a
b
c
1
d >0
1
1
-2
x1 = 1,   x2 =  - 2
2
d=0
1
2
1
Корни равны:  x1 = - 1,   x2 =  - 1
3
d < 0
2
1
2
Действительных корней нет
4
a=0,   b=0,   c=0
0
0
0
Все коэффициенты равны нулю.   х — любое число.
5
a=0,   b=0,   c<>0
0
0
2
Неправильное уравнение
6
a=0,   b<>0
0
2
1
Линейное уравнение.   Один корень:   x = - 0,5
7
a <> 0,   b <> 0,   с = 0
2
1
0
x1 = 0,   x2  =  - 0,5

Демонстрация

Школьный АЯ (упрощенный алгоритм)
алг Квур (арг вещ а, b, c, рез вещ x1, x2, рез лит t)
   дано a <> 0
нач вещ d
  d := b**2-4*a*c | d - дискриминант квадратного уравнения
  если d<0
    то t := "Действительных корней нет"
    иначе если d=0
            то t := "Корни равны"; x1 := -b/(2*a); x2 := x1
            иначе t := "Два корня"
                  x1 := (-b + sqrt(d)) / (2*a)
                  x2 := (-b - sqrt(d)) / (2*a)
          все
  все
кон
 
Turbo Pascal
Program QuadraticEquation;
  Uses Crt; { подключение библиотеки Crt }
  Var a, b, c     : Real;         {a, b, c - коэффициенты уравнения}
      Discr       : Real;
      x1, x2      : Real;         {x1, x2 - корни }
      Test, NTest : Integer;      {Ntest - количество тестов }
BEGIN
  ClrScr;
  Write('Введите количество тестов : ');
  ReadLn(NTest);
  For Test := 1 to NTest do {цикл по всем тестам задачи }
   begin
    Write('Тест ', Test, '. Введите коэффициенты a, b, c : ');
    ReadLn(a, b, c);
    If (a=0) and (b=0) and (c=0)
     then begin Write('Все коэффициенты равны нулю.');
                WriteLn('x - любое число ')
          end
     else
      If (a=0) and (b<>0)
       then WriteLn('Линейное уравнение. Oдин корень: x =', (-c/b):6:2)
       else
        If (a=0) and (b=0) and (c<>0)
          then WriteLn('Неправильное уравнение.')
          else
           begin
            Discr := b*b - 4*a*c;
            If Discr > 0 
             then begin
                    x1:=(-b + Sqrt(Discr)) / (2*a);
                    x2:=(-b - Sqrt(Discr)) / (2*a);
                    WriteLn('x1=' , x1:6:2 , '; x2=' , x2:6:2)
                  end
             else
              If Discr = 0
               then begin
                      x1 := -b/(2*a); 
                      WriteLn('Корни равны: x1=', x1:6:2, ' x2=', x1:6:2)
                    end
               else WriteLn('Действительных корней нет.');
          end; 
      WriteLn      
    end; 
  ReadLn
END.
 
QBasic
CLS
INPUT "Введите количество тестов : ", NTest
FOR Test = 1 TO NTest ' цикл по всем тестам задачи
  PRINT "Тест" ; Test ; ". Введите коэффициенты a, b, c : " ;
  INPUT a, b, c
  IF (a = 0) AND (b = 0) AND (c = 0) THEN
    PRINT "Все коэффициенты равны нулю. x - любое число"
   ELSE
    IF (a = 0) AND (b <> 0) THEN
      PRINT "Линейное уравнение, корень один : x = "; -c / b
     ELSE
      IF (a = 0) AND (b = 0) AND (c <> 0) THEN
        PRINT "Неправильное уравнение." 
       ELSE
        Discr = b * b - 4 * a * c
        IF Discr > 0 THEN
          x1 = (-b + SQR(Discr)) / (2 * a)
          x2 = (-b - SQR(Discr)) / (2 * a)
          PRINT "x1 = "; x1; "; x2 = "; x2
         ELSE
          IF Discr = 0 THEN
            x1 = - b / (2 * a) 
            PRINT "Корни равны: x1 = "; x1; "; x2 = "; x1
          ELSE PRINT "Действительных корней нет."
          END IF
        END IF
      END IF
    END IF
  END IF : PRINT
NEXT Test
END
Результаты работы QBasic-программы (фрагмент):
 
Тест 1 . Введите коэффициенты a, b, c : ? 1, 1, –2 <Enter> 
x1 = 1 ; x2 = – 2  

Тест 2 . Введите коэффициенты a, b, c : ? 1, 2, 1  <Enter> 
Корни равны: x1 = – 1 ; x2 = – 1  

Тест 3 . Введите коэффициенты a, b, c : ? 2, 1, 2  <Enter> 
Действительных корней нет. 

 
 
Пример 1.6.
 
Две прямые описываются уравнениями
 
a1 x + b1 y + c1 = 0;
a2 x + b2 y + c2 = 0.
Напечатать координаты точки пересечения этих прямых, либо сообщить, что эти прямые совпадают, не пересекаются или вовсе не cуществуют.
 
Система тестов
 
Номер теста
Проверяемый 
случай
Коэффициенты прямых
Результаты
a1
b1
c1
a2
b2
c2
1
Первая прямая не существует
0
0
1
1
2
2
Это не прямая
2
Вторая прямая не существует
1
2
2
0
0
1
Это не прямая
3
Все коэффициенты одной или обеих прямых равны нулю
0
0
0
1
2
1
Это не прямая (прямые)
4
Коэффициенты попарно равны
1
2
1
1
2
1
Прямые совпадают
5
Коэффициенты попарно пропорциональны
1
2
1
2
4
2
Прямые совпадают
6
Прямые параллельны
2
3
-1
4
6
1
Прямые параллельны
7
Прямые пересекаются
1
2
-4
1
-2
1
x=1.50,   y=1.25
 
Демонстрация
 
Школьный АЯ
алг Пересечение (арг вещ a1, b1, c1, a2, b2, c2, 
                 рез вещ x, y, рез лит t)
нач
  если (a1 = 0 и b1 = 0) или ( a2 = 0 и b2 = 0)
    то t := "Это не прямая (прямые)"
    иначе если (a1*b2 = a2*b1) и (a1*c2 = a2*c1)
            то t := "Прямые совпадают"
            иначе если a1*b2 = a2*b1
                    то t := "Прямые параллельны"
                    иначе x := (c1*b2-c2*b1)/(b1*a2-b2*a1)
                          y := (c2*a1-c1*a2)/(b1*a2-b2*a1)
                  все
          все
    все
кон
 
Turbo Pascal
Program Intersection;
  Uses Crt; {подключение библиотеки Crt }
  Var a1, b1, c1,  {коэффициенты уравнения первой прямой}
      a2, b2, c2,  {коэффициенты уравнения второй прямой}
      x, y : Real; {координаты точки пересечения }
      Test, NTest : Integer;
BEGIN
  ClrScr; {очистка экрана}
  Write('Введите количество тестов : ');
  ReadLn(NTest);
  For Test := 1 to NTest do {цикл по всем тестам задачи}
   begin
     Write('Тест ', Test, '. Введите a1, b1, c1 : ');
     ReadLn( a1, b1, c1);
     Write(' Введите a2, b2, c2 : ');
     ReadLn( a2, b2, c2);
     WriteLn; Write('О т в е т : ');
     If ( (a1=0) and (b1=0) ) or ( (a2=0) and (b2=0) )
      then WriteLn( 'это не прямая (прямые). ' )
      else
        if (a1*b2=a2*b1) and (a1*c2=a2*c1) {условие совпадения}
         then WriteLn( 'прямые совпадают.' )
         else
          if a1*b2 = a2*b1 {условие параллельности}
           then WriteLn('прямые параллельны.')
           else begin x:=(c1*b2-c2*b1)/(b1*a2-b2*a1);
                      y:=(c2*a1-c1*a2)/(b1*a2-b2*a1);
                      WriteLn('координаты точки пересечения :', 
                              ' x = ', x : 5 : 2 , ', y = ', y : 5 : 2);
                end; WriteLn
    end;
   ReadLn
END.
Результаты работы Pascal-программы:
Введите количество тестов : 7 
Тест 1.  Введите a1, b1, c1 : 0  0  1 <Enter> 
Введите a2, b2, c2 : 1  2  2 <Enter> 
О т в е т : это не прямая (прямые). 

Тест 2. Введите a1, b1, c1 : 1  2  2   <Enter> 
  Введите a2, b2, c2 : 0  0  1   <Enter> 
О т в е т : это не прямая (прямые). 

Тест 3. Введите a1, b1, c1 : 0  0  0   <Enter> 
  Введите a2, b2, c2 : 1  2  1   <Enter> 
О т в е т : это не прямая (прямые). 

Тест 4. Введите a1, b1, c1 : 1  2  1   <Enter> 
  Введите a2, b2, c2 : 1  2  1   <Enter> 
О т в е т : прямые совпадают. 

Тест 5. Введите a1, b1, c1 : 1  2  1   <Enter> 
  Введите a2, b2, c2 : 2  4  2   <Enter> 
О т в е т : прямые совпадают. 

Тест 6. Введите a1, b1, c1 : 2  3 -1 <Enter> 
  Введите a2, b2, c2 : 4  6  1 <Enter> 
О т в е т : прямые параллельны. 

Тест 7. Введите a1, b1, c1 : 1  2 -4 <Enter> 
  Введите a2, b2, c2 : 1 -2  1 <Enter> 
О т в е т : координаты точки пересечения : x = 1.50, y = 1.25

QBasic
CLS
INPUT "Введите количество тестов : ", NTest
FOR Test = 1 TO NTest        ' цикл по всем тестам задачи
  PRINT "Тест"; Test;
  INPUT ". Введите a1, b1, c1 : ", a1, b1, c1
  INPUT "     Введите a2, b2, c2 : ", a2, b2, c2
  PRINT : PRINT "О т в е т : ";
  IF (a1 = 0) AND (b1 = 0) OR (a2 = 0) AND (b2 = 0) THEN
     PRINT "это не прямая (прямые)."
   ELSE
     IF (a1*b2=a2*b1) AND (a1*c2=a2*c1) THEN
        PRINT "прямые совпадают."
       ELSE
        IF a1*b2 = a2*b1 THEN
             PRINT "прямые параллельны."
           ELSE x=(c1*b2 - c2*b1) / (b1*a2 - b2*a1)
                y=(c2*a1 - c1*a2) / (b1*a2 - b2*a1)
                PRINT "координаты точки пересечения: x="; x ; ", y="; y
        END IF
     END IF
  END IF
  PRINT
NEXT Test
END


Задачи для самостоятельного решения

1.1. [Pascal | C | Basic] Вычислите длину окружности, площадь круга и объём шара одного и того же заданного радиуса.

1.2. [Pascal | C | Basic] Вычислите периметр и площадь прямоугольного треугольника по длинам двух его катетов.

1.3. [Pascal | C | Basic] По координатам трёх вершин некоторого треугольника найдите его площадь и периметр.

1.4. [Pascal | C | Basic] Вычислите дробную часть среднего геометрического трёх заданных вещественных чисел.

1.5. [Pascal | C | Basic] Определите, является ли заданное целое число А нечётным двузначным числом.

1.6. [Pascal | C | Basic] Определите, имеется ли среди заданных целых чисел   A, B, C хотя бы одно чётное.

1.7. [Pascal | C | Basic] Даны три числа. Выберите те из них, которые принадлежат заданному отрезку [ ef ].

1.8. [Pascal | C | Basic] Определите число, полученное выписыванием в обратном порядке цифр заданного целого трёхзначного числа.

1.9. [Pascal | C | Basic] Для заданных вещественных чисел a, b и c определите, имеет ли уравнение ax2 + bx + c = 0 хотя бы одно вещественное решение.

1.10. [Pascal | C | Basic] Вычислите площадь кольца, ширина которого равна Н, а отношение радиуса большей окружности к радиусу меньшей окружности равно D.

1.11. [Pascal | C | Basic] Определите, есть ли среди цифр заданного целого трёхзначного числа одинаковые.

1.12. [Pascal | C | Basic] Заданы площади круга и квадрата. Определите,  поместится ли квадрат в круге.

1.13. [Pascal | C | Basic] Для задачи 1.12 определите, поместится ли круг в квадрате.

1.14. [Pascal | C | Basic] Заданы координаты двух точек. Определите, лежат ли они на одной окружности с центром в начале координат.

1.15. [Pascal | C | Basic] Определите, лежит ли заданная точка на одной из сторон треугольника, заданного координатами своих вершин.

1.16. [Pascal | C | Basic] Проверьте, можно ли построить треугольник из отрезков с длинами x, y, z и, если можно, то какой - остроугольный, прямоугольный или тупоугольный.

1.17. [Pascal | C | Basic] Проверьте, можно ли построить параллелограмм из отрезков с длинами x, y, v, w.

1.18. [Pascal | C | Basic] Даны координаты (как целые от 1 до 8) двух полей шахматной доски. Определите, может ли конь за один ход перейти с одного из этих полей на другое.

1.19. [Pascal | C | Basic] Треугольник задан величинами своих углов (град.) и радиусом описанной окружности. Вычислите стороны треугольника.

1.20. [Pascal | C | Basic] Смешали v1 литров воды с температурой t1 градусов Цельсия с v2 литрами воды с температурой t2 градусов Цельсия. Вычислите объем и температуру образовавшейся смеси.

1.21. [Pascal | C | Basic] Выберите наибольшее из трех заданных чисел.

1.22. [Pascal | C | Basic] Два прямоугольника заданы длинами сторон. Определите, можно ли первый прямоугольник целиком разместить во втором.

1.23. [Pascal | C | Basic] Значения заданных переменных a, b и c перераспределите таким образом, что a, b, c станут, соответственно, наименьшим, средним и наибольшим значениями.

1.24. [Pascal | C | Basic] Решите линейное уравнение ax = b.

1.25. [Pascal | C | Basic] Решите биквадратное уравнение ax4 + bx2 + c = 0.

1.26. [Pascal | C | Basic] Определите номер квадранта, в котором находится точка с заданными координатами (x, y).

1.27. [Pascal | C | Basic] Запишите заданное смешанное число в виде неправильной дроби.

1.28. [Pascal | C | Basic] Определите, пройдет ли кирпич с рёбрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его рёбер было параллельно или перпендикулярно каждой из сторон отверстия.

1.29. [Pascal | C | Basic] Идет k-ая секунда суток. Определитe, сколько полных часов и полных минут прошло к этому моменту от начала суток.

1.30.* [Pascal | C | Basic] Найдите центр и радиус окружности, проходящей через три заданные точки на плоскости.

1.31.* [Pascal | C | Basic] Даны четыре точки на плоскости. Определите, можно ли построить треугольник с вершинами в этих точках такой, что оставшаяся точка окажется внутри треугольника.

1.32.* [Pascal | C | Basic] Определите, имеют ли общие точки две плоские фигуры - треугольник с заданными координатами его вершин и круг радиусом R c центром в начале координат. 

1.33. [Pascal | C | Basic] В кубический, наполненный до краев аквариум со стороной а метров выпустили рыбу-шар диаметром b см. Вычислите, сколько процентов от первоначального объема воды выплеснется из аквариума (хвост и плавники рыбы не учитывайте). 

1.34. [Pascal | C | Basic] Станции А, B и C расположены на n-м, m-м и p-м километрах железной дороги, соответственно. Какие из этих станций расположены наиболее близко друг к другу?

1.35. [Pascal | C | Basic] На карте координаты начала и конца строящегося прямолинейного участка шоссе обозначены как  (x1, y1 )  и   (x1, y2 ).  Карьер, откуда можно брать гравий для стройки, имеет координаты  (x0, y0), причем x0 <> x1. Определите минимальное расстояние от строящегося участка шоссе до карьера.

1.36. [Pascal | C | Basic] Составьте программу, играющую со своим автором в "Орел или решку".

1.37*. [Pascal | C | Basic] Любитель горнолыжного спорта собирается провести свой недельный отпуск на одном из трех курортов. Курорт А открыт с начала ноября по конец апреля, но из-за лавинной опасности его закрывают на весь январь. Курорт В открыт с начала декабря по конец марта. Его закрывают на соревнования с 1 по 15 февраля. Курорт С постоянно открыт с начала октября по конец мая. Стоимость отдыха на каждом из курортов, включая проезд, составляет, соответственно, P1, P2 и P3 рублей. По дате начала отпуска определите, сможет ли он провести свой отпуск в горах, и какой минимальной суммой он должен располагать.

1.38*. [Pascal | C | Basic] Стартовый номер участника соревнований по автомотоспорту определяется на квалификационных заездах. При этом фиксируется время начала и конца прохождения так называемого "быстрого" круга (часы, минуты, секунды). Проверьте, корректно ли зафиксированы данные участника, и найдите время прохождения им "быстрого" круга.