Ответим сначала на первый вопрос, заданный на этом шаге. Если убрать конструкцию Else, то в случае неправильного задания номера месяца никаких сообщений на экран выведено не будет.
Приведем текст программы определения номера квартала по заданному номеру месяца с использованием условных конструкций.
Program Kvartal1; Var a:Integer; Begin WriteLn('Введите номер месяца: '); ReadLn(a); {Начинаем проверки} If (a>=1) and (a<=3) Then WriteLn('Первый квартал.') Else {Переход сюда, если значение a не попадает в диапазон 1..3} If (a>=4) and (a<=6) Then WriteLn ('Второй квартал.') Else {Переход сюда, если значение a не попадает в диапазон 1..6} If (a>=7) and (a<=9) Then WriteLn ('Третий квартал.') Else {Переход сюда, если значение a не попадает в диапазон 1..9} If (a>=10) and (a<=12) Then WriteLn ('Четвертый квартал.') Else {Переход сюда, если значение a не попадает в диапазон 1..12} WriteLn('Такого месяца нет.'); End.
Надеемся, что принцип ее работы понятен из приведенных комментариев. Приведем еще один вариант этой программы, но с использованием сокращенной условной конструкции.
Program Kvartal2; Var a:Integer; Begin WriteLn('Введите номер месяца: '); ReadLn(a); {Начинаем проверки} If (a>=1) and (a<=3) Then WriteLn('Первый квартал.'); If (a>=4) and (a<=6) Then WriteLn ('Второй квартал.'); If (a>=7) and (a<=9) Then WriteLn ('Третий квартал.'); If (a>=10) and (a<=12) Then WriteLn ('Четвертый квартал.'); If not ((a>=1) and (a<=12)) Then WriteLn('Такого месяца нет.'); End.
Отличие этой программы от предыдущей заключается в том, что при ее выполнении проверяются все пять условий независимо от того, есть уже какое-то сообщение на экране или нет. Пусть, например, a=8. Проверка первых двух условий даст ложный результат. Третье условие ((a>=7) and (a<=9)) будет истинным. Поэтому на экран будет выведено сообщение: Третий квартал, однако все равно будут осуществлены проверки четвертого и пятого условий!
Остановимся более подробно на пятом условии. Как видно из текста сообщения, оно предназначено для обработки ошибочно указанного номера месяца. Может показаться, что можно объединить четвертое и пятое условия. Однако такое объединение будет ошибочным:
If (a>=10) and (a<=12) Then WriteLn ('Четвертый квартал.')
Else WriteLn('Такого месяца нет.');
Покажем это. Пусть, например, a=5. Тогда второе условие будет истинным. Поэтому на экран будет выведено сообщение: Второй квартал, однако проверки продолжатся. При выполнении проверки четвертого условия ((a>=10) and (a<=12)) оно будет ложным и, соответственно, на экране появися сообщение: Такого месяца нет. Таким образом, на экране будут два сообщения: Второй квартал и Такого месяца нет. Поэтому объединение последних двух условий в одно является ошибочным!
Конструкцию not ((a>=1) and (a<=12)) можно понять так: значение, не принадлежащее диапазону 1..12. Сначала создается условие принадлежности числа диапазону 1..12, а затем берется его отрицание. Это условие можно было бы записать следующим образом: (a<1) or (a>12)).
В заключение приведем еще одно решение данной задачи с использованием конструкции цикла. Советуем вам вернуться к этому варианту решения после изучения циклических конструкций.
Program Kvartal3; Var i,a:Integer; Begin WriteLn('Введите номер месяца: '); ReadLn(a); If not ((a>=1) and (a<=12)) Then WriteLn('Такого месяца нет.') Else For i:=1 To 4 Do {Цикл по количеству кварталов} If (a>=1+3*(i-1)) and (a<=3*i) Then WriteLn(i,'-й квартал'); End.