ВЕТВЛЕНИЯ И ЦИКЛЫ

§ 1. Условный оператор


Команда в языке QBASIC

IF X1 > X2 THEN PRINT "В первый день привезли больше ящиков" ELSE PRINT "Во второй день привезли больше ящиков"

Перевод этого оператора на русский язык выглядит так: " Проверить условие X1 > X2. Если это условие выполняется, вывести на экран надпись " В первый день привезли больше ящиков ", в противном случае вывести на экран надпись " Во второй день привезли больше ящиков".

Здесь в зависимости от результатов проверки условия X1 > X2 выполняется один из двух операторов вывода: или тот, который стоит после слова THEN ( PRINT " В первый день привезли больше ящиков " ) , или тот, который стоит после слова ELSE
( PRINT " Во второй день привезли больше ящиков " ). На графической схеме этот выбор изображается следующим образом:

Условие помещается в ромбике. Из ромбика выходят две ветви. Одна ветвь ( ДА ) соответствует случаю, когда условие выполняется; эта ветвь приводит к оператору, стоящему после слова THEN в условном операторе. Вторая ветвь ( НЕТ ) соответствует случаю, когда условие не выполняется. Эта ветвь приводит к оператору, стоящему после слова ELSE.

В программировании эта конструкция называется ветвлением. Изобразим ветвление в общем виде.








В QBASIC ветвление осуществляется при помощи условного оператора:

IF условие THEN оператор 1 ELSE оператор 2.

Условный оператор применяется, когда в зависимости от результатов проверки некоторого условия необходимо выполнить один из двух операторов. Конечно, в качестве "оператор 1" и "оператор 2 ", можно использовать любые операторы, а не только операторы вывода.

При написании условий в условных операторах используются математические операции, которые называются операциями отношений:

> – больше,
< – меньше,
>= – больше или равно ( не меньше ),
<= – меньше или равно ( не больше ),
<> – не равно,
= – сравнение ( проверка на равенство ).
В нашей задаче "условие" – это математическое неравенство A > B.

В языке QBASIC существует такая форма записи условного оператора, которая позволяет отразить логическую структуру алгоритма. Выглядит эта запись так:

IF условие THEN
блок операторов
ELSE
блок операторов
END IF.
Отметим разницу между двумя формами записи оператора. Прежде мы записывали весь оператор в одной строке. Теперь после слова THEN следует начинать новую строку. После слова ELSE также следует начинать новую строку. Признаком конца условного оператора служат слова END IF.

После служебных слов THEN и ELSE в новом операторе можно написать много операторов – столько, сколько нужно. Конечно, и в старом операторе после слова ELSE можно написать несколько операторов, разделенных двоеточием. Но в Бейсике длина строки ограничена 256 символами. Кроме того, длинные строки в программе трудно читать.

Запишем нашу программу в новой форме:

CLS
INPUT " Введите число "; X
IF X < -1 THEN
PRINT " Точка не принадлежит заданному отрезку"
ELSE
IF X > 1 THEN PRINT " не принадлежит " ELSE PRINT " принадлежит"
END IF.
§ 4. Логические операции

Процесс объединения нескольких условий в одно составное называется логической операцией. На языке QBASIC логическая операция, соответствующая союзу "и", обозначается английским словом "AND". Называется эта операция логическим умножением.

CLS
INPUT " Введите координаты точки"; x, y
IF X > 0 AND Y > 0 THEN PRINT " Точка лежит в 1-й четверти " ELSE PRINT " Точка не лежит в 1-й четверти"

Составное условие "x>0 and y>0" выполняется только тогда, когда выполнены оба простых условия: "x>0" и "y>0". Выражение "x>0 and y>0" можно сформулировать следующим образом: условия "x>0" и "y>0" выполняются одновременно. Условный оператор в нашей программе можно перевести на русский язык так: " Если одновременно выполняются условия x>0 и y>0, то точка лежит в 1-й четверти, в противном случае точка не лежит в 1-й четверти”.

Решим другую задачу: определить, лежит ли точка в области, заштрихованной
на рис. 2 ? В эту область попадают точки, лежащие выше оси OX, а так же точки, лежащие правее оси OY. Координаты этих точек удовлетворяют условию: x >0 или y > 0. Можно сказать и так: точка лежит в заштрихованной области, если хотя бы одна из координат положительна, т. е. или первая координата положительна, вторая отрицательна, или вторая координата положительна, а первая отрицательна, или обе координаты положительны.

У нас опять получилось составное условие, построенное из двух простых. Но простые условия соединены союзом "или". Этому союзу соответствует логическая операция, называемая "логическое сложение". На языке QBASIC эта операция обозначается словом "OR".

Теперь можно записать программу, решающую нашу задачу:
CLS
INPUT " Введите координаты точки"; x, y
IF X > 0 OR Y > 0 THEN PRINT " Точка лежит в заштрихованной области " ELSE PRINT "Точка не лежит в заштрихованной области"
Новое составное условие "x>0 or y>0" выполняется в том случае, если выполняется хотя бы одно из простых условий. Словосочетание "хотя бы" здесь означает, что выполняется или первое простое условие "x>0", или второе простое условие "y>0" , или оба простых условия выполняются одновременно.

Подведем некоторые итоги. У нас появились новые термины: "простое условие", "составное условие". Дадим им определения.

Определение.
Условие, содержащее логические связки, называется составным условием.
условие, не содержащее логических связок, называется простым, или элементарным условием.
Мы пока имеем дело только с двумя логическими связками – "И" и "ИЛИ" и, соответственно, с двумя логическими операциями – логическим умножением и
логическим сложением. В дальнейшем мы познакомимся с другими логическими связками и логическими операциями. Отметим пока, что логическое умножение называют также операцией "И" и конъюнкцией, а логическое сложение – операцией "ИЛИ" и дизъюнкцией.

В одном составном условии можно объединять не только два, но и любое количество простых условий. Если простые условия объединены логическим умножением, то составное условие выполняется только в том случае, если выполняются все простые условия одновременно. Если же простые условия объедены операцией логического сложения, то для выполнения составного условия достаточно выполнения хотя бы одного простого условия.

§ 5. Циклы

Решим следующую задачу: вывести на экран квадраты натуральных чисел от 1 до 5. Решить задачу можно при помощи следующей программы

CLS
A = 1
B = A^2
PRINT A;B
A = 2
B = A^2
PRINT A;B
A = 3
B = A^2
PRINT A;B
A = 4
B = A^2
PRINT A;B
A = 5
B = A^2
PRINT A;B
Мы взяли всего 5 чисел, а программа получилась уже довольно длинная. А если взять не 5 чисел, а 15 ? А если понадобиться вычислить квадраты 150 чисел ?

В программе повторяется один и тот же набор операций: переменной А присваивается некоторое значение, затем квадрат этого значения присваивается переменной B и значения обеих переменных выводятся на экран. Процесс вычисления квадратов пяти чисел можно сокращенно описать следующим образом:

1. Присваивать переменной А значения от 1 до 5;
2. Возвести каждое значение переменной А в квадрат и результат записать в переменную В;
3. Вывести на экран значения переменных А и В.
Вместо 15 строчек программы мы получили всего 3 строчки. Из контекста ясно, что эти строчки нужно выполнять 5 раз. Такое повторение одних и тех же операций с разными значениями переменных в программировани называют циклом.

Определение. Многократное выполнение одних и тех же операций называется циклом.

Язык QBASIC имеет специальный оператор, позволяющий записать такой цикл
( программисты говорят: организовать цикл ). Называется этот оператор оператором цикла. Запишем программу, вычисляющую квадраты первых пяти чисел, при помощи оператора цикла:

CLS
FOR A = 1 TO 5
B = A ^ 2
PRINT A; B
NEXT A.
В переводе на русский язык это звучит примерно так:

1. Для каждого значения А от 1 до 5 выполнить:
2. Переменной В присвоить значение А ^ 2;
3. Вывести на экран значения А и В ;
4. Перейти к следующему значению А.
Состоит оператор цикла из трех частей: заголовка, тела цикла и признака окончания цикла. Заголовком цикла является строчка, которая начинается служебным словом FOR. Признаком конца цикла является слово NEXT. Всё, что стоит между заголовком и словом NEXT, называется телом цикла. Тело цикла – это и есть те самые операторы, которые многократно выполняются в программе. Конечно, при каждом выполнении тела цикла значения переменных А и В будут разными.

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

Мы написали самый простой вариант оператора цикла, когда при каждой итерации параметр цикла увеличивается на 1. QBASIC позволяет изменять параметр цикла на любую величину. Величина, на которую изменяется параметр цикла при каждой итерации, называется шагом изменения параметра цикла. Шаг указывается в заголовке цикла после служебного слова STEP. Если мы хотим вычислить квадраты чисел от 1 до 5 с шагом 0.1, то нужно написать:

CLS
FOR A = 1 TO 5 STEP 0.1
B = A ^ 2
PRINT A; B
NEXT A
Здесь выражение STEP 0.1 указывает, что при каждой итерации параметр увеличивается на 0.1 ( STEP – по-английски шаг ). При этом изменится количество итераций ( посчитайте, сколько итераций сделает этот цикл ).

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

CLS
FOR A = 5 TO 4.5 STEP -0.1
B = A ^ 2
PRINT A; B
NEXT A
выведет на экран следующие числа
5 25
4.9 24.09
4.8 23.04
4.7 22.09
4.6 21.16
4.5 20.25.
Теперь можно записать формат оператора цикла с параметром:

FOR парам = нз TO кз [ STEP шаг ]
тело
NEXT [ парам ].
Здесь

парам – идентификатор параметра цикла;

нз – начальное значение параметра цикла;

кз – конечное значение параметра цикла;

шаг – шаг изменения параметра цикла.

В современных версиях Бейсика имя параметра цикла после слова NEXT можно не писать  Поэтому здесь имя параметра написано в квадратных скобках. Можно также не указывать шаг, если он равен 1 ( в этом случае говорят, что шаг по умолчанию принимается равным 1 ). Поэтому слова "STEP шаг" в заголовке цикла написаны в квадратных скобках.

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

FOR I = PI/2 TO 3*PI/2 STEP PI/10.

В заключение можно сказать, что оператор цикла с параметром сокращенно называют оператором FOR ... NEXT.


§ 7. Массивы


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

Здесь мы сразу столкнемся с такой проблемой: каким образом занести наши оценки в память компьютера, чтобы их было легко обрабатывать ? Сразу договоримся, что фамилии учеников заносить в память не будем. Учеников мы пронумеруем ( как в классном журнале ) и будем различать их по номерам. Если ученик № 1 получил оценку 5 , то эту оценку можно занести в память при помощи следующего оператора присваивания :

А1 = 5.

Если ученик № 2 получил оценку 3 , то в программе нужно написать:

А2 = 3

и т. д. Если в классе 25 учеников, то придется написать 25 операторов присваивания.

Теперь посчитаем количество оценок каждого типа. Начнем с пятерок. Количество пятерок будем считать при помощи переменной P, которая будет играть роль счетчика. Сначала примем P = 0. Затем будем проверять каждую оценку ( проверять значение каждой переменной А ), и если это значение равно 5, то значение переменной P увеличим на 1. Проверка производится при помощи условного оператора:

P =0
IF A1 = 5 THEN P = P+1
IF A2 = 5 THEN P = P+1
и т. д.
14

Для подсчета количества пятерок нужно написать 25 условных операторов. Для подсчета количества четверок нужно написать еще 25 операторов, и так для каждого типа оценок. Всего программа будет содержать 100 условных операторов. Сколько же операторов нужно написать, чтобы посчитать оценки по всей школе ?

Очевидно, здесь нужно использовать оператор цикла, поскольку программа состоит из одинаковых операторов, проверяющих значения переменных A1, A2, A3 ... Нужно только каким-то образом перебрать в цикле значения всех переменных. Делается это следующим образом: оценки нумеруются ( так же, как и фамилии ) и записываются в памяти под одним именем. Номер оценки указывается в скобках рядом с именем переменной: А( 1 ), А( 2 ), А( 3 ) и т.д. Если 1-й ученик получил 5, 2-й ученик получил 3, а 3-й – 4, то в программе можно написать: A( 1 ) = 5, A( 2 ) = 3, A( 3 ) = 4.

Номер переменной в программировании называется индексом. Переменная, имеющая номер, называется "переменная с индексом"; переменная без номера называется "простая переменная". В памяти простые переменные и переменные с индексом записываются по-разному. Если в программе написаны операторы присваивания:

A1 = 5
A2 = 3
A3 = 4,
то в памяти компьютера будут образованы переменные с именами А1, А2, А3 и в них будут записаны соответствующие значения. Переменные эти будут размещаться в разных участках памяти и никак не будут связаны друг с другом. Это можно схематически изобразить следующим образом:

A1 5 A3 4
A2 3
Здесь пунктиром обозначена внутренняя память ЭВМ.
Другая ситуация возникнет, если мы напишем
A( 1 ) = 5
A( 2 ) = 3
A( 3 ) = 4.
В этом случае всем трем переменным будет присвоено одно и то же имя. Располагаться значения всех трех переменных будут в соседних ячейках памяти, последовательно друг за другом согласно номерам:

1 2 3
A 5 3 4
15

Такой набор пронумерованных переменных, имеющих одно, имя в программировании называется массивом. Каждая переменная называется элементом массива. Номер элемента массива называется его индексом.

Определение. Группа пронумерованных элементов, имеющих одно имя,

называется массивом.

В качестве индекса элемента массива можно использовать не только число, но и переменную. Если ученик номер N получил 5, то можно написать

A( N ) = 5.
Естественно, до того как этот оператор будет выполняться, переменная N должна быть определена, т.е. ей нужно присвоить какое-либо значение. Тогда машина, выполняя этот оператор, сначала найдет в памяти переменную N, прочитает ее значение и затем запишет число 5 в переменную А с соответствующим номером. Если мы хотим занести число 5 в переменную A( 1 ), то можно написать

N = 1
A( N ) = 5.
В качестве индекса можно использовать любую переменную, которая принимает целочисленное значение. Если мы в качестве индекса используем параметр цикла, то сможем написать небольшую программу, подсчитывающую количество пятерок, полученных учениками:

P = 0
FOR I = 1 TO 25
IF A( I ) = 5 THEN P = P+1
NEXT.
Эта же программа посчитает количество пятерок, полученных любым количеством учеников ( например, учениками всех восьмых классов или учениками всей школы ). Надо только в качестве конечного значения параметра цикла поставить другое число.

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

§ 8. Заполнение массива

Работа с массивом начинается с описания массива. Описать массив – это значит сообщить машине имя массива и количество элементов в массиве. Всё это нужно для того, чтобы машина заранее выделила в памяти место под этот массив
( зарезервировала участок памяти ).

Оператор описания массива начинается с ключевого слова DIM ( от английского слова dimention – размер ). Затем идет имя массива, после которого в скобках ставится максимальное значение индекса. Например, если мы хотим описать массив А, в котором будет 6 элементов, то нужно написать:

DIM A( 6 ).

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

0 1 2 3 4 5 6

A 0 0 0 0 0 0 0

Теперь нам нужно заполнить массив, т. е. записать в клеточки числа, с которыми мы будем работать. Заполнить массив можно при помощи оператора присваивания, перечислив последовательно все элементы ( как мы это делали в предыдущем параграфе ). Но если элементов массива много, то этот способ нерационален, поскольку программа получается очень громоздкой.

Для сокращения текста программы используется оператор цикла. В операторе цикла можно поставить оператор INPUT :

DIM A ( 6 )
FOR I = 1 TO 6
PRINT " Введите "; I ; " - е число"
INPUT A ( I )
NEXT
Для заполнения массива можно использовать оператор чтения данных. Сформируем для примера массив оценок, которые получили 25 учеников :

DIM A ( 25 )
FOR I = 1 TO 25
READ A ( I )
NEXT
DATA 2,3,5,4,3,2,2,3,4,4,4,5,3,3
DATA 4,4,5,5,5,3,2,4,3,3, 4
В строчке DATA перечисляются оценки в том порядке, в котором пронумерованы ученики.

З А Д А Ч И

Условный оператор

1. У Сережи 145 рублей. Он решил купить 3 блокнота по 48 рублей. Хватит ли денег на покупку ?

2. Ребята собрали в саду 875 кг яблок и упаковали их в ящики по 25 кг в каждом. Хватило ли им 40 ящиков ?

3. Из куска ткани можно сшить 17 детских плащей, расходуя на каждый 2 м ткани. Можно ли из этого куска сшить 8 плащей для взрослых, расходуя по 4 м ткани на каждый плащ ?

4. Валя взяла у подруги книгу на 3 дня. В первый день она прочитала 28 страниц, во второй день прочитала в 3 раза больше, чем в первый, в третий день она прочитала на 25 страниц меньше, чем во второй. Успела ли Валя прочитать книгу вовремя, если в книге 194 страницы ?

5. В коробке 3 кг лимонов и апельсинов. Лимоны вынули и взвесили отдельно. Их масса оказалась 1 кг 760 г. Каких цитрусовых больше и на сколько ?

6. Мотоциклист должен прибыть в город через 4 часа после выезда из пункта, находящегося на расстоянии 320 км от города. Успеет ли он вовремя прибыть в город, если в первый час он проедет 75 км, а всё оставшееся время будет ехать со скоростью 70 км/ч ?

7. Даны два числа. Вывести их на экран в порядке возрастания.

8. Даны два числа. Вывести на экран первое число, если оно больше второго и оба числа, если это не так.

9. Даны два числа. Меньшее из этих чисел заменить их полусуммой, а большее – удвоенным произведением.

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

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

12. Даны 4 числа. Найти разницу между максимальным и минимальным числами.

13. Определить принадлежность точки кругу радиуса R с центром в начале координат.

14. Определить принадлежность точки заданному отрезку.

15. Даны три числа. Выяснить, существует ли треугольник с такими сторонами.

16. Две точки заданы своими координатами. Выяснить, лежат ли они на одной окружности с центром в начале координат.

17. Даны три числа a, b, c. Выяснить, выполняется ли условие a < b < c.

18. В киоске продается газета стоимостью 3 рубля и журнал стоимостью 20 рублей. Составить программу, которая спрашивает, что вы хотите купить, принимает деньги и выдает сдачу.

19. Даны два числа x и y. Вычислить:

a ) z = x- y, если x > y, z = y - x + 1 в противном случае;

b ) z = 13.8, если x > y, z = 20.0 в противном случае.

20. При выполнении условия x - y < 0 вычислить z = ( x + y )/2 +1, в против-

ном случае проверить условие x - y = 0, и если оно выполняется, вычис-

лить z = ( x + y )/2, в противном случае z = 3.2.

V. Циклы и массивы.

21. Написать таблицу перевода температур из градусов Цельсия ( С ) в градусы Фаренгейта ( F ) по формуле: F = 1,8 · C + 32.

22. Напечатать таблицу соответствия между весом в фунтах и весом в килограммах.
1 фунт = 0,4 кг.

23. Напечатать таблицу перевода расстояний в дюймах в сантиметры. 1 дюйм = 2,54 см.

24. Составить таблицу расстояний до линии горизонта для наблюдателя, находящегося на высоте H от поверхности Земли для величин H от 10 до 100 метров с интервалом 10 м.

25. Дан прямоугольный параллелепипед высотой h. В основании параллелепипеда лежит квадрат со стороной a. Объём параллелепипеда равен 1. Составить таблицу значений a для 0,1 Ј h Ј 2 с шагом 0,1.

26. Одноклеточная амеба каждые 3 часа делится на 2 клетки. Определить, сколько клеток будет через 3, 6, 9 ... 24 часа.

27. Вычислить среднее арифметическое элементов массива.

28. Вывести на экран положительные элементы массива.

29. Вычислить среднее арифметическое положительных и среднее арифметическое отрицательных элементов массива.

30. В массив занесены результаты контрольной работы. Посчитать процент оценок каждого типа.

31 В массив занесены данные о росте учеников класса. Рост мальчиков кодируется знаком "+", рост девочек – знаком "-". Посчитать средний рост мальчиков и средний рост девочек.

32. В массив А занесены среднесуточные температуры за апрель. В массив В занесены данные о количестве выпавших осадков ( в мм ) в эти же дни. Посчитать количество осадков, выпавших в виде дождя и количество осадков, выпавших в виде снега. Вывести на экран дни, в которые шел дождь, дни, в которые шел снег и дни, в которые не было осадков.
Hosted by uCoz