Урок 6. Логически изрази. Вложени условни оператори.
Да се върнем към задача 2 от предишния урок. Тя представлява симулация на ТОТО2 и тегленето на тиража. Но при тестването на програмата трябва да сте забелязали, че понякога има повторение на изтеглени числа, а това е недопустимо.
Какво би станало ако направим проверка за повторение и ако това се случи, да се изтегли следващо число. Тегленето да продължи докато няма повторение.
Когато числата са две на брой – решението е много просто – използва се просто условие в което се сравняват числата. Когато се генерира третото число, ако то съвпада с първото или второто да се изтегли новото. За да извършим тази проверка ще използваме логическите изрази AND и OR – конюнкция и дизюнкция. С използване на логическите изрази AND и OR можем да проверим истинността на повече от едно условие. Трябва да имаме предвид, че AND дава стойност 1 /истина/ ако всички условия са изпълнени, а OR ако едно от условията е истина. В нашия случай ще използваме OR. Програмата ще добие следния вид:
x1=math.GetRandomNumber(49)
x2=math.GetRandomNumber(49)
If x1=x2 Then
x2= math.GetRandomNumber(49)
EndIf
x3=math.GetRandomNumber(49)
If x3=x1 Or x3=x2 Then
x3=math.GetRandomNumber(49)
endif
x4=math.GetRandomNumber(49)
If x4=x3 Or x4=x2 Or x4=x1 Then
x4=math.GetRandomNumber(49)
EndIf
x5=math.GetRandomNumber(49)
If x5=x4 Or x5=x3 Or x5=x2 Or x5=x1 Then
x5=math.GetRandomNumber(49)
EndIf
x6=math.GetRandomNumber(49)
If x6=x5 Or x6=x4 Or x6=x3 Or x6=x2 Or x6=x1 Then
x6=math.GetRandomNumber(49)
EndIf
TextWindow.WriteLine("Бяха изтеглени числата " +x1+" "+x2+" "+x3+" "+x4+" "+x5+" "+x6 )
Изпълнявайки многократно написания програмен код виждаме, че вече няма повторение. Решението на проблема може да стане и по друг начин, но затова ще говорим в следващи уроци.
Нека решим следната задача:
Учениците от ЗПГ получават стипендия при показан среден успех равен или по-голям от 5.50 от последния учебен срок и при 5 и по-малко от 5 неизвинени отсъствия. Напишете програма, която да определя дали ученика получава стипендия.
За решението на тази задача ще използваме условния оператор. Тук условията са две, но те трябва да са изпълнени едновременно и затова ще използваме логическия израз AND.
За да решим задачата първо да определим кои са входните данни
- Успех на ученика
- Брой неизвинени отсъствия
Изходният резултат е отговор на въпроса – Получава ли ученикът стипендия?
TextWindow.BackgroundColor= "White"
TextWindow.Clear()
TextWindow.ForegroundColor="Red"
TextWindow.Write( "Какъв е средния успех на ученика ")
usp=TextWindow.ReadNumber()
TextWindow.Write( "Брой неизвинени отсъствия ")
br=TextWindow.ReadNumber()
TextWindow.ForegroundColor="Blue"
If usp >=5.5 And br <=5.0 Then
TextWindow.WriteLine( "Ученикът получва стипендия")
Else
TextWindow.WriteLine( "Ученикът не получва стипендия")
EndIf
Резултатът от изпълнение на програмата е
Двете условия са свързани с логическия израз AND. Нека проверим за устойчивостта на програмата.
Какво ще стане ако потребителя въведе за успех число по-голямо от 6? Какво ще стане ако потребителя въведе отрицателно число за брой отсъствия?
И в двата случая ще получим положителен отговор:
А това означава, че програмата не работи вярно.
За да избегнем неволната грешка при въвеждане на стойностите за успеха / той не може да е по-голям от 6:00) и отсъствията /те могат да бъдат в интервала от 0 до 5/ще добавим още 2 логически израза.
Програмата ще добие следния вид:
TextWindow.BackgroundColor= "White"
TextWindow.Clear()
TextWindow.ForegroundColor="Red"
TextWindow.Write( "Какъв е средния успех на ученика ")
usp=TextWindow.ReadNumber()
TextWindow.Write( "Брой неизвинени отсъствия ")
br=TextWindow.ReadNumber()
TextWindow.ForegroundColor="Blue"
If usp >=5.5 And usp <=6 and br <=5.0 And br>0 Then
TextWindow.WriteLine( "Ученикът получва стипендия")
Else
TextWindow.WriteLine( "Ученикът не получва стипендия")
EndIf
При тестването и с некоректни входни данни ние получаваме съобщение,че ученика не получава стипендия, а не че при управлението на входа е допусната грешка
За да отстраним и този пропуск ще използваме вложени разклoнени оператори.
Първият ще провери дали въведената стойност за успех не е по-голяма от 6 и дали броя на неизвинените отсъствия не е отрицателен и ако едно от условията е вярно , ще се изведе съобщение за НЕДОПУСТИМИ данни.
Ако данните са коректни, тогава ще се направи проверка за успеха и броя на отсъствията и от това ще се определи получаването на стипендията.
Правим следните промени в кода
TextWindow.BackgroundColor= "White"
TextWindow.Clear()
TextWindow.ForegroundColor="Red"
TextWindow.Write( "Какъв е средния успех на ученика ")
usp=TextWindow.ReadNumber()
TextWindow.Write( "Брой неизвинени отсъствия ")
br=TextWindow.ReadNumber()
TextWindow.ForegroundColor="Blue"
If usp>6 Or br<0 Then
TextWindow.WriteLine( "Недопустими стойности за успех или отсъствия")
Else
If usp >=5.5 and br <=5.0 Then
TextWindow.WriteLine( "Ученикът получава стипендия")
Else
TextWindow.WriteLine( "Ученикът не получава стипендия")
EndIf
EndIf
Тестваме програмата и се убеждаваме, че сега всичко е наред:
Какво ще се случи ако потребителят въведе некоректни данни за успех и брой отсъствия?
Тествайте програмата и ако откриете грешка се опитайте да я отстраните!
Забелязахте ли, че сега получаваме изходните резултати в бял прозорец. Защо във втори ред на програмата използваме опeрацията Clear ? Анализирайте как е постигнато това!
Нека решим следната задача:
Самолетният билет до Париж и обратно струва 190 евро. Деца до 14 годишна възраст пътуват с 40% намаление, а възрастни, навършили 60 години с 20%. Напишете програма, която да определя стойността на самолетния билет в зависимост от възрастта на пътника.
Решение:
TextWindow.Write( "Въведете годините на пътника ")
god=TextWindow.ReadNumber()
bilet=190
If god > 60 Then
bilet= bilet*0.8
ElseIf god < 14 Then
bilet= bilet*0.6
EndIf
TextWindow.WriteLine( "Билетът струва "+bilet)
За решението на задачата е използвана конструкцията elseif.
Както се вижда тя е комбинация от IF и ELSE. Тя дава възможност да се изпълни различно действие при положение че условието след If не е вярно. Различава се от ELSE по това, че действието след ELSEIT ще се изпълни само ако условието, посочено след нея е вярно.
В случая, когато годините са, например 10, билетът се изчислява с 40% намаление.
С две думи – използвайки ELSEIT, ние увеличаваме възможността за проверка на повече условия без да използваме вградени един в друг условни оператори, докато ELSE служи да разграничи истина от лъжа на едно условие.
Забележка: Горната задача може да се реализира с два условни оператора – кратка форма. Помислете как!
Задачи за самостоятелна работа.
След този урок вие трябва да можете :