ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ
Введение
Данное учебное пособие подготовлено для студентов специальностей 270102 Промышленное и гражданское строительство, 270115 Экспертиза и управление недвижимостью, 280201 Охрана окружающей среды и рациональное использование природных ресурсов, 270100 Строительство, 280200 Защита окружающей среды.
В курс дисциплины «Информатика» для этих специальностей входит знакомство с языками программирования высокого уровня. На лабораторных занятиях учебной программой предусмотрено создание программ на языке Паскаль по следующим темам: «Линейные программы», «Операторы условия и выбора», «Организация циклов», «Процедуры и функции», «Одномерные и двумерные массивы», «Обработка строковых величин».
Пособие содержит примеры решения заданий по каждой теме, варианты заданий, требования к отчетам по лабораторным работам, а также дополнительные задания, контрольные вопросы и должно помочь успешно выполнить лабораторные работы, а также подготовиться к зачету или экзамену.
Предполагается, что к началу лабораторного занятия студенты изучили конспект лекций по данной теме и соответствующие разделы рекомендуемой литературы. Для проверки готовности к занятию можно использовать контрольные вопросы. Повторно вернуться к ним рекомендуется по окончанию работы.
Общие указания к выполнению лабораторных работ
Основная цель при выполнении лабораторных работ - практическое освоение всех этапов разработки программ для решения задач, начиная от анализа условия задачи и заканчивая сдачей отчета по написанной программе.
Задание каждой лабораторной работы включает не менее двух задач и предусматривает следующие виды работ:
1. Анализ условия задачи и выработка подхода к ее решению.
2. Пошаговая разработка алгоритма решения и его описание.
3. Составление блок-схемы алгоритма.
4. Разработка программы на языке Паскаль.
5. Выбор набора тестов, на которых будет проверяться программа.
6. Отладка программы и демонстрация правильной ее работы на выбранном наборе тестов.
Подготовка к выполнению задания осуществляется во внеаудиторное время. Выполнив лабораторную работу, студент оформляет отчет, который должен включать:
Тема и цель работы.
Условия задания.
Схема алгоритма решения задачи:
- математическая модель задачи;
- блок схема алгоритма.
Анализ алгоритма.
Текст программы и размещение исходных данных при вводе.
Результаты выполнения программы.
Обоснование правильности разработанной программы.
Выводы.
При защите отчета проверяется правильность его выполнения, студент должен быть готов отвечать на контрольные вопросы и уметь пояснять как работу программы в целом, так и ее отдельных частей.
Лабораторная работа № 1
ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ
Цель работы: выработать практические навыки использования системы программирования Borland Pascal, научиться создавать, вводить, отправлять на выполнение и исправлять простейшие программы на языке Паскаль, познакомиться с диагностическими сообщениями компилятора об ошибках на примере программ, реализующих линейные алгоритмы.
Общие сведения
Линейным называется алгоритм, в котором результат получается путем однократного выполнения заданной последовательности действий при любых значениях исходных данных. Операторы программы выполняются последовательно, один за другим, в соответствии с их расположением в программе.
Перед выполнением работы необходимо ознакомиться с теоретическим материалом по темам «Описание языка Паскаль», «Простые операторы. Ввод/вывод данных» ([1], с. 10-28).
Пример. Определить расстояние на плоскости между двумя точками с заданными координатами M1(x1,y1) и M2(x2,y2).
Решение задачи.
В этом примере проведем полный разбор решения задачи.
Математическая модель: расстояние на плоскости между двумя точками M1(x1,y1) и M2(x2,y2) высчитывается по формуле:
Составим схему алгоритма, а затем уточним содержимое блоков "Вычисление расстояния" и "Вывод расстояния" (рис.1):
Рис. 1
Дальнейшая детализация не требуется. Переводим блок-схему на язык Паскаль, доработав программу, чтобы улучшить ее интерфейс:
program example1;var x1, x2, y1, y2: Integer; d:Real; begin Writeln('Эта программа вычисляет расстояние между двумя точками на плоскости'); Writeln('Введите координаты двух точек:'); Write('x1= '); Readln(x1); Write('y1= '); Readln(y1); Write('x2= '); Readln(x2); Write('y2 ='); Readln(y2); d:=sqrt(sqr(x2-x1)+sqr(y2-y1)); Writeln('d= ',d:6:2); Writeln('нажмите Enter для завершения работы программы'); Readln; end.
Проверим работу программы на нескольких тестах:
Набор данных | Результаты вычислений | ||||
x1 | y1 | x2 | y2 | Ручных | Машинных |
-4 | 5.00 | ||||
0.00 | |||||
5,83095 | 5.83 | ||||
-23 | -4 | 19,41649 | 19.42 |
С учетом округления при выводе, результаты ручных и машинных вычислений совпадают на выбранных наборах данных, что позволяет предположить правильность составления программы по выбранному алгоритму.
Перед самостоятельным выполнением заданий ознакомьтесь с Приложениями 1-2.
Варианты заданий
Задание 1. Даны x, y. Составить программу вычисления значения выражения:
1. | ![]() | 4. | ![]() | 7. | ![]() | 10. | ![]() |
2. | ![]() | 5. | ![]() | 8. | ![]() | 11. | ![]() |
3. | ![]() | 6. | ![]() | 9. | ![]() | 12. | ![]() |
Задание 2.Составить программу для решения следующей задачи:
1. Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.
2. Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.
3. Определить время падения камня на поверхность земли с высоты h.
4. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
5. Треугольник задан координатами своих вершин. Найти периметр треугольника.
6. Вычислить высоту треугольника, опущенную на сторону а, по известным значениям длин его сторон a, b, c.
7. Вычислить объем цилиндра с радиусом основания r и высотой h.
8. Определить расстояние, пройденное физическим телом за время t, если тело движется с постоянным ускорением а и имеет в начальный момент времени скорость V0.
9. Вычислить площадь треугольника по формуле Герона, если заданы его стороны.
10. Определить координаты вершины параболы y=ax2+bx+c (a≠0). Коэффициенты a, b, c заданы.
11. По данным сторонам прямоугольника вычислить его периметр, площадь и длину диагонали.
12. Треугольник задан координатами своих вершин. Найти площадь треугольника.
Задание 3. Вывести значение true, если приведенное высказывание для предложенных исходных данных является истинным, и значение false в противном случае (все числа, для которых не указано иное, являются действительными):
1) данное число x принадлежит отрезку [-a, a];
2) данное целое число x является двузначным;
3) данное число x не принадлежит интервалу (a, b);
4) данное целое число x является четным;
5) данное целое число x заканчивается цифрой9;
6) данное натуральное число x является однозначным;
7) данные x, y - различные положительные числа;
8) данное натуральное число делится на три;
9) дробная часть данного вещественного числа x больше 0.5;
10) модуль данного числа x больше некоторого K;
11) данное число x является корнем уравнения: ax+b=0;
12) данное натуральное число не делится на семь.
Дополнительные задания
1. Студент начал решать задачи данного урока программирования, когда электронные часы показывали h1 часов и min1 минут, а закончил, когда было h2 часов и min2 минут. Составьте программу, позволяющую определить, сколько времени студент решал эти задачи. Будем считать, что студент не засиживался за полночь.
2. Дано действительное число а. Не пользуясь никакими другими операциями, кроме умножения, получить: а) а4 за две операции; б) а6 за три операции; в) а7 за четыре операции; г) а8 за три операции.
3. Найти максимум и минимум двух натуральных чисел, не используя оператор ветвления.
Контрольные вопросы
1. Каковы назначение и возможности системы Borland Pascal?
2. Как запустить программу на трансляцию и выполнение?
3. Как обозначается начало и конец программы?
4. Из каких разделов состоит программа на языке Паскаль?
5. Как в языке Паскаль осуществляется вывод на экран?
6. Для чего предназначен оператор присваивания?
7. Как вывести на экран значение переменной?
Лабораторная работа № 2
ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ
Цель работы: научиться решать задачи на разветвляющиеся алгоритмы; научиться использовать в программах условный оператор if и оператор выбора case.
Общие сведения
Алгоритм называется разветвляющимся, если он содержит несколько ветвей, отличающихся друг от друга содержанием вычислений. Выход вычислительного процесса на ту или иную ветвь алгоритма определяется исходными данными задачи.
Перед выполнением работы необходимо ознакомиться с правилами записи логических выражений, операций сравнения, операторов if, case. См. [1], c. 28-35.
Пример. Дано действительное x. Для функции f, график которой представлен на рисунке, вычислить f(x).
Решение задачи.
Математическая модель: функция вычисляется по следующей формуле:
Составим схему алгоритма, детализировав все блоки (рис. 2).
Дальнейшая детализация не требуется. Переводим алгоритм на язык Паскаль.
Program example1; var x, f:Real; begin Write('Введите x: '); Readln(x); if x<-1 then f:= -x-1 else if (x>=-1) and (x<0) then f:= x-1 else if (x>=0) and (x<1) then f:= -x+1 else f:= x+1; Writeln('F= ',f:6:2); Readln; end.Рис. 2
Варианты заданий
Задание 1. Используя оператор if, вычислить заданное выражение для данных типа Integer:
1) 7)
2) 8)
3) 9)
4) 10)
5) 11)
6) 12)
Задание 2. Бытовые алгоритмы
1. Составить программу для определения подходящего возраста кандидатуры для вступления в брак, используя следующие соображения: возраст девушки равен половине возраста мужчины плюс 7 лет; возраст мужчины определяется соответственно: удвоенный возраст девушки минус 14. Предусмотреть постановку вопроса: «Кто Вы: мужчина или женщина?» (1/0) (1 – мужчина, 0 – женщина).
2. Составить программу, реализующую эпизод сказки: машина спрашивает, куда пойдет герой, и в зависимости от ответа (налево – (-1), прямо – 0, направо – 1), печатает, что произойдет с героем.
3. Составить программу, которая по номеру года определяет: високосный это год или нет. (Високосными являются годы, номера которых делятся на 4, кроме тех, которые делятся на 100 и не делятся на 400, например: 1900 – не високосный, 2000 – високосный).
4. Шерлок Холмс и доктор Уотсон, опасаясь мести друзей профессора Мориарти, придумали код: дверь открывается только в том случае, если число первой серии ударов – четное, второй больше числа ударов первой серии на 5, число ударов третьей серии равно половине числа ударов первой серии. Составить программу, проверяющую откроется ли дверь.
5. Джонатан Смит играет с машиной в итальянские кости. Условия игры такие: машина задумывает число от 0 до 50 и запрашивает последовательно ввод трех чисел, а Джонатан вводит их с клавиатуры. Если сумма чисел отличается от задуманного числа не более чем на 10% - Джон выиграл, нет – проиграл. Составить программу, реализующую игру.
6. Морской бой. Машина задумывает два числа от 0 до 9. Игрок пытается их угадать, вводя свои два числа. Если они совпали (в любом сочетании), то игрок выиграл.
7. Преступник, совершив ограбление, позвонил через t минут в полицию из телефона-автомата. Комиссару Мегре известны расстояния от места преступления до трех ближайших автоматов. Составить программу, определяющую, из какого автомата звонил преступник, если его скорость передвижения 7 км/ч.
8. В Атлантическом океане терпит бедствие пассажирский теплоход «Посудина». Все пассажиры будут спасены, если на помощь успеют два судна. Судно продержится на плаву t часов. Скорость судов-спасателей 40 узлов. Составить программу, определяющую спасутся ли пассажиры. Известны расстояния от трех судов-спасателей до тонущего судна.
9. Стоимость акций компании Дженерал - Моторс от 0 до 100 долларов (машина генерирует два случайных числа). Вы не знаете колебаний стоимости акций. Машина спрашивает, будете ли вы продавать или покупать акции. Если вы продаете, а цены поднялись – вы банкрот, если покупаете, а цены падают – тоже. В противном случае богатеете на разность стоимости. Составить программу, организующую эту торговую сделку и печатающую результат.
10. Витя стоит на автобусной остановке. Если солнечно и подходит автобус № 3, он едет к Маше, если автобус № 10 – к Люсе. Если идет дождь или подъезжает любой другой автобус – едет домой. «Дождь» машина генерирует числами от 0 до 10. Если число меньше 5 – солнечно, больше или равно 5 – дождь.
11. В аудиторию пред началом лекции вошло N человек. Если у лектора хорошее настроение, он не выгонит никого, если настроение неважное – 20% студентов, плохое - от 20 до 50%, ужасное – свыше 50%. Определить какое настроение было у лектора, если в аудитории к концу лекции сидит M человек.
12. Через старый мост движется поток автомашин. Одновременно на мосту могут находиться 3 машины. Если на мост въедут 3 легковых или 2 легковых и грузовик – мост выдержит. Если 2 грузовика и легковая или 3 грузовика – рухнет. Составить программу прогнозирующую ситуацию. Можно обозначить: нет машин – 0, грузовая – 10, легковая – 5.
Задание 3.Используя оператор выбора, составить программы решения следующих задач.
1. Вывести на печать название N-го дня недели.
2. По номеру дня недели вывести на печать рабочий это день или выходной, считая выходными субботу и воскресенье.
3. Вывести на печать название N-го месяца года.
4. По номеру месяца указать, к какому времени года он относится.
5. По номеру месяца вывести на печать количество дней в нем.
6. Дано целое число в диапазоне 0–9. Вывести строку — название соответствующей цифры на русском языке (0 — "ноль", 1 — "один", 2 — "два",...).
7. Дано целое число в диапазоне 1–5. Вывести строку — словесное описание соответствующей оценки (1 — "плохо", 2 — "неудовлетворительно", 3 — "удовлетворительно", 4 — "хорошо", 5 — "отлично").
8. Напечатать значение вводимого числа от 1 до 10 римскими цифрами.
9. Арифметические действия над числами пронумерованы следующим образом: 1 — сложение, 2 — вычитание, 3 — умножение, 4 — деление. Дан номер действия и два числа A и B (В не равно нулю). Выполнить над числами указанное действие и вывести результат.
10. Единицы массы пронумерованы следующим образом: 1 — килограмм, 2 — миллиграмм, 3 — грамм, 4 — тонна. Дан номер единицы массы и масса тела M в этих единицах (M - вещественное число). Вывести массу данного тела в килограммах.
11. Дано целое число в диапазоне 1–99, определяющее возраст (в годах). Вывести строку-описание указанного возраста: детство, подростковый возраст, юность, зрелость, старость.
12. Известно, что астрологи делят год на 12 периодов и каждому из них ставят в соответствие один из знаков Зодиака: Овен, Телец, Близнецы, Рак, Лев, Дева, Весы, Скорпион, Стрелец, Козерог, Водолей, Рыбы. Написать программу, которая по номеру знака печатает его название.
Дополнительные задания
1. Даны действительные числа a, b, c, x, y. Выяснить, пройдет ли кирпич с ребрами a,b,c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.
2. Сможет ли шар радиуса R пройти в ромбообразное отверстие со стороной P и острым углом Q?
3. Написать программу, которая проверяет, выполняются или нет заданные условия: а) квадрат заданного трехзначного числа равен кубу суммы цифр этого числа; б) сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр; в) среди цифр заданного трехзначного числа есть одинаковые; г) среди первых трех цифр из дробной части заданного положительного вещественного числа есть цифра ноль.
4. В восточном календаре принят 60-летний цикл, состоящий из 12-летних подциклов, обозначаемых названиями цвета: зеленый, красный, желтый, белый и черный. В каждом подцикле годы носят названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи. По номеру года вывести его название, если 1984 год был началом цикла — годом зеленой крысы.
Контрольные вопросы
1. Какие операторы используются для программирования развилок?
2. Как выполняются операторы условного перехода?
3. Какую из функций: Sin(x), Abs(x), Trunc(x) можно заменить условным оператором if x<0 then x := -x?
Лабораторная работа № 3
ОПЕРАТОРЫ ЦИКЛА
Цель работы: закрепить практические навыки работы с системой Borland Pascal, научиться составлять программы с использованием циклических структур.
Общие сведения
Алгоритм называется циклическим, если он содержит многократное выполнение одних и тех же операторов при различных значениях промежуточных данных.
Перед выполнением работы необходимо изучить различные схемы организации циклов и операторы for, while, repeat (см. [1], c. 35-42).
В этом разделе и последующих мы не будем приводить подробное решение задач, а ограничимся текстами программ с пояснениями.
Пример: На промежутке от 1 до M найти все числа Армстронга. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенных в степень n, равна самому числу. Например, число 153 (153=13+53+33).
Решение. После организации ввода данных программа будет содержать цикл с параметром i (от 1 до М) с двумя вложенными циклами. Первый предназначен для подсчета количества цифр n, второй – для вычисления суммы s степеней цифр числа i. Если числа i и s равны, то i – число Армстронга, его необходимо вывести на экран.
PROGRAM Primer_1;
var i,k,s,p,n,M: Integer;
begin
Write('Введите M '); Readln(M);
for i:=1 to M do
begin
s:=0; k:=i; n:=0;
while k<>0 do
begin k:=k div 10; n:=n+1 end;
k:=i;
While k<>0 do
begin p:=k mod 10; k:=k div 10;
if p<>0 then s:=s+ Round(Exp(n*Ln(p)))
end;
if s=i then Writeln(i);
end;
Readln;
end.
Варианты заданий
Задание 1. Составить программу, позволяющую:
1. Найти количество натуральных двузначных чисел, каждое из которых не делится ни на 2, ни на 13.
2. Найти количество натуральных чисел, не превосходящих 1000, каждое из которых при делении на три дает в остатке два.
3. Найти сумму натуральных двузначных чисел, каждое из которых делится на 3 и не делится на 4.
4. Найти сумму натуральных трехзначных чисел, кратных трем.
5. Найти сумму натуральных двузначных чисел, каждое из которых не делится ни на 2, ни на 3.
6. Найти все натуральные четырехзначные числа, каждое из которых не делится ни на 3, ни на 4.
7. Найти количество натуральных четырехзначных чисел, кратных 3 и 7.
8. Найти сумму натуральных трехзначных чисел, каждое из которых при делении на 7 дает в остатке 3.
9. Найти количество натуральных четырехзначных чисел, каждое из которых не делится ни на 2, ни на 3.
10. Найти сумму натуральных двузначных чисел, каждое из которых при делении на три дает в остатке 2.
11. Найти количество натуральных чисел, не превосходящих 1000, каждое из которых кратно 25 и не кратно 3.
12. Найти те натуральные числа, не превосходящие x, которые при делении на 10 дают в остатке 5.
Примечание. Обратите внимание, что в задании 1 нет необходимости находить количество цифр: двузначные числа – это числа от 10 до 99, трехзначные – от 100 до 999 и т.д.
Задание 2. Составить программу, позволяющую решить задачу.
1. Начальный вклад в банк составил а рублей. Через сколько лет он станет больше b рублей? Каждый год вклад увеличивается на 3%.
2. Ежегодный прирост рыбы в пруду составляет 15%. Запасы рыбы оценены в А тонн. Ежегодный план отлова В тонн. Подсчитать, сколько лет можно выдерживать заданный план?
3. Население города N увеличивается на 3% ежегодно. В текущем году оно составляет 40 000 человек. Выяснить, через сколько лет численность населения превзойдет x человек.
4. Каждая бактерия делится на две в течение одной минуты. В начальный момент имеется A бактерий. Сколько времени потребуется, чтобы количество бактерий превзошло X?
5. Определить количество пассажиров, которые могут поместиться на борт самолета, если его грузоподъемность 8 т. Вес каждого пассажира вводится пользователем.
6. Дана последовательность 5, 9, 13, 17, 21, … . Выяснить, сколько слагаемых, начиная с первого, из этой последовательности нужно взять, чтобы получить сумму большую x.
7. Царевна-лягушка съедает ежедневно на 20 % комаров больше, чем в предыдущий день и еще два комара. Выяснить, через сколько дней количество съедаемых за день комаров превысит x, если в первый день было съедено 12 комаров.
8. Одноклеточная амеба каждые три часа делится на две клетки. Определить, через сколько часов станет более X амеб, если первоначально она была одна.
9. Некоторое количество последовательных натуральных чисел 1, 2, 3, 4, … просуммировали, получив число S. Для данного S выяснить, сколько чисел было в сумме.
10. Определить количество посетителей салона, которых успеет обслужить мастер-стилист, если его рабочий день составляет t часов и известна продолжительность (в минутах) обслуживания каждого посетителя очереди (вводится пользователем).
11. Определить минимальное n, при котором сумма чисел 1/k для k от 1 до n больше числа А, где А меньше или равно 10 и вводится пользователем.
12. Тронувшись с места, автомобиль каждую секунду увеличивает скорость на a км/ч. На этом участке дороги существует ограничение V км/ч. Выяснить, через сколько полных секунд автомобиль превысит предельно допустимую скорость V?
Контрольные вопросы
1. Как записывается и как работает оператор for?
2. Для организации каких циклов применим оператор for?
3. В чем отличие оператора while от оператора repeat?
4. Как программируются циклические алгоритмы с явно заданным числом повторений цикла?
5. Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?
6. Напишите пример оператора цикла, который не выполняется ни разу.
7. Напишите пример оператора цикла, который выполняется неограниченное число раз.
8. С помощью каких операторов в языке Паскаль может быть смоделирован бесконечный цикл?
9. С какими ограничениями реализована конструкция цикла со счетчиком?
10. Замените оператор "repeat A until B" равносильным фрагментом программы с оператором while.
Лабораторная работа №4
ПРОЦЕДУРЫ И ФУНКЦИИ
Цель работы: научиться создавать и использовать в Паскаль-программах процедуры и функции.
Общие сведения
Процедуры и функции являются «строительными блоками» для программ и обеспечивают их модульность, а потому представляют собой важнейшее средство увеличения эффективности программирования.
Перед выполнением работы необходимо ознакомиться с правилами оформления и вызова процедур и функций в языке программирования Паскаль (см. [1, c. 42-66]).
Пример 1. Вычислить значения функции f(x)=2 cos x+3, при xϵ{1; 4; 7,5; 20}. Вывести результаты в два столбца: в первом - значения x, во втором - значения f(x). Вычисления провести двумя способами: с помощью функции и процедуры.
Решение. Аргумент и результат функции – действительные числа, поэтому используем тип Real. В теле функции будет только оператор присваивания – для вычисления значения выражения. Процедура отличается строкой заголовка, - для передачи в основную программу результатов вычислений добавим параметр-переменную fx. Чтобы вывести результаты в виде таблицы, используем форматный вывод.
program proc_1;
function f(x:Real):Real;
begin
f:=2*cos(x)+3
end;
procedure proc_f(x:Real;var fx:real);
begin
fx:=2*cos(x)+3
end;
var x,fx:real;
begin
Writeln('с использованием процедуры:');
Writeln(' x f(x)');
x:=1; proc_f(x,fx); Writeln(x:6:2, fx:6:2);
x:=4; proc_f(x,fx); Writeln(x:6:2, fx:6:2);
x:=7.5; proc_f(x,fx); Writeln(x:6:2, fx:6:2);
x:=20; proc_f(x,fx); Writeln(x:6:2, fx:6:2);
Readln;
Writeln('с использованием функции:');
Writeln(' x f(x)');
Writeln(1:6, f(1):6:2);
Writeln(4:6, f(4):6:2);
Writeln(7.5:6:2, f(7.5):6:2);
Writeln(20:6, f(20):6:2);
Readln;
end.
Пример 2.Написать рекурсивную функцию поиска n-го члена последовательности, заданной следующим образом: A1=1, A2=3, Ai=3Ai-2-Ai-1.Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.
Решение. По условию задачи аргумент может принимать только целые значения, поэтому функция имеет параметр-значение типа Integer. Выход из рекурсии в данном случае осуществляется при двух значениях аргумента (при i=1, i=2), поэтому в рекурсивной функции необходимы два вложенных условных оператора или оператор выбора case. В приведенном листинге использованы операторы if, попробуйте самостоятельно записать решение с оператором выбора. В основной программе значения аргумента - целые последовательные числа, - воспользуемся циклом с параметром for.
program proc_2;
function A(i:Integer):Integer;
begin
if i=1 then A:=1 else
if i=2 then A:=3 else А:=3*A(i-2)-A(i-1)
end;
var i:Integer;
begin
for i:=1 to 10 do Write(A(i),' ');
Readln
end.
Варианты заданий
Задание 1. Составить программу для решения задачи с применением функции пользователя.
1. Даны координаты вершин треугольника (x1,y1), (x2,y2), (x3,y3). Используя функцию вычисления расстояния между двумя точками, найти периметр треугольника. Формула для вычисления расстояния между двумя точками:
.
2. В правильном треугольнике проведена средняя линия. Найти площадь образовавшейся трапеции, дважды используя функцию вычисления площади правильного треугольникапо формуле:
3. Найти положение свободно падающего в глубокий колодец камня через 0,1; 0,2; 0,3; 0,4; 0,5; 0,6; 0,7; 0,8; 0,9; 1,0 сек. после начала падения, используя функцию вычисления пути:
, где g=9,8.
4. Две бочки имеют цилиндрическую форму, известны высота и диаметр каждой из них. Выяснить, в которую бочку поместится больше воды. В решении использовать функцию нахождения объема цилиндра: V=πR2H, где R – радиус основания, H – высота цилиндра.
5. Даны значения первого члена и знаменателя геометрической прогрессии. Написать функцию вычисления суммы n первых членов геометрической прогрессии. Вычислить значения суммдля nϵ{2,4,6,8,10}.
6. Создав функцию пользователя, вычислить значения функции f(x) при заданных значениях аргумента x. Вывести результаты в два столбца: в первом - значения x, во втором - значения f(x).
7. Одновременно толкают два маятника с длинами нитей l1 и l2. Выяснить, сколько всего колебаний они совершат за P секунд, используя для вычислений функцию нахождения периода колебаний математического маятника:
, где g=9,8, l – длина нити.
8. Для правильного треугольника со стороной а построены вписанная и описанная окружности. Найти площадь образовавшегося кольца, используя функцию вычисления площади круга S=πR2. Для нахождения радиусов окружностей воспользуйтесь формулами:
,
9. Используя функцию вычисления плотности населения, выяснить, на сколько уменьшится плотность населения, если число жителей сократится на Х человек.
10. При поступлении в некоторый вуз учитывают результаты ЕГЭ по трем дисциплинам. Для вычисления рейтинга используют формулу , где E1, E2, E3 – результаты ЕГЭ. Известны результаты двух абитуриентов. Используя функцию подсчета рейтинга, выяснить, у кого из них выше шансы поступления.
11. Тариф предусматривает оплату телефонных разговоров следующим образом: при продолжительности разговора меньше P минут стоимость одной минуты составляет S1 копеек, в противном случае – S2 коп/мин (S1, S2, P - константы). Используя функцию вычисления стоимости одного разговора, найти суммарную стоимость трех звонков известной продолжительности.
12. На товар дважды была сделана скидка – на p1, а затем на p2 процентов. Первоначальная стоимость товара составляла S рублей. Используя функцию вычисления стоимости товара с учетом скидки на P процентов, найти стоимость товара после двойной скидки.
Задание 2. Составить программу для решения задания 1, используя процедуру пользователя вместо функции.
Задание 3. Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно. Рекурсивная функция должна осуществлять следующие вычисления:
1. Найти член последовательности, заданной формулой: Di=7+Di-1 при i>1. Значение первого члена последовательности вводится пользователем.
2. Найти натуральную степень числа с использованием формулы: an=a·an-1.
3. Найти член последовательности, заданной формулой: Ai=Ai-1-Ai-2, при i>2. Значения i, первого и второго членов последовательности вводятся пользователем.
4. Найти член арифметической прогрессии с помощью формулы: an=an-1+d, при n>0. Значения n, d и a0 вводятся пользователем.
5. Найти значение выражения cos(cos(cos...cos(cos(cos x)))),
где cos используется n раз. Значения x и n вводятся пользователем.
6. Найти член последовательности, заданной следующим образом:
y1=0; y2=10; yn=2×yn-1-yn-2, где n>2.
7. Найти член последовательности, заданной формулой Bi=4·Bi-1, при i>1. Значения i и первого члена последовательности вводятся пользователем.
8. Найти член геометрической прогрессии с помощью формулы
bi=bi-1·q, где значения i, q и b0 вводятся пользователем.
9. Найти значение выражения sin(sin(sin...sin(sin(sin x)))), где sin используется n раз. Значения x и n вводятся пользователем.
10. Найти член последовательности, заданной следующим образом:
11. Найти член последовательности, заданной формулой , при i>1. Значения i и первого члена последовательности вводятся пользователем.
12. Найти член последовательности, заданной следующим образом:
x1=1; xn=xn-1+n+3, где n≥2.
Дополнительные задания
1. Для чисел a, b, c найти значение выражения min(a,ab)+min(a,ac)+1 с использованием функции вычисления минимального из двух чисел.
2. Дан квадрат со стороной а, диагональ этого квадрата является стороной второго квадрата, диагональ второго квадрата – стороной третьего. Найти длину стороны третьего квадрата, используя функцию вычисления длины диагонали квадрата по его стороне:
3. Даны длины катетов двух прямоугольных треугольников. Используя функцию вычисления длины гипотенузы, выяснить, у которого треугольника гипотенуза больше и на сколько.
Контрольные вопросы
1. В чем состоит принципиальное отличие процедур от функций?
2. Чем отличается вызов функции от вызова процедуры?
3. Укажите формальные и фактические параметры в составленных программах.
4. Как описать в процедуре параметр-переменную?
5. Какие переменные в языке Паскаль называются локальными, а какие глобальными?
6. Какие процедуры и функции называют рекурсивными?
Лабораторная работа №5
ОБРАБОТКА МАССИВОВ
Цель работы: овладеть основными приемами работы с одномерными и двумерными массивами.
Общие сведения
Табличное представление информации одно из самых распространенных, поэтому массивы широко применяются в прикладных программах.
Перед выполнением работы необходимо ознакомиться с теоретическим материалом по теме «Массивы» ([1], с. 67-73).
Пример 1. Составить программу, позволяющую в одномерном массиве, состоящем из N вещественных элементов, вычислить сумму положительных элементов.
Решение. При написании процедур ввода и вывода следует обратить внимание, что элементы – вещественные числа, поэтому необходимо позаботиться о верной обработке дробной части. Вычисление суммы оформим в виде функции с одним аргументом - массивом. Локальными переменными функции будут индексная переменная i и дополнительная переменная s для хранения текущей суммы элементов. В начале тела функции обязательно обнуление s. Каждый элемент массива сравним с нулем, и, если значение положительно, добавим его к искомой сумме s. В конце функции запишем значение переменной s в результирующую переменную.
program massiv_1;
const N=10;
type mas=array [1..N] of Real;
procedure Vvodmas(var A:mas);
var i:Integer;
begin
for i:=1 to N do A[i]:=-50+Random(101)+random;
end;
procedure Vivodmas(A:mas);
var i:Integer;
begin
for i:=1 to N do Write(A[i]:8:2);
Writeln
end;
function Summa(A:mas):real;
var i: Integer; s:real;
begin
s:=0;
for i:=1 to N do if A[i]>0 then s:=s+A[i];
Summa:=s;
end;
var A: mas;
begin
Randomize; Vvodmas(A);
Writeln('Исходный массив:'); Vivodmas(A);
Writeln('Ответ: ', Summa(A):0:2);
Readln
end.
Пример 2. Написать программу для решения следующей задачи. В двумерном массиве, состоящем из целочисленных элементов, в каждом столбце поменять местами наибольший по модулю и последний не принадлежащий интервалу (a, b) элементы массива.
Решение. Преобразования необходимо провести в каждом столбце массива, поэтому параметр внешнего цикла в процедуре обработки - номер столбца j, а вложенного – номер строки i.
Для перестановки двух элементов в столбце массива необходимо найти номера их строк n1 и n2, а затем поменять местами значения элементов с использованием промежуточной переменной p.
Чтобы найти наибольший по модулю элемент столбца, введем дополнительную переменную max, которая будет хранить максимальное по модулю значение в текущем столбце массива на данный момент. (Можно решить задачу без использования переменной max. Подумайте, как это сделать.)
Программа должна корректно работать с любыми входными данными, а значит и в тех случаях, когда некоторые или даже все столбцы массива содержат только элементы из интервала (a, b), и обмен значений в некоторых столбцах или во всем массиве не нужен.
const n=10; m=7;
type mas=array [1..n,1..m] of Integer;
procedure Vvodmas(var D:mas);
var i,j:Integer;
begin
for i:=1 to n do
for j:=1 to m do
D[i,j]:=-50+Random(101);
end;
procedure Vivodmas(D:mas);
var i,j:Integer;
begin
for i:=1 to n do
begin
for j:=1 to m do Write(D[i,j]:4);
Writeln;
end;
end;
procedure Obmen(a,b: real; var D:mas);
var i,j,p,n1,n2,max: Integer;
begin
for j:=1 to m do
begin
n1:=1; max:=abs(D[1,j]);{считаем первый элемент столбца наибольшим по модулю}
for i:=2 to n do
if abs(D[i,j])>max then {обнаружен больший элемент}
begin n1:=i; max:=abs(D[i,j]) end;
i:=n; {перебираем элементы столбца, начиная с последнего}
while (i>=1)and (D[i,j]>a)and(D[i,j]<b) do i:=i-1;
n2:=i;
if n2<>0 then {если элемент, не принадлежащий интервалу (a,b), был найден}
begin
p:=D[n1,j]; D[n1,j]:=D[n2,j]; D[n2,j]:=p; {обмен значений}
end;
end;
end;
var D: mas; a,b:Real;
begin
Randomize; Vvodmas(D);
Writeln('Исходный массив:'); Vivodmas(D);
Write('Введите через пробел концы интервала (a,b): '); Readln(a,b);
Obmen(a,b,D);
Writeln('Ответ:'); Vivodmas(D);
Readln
end.
Варианты заданий
Задание 1. Составить программу, позволяющую в одномерном массиве, состоящем из N вещественных элементов, вычислить:
1) сумму модулей отрицательных элементов массива;
2) количество положительных элементов массива;
3) количество элементов массива, не принадлежащих интервалу (a, b);
4) произведение элементов массива, меньших десяти;
5) наименьший из элементов массива, принадлежащих отрезку [a, b];
6) количество элементов массива, равных первому элементу;
7) количество элементов массива, модуль которых больше числа X;
8) разность наибольшего и последнего элементов массива;
9) сумму модулей элементов массива, меньших числа X;
10) сумму квадратов элементов массива, больших числа X;
11) сумму квадратов элементов массива, не принадлежащих интервалу (a, b);
12) количество элементов массива, принадлежащих отрезку [a, b];
Задание 2. Написать программу для решения следующей задачи. В двумерном массиве, состоящем из целочисленных элементов, поменять местами:
1) в каждой строке первый меньший числа X и последний принадлежащий отрезку [a, b] элементы;
2) в каждом столбце первый двузначный и последний принадлежащий интервалу (a, b) элементы;
3) в каждом столбце наибольший по модулю и последний положительный элементы;
4) в каждой строке наибольший нечетный по значению и последний положительный элементы;
5) в каждом столбце первый и последний отрицательные элементы;
6) в каждой строке первый равный нулю и первый больший числа K элементы массива, где K - количество четных элементов массива;
7) в каждой строке наибольший и наименьший элементы;
8) в каждом столбце первый по модулю меньший десяти и последний кратный пяти элементы;
9) в каждой строке наибольший и первый не принадлежащий интервалу (a, b) элементы;
10) в каждом столбце первый принадлежащий отрезку [a, b] и первый отрицательный элементы;
11) в каждом столбце первый положительный и последний отрицательные элементы;
12) в каждом столбце наименьший и последний равный нулю элементы.
Дополнительные задания
1. Определить в одномерном массиве число соседств из двух чисел разного знака.
2. Определить, имеется ли в одномерном массиве хотя бы одна пара противоположных чисел.
3. Определить, какой элемент одномерного массива встречается чаще всего.
4. В одномерном массиве в порядке убывания представлены достоинства денежных знаков некоторой страны. Реализовать выдачу в этой системе заданной суммы M минимальным числом денежных знаков.
5. Фирме принадлежит два магазина. Известны стоимости товаров, проданных в каждом магазине в августе и сентябре, хранящиеся в двух массивах. Получить общую стоимость проданных фирмой товаров за два месяца (в августе 31 день, в сентябре – 30).
6. Пусть A – квадратный массив из N строк и N столбцов. Главной называется диагональ, идущая от A[1,1] до A[N,N]. Найти сумму квадратов элементов, стоящих на главной диагонали массива.
7. Дан двумерный массив целых чисел. Поменять местами строку, содержащую максимум массива, со строкой, содержащей его минимум.
8. Упорядочить каждую строку двумерного массива по возрастанию.
9. Найти элемент двумерного массива, являющийся одновременно максимальным в своей строке и минимальным в том столбце, где он находится.
10. Во время соревнований штангистов данной весовой категории в первую строку таблицы заносятся результаты, показанные в толчке штанги, во вторую - в рывке, а в третью собственный вес спортсмена. При равенстве победитель выбирается среди штангистов с меньшим собственным весом. Напишите программу, определяющую номера чемпионов по каждому упражнению в общем зачете.
Контрольные вопросы
1. Как описываются в языке Паскаль одномерный и двумерные массивы?
2. Может ли массив содержать разнотипные данные?
3. В каком порядке указываются индексы при обращении к элементам двумерного массива?
4. Привести пример массива, описание которого выглядит следующим образом: var A: array [1..3, 20..24] of real.
5. Напишите процедуры ввода и вывода одномерного и двумерного массивов.
Лабораторная работа №6