Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Теория алгоритмов - БИ-1.docx
Скачиваний:
110
Добавлен:
30.05.2015
Размер:
4.19 Mб
Скачать
  1. Требования к отчету

Отчет должен содержать:

  • название работы, постановку задачи и сведения о последовательности её выполнения;

  • скриншот работающей программы (результаты работы);

  • ответы на контрольные вопросы из Приложения Б, указанные преподавателем.

  1. Нелинейные алгоритмы с разветвлением

Цель занятия - изучение основ построения алгоритмов и программ нелинейной структуры с использованием выбора по условию.

Объем занятия – 2 часа.

  1. Общие сведения

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

Структура ветвление существует в четырех основных вариантах:

  • если-то;

  • если-то-иначе;

  • выбор;

  • выбор-иначе.

  1. Содержание работы

Работа предполагает базовые знания школьного курса языка программирования Turbo Pascal. Запустить программуPascal ABC. Ознакомиться с работой программы, строкой меню, окном редактора кода и ввода-вывода команд. Воспроизвести примеры, приведенные ниже, используя, где необходимо, преобразование команд «школьного алгоритмического языка» в операторы паскаля. По указанию преподавателя выбрать вариант из Приложения В. По завершении работы результаты сохранить в файл.

Структура ветвления

Блок-схема

1. если-то

если условие

то действия

все

  1. Для положительных х вычислить значение функции sin(x)

если x > 0

то y := sin(x)

все

2. если-то-иначе

если условие

то действия 1

иначе действия 2

все

  1. Даны два числа, если первое из них больше второго, то его необходимо удвоить, а второе число приравнять единице, в противном случае первое число оставить без изменения, а второе – удвоить.

если a > b

то a := 2*a; b := 1

иначе b := 2*b

все

3. выбор

Выбор

при условие 1: действия 1

при условие 2: действия 2

. . . . . . . . . . . .

при условие N: действия N

все

  1. В зависимости от значения натурального числа n, могущего принимать значения 1, 2 или 3, присвоить функции y значения sin x, cos x или нуля.

выбор

при n = 1: y := sin(x)

при n = 2: y := cos(x)

при n = 3: y := 0

все

4. выбор-иначе

Выбор

при условие 1: действия 1

при условие 2: действия 2

. . . . . . . . . . . .

при условие N: действия N

иначе действия N+1

все

выбор

при a > 5: i := i+1

при a = 0: j := j+1

иначе i := 10; j:=0

все

  1. Дано натуральное число n. Если число нечётное и его удвоение не приведет к выходу за 32767 (двухбайтовое целое число со знаком), удвоить его, иначе – оставить без изменения.

Чтобы удовлетворить условию удвоения, число n должно быть нечетным и меньше 16384.

1. Ввести число n

2. Если число n нечетное и меньше 16384, то n := n * 2

3. Вывод n

4. Конец

  1. Даны три точки на плоскости. Определить, какая из них ближе к началу координат.

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)); {расстояние до точки B}

  DistC := sqrt(sqr(xC) + sqr(yC)); {расстояние до точки C}

  WriteLn; Write('Ответ : ');

  If (DistA < DistB) and (DistA < DistC) {сравнение расстояний}

then WriteLn( 'Это точка А.')

else If (DistB < DistC) {сравнение расстояний}

then WriteLn('Это точка B.')

else WriteLn('Это точка C.');

  ReadLn

END.

  1. Найти произведение цифр заданного целого четырехзначного числа.

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.

  1. Решить квадратное уравнение ax2 + bx + c = 0.

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) {проверка 4-го случая}

then begin Write('Все коэффициенты равны нулю.');

WriteLn('x - любое число ')

end

else

If (a=0) and (b<>0) {проверка 6-го случая}

then WriteLn('Линейное уравнение. Oдин корень: x =', (-c/b):6:2)

else

  If (a=0) and (b=0) and (c<>0) {проверка 5-го случая}

then WriteLn('Неправильное уравнение.')

else

begin

Discr := b*b - 4*a*c; {вычисление дискриминанта}

If Discr > 0  {проверка 1-го случая}

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 {проверка 2-го случая}

then begin

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

WriteLn('Корни равны: x1=', x1:6:2, ' x2=', x1:6:2)

  end

else WriteLn('Действительных корней нет.'); {проверка 3-го случая}

end; 

WriteLn

end; 

  ReadLn

END.

  1. Контроль корректности данных. Составить программу расчета площади треугольника S по трем сторонам a, b,c, значения которых запрашиваются с клавиатуры, по формуле Герона

, где .

Var a, b, c, p,S: real;

Begin

Write(‘Ввести сторону а=’);ReadLn(a);

Write(‘Ввести сторону b=’);ReadLn(b);

Write(‘Ввести сторону c=’);ReadLn(c);

IF (a>0) and (b>0) and (c>0){проверка положительности}

and (a+b>c) and (a+c>b) and (c+b>a) {каждая сторона должна быть меньше суммы двух других сторон}

THEN begin p:=(a+b+c)/2;

S:=sqrt(p*(p-a)*(p-b)*(p-c));

WriteLn(‘Площадь:’, S:15:5)end

ELSE Writeln(“Неверные входные данные!’);

ReadLn

END.

  1. Программа случайного предсказания одного из десяти вариантов ближайшего будущего с вероятностью 1/20, в остальных случаях – Вы «неудачник».

Var N:word;

Begin

WriteLn(‘Предсказание будущего!’);

Randomize;N:=Random(20)+1; {N-случайное число от 1 до 20}

WriteLn; Write(‘Вас ожидает_’);

Case N of

1: WriteLn(‘счастье’); 6: WriteLn(‘здоровье’);

2: WriteLn(‘пятерка’); 7: WriteLn(‘деньги’);

3: WriteLn(‘дорога’); 8: WriteLn(‘любовь’);

4: WriteLn(‘двойка’); 9: WriteLn(‘встреча’);

5: WriteLn(‘болезнь’); 10: WriteLn(‘мама’)

Else WriteLn(‘неудача’) end;

WriteLn(‘Нажми клавишу Enter’);

ReadLn

END.

Здесь функция Random(x) генерирует случайное число, с равномерной плотностью распределения на заданном интервале. Для инициализации распределения в начале программы необходимо вызвать процедуру Randomize.