Вложенное ветвление

 

Любая ветвь может не быть линейным участком программы, а сама содержать ветвление. Такое ветвление называется вложенным (или множественным) ветвлением. Чаще вторично разветвляется ветка «нет». В качестве примера разберём простую задачу:

В первом магазине хозяйка приобрела a кг. огурцов. Их оказалось b штук. Во втором магазине на c кг. получилось d штук. В каком магазине огурцы крупнее?

Находим массу одного огурца в каждом магазине и сравниваем их.

 
 
program ogur; var a,b,c,d,m1,m2:real; begin write(’Введите массу и к-во огурцов из 1 магазина ’); readln(a,b); m1:=a/b; write(’Введите массу и к-во огурцов из 2 магазина ’); readln(c,d); m2:=c/d; if m1>m2 then writeln(’В первом магазине – крупнее.’) else if m1<m2 then writeln(’Во втором магазине – крупнее.’) else writeln(’Одинаковые’); end.    

 

 


Обратите внимание, что каждый else пишется под своим if. Ступенчатое расположение структур (особенно хорошо это видно в следующей задаче) очень рекомендуется для лучшей читаемости программы. Если пренебрегать этим правилом, большие программы становятся запутанными и неясно, какой else к какому if относится.

if a > b then if x > 0 then writeln(’***’) else writeln(’ooo’);  
Не забывайте также, что любой else относится к последнему незакрытому if. Напри­мер, в показанном справа фрагменте else стоит под первым if, но относится ко второму. Это может привести к ошибкам. Исправит положение только правильное использование пары команд begin и end (так называемых «операторных скобок»), как показано во втором фрагменте.

if a > b then begin if x > 0 then writeln(’***’); end else writeln(’ooo’);  
Рисунок, изображённый над программой, на котором
специальными значками и стрелками изображена последовательность действий (алгоритм) в программе, называется блок-схемой алгоритма. Программисты используют такие схемы для обсуждения алгоритма с непрограммистами или специалистами, использующими другие алгоритмические языки, а также для того, чтобы лучше продумать алгоритм, не отвлекаясь на мелкие детали и особенности языка программирования.

 

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

 
 
program deliteli; var a,b:integer; begin write(’Введите два целых числа: ’); readln(a,b); if a=b then writeln(’Числа равны’) else if (a mod b=0) then writeln(a,’ делится на ’,b) else if (b mod a=0) then writeln(b,’ делится на ’,a) else writeln(’Эти числа не делятся друг на друга’); end.

 


Эта программа работает с ошибкой, если одно из введённых чисел равно 0 (деление на 0 запрещено). Измените программу, сделав в начале дополни тельную проверку этого случая.

Лаб. 4. Задачи на ветвление:

1. Программа вычисляет модуль введенного числа, не пользуясь стандартной функцией abs()

2. В 1 л тёплой воды можно растворить до 120 г поваренной соли. Растворится ли a кг соли в b л воды при тех же условиях?

3. Определить, является ли введённое число чётным

4. Определить, лежит ли точка (x, y) внутри круга с центром в начале координат и радиусом 5.

5. На вывод одного пиксела видеоадаптер тратит 0,00000003 секунды. Разрешение экрана – a х b пикселов. Сколько времени понадобится для вывода всего кадра? Будет ли при этом хорошее качество мультипликации? (Если частота смены кадров меньше 50 кадров в секунду, качество плохое)

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

7. Определить, является ли целое число N точным квадратом.

8. Поместится ли a кг апельсинов в b ящиков (вместимость ящика – c кг)?

9. Возможно ли разместить два файла (объёмом a и b Кбайт) на одной дискете (объёмом 1440 Кбайт)?

10. Хватит ли на просмотр фильма одного часа, если он состоит из k кадров, а в секунду показывается 25 кадров?

11. Первая цветочница продала R роз по 50 рублей за цветок, а вторая T тюльпанов по 30 рублей. У кого выручка больше?

12. Из банка на выплату зарплаты привезли a рублей. Хватит ли этой суммы, если на предприятии n работников, их средняя зарплата s рублей, а в кассе ещё имеется остаток k рублей?

13. Для ремонта проколотой шины после нанесения на место прокола каучуковой смеси её нужно выдерживать 50-60 минут при температуре 70-80 °С. Вулканизатор поддерживал температуру
t °С в течение m минут. Процесс вулканизации прошёл нормально?

14. Для полноценного питания коровы требуется 10 кг сена и 4 кг комбикорма в день. В наличии a кг сена и b кг комбикорма. На сколько дней этого хватит?

15. Первый абитуриент решил a упражнений по b задач в каждом, а второй – c упражнений по d задач. Кто из них лучше подготовился к поступлению в ВУЗ?

16. Сможет ли покупатель, располагающий суммой S рублей, приобрести a граммов конфет по цене b рублей за 1 кг?

17. Больному нужно ввести a см3 первого лекарства и b см3 второго. Хватит ли шприца ёмкостью 10 см3 для смеси этих лекарств?

18. Первое блюдо - 300 г борща. Второе блюдо – 250 г плова. В столовой приготовлено a кг борща и b кг плова. Сколько людей сможет накормить столовая полным обедом?

19. Войдёт ли в конверт размерами NxM открытка размерами RxP?

20. В секцию по баскетболу берут юношей не ниже 180 см. В прошлом году у Васи был рост h см, а за этот год он подрос на d см. Возьмут ли Васю теперь на баскетбол?


 

Лаб. 5. Задачи на ветвление с вычислениями:

1. Одна коробка с яйцами содержит 10 ячеек по 30 яиц в каждой. Поместятся ли a яиц в b коробок (уже имеющих пустые ячейки)? Если не поместятся, сообщить, сколько ещё требуется ячеек и коробок. Если останутся лишние коробки, сообщить, сколько осталось.

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

3. В котёл с 20 л воды всыпали m граммов соли. Норма для супа составляет от 10 до 12 г/литр. Определить, нормально ли посолена вода. Если недосолена, сообщить, сколько граммов соли нужно добавить до нормы. Если пересолена, – сколько литров воды нужно долить до нормальной концентрации.

4. После промывки шерсть сушат. Нормальная плотность шерсти, соответствующей требуемой влажности, составляет около 280 кг/м3. На текстильный завод поступило m тонн шерсти, объём которой составляет V м3. Определить соответствие сырья требуемой влажности.

5. Определить, лежит ли точка (x, y) внутри кольца с центром в начале координат, внутренним радиусом r1 и внешним радиусом r2

6. Врач прописал больному первого лекарства всего a таблеток, по b таблеток в день и второго лекарства c таблеток по d таблеток в день. На следующий день после того, как все лекарства будет приняты, больной должен прийти на приём. Через сколько дней больной попадёт на приём к врачу?

7. За первые 30 минут в Internet-клубе нужно платить по 80 копеек в минуту, а дальше по 60 копеек. Но если клиент работает без перерыва 5 часов, ему снижается дальнейшая оплата до 50 копеек в минуту. Сидоров работал a часов и b минут. Сколько ему нужно заплатить?

8. Поезд выехал в h1 часов и m1 минут. Поездка заняла h2 часов и m2 минут (меньше 1 суток). Во сколько часов и минут поезд приехал на станцию назначения? Не забыть, что в 24.00 время обнуляется. Часовые пояса не учитывать (счёт идёт по московскому времени).

9. 1 конфета «Мишка на севере» весит 26-30 граммов. «Ласточка» - 15-19 г. «Грильяж» - 20-25 г. Вася съел a одинаковых конфет, общий вес которых – b граммов. Что это были за конфеты? (не исключено, что не из этих трёх видов, а какие-либо другие).

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

11. Работа светофора запрограммирована следующим образом: Начиная с полуночи, 3 минуты горит зелёный свет, 1 минуту – жёлтый, 3 минуты – красный, 1 минуту – жёлтый. Затем всё начинается сначала. Дано вещественное число t, означающее время в минутах, прошедшее от полуночи. Определить, сигнал какого цвета горит в это время на светофоре.

12. Заданы координаты X1,Y1 левого верхнего угла и размеры A1 и B1 первого прямоугольника и координаты X2,Y2 и размеры A2 и B2 второго прямоугольника. Определить, помещается ли один из них целиком в другом (Стороны прямоугольников параллельны осям координат).

13. Время прибытия поезда на станцию h1 ч. и m1 м. Время отправления h2 ч. и m2 м. Человек пришёл на станцию в h3 ч. и m3 м. Попал ли он на этот поезд (или пришёл раньше или опоздал)?

14. Имеется два куска холста: 60х80 см и 70х70 см. Художник должен натянуть один из них на раму размером ax b см. Какой из них взять выгоднее, чтобы меньше холста пришлось отрезать? На подгиб берётся не менее 3 см. с каждой стороны. Если никакой холст не подходит, сообщить об этом.

15. Имеется три файла, размерами a, b и c Кбайт. На одной дискете помещается 1440 Кбайт. Войдут ли на неё все три файла? Если не войдут, проверить, можно ли разместить эти файлы на двух дискетах (Файлы не делить на части, а записывать только целиком).

16. Программа определяет, поместится ли круг, площадью S1 в квадрате, площадью S2.

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

18. Дано натуральное число n (n ≤ 9999). Верно ли, что все четыре цифры числа различны?

19. Заданы 4 числа. Проверить, являются ли они длинами сторон ромба, параллелограмма или четырёхугольника другого вида (считать, что стороны перечислены подряд).

20. Найти координаты точек пересечения прямой y = ax+ b и окружности радиуса R с центром в точке (X, Y). Если точка одна или пересечений нет, сообщить об этом.


 

Выбор варианта

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

1. все ветвления вкладываются в ветвь «нет»;

2. все они проверяют значения одной и той же переменной (или выражения);

3. проверяемое значение должно быть целого типа.

 

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

 

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

 
 
program money; var p:integer; begin write(’Какая полка Вас интересует? ’); readln(p); if p=1 then writeln(’Сапоги’) else if (p=2) or (p=4) then writeln(’Мужские туфли’) else if (p>=5) and (p<=8) then writeln(’Женские туфли’) else if (p=3) or (p>=9) and (p<=12) then writeln(’Кроссовки’) else writeln(’Полки с таким номером у нас нет’); readln; end.

 

 


То же, с применением новой команды:

 
 
program money; var p:integer; begin write(’Какая полка Вас интересует? ’); readln(p); case p of 1: writeln(’Сапоги’); 2,4: writeln(’Мужские туфли’); 5..8: writeln(’Женские туфли’) 3,9..12: writeln(’Кроссовки’) else writeln(’Полки с таким номером у нас нет’); end; readln; end.

 


Как видите, программа выиграла в размере и простоте.

Если в каком-либо из вариантов нужно выполнить не одно, а два и более действия, их заключают в операторные скобки begin и end:

 
 

 

 


 


Более сложные задачи с применением выбора вариантов:

1) С клавиатуры вводят число летящих ворон. Напечатать это число со словом «ворон», взятом с нужным окончанием.

В большинстве случаев окончание зависит от последней цифры: 2181 ворона, 851 ворона, 342(343, 344) вороны, 765(766, 767, 768, 769, 770) ворон. Но имеется исключение: Если предпоследняя цифра – единица (например, 3211, 412), то независимо от последней цифры будет «ворон». Поэтому в этой задаче выбор варианта применяется совместно с ветвлением:

 

2) Ввести с клавиатуры число от 1 до 999 и назвать его словами (например, «семьсот сорок восемь»).

Число разделим на сотни, десятки и единицы и будем эти части называть словом по очереди, например, «пятьсот двадцать три». Проблема опять возникает, когда предпоследняя цифра «1». В этом случае две последних цифры называются одним словом, например, «пятьсот тринадцать».

 

 

Лаб. 6. Задачи на выбор варианта:

В каждой из ниже перечисленных задач использовать выбор не менее чем из 5 вариантов (если условие явно не задаёт конкретное число вариантов).

 

1. Колдун должен сделать очередной ход. По нажатию на любую клавишу генерируется случайное число от 1 до 10, и программа печатает, какое заклинание произнёс колдун. Например, 1- удар молнии; 2 – огненный шар …

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

3. Покупатель вводит имеющуюся у него сумму и количество порций мороженого, а программа называет, какое мороженное можно приобрести на такую сумму (цены выражаются целым числом). Если по указанной цене мороженого нет, программа сообщает об этом.

4. Разведчик получает закодированное числами сообщение. Каждое число обозначает какое-либо слово. Нужна программа-декодер, которая получает число и выдаёт слово.

5. Микки-Маус подходит к стене с отверстиями. Над каждым отверстием стоит номер. Некоторые ходы ведут в ловушку, некоторые – к запасам зерна, сыра, муки и т. д. Нужна программа, которая по введённому номеру сообщает, куда попадёт Микки-Маус.

6. Предлагается список авиарейсов. По введённому номеру рейса программа сообщает пункт назначения и цену билета.

7. Составить программу «Рабочее место заведующего хлебопекарней», которая выдаёт ассортимент производимой продукции, и при выборе нужного номера сообщает, сколько и какой муки, дрожжей, соли, воды и т.д. нужно для выпечки одной буханки данного вида хлеба.

8. Программа выводит пронумерованный список различных носителей информации: дискета, жёсткий диск, компакт-диск и т.д. Если ввести номер какого-либо из них, программа сообщает подробности: ёмкость, размеры, разновидности и т.д.

9. На экран выдаётся список наиболее распространённых программ. При выборе номера какой-либо из них программа сообщает дополнительную информацию: назначение, фирма-производитель, есть ли русифицированная версия, требуемый объём дисковой памяти и т.д. …

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

11. Программа должна напоминать хозяину, какой праздник (в том числе – семейные) приходится на интересующую его дату. Для этого с клавиатуры вводятся отдельно дата и месяц, объединяются в целое число и выводится описание праздника. Например, вводятся числа 23 и 02, из них составляется число 2302, по которому программа выводит «День защитника Отечества».

12. В горисполкоме имеется очередь льготников на квартиры. При вводе номера очередника программа сообщает его фамилию, имя, отчество, причину постановки в очередь (льготу) и количество комнат (по числу членов семьи), на которые претендует очередник.

13. Каждое поколение компьютеров характеризовалось электронной базой, размерами, объёмом памяти, быстродействием и другими характеристиками процессоров… Программа запрашивает, какое поколение компьютеров нас интересует, и при вводе номера выдаёт отличительные особенности компьютеров данного поколения: электронную базу, размеры, объём памяти, быстродействие и другие характеристики.

14. В поликлинике при вводе номера кабинета программа сообщает, какой специалист принимает в этом кабинете (специальность и фамилию). Если работают два врача, сообщить, кто до обеда, а кто после.

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

16. Программа вводит номер компакт-диска из домашней коллекции и выводит описание: что есть на этом диске. Если игра, указывает её жанр.

17. Выдаётся список различных Intel-совместимых процессоров. При вводе номера одного из них программа сообщает основные характеристики данного процессора.

18. Программа работает как телефонная книга наоборот: при вводе 6-значного номера телефона (простым числом без чёрточек и пробелов) она выдаёт фамилию и адрес абонента.

19. Программа предназначена для процедурного кабинета. На экране печатается список лекарств для инъекций. При выборе нужного номера программа выдаёт информацию, сколько миллилитров («кубиков») растворителя нужно использовать, и какой взять: воду, физраствор, раствор новокаина или раствор глюкозы.

20. Программа для библиотеки просит ввести номер книги по каталогу и выдаёт сведения об этой книге: автора, название и год издания.

Циклы

 

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

Цикл с предусловием(с условием перед телом цикла). В этом цикле перед началом «тела цикла» (повторяющегося участка программы) проверяется условие, которое определяет, нужно липродолжать повторение. Если условие выполняется, тело цикла повторяется. Если условие перестало выполняться, цикл заканчивается. На Паскале этот цикл записывается так:

while a<b do begin команда; команда; ........ end;

 


Если в теле цикла только одна команда, то begin и end не обязательны.

 

Пример использования цикла while: Известна сумма S1, положенная в банк и годовая процентная ставка P. Через сколько лет накопится сумма S2 ?

 
 
program bank; var s1,s2,p:real; g:integer; begin write(’Введите начальную сумму ’); readln(s1); write(’Введите конечную сумму ’); readln(s2); write(’Введите процентную ставку ’); readln(p); g:=0; while s1<s2 do begin s1:=s1 + s1 * p / 100; g:=g + 1; end; writeln(’До накопления суммы пройдёт ’,g,’ лет’); end.

 

 


Цикл с постусловием(с условием после тела цикла). В этом цикле после тела цикла проверяется условие, которое определяет, нужно лизакончить цикл. Если условие выполняется, цикл заканчивается. Если условие ещё не выполнилось, цикл повторяется.

 

На Паскале этот цикл записывается так:

 
 
repeat команда; команда; ........ until a >= b;  

 


program summa; var s,r: real; begin write(’Введите число R (> 1) ’); readln(r); s:=0; repeat s:=s+r ; r:=r/1.5 ; until r<0.001; writeln (’Сумма чисел равна ’,s:7:4); end.
Пример использования такого цикла: Найти сумму чисел, первое из которых R (R>1) задано с клавиатуры, а каждое следующее в 1.5 раза меньше. Последнее из этих чисел (которое не входит в сумму) – меньше 0.001.

 

 

Цикл с параметром(счётчиком). В этом цикле используется целая переменная – счётчик (или параметр цикла), которая автоматически при каждом повторении изменяется на 1 от начального значения до конечного. Если начальное значение меньше конечно­го, то на Паскале он записы­вается так:

 
 
for i:=1 to 20 do begin команда; команда; ........ end;  

 


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

 

 

Пример использования цикла for: Найти сумму первых 30 натуральных чисел. Слово «первых» обозначает, что начинаем с 1. Сумма в цикле увеличивается, но чтобы было к чему прибавить самое первое число, до начала цикла сумму обнуляем (присваиваем ей начальное значение 0).

       
 
program summa; var s,i: integer; begin s := 0; for i:=1 to 30 do s:= s + i ; writeln (’Сумма 30-ти чисел равна ’,s); readln; end.
 
   

 









Дата добавления: 2014-12-18; просмотров: 8149;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.039 сек.