Программирование алгоритмов с ветвящейся структурой.

Пример 1. Дано число а. Вычислить f(а), если

                  

Program Example_Function;

var a,f:real; begin

writeln ('Введите число: ');

readln (a);

if a <= 0 then f:= 0

else

 if a <= 1 then f: = sqr(a) — a

   else f: = sqr (a) - sin (pi * sqr(a));

writeln ('значение функции f(х) при х = ', а: 10:4,' равно ', f:10:4);

end.

 

Пример 2.  Составить блок-схему алгоритма и программу решения обычного квадратного уравнения.

 

Program Example_uravnenia;

var a, b, с,d,x,x1,x2:real;

begin

writeln('введите А, В,С ' ) ;

readln(a,b,с) ;

d:=sqr(b)-4*a*c;

if d<0 then

 begin

  writeln(Kорней нет'); end

else if d=0 then

 begin

  x:=(-b)/(2*a);

  writeln('Х=' , x) ; end

     else

       begin

         x1:=(-b+sqrt(d) )/ (2*a) ;

         x2: = (-b-sqrt(d) )/ (2*a) ;

         writeln('Х1=',x1);

         writeln('Х2=',х2);

end.

 

Пример 3. Какая из двух точек на плоскости, заданная своими координатами, ближе к началу координат ?

 

Program Example_ploskost;

var x1,y1,х2,у2,d1,d2:real;

begin

writeln ('введите A(X1,Y1) и B(X2,Y2)');

readln( x1,y1,x2,y2 );

d1:=sqrt(sqr(y1)+sqr(x1));

d2:=sqrt(sqr(y2)+sqr(x2));

if d1<d2 then writeln('Точка А ближе')

else if d1>d2 then writeln ('Точка В ближе')

 else writeln('Одинаково');

end.

 

Пример 4. В старояпонском календаре был принят двенадцатилетний цикл. Годы внутри цикла носили названия животных.: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и свиньи. Написать программу, которая позволяет ввести номер года и печатает его название по старояпонскому календарю. Справка: 1996 г.— год крысы начало очередного цикла.

Поскольку цикл является двенадцатилетним, поставим название года в соответствие остатку от деления номера этого года на 12.

Program Example_kalendar;

var year : integer;

begin

write (' введите год ');

readln (year) ;

case year mod 12 of

0: writeln ('Год Обезьяны);

1: writeln ( 'Год Петуха');

2: writeln ( 'Год Собаки);

3: writeln ( ' Год Свиньи') ;

4: writeln ( ' Год Крысы ' ) ;

5: writeln ( ' Год Коровы' ) ;

6: writeln ( ' Год Тигра ' ) ;

7: writeln ( ' год Зайца ' ) ;

8: writeln ( ' Год Дракона ' ) ;

9: writeln ( ' Год Змеи ' ) ;

10:writeln ( ' Год Лошади ) ;

11:writeln ( 'Год Овцы' )

end;

end.

 

Пример 5. Найти наибольшее из двух действительных чисел, используя оператор выбора.

Program Example_vibor;

var max, x, у : real;

begin

write('Введите два неравных числа:');

readln(x, у);

case x > у of

true : max := x;

false : max := у

end;

writeln('Максимальное из двух есть ', max );

end.

 

Задачи с условиями

Пример 6.. Проверить данное число на «простоту».

Мы знаем, что простое число делится только на единицу и на само себя. Это аксиоматично и не требует проверки. Нам надо лишь проверить делимость числа на другие числа. Рассуждая логически, если число не будет делиться хотя бы на одно из «базовых» простых чисел 2, 3, 5 и 7, то оно будет простым. Используя функцию «логического сложения», получаем простое решение на Паскале:

if ((a mod 2) or (a mod 3) or (a mod 5) or (a mod 7)) then writeln('He простое') else writeln ('Простое');

Здесь мы видим принцип использования математической закономерности для построения условия. В данном примере явно видно ограничение на величину входного числа, но в данном случаем нам важен принцип. Используя такой же подход для решения других задач, можно существенно облегчить решение. Хорошим примером в это плане являются «шахматные» задачи.

Будем считать, что каждая клетка задается парой натуральных чисел, не превышающих восьми, причем первая цифра соответствует номеру строки, а вторая — номеру столбца. Введем обозначения: (k,l) для одной и (m,n) для другой клетки.

 

Пример 7. Заданы координаты двух клеток шахматной доски. Определить, различны ли они по цвету.

Выпишем для примера координаты черных и белых клеток:

Черные клетки

Белые клетки

(2,1)

(1,7)

(5,4)

(2,8)

Рассмотрим шахматную доску в следующем представлении:

Внешне никакой закономерности не проявляется, однако стоит нам сложить координаты, как закономерность сразу становится явной: сумма координат клеток одного цвета одинакова по четности: если сумма координат одной клетки одинаково четна или нечетна с суммой координат другой клетки, то клетки одного цвета.

if ((k+1 mod 2=0) and (m+n mod 2=0)) or ((k+1 mod 2<>0)

and (m+n mod 2<>0))

then writeln ('YES') else writeln('NO');

 

Пример 8. На одной клетке стоит одна из данных фигур: ладья, слон, ферзь. Заданы координаты другой клетки. Определить, «бьет» ли данная фигура заданную клетку поля.

Для ладьи задача решается просто: если координаты столбца или строки обеих клеток совпадают, то угроза существует.

Немного сложнее обстоит дело со слоном. Использование решения предыдущей задачи в предположении, что слон «ходит» только по клеткам своего цвета, не даст нам правильного решения ° всех возможных случаях. Попробуем найти закономерность для Клеток одной диагонали.

Пусть слон стоит на клетке (4,4). Тогда под его удар попадают клетки:

(5,3)       

(6,2)       

(7,1)       

(3,5)       

(2,6)       

(1,7)

 

(5,5)       

(6,6)       

(7,7)       

(8,8)       

(3,3)       

(2,2)       

(1,1)

 

 Для сравнения возьмем «безопасную» клетку: (2,1).

Мы видим, что разность по модулю между координатами клеток одной диагонали постоянна.

Объединив условия для ладьи и слона, получим условие для ферзя.

 

Зная простые геометрические законы для базовых фигур (или найдя их в справочнике), можно решить и простейшие геометрические задачи.

Пример 9. Может ли шар радиуса r пройти через ромбообразное отверстие с диагоналями р и q?

Рассмотрев ромб как два равных треугольника и используя соотношения для окружности, вписанной в треугольник, можно вывести условие для данной задачи. Не исключены и другие варианты решения. Например, можно рассмотреть два подобных прямоугольных треугольника (в одной четвертой части ромба) и по принципу подобия и тереме Пифагора вывести соотношение самостоятельно. Один треугольник - четвертая часть ромба, другой - образованный высотой в этом треугольнике.

И наконец, анализируя значения остатков от деления данного числа на какое-либо другое, можно легко решить такие задачи, как следующая.

 

Пример 10. Для заданного возраста человека вывести фразу вида «Человеку 21 год», «Человеку 15лет», «Человеку 34 года».

Проанализируем ряд возрастов человека. После 20 лет получается, что если последняя цифра числа 1, то мы должны сказать год; если 2, 3, 4 — года, если 5-9 и 0 — лет.

До 20 лет получается аналогично, но с исключением: с 5 до 20 включительно мы говорим лет. На основе этого можно записать правила: если остаток от деления числа на 10 равен 1, то вывести «год»; если остаток от деления на 10 равен 2, 3 или 4, то вывести «года»; если остаток от деления на 10 равен 0, 5, 6, 7, 8 или 9, то вывести «лет». Но если число находится в промежутке от 5 до 20, то вывести «лет» независимо от значения остатка.

Program Example_vozrast;

var n,o: integer; begin

write ('Введите возраст ');

readln (n);

o:=n mod 10;

if (o=l) and (not((n>4) and (n<21))) then writeln(n,'год');

if (o>l) and (o<5) and (not((n>4) and (n<21))) then writeln(n,'года');

if (o>=5) and (o<=9) or (o=0) or ((n>4) and (n<21)) then

writeln(n, ' лет ' );

end.

В МЕНЮ

Используются технологии uCoz