Урок 10 Вложени един в друг цикли. Оператор за безусловен преход , обобщение.
Последната задача от урок 9 е решена с помощта на два цикъла – едни с брояч и един от вида While. Това е една чудесна възможност за програмиста. Той има пълната свобода да влага едни в други толкова брой цикли колкото си пожелае. Когато създавате вложени един в друг започвайте първия ред на всеки цикъл по навътре, за да можете по-лесно да следите къде започва и къде завършва той. Така написаният код става по-прегледен и по-лесно четим от други хора Същата препоръка важи и за разклонените условия.
Когато създавате цикъл с помощта на безусловния оператор GOTO етикет съчетан с условния If e необходимо да имате предвид следното.
Безусловният оператор ни дава възможност да нарушим последователното изпълнение на командите в програмата. Обикновено командите в програмата се изпълняват една след друга. Ако по някаква причина искаме да прескочим няколко команди или да се върнем назад с няколко команди, тогава може да се използва операторът за безусловен преход.
Правилото за използване на оператора за безусловен преход е следното:
goto етикет където етикетът е комбинация от букви и цифри. Етикетът се поставя на реда пред командата от програмата, към която искаме да се извърши прехода:
етикет:
команда
Ако в програмата се използват повече от един етикета, те трябва да са с различни имена.
Операторът goto е опасен за ползване, защото нарушава естествената логика на програмата. Чрез него тя се накъсва и става трудна за асимилиране. Това често води до грешки. Затова когато използваме goto трябва да внимаваме.
Понякога обаче използването на Goto е наложително.
Тъй като в Small Basic нямаме възможност да организираме изпълнение на цикъл докато условието не е изпълнено, това може да се постигне чрез Goto.
Да решим следната задача в която използването на Goto е наложително:
Задача1 Да се състави програма, която събира N реални числа
В тази програма има два безусловни прехода. Първият (goto et2) е към края на програмата и вторият (goto et1) е няколко команди назад към началото. В този случай имаме неявен цикъл oт който излизаме с помощта на оператора if.
Ето резултат при изпълнението на първия. Потребителят въвежда за N отрицателно число и програмата завършва своята работа.
И резултат от втория безусловен преход, с помощта на който реализираме следващо изпълнение на тялото на цикъла.
Задача 2: Напишете програма, която изчислява израза
1+ 2.3+ 3.4.5 + 4.5.6.7 + …..+ n(n+1)….(n+n-1)
За решението и ще използваме вложени цикли – първият който да изчислява сумата, а вторият – да намира съответното събираемо. При решаването на задачи от този тип е важно да намерим връзката между двете променливи, които ще управляват циклите.
Решението е следното:
За да се убедите дали сте работили правилно, тествайте програмния код многократно като задавате различни стойности за N.
Нека сега се опитаме да използваме GOTO, за да реализираме програма с меню.
Задача: Да се състави програма, която намира лицата на фигурите: окръжност по даден радиус, квадрат по дадена страна, правоъгълник по дадени две страни и триъгълник по дадени страна и височина към нея.
TextWindow.WriteLine("Лица на фигури")
TextWindow.WriteLine("Въведете вид фигура")
TextWindow.WriteLine("1. Кръг")
TextWindow.WriteLine("2. Квадрат")
TextWindow.WriteLine("3. Правоъгълник")
TextWindow.WriteLine("4. Триъгълник")
nachalo:
TextWindow.Write("Изберете:")
k= TextWindow.ReadNumber()
If k<1 Or k>4 Then
TextWindow.Clear()
Goto nachalo
Else
If k=1 Then
TextWindow.Clear()
TextWindow.WriteLine("Лицe на кръг")
TextWindow.write("Въведете радиус:")
r=TextWindow.ReadNumber()
s = Math.pi*r*r
TextWindow.WriteLine("Лицeто на кръга е " + s)
Goto krai
EndIf
If k=2 Then
TextWindow.Clear()
TextWindow.WriteLine("Лицe на квадрат")
TextWindow.write("Въведете страна:")
а=TextWindow.ReadNumber()
s = а*а
TextWindow.WriteLine("Лицeто на квадрата е " + s)
Goto krai
EndIf
if k=3 Then
TextWindow.Clear()
TextWindow.WriteLine("Лицe на правоъгълник")
TextWindow.write("Въведете страна а=")
а=TextWindow.ReadNumber()
TextWindow.write("Въведете страна b=")
b=TextWindow.ReadNumber()
s = а*b
TextWindow.WriteLine("Лицeто на правоъгълника е " + s)
Goto krai
EndIf
If k=4 Then
TextWindow.Clear()
TextWindow.WriteLine("Лицe на триълник")
TextWindow.write("Въведете страна а=")
а=TextWindow.ReadNumber()
TextWindow.write("Въведете височина h=")
h=TextWindow.ReadNumber()
s = а*h/2
TextWindow.WriteLine("Лицeто на триъгълника е " + s)
Goto krai
Endif
EndIf
krai:
Тествайте програмния код и след това направете следните промени:
А) Добавете още една възможност в менюто – изход от програмата
Б) Потребителят да може да изчислява лица докато му е необходимо.
Задачи за самостоятелна работа:
Задача 1: Да се състави програма за намиране на НОД (най-голям общ делител) на 2 цели положителни числа по алгоритъма на Евклид.
Задача 2: Съставете програма за намиране на сумата на числата от 1 до 100.
Задача 3: Съставете програма, която намира сумата на целите числа в интервала от М до N.
Тестови въпроси:
Въпрос 1. Колко пъти ще се изпълни следния цикъл
For i=15 to 1 step -1
Действия
Endfor
a) Един път, но петнадесет пъти по бързо
b) Петнадесет пъти
c) Нито веднъж
d) Неопределен брой
Въпрос 2. Какво е ограничението за броя цикли, които можете да влагате едни в други
А) неопределен
Б) ограничен според лимит определен от Мicrosoft
В) пет
Г) четно число, определено от разработчика на езика Small Basic
Въпрос3 Колко пъти ще се изпълни програмата
k=11
While (k<11 )
TextWindow.Writeline(k)
k=k+1
endWhile
a) 11 б) 10 в)нито веднъж г) безброй пъти
Въпрос4.
k=12
While (k>11 )
TextWindow.Writeline(k)
k=k+1
endWhile
a) 11 б) един път в)нито веднъж г) безброй пъти
Въпрос 5
k=12
While (k>11 )
TextWindow.Writeline(k)
k=k-1
endWhile
a) 11 б) един път в)нито веднъж г) безброй пъти
След този урок вие трябва да можете :
1. Да създавате програми с вложени цикли
2. Да използвате безусловния оператор за реализиране на задача с потребителско меню