Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактОАиПН111.doc
Скачиваний:
58
Добавлен:
25.02.2016
Размер:
1.38 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

“МИНСКИЙ ГОСУДАРСТВЕННЫЙ ВЫСШИЙ РАДИОТЕХНИЧЕСКИЙ КОЛЛЕДЖ”

Основы алгоритмизации и программирования

Лабораторный практикум для студентов специальности

«Программное обеспечение информационных технологий»

Минск 2004

УДК

ББК

Рекомендовано кафедрой информатики и Научно-методическим советом Учреждения образования «Минский государственный высший радиотехнический колледж»

Составитель Назаров Леонид Викторович

старший преподаватель кафедры информатики МГВРК

Рецензент

Основы алгоритмизации и программирования: Лабораторный практикум для студентов специальности «Программное обеспечение информационных технологий»/Назаров Л.В. – Мн.:МГВРК, 2004.- с.,ил.

Данный практикум является первой частью лабораторного практикума по предмету «Основы алгоритмизации и программирования», содержит задания для 18-и лабораторных работ, ориентированных на программирование с использованием системы программирования Паскаль. Многие лабораторные работы кроме основных заданий содержат задания повышенной сложности. Каждая лабораторная работа содержит рекомендации по ее выполнению, приводятся решения типовых заданий.

Предназначается для студентов и преподавателей колледжа

Введение

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

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

Некоторые задания по лабораторным работам содержат задания повышенной сложности.

В электронном варианте данный практикум постоянно пополняется новыми заданиями.

Лабораторная работа 1

Разветвляющиеся алгоритмы и программы

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

Что нужно знать для выполнения работы

1. Символы, используемые в схемах программ и правила их применения.

2. Структуру программы.

3. Оператор присваивания, математические и логические операции, их приоритет.

4. Операторы ввода-вывода read(ln), write(ln).

5. Стандартные математические функции Паскаля.

6. Условный оператор if … then…else.

7. Оператор выбора case … of…else…end.

Примеры выполнения задания лабораторной работы

Пример 1

Даны два числа a и b. Получите число maxab, равное наибольшему из исходных. Если исходные числа равны, то maxab положить равным любому из них.

Решение

Для решения задачи нужно ввести значения переменных a и b, сравнить их значения и, в зависимости от результата сравнения, maxab положить равным а или b.

Обратите внимание на то, что вместе с результатом выводятся и исходные данные. Это позволит упростить тестирование и повысить наглядность вывода. Во втором варианте решения данной задачи мы не сравнивая присваиваем переменной-результату maxab первое «попавшееся» значение, а затем сравниваем это значение со вторым числом.

Возможно и более “экзотическое” решение данной задачи, в котором maxab находится не прибегая к сравнению исходных чисел (Кнут Д. «Искусство программирования для ЭВМ»). Вместо этого хитроумно используется стандартная функция Паскаля «abs» вычисления модуля числа.

Да Нет

Рисунок 1.1 Схема алгоритма программы задачи 1 (вариант 1)

Да

Нет

Рисунок 1.2 Схема алгоритма программы задачи 1 (вариант 2)

Текст программы

program lr1_1_1;

{ Даны два числа a и b. Получите число maxab, равное наибольшему из исходных.

Если исходные числа равны, то maxab положить равным любому из них.

}

uses

crt;

var

a,b,maxab:real;

begin

clrscr;

write(‘Введите два числа через пробел ’);

readln(a,b);

if a>=b then

maxab:=a

else

maxab:=b;

writeln(‘ a= ’,a:8:2,’ b= ‘,b:8:2,’ maxab= ‘,maxab:8:2);

readkey;

end.

Основная часть программы, соответствующая второй схеме будет выглядеть так.

maxab:=a;

if maxab<b then

maxab:=b;

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

Контрольные примеры

Контрольный пример 1

Исходные данные: a=1, b=2; результат maxab=2.

Контрольный пример 2

Исходные данные: a=3, b=1; результат maxab=3.

Контрольный пример 3

Исходные данные: a=1, b=1; результат maxab=1.

Примечание. При записи результата мы не учитываем формат вывода его в программе.

Пример 2

Рассмотрим следующую задачу. Даны координаты точки М(х,у). Определите, принадлежит ли данная точка замкнутому множеству D (рисунок 1.3) (a>0; b>0).

Y

b

D

0 а X

Рисунок 1.3

Решение

Точка М(х,у) принадлежит замкнутому множеству D, если ее абсцисса не меньше 0 и не больше а, а ордината не меньше 0 и не больше b.

Нет

Да

Нет

Да

Нет

Да

Нет

Да

Рисунок 1.4. Схема программы (вариант 1)

В данном варианте в каждом блоке «решение» проверяется простое условие (вычисляется булевское выражение), имеющее вид «арифметическое выражение» «знак сравнения» «арифметическое выражение», которое может принимать одно из двух значений: «истина» (true) или «ложь» (false).

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

Да Нет

Рисунок 1.5. Схема программы (вариант 2).

Учитывая законы булевой алгебры (законы де Моргана), сложное выражение во втором варианте можно записать: не(x<0 или x>a или y<0 или y>b)?. Если данное выражение принимает значение «истина», то точка принадлежит области, иначе не принадлежит.

Текст программы (вариант 1)

program lr1_2_1;

{ Даны координаты точки М(х,у). Определите, принадлежит ли данная точка замкнутому множеству D. D – прямоугольник с координатами вершин (0;0), (a;0), (a;b), (0;b) (a>0; b>0).

Исходные данные: a, b, x, y.

Результат: сообщение на экране «Точка не принадлежит» или «Точка принадлежит»

}

uses

crt;

var

a,b,x,y:real;

begin

clrscr; {очистка экрана}

{Ввод исходных данных}

write(‘Введите через пробел значения a,b,x,y);

readln(a,b,x,y);

{Оределение принадлежности точки множеству}

if x0 then

if xa then

if y0 then

if yb then

writeln(‘Точка принадлежит’)

else

writeln(‘Точка не принадлежит’)

else

writeln(‘Точка не принадлежит’)

else

writeln(‘Точка не принадлежит’)

else

writeln(‘Точка не принадлежит’);

readkey; {ожидание нажатия клавиши}

end.

Текст программы (вариант 2)

program lr1_2_2;

uses

crt;

var

a,b,x,y:real;

begin

clrscr; {очистка экрана}

{Ввод исходных данных}

write(‘Введите через пробел значения a,b,x,y);

readln(a,b,x,y);

{Оределение принадлежности точки множеству}

if (x>=0) and (x<=a) and (y>=0) and (y<=b) then

writeln(‘Точка принадлежит’)

else

writeln(‘Точка не принадлежит’);

radkey; {ожидание нажатия клавиши}

end.

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

{Оределение принадлежности точки множеству}

if (x<0) or (x>a) or (y<0) or (y>b) then

writeln(‘Точка не принадлежит’)

else

writeln(‘Точка принадлежит’);

или

{Оределение принадлежности точки множеству}

if not (x<0) or (x>a) or (y<0) or (y>b) then

writeln(‘Точка принадлежит’)

else

writeln(‘Точка не принадлежит’);

Контрольные примеры

Контрольный пример 1:

Исходные данные: a=4; b=2; x=2;y=1

Результат: ‘Точка принадлежит’

Контрольный пример 2:

Исходные данные: a=4; b=2; x=2;y=0

Результат: ‘Точка принадлежит’

Контрольный пример 3:

Исходные данные: a=4; b=2; x=0;y=0

Результат: ‘Точка принадлежит’

Контрольный пример 4:

Исходные данные: a= 4; b=2; x=-2;y=1

Результат: ‘Точка не принадлежит’

Контрольный пример 5:

Исходные данные: a=4; b=2; x=2;y=3

Результат: ‘Точка не принадлежит’

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

Для иллюстрации применения структуры «выбор» и, следовательно, оператора case, решим следующую задачу.

Пример 3

Дана оценка по десятибалльной системе. Получить ее эквивалент по пятибалльной системе. Предполагается, что между системами имеется следующее соответствие:

10-балльная 5-балльная

0 1

1-3 2

4-5 3

6-8 4

9-10 5

Данную задачу можно решить и с помощью структуры «ветвление» (оператора if…then…else), но удобней воспользоваться структурой «выбор».

0

1..3

4,5

6..8

Иначе 9,10

Рисунок 1.6. Схема программы

Текст программы

program lr1_3_1;

{Дана оценка по десятибалльной системе. Получить ее эквивалент

по пятибалльной системе. Предполагается, что между системами

имеется следующее соответствие:

10-балльная 5-балльная

0 1

1-3 2

4-5 3

6-8 4

9-10 5

}

uses

crt;

var

oc10,oc5:byte;

begin

clrscr;

write('Введите оценку по десятибалльной системе ');

readln(oc10);

case oc10 of

0 : oc5:=1;

1..3 : oc5:=2;

4,5 : oc5:=3;

6,7 : oc5:=4;

8..10: oc5:=5

else

begin

writeln(oc10,' -такой оценки нет. ');

readkey;

exit; {Выход из программы}

end;

end;

writeln(‘Оценке ’,oc10,' по 10-балльной системе соответствует ',

oc5,' по 5-балльной');

readkey;

end.

Задания

1. Напишите программу, запрашивающую возраст пользователя. Если ему не менее 18 лет, сообщите, что он имеет право голосовать, в противном случае вычислите, через сколько лет ему будет предоставлено это право.

2. Напишите программу, которая спрашивала бы сокращенное имя, а печатала полное для пяти ваших друзей. Ввод незнакомого имени должен провоцировать заявление типа «Я С ВАМИ НЕЗНАКОМА». Ответ, содержащий сокращенное имя, помещается в символьную переменную, а затем сравнивается последовательно с сокращенными именами пяти знакомых. Если введенное имя совпадает с каким-либо из использованных в программе, то вывести соответствующее полное имя.

3. Составьте программу для определения подходящего возраста кандидатуры для вступления в брак, используя следующее соображение: возраст девушки равен половине возраста мужчины+7, возраст мужчины определяется соответственно как удвоенный возраст девушки-14. В начале выполнения программы на экране должен появиться вопрос МУЖЧИНА или ЖЕНЩИНА? ВВЕДИТЕ М, если Вы мужчина, или Ж, если женщина и свой возраст. В зависимости от ответа выводятся соответствующие рекомендации.

4. Заданы координаты двух точек. Определите, расположены ли они на одной окружности с центром в начале координат. Результат присвоить символьной переменной. Две точки находятся на одной окружности, если длины радиус-векторов, соединяющих эти точки с началом координат, равны (проверку на равенство осуществить с точностью до е=1.0Е-3)

5. Введите номер месяца в году. Выведите на экран сообщение о времени года.

6. Введите номер дня недели. Выведите на экран название дня.

7. В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп. Составьте программу, которая спрашивает о желании покупателя (журнал или газета?), принимает деньги (сумма денег вводится с клавиатуры) и печатает причитающуюся сдачу. Покупателю нужно задать, по крайней мере, 2 вопроса: 1.”ЧТО ХОТИТЕ КУПИТЬ? ЖУРНАЛ ИЛИ ГАЗЕТУ?” После ввода ответа нужно показать стоимость соответствующего издания и задать вопрос: 2.”СКОЛЬКО ВЫ ПЛАТИТЕ ?” Сумма денег покупателя вводится с клавиатуры (в числовую переменную). Далее сравнивается эта сумма со стоимостью покупки и печатается соответствующее итоговое сообщение.

8. Даны радиус круга и сторона квадрата. Проверьте, пройдет ли квадрат в круг?

9. Ввести три числа, найти наименьшее отношение этих чисел.

10. Даны радиус круга и сторона квадрата. Проверьте, пройдет ли круг в квадрат?

11. Функция sign(x) задана аналитически cледующим образом

1, если х>0;

sign(x)= 0, если х=0;

-1, если х<0;

Введите значение х, выведите значение функции sign(x).

12. На плоскости расположена окружность радиуса R с центром в начале координат. Ввести заданные координаты точки и определить, находится ли она на окружности. Результат присвоить символьной переменной. Точка находится на окружности, если длина радиус-вектора, соединяющего начало координат с заданной точкой, равна R (проверку на равенство осуществлять с точностью до е=1.0Е-3)

13. Напишите программу, печатающую корни квадратного уравнения ax2 + bx + c =0. Если уравнение не имеет корней, то выдать соответствующее сообщение.

14. Даны координаты точки М(х,у). Определите, принадлежит ли данная точка замкнутому множеству D (рисунок 1.7).

Y

1

D

0 2 X

Рисунок 1.7

15. Даны координаты точки М(х,у). Определить, принадлежит ли данная точка замкнутому множеству D (рисунок 1.8). ABC – равносторонний.

Y

С

А В

0 2 X

Рисунок 1.8

16. Даны координаты точки М(х,у). Определить, принадлежит ли данная точка замкнутому множеству D, заданному системой ограничений:

х + у  1,

2х - у  1,

у  0

17. Даны координаты точки М(х,у). Определить, принадлежит ли данная точка замкнутому множеству D (рисунок 1.9).

Y

1

0 1 X

Рисунок 1.9

18. Даны координаты точки М(х,у). Определить, принадлежит ли данная точка замкнутому множеству D (рисунок 1.10).

Y

1

-1 1

X

-1

Рисунок 1.10

19. Даны координаты точки М(х,у). Определить, принадлежит ли данная точка замкнутому множеству D (рисунок 1.11).

Y

1

-1 1

0 D X

-1

Рисунок 1.11

20. Ввести два положительных числа и показать, что среднее арифметическое этих чисел не меньше их среднего геометрического.

21. Ввести два положительных числа и показать, что среднее геометрическое этих чисел не меньше их среднего гармонического.

22. Даны длины трех отрезков. Определить, можно ли из этих отрезков сложить треугольник?

23. Даны длины сторон треугольника. Определить, является ли данный треугольник равнобедренным?

24. Даны длины сторон треугольника. Определить, является ли данный треугольник равносторонним?

25. Даны длины сторон треугольника. Определить, является ли данный треугольник разносторонним?

26. Даны в градусах величины двух углов треугольника. Определить, является ли данный треугольник равнобедренным?

27. Найти наибольшее значение из трех f(1), f(2) и f(3), где f(x) = sin(5x).

28. Даны в градусах величины двух углов треугольника. Определить, является ли данный треугольник остроугольным?

29. Прямоугольник задан координатами своих вершин. Определить, принадлежит ли точка с заданными координатами области прямоугольника.

30. Прямоугольник задан координатами своих вершин. Определить, принадлежит ли окружность с заданным радиусом и координатами центра области прямоугольника.

31. Даны длины сторон треугольника. Определить, является ли данный треугольник прямоугольным?

Задания второго уровня

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

2. В каждой больничной палате четыре койки. Введите количество палат, количество больных мужчин и количество больных женщин. Определить, сколько всего свободных мест. Сколько больных каждого пола можно еще положить в больницу?

3. Напишите программу, запрашивающую у тренера сборной колледжа по лыжам время в минутах и секундах (с точностью до сотых долей секунды) трех победителей 10-километровой гонки. Если какие-то результаты различаются меньше, чем на секунду, напечатать:

ВОТ ТАК БОРЬБА ШЛА ЗА___________ МЕДАЛЬ!

4. Ввести значение х. Расположить в порядке убывания значения x*sin(x), ln.

5. Написать программу, реализующую задачу из примера 3 не использующую условного оператора и оператора выбора. Другими словами, программа должна быть линейной.

6. Написать программу нахождения наибольшего из трех заданных чисел a, b, c, не использующую условного оператора и оператора выбора. Другими словами, программа должна быть линейной.

7. Треугольник задан координатами вершин. Определить, принадлежит ли точка с заданными координатами области треугольника.

8. Треугольник задан координатами вершин. Определить количество общих точек данного треугольника с отрезком, заданным координатами концов.

9. Определить количество общих точек у двух отрезков, заданных координатами своих концов.

10. Две окружности заданы своими радиусами и координатами центра. Определить количество общих точек у этих окружностей.

11. Треугольник задан длинами сторон. Определить, пройдет ли данный треугольник в квадрат с заданной стороной?

12. Треугольник задан длинами сторон. Определить, пройдет ли данный треугольник, как бы его не поворачивали, в квадрат с заданной стороной ?

13. Треугольник задан координатами вершин. Определить, принадлежит ли начало координат области треугольника.

14. Определите, сколько общих точек у прямой y=kx+b и окружности x2 + y2 =R2.

15. Два прямоугольника заданы длинами своих сторон. Определить, можно ли уместить один из них внутри другого.

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

Лабораторная работа 2

Простые циклы с заданным числом повторений

Цель работы: Формирование первичных умений в разработке простых циклических программ с заданным числом повторений.

Что нужно знать для выполнения работы

1. Структура цикла, назначение и порядок следования его отдельных частей.

2. Структуры: «цикл-пока» и «цикл-повторить».

3. Операторы цикла «while … do», «repeat … until», «for … do».

Примеры выполнения задания лабораторной работы

Пример 1

Составьте программу, находящую сумму значений функции sin(x) для х, изменяющегося от 0 до 10 с шагом /3.

S:=0

x:=0

Нет

Да

S:=S+sin(x)

x:=x+/3

Рисунок 2.1 Схема алгоритма программы примера 1 (вариант 1 «цикл-пока»)

S:=0

x:=0

S:=S+sin(x)

x:=x+/3

Да

Нет

Рисунок 2.2 Схема алгоритма программы примера 1 (вариант 2 «цикл-повторить»)

Приведенные схемы удобно изображать с использованием символов «начало цикла» и «конец цикла».

S:=0

x:=0

S:=S+sin(x)

x:=x+/3

Рисунок 2.3 Схема алгоритма программы примера 1 (вариант 3 «цикл-пока»)

S:=0

x:=0

S:=S+sin(x)

x:=x+/3

Рисунок 2.4 Схема алгоритма программы примера 1 (вариант 4 «цикл-повторить»)

Текст программы

program lr2_1_1;

{Нахождение суммы значений функции sin(x) для

х, изменяющегося от 0 до 5*пи}

uses

crt;

const

p:real=pi;

var

x,s:real;

begin

clrscr;

s:=0;

x:=0;

while x<=5*p do

begin

s:=s+sin(x);

x:=x+p/3;

end;

writeln(' x=',x:4:2,' s=',s:6:2);

readkey;

end.

program lr2_1_2;

{Нахождение суммы значений функции sin(x) для

х, изменяющегося от 0 до 5*пи.

Использование цикла-повторить}

uses

crt;

const

p:real=pi;

var

x,s:real;

begin

clrscr;

s:=0;

x:=0;

repeat

s:=s+sin(x);

x:=x+p/3;

until x>5*p;

writeln(' x=',x:4:2,' s=',s:6:2);

readkey;

end.

Пример 2

Найти n-й член ряда Фибоначчи. Члены ряда Фибоначчи можно вычислить по формуле a1 = a2 = 1, ai = ai-1 + ai-2, для i > 2.

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

a:=1

b:=1

c:=a+b

a:=b

b:=c

Рисунок 2.5 Схема алгоритма программы примера 2

Текст программы

program lr2_2_1;

{Найти n-ый член ряда Фибоначчи}

uses

crt;

var

i,n,a,b,c :word;

begin

clrscr;

write('n= ');

readln(n);

a:=1;b:=1;

for i:=3 to n do

begin

c:=a+b;

a:=b;

b:=c;

end;

writeln('F(n)= ',b:8);

readkey;

end.