NEXT имя_переменной_цикла
последовательно выполняет операторы, находящиеся между оператором FOR до оператора NEXT столько раз, сколько нужно для того, чтобы изменяемая переменная от начального значения достигла конечного значения с установленным шагом.
Например:
FOR a = 3 TO 7.5 STEP 0.8
Операторы
NEXT a
Здесь группа операторов от оператора FOR до оператора NEXT будет повторяться столько раз, сколько нужно, чтобы переменная A, изменяясь с шагом 0.8 от значения равного 3, достигла 7.5. Таким образом, мы последовательно получим: A=3; 3.8; 4.6; 5.4; 6.2; 7, т.е. цикл будет выполнен 6 раз. При следующем значении A=7.8 циклы более не выполняются, поскольку A становится больше предельно возможного (7.8>7.5) в данном операторе FOR. Далее программа продолжаться с оператора, следующего сразу после NEXT.
В качестве параметров оператора цикла разрешены выражения. Например: FOR c=b+2 TO k STEP x–2.Если шаг изменения переменной цикла 1, разрешается его не указывать. Так, операторы
FOR i=4 TO k STEP 1иFOR i=4 TO k
полностью эквивалентны. Дословно такой оператор интерпретируется следующим образом: “Выполнять операторы цикла от оператора FOR до оператора NEXT столько раз, сколько нужно, чтобы переменная I, изменяясь с шагом 1, достигла значения k.” Цикл перестанет выполняться в момент, когда переменная цикла становится больше предельного значения цикла (k).
Допускается отрицательный шаг с превышением начального значения цикла над конечным, например
FOR i=20 TO 10 STEP -3
Здесь переменная I последовательно получит значения: 20, 17, 14, 11.
Оператор цикла является сильнейшим средством программиста. Он один заменяет несколько операторов в цикле, построенном обычным образом – это операторы задания исходного значения циклической переменной (или счетчика циклов) и операторы ее приращения и анализа. Оператор FOR удобен для реализации арифметических циклов.
Программа к | Проверка для N=3 | |||
задаче 4.5 (с FOR) | 1 цикл | 2 цикл | 3 цикл | |
INPUT n a=3: s=0 FOR i=1 TO n s=s+a a=2*a NEXT i ? s | n=3 a=3, s=0 i=1<3 s=0+3=3 a=2*3=6 | 2<3 | 3=3 | 4>3 s=21 |
Решим задачу 4.5 с применением оператора FOR. Здесь необходимо просуммировать в переменную S все числа X из множества N чисел.
Если необходимо выйти из цикла FOR до его естественного завершения (до выполнения всех циклов), можно применить оператор GOTO, но удобнее воспользоваться специальным оператором выхода вида
üEXIT FOR
который передает управление на оператор, следующий непосредственно за оператором NEXT.
Если нужно, не выполняя до конца текущего цикла, начать следующий, следует перейти оператором GOTOнепосредственно на оператор NEXT. В задаче 8, например, это оператор IF x<0 THEN s=s+x: GOTO 9.
Программа | Проверка для N=5 | |||||
к задаче 5.1 | 1 цикл | 2 цикл | 3 цикл | 4 цикл | 5 цикл | |
INPUT n kp=0: s=0: p=1 FOR i=1 TO n INPUT x IF x=0 GOTO 7 IF x<0 THEN s=s+x: GOTO 9 kp=kp+1 p=p*x 9 NEXT i ?"Нулей нет" 7 ? s p kp | n=4 i=1<5 x=3 x≠0 x>0 kp=1 p=3 | 2<5 x=-2 x≠0 x<0, s=-2 | 3<5 x=1 x≠0 x>0 kp=2 p=3 | 4<5 x=-3 x≠0 x<0, s=-5 | 5=5 x=2 x≠0 x>0 kp=3 p=6 Нулей | 6>5 нет -5,6,3 |
Задача 5.1. Для N произвольных чисел X вычислить и отпечатать: сумму отрицательных чисел S, количество положительных КР, произведение положительных чисел Р. Все вычисления производить до появления первого нуля в последовательности. Если нуль не встретился, кроме S, KP и Р напечатать сообщение НУЛЕЙ НЕТ. В программе сделана проверка для N=5 и чисел X=3,–2,1,–3,2. В результате получено S=–5, P=6, KP=3.
Задача 5.2. Для чисел X и Y найти наибольший общий делитель, т.е. наибольшее число, которое делит X и Y без остатка. Нахождение НОД будем выполнять путем последовательного перебора сверху вниз всех натуральных чисел от минимального из X и Y до 1. Наибольшим делителем считаем первое значение i, которое делит оба числа без остатка.
Программа к задаче 5.2
INPUT "Введите числа X и Y", x, y
IF x<y THEN k=x ELSE k=y'определение минимального (переменная К) значения из X и Y
FOR i = k TO 1 STEP –1'перебор чисел от К до 1
IF (x MOD i=0) AND (y MOD i=0) THEN ?"НОД="; i: EXIT FOR 'если X и Y делятся нацело на i, НОД=i найден
NEXT
Напоминаем, что взятие модуля X по I означает получение целого остатка от деления X на I. Иными словами, если x MOD i=0, то число X кратно числу I.
@ Задачи для самостоятельного решения.
1). Имеется N произвольных чисел X. Составить программу вычисления суммы S всех положительных чисел меньших 10 и среднее арифметическое SR всех отрицательных чисел.
2). Напечатать цепочку чисел, каждое из которых равно сумме двух предыдущих. Самые первые два числа X и Y задаются произвольно.
3). Напечатать все числа, на которые число X делится без остатка.
4). Вычислить наименьшее общее кратное (НОК) чисел X и Y. НОК – это минимальное число, которое делится на X и Y без остатка. Общим кратным, конечно, является произведение X на Y, но оно не обязательно наименьшее. Так если X=6, а Y=9, то X*Y=54. Однако еще есть общие кратные 36 и 18. Т.е. НОК=18. Удобно поиск НОК осуществлять, перебирая все числа от 1 до X*Y, до встречи первого числа, которое делится на X и Y без остатка.
5). В банке хранится известное количество N срочных вкладов. О каждом вкладе известно его значение на начало года – X. Размер годовой прибыли зависит от величины вклада. Если вклад до 10000 руб. – прирост составляет 10% годовых, если до 50000 руб. – 12%, если больше – 15%. Вычислить и напечатать значение каждого вклада на конец года Y, а также сумму всех вкладов на начало SX и конец SY года. Задачу решить двумя способами – с оператором цикла и без него. Указание. Процент увеличения вклада удобно отобразить в виде коэффициента. Так при 12% годовых, значение вклада Y на конец года соответствует 1.2X.
Оператор итерационного циклаимеет вид
üWHILE условие
Операторы
WEND
Такая конструкция позволяет организовывать итерационные циклы. Операторы, входящие в тело цикла выполняются до тех пор, пока истинно условие.
Для примера снова решим задачу 3 (вычислять и печатать Y=2/X до обнаружения первого X=0). Программа приведена ниже.
INPUT x
WHILE x< >0
?х; x/2
INPUT x
WEND
Если параметр условие опущен, цикл будет выполняться бесконечно. В этом случае внутри него должно быть предусмотрено средство выхода, например строка GOTO. Кроме того, в Бейсике имеется еще один оператор цикла с условием. Он имеет две разновидности: цикл с предусловием (условие рассматривается до входа в цикл)
üDO [WHILE/UNTIL условие]
Операторы
LOOP
и цикл с постусловием (условие оценивается после выполнения тела цикла)
üDO
Операторы
LOOP [WHILE/UNTIL условие]
Ключевое слово UNTIL действует обратным образом по отношению к WHILE, т.е. UNTIL-цикл будет выполняться до тех пор, пока условие не станет истинным. Иными словами WHILE условие это UNTIL NOT условие.
Здесь, имеется собственный оператор принудительного выхода из цикла
üEXIT DO
Структуру с постусловием удобно применять в случае, если цикл необходимо выполнить хотя бы один раз независимо от значения условия или, если само условие формируется в цикле и не может быть оценено до входа в цикл.
@ Задачи для самостоятельного решения.
1). Решите задачу 4.2, используя оператор WHILE, а затем оператор DO.
2). Суммировать элементы числового ряда вида 2+6+18+… до тех пор, пока сумма не превысит число 120. Напечатать получившуюся сумму и номер элемента, на котором произошло это событие.
6. Работа с массивами
Как правило, данные для вычислений на компьютере задаются в упорядоченной форме – в виде последовательности (вектора) чисел или в виде таблицы (матрицы) чисел. Такие совокупности данных называются массивами. Построение программ, оперирующих с элементами массивов – важнейшая часть техники программирования.
Например, вектор A длиной К чисел и матрица В из N строк и M столбцов (всего из N×M элементов) выглядят следующим образом (рис. 6.1).
Цифры при имени массива, указывающие порядковый номер элемента, называются индексами. В алгоритмических языках элементы массивов AIи BIJобозначаются как A(I) и B(I,J). К массиву в целом обратиться нельзя. Обработка массива обычно означает последовательную обработку отдельных его элементов.
Оператор описания массивов.Если предполагается работа с массивами, предварительно следует “известить” об этом компьютер оператором вида
üDIM список_массивов
Описание массива содержит имя массива и его размерность. Например, оператор DIM A(20), B(4,6) читается как “Установить размерность одномерного массива A из 20 элементов и двумерного массива В из 24–х элементов (4 строки, 6 столбцов)”.
По умолчанию отсчет элементов в Бейсике начинается с нуля, то есть оператор DIM A(20) определяет на самом деле 21 элемент памяти (нулевой элемент можно игнорировать). Если есть необходимость установить нестандартную нумерацию, можно при определении размерности использовать указатель вида нижняя граница индекса ТО верхняя граница. Например, оператор DIM Y(5 TO 20, 1 TO 8) определяет двухмерный массив Y, у которого первый индекс изменяется от 5 до 20, а второй – от 1 до 8. Размерность массива задается исходя из условий решаемой задачи. Первоочередной задачей при работе с массивами является ввод-вывод данных, который организуется с помощью циклов. На рис. 6а осуществляется ввод данных в вектор A размерностью N элементов. На рис. 6б – в матрицу В размерностью N строк на M столбцов. Ввод осуществляется с помощью двух циклов, один из которых вложен в другой. В наружном цикле изменяется первый индекс I элемента матрицы В, во внутреннем – второй индекс J. Таким образом, второй индекс J изменяется быстрее, чем первый. Это означает, что ввод элементов матрицы будет производиться в следующей последовательности: B(1,1), B(1,2), ... , B(1,M); B(2,1), B(2,2), ... , B(2,M); ... ; B(N,1), B(N,2), ... B(N,M), т.е. по строкам. Замечание. Два последних оператора могут быть объединены в один вида NEXT j,i (первым должен быть указан индекс внутреннего цикла, вторым – внешнего). Аналогичным образом осуществляется и вывод (рис. 6в), но вместо оператора INPUT используется оператор PRINT. Здесь, однако, следует позаботиться об удобстве восприятия выводимых данных. Желательно, чтобы строка матрицы занимала на экране именно одну строку. Для этого во внутреннем цикле печати нужно поставить точку с запятой после оператора вывода (PRINT;), что подавляет переход на новую строку монитора после вывода каждого числа. Напротив, после завершения вывода всех элементов строки матрицы, как раз следует перейти на следующую строку монитора. Для этого ниже оператора NEXT j следует поставить пустой оператор PRINT, который переведет вывод на следующую строку экрана. Кроме того, для обеспечения фиксированного расположения элементов матрицы друг под другом в столбцы, имеет смысл использовать для вывода не оператор PRINT, а PRINT USING (например, PRINT USING "####.##"; b(i,j);).
Программа к задаче 6.1 INPUT n DIM c(n) FOR i=1 TO n INPUT c(i) NEXT | Проверка | |||
m=c(1): k=1 FOR i=2 TO n IF m<c(i) THEN m=c(i): k=i NEXT ?m k | m=5, k=1 i=2 5>2 | i=3 5<7 m=7,k=3 | i=4 7>4 | i=5 7, 3 |
Задача 6.1. В векторе С размерности N элементов найти максимальный по значению элемент и его номер в С. Ниже приведена программа и ее проверка для N=4 и C=[5,2,7,4] (с оператора m=c(1)). Здесь переменная М запоминает значение максимального элемента, а К – номер этого элемента в векторе С. Первоначально в качестве такого элемента берется самый первый.
Sub primer()
n = Val(InputBox("vvedite n"))
Dim a(5) As Integer
For i = 1 To n
a(i) = Val(InputBox("vvedite a(i)"))
Next
m = a(1): k = 1
For i = 1 To n
If m < a(i) Then m = a(i): k = i
Next
MsgBox (m)
MsgBox (k)
End Sub
Задача 6.2. Определение значения вклада в банке на конец года.Пусть в банке имеется N счетов вкладчиков. Для всех известны значения остатков на счете в конце каждого квартала. Следует определить и напечатать значения всех вкладов на конец года с учетом известного процента роста вклада Р. Данные о вкладах хранятся в массиве X из N строк и пяти столбцов. Первые четыре элемента каждой i-ой строки X(i,1), X(i,2), X(i,3), X(i,4), хранят остатки вклада на конец каждого из четырех кварталов года. В последний пятый элемент строки X(i,5) следует занести вычисленную величину вклада на конец года. Он равен остатку вклада на конец последнего квартала X(i,4) плюс установленный процент Р/100 от среднего значения вклада (X(i,1)+X(i,2)+X(i,3)+X(i,4))/4 за год. Отсюда X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+ X(i,4))/4.
I кв X(i,1) | II кв X(i,2) | III кв X(i,3) | IV кв X(i,4) | Остаток на конец года X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+X(i,4))/4 |
Кроме перечисленного, следует найти сумму всех вкладов в банке S и среднее значение вклада, приходящееся на одного вкладчика S/N.
Программа к задаче 6.2 INPUT "Введите число вкладчиков и процент ",N,P DIM x(n,5) FOR i=1 TO n FOR j=1 TO 4 ?"Введите остаток вклада №"i "за" j "квартал "; INPUT x(i,j) NEXT j,i s=0 ?" Счет Остатки по кварталам ВСЕГО" ?" I II III IV" FOR i=1 TO n x(i,5)=x(i,4)+(р/100)*(x(i,1)+x(i,2)+x(i,3)+x(i,4))/4 PRINT USING "#######"; i,x(i,1),x(i,2),x(i,3),x(i,4),x(i,5) s=s+x(i,5) NEXT ? "Сумма вкладов =" s, "Средний вклад =" s/n | Программа к задаче 6.3 INPUT n DIM x(n) 'формирование исходного вектора FOR i = 1 TO n: x(i) = i: NEXT FOR i = 1 TO n - 1 FOR j = i + 1 TO n 'при x(i)<x(j), числа меняются местами IF x(i)<x(j) THEN SWAP x(j), x(i) NEXT j NEXT i 'вывод результатов FOR i = 1 TO n: PRINT x(i): NEXT |
Задача 6.3. Сортировка чисел в массиве.Пусть имеется вектор чисел X длиной N. Напечатать массив в порядке убывания значений его элементов. Алгоритм реализуется при помощи двух вложенных циклов. В наружном цикле последовательно перебираются числа X(i) в массиве и во вложенном цикле сравниваются со всеми оставшимися числами справа от данного X(j). Если выясняется, что какое-то из X(i) меньше сравниваемого, они меняются местами – большее число становится на место меньшего. В программе для упрощения в качестве элементов массива взяты их номера i. Если вектор имеет длину четыре (X(4)), то будет выполнена следующая последовательность перестановок чисел массива: 1,2,3,4; 2,1,3,4; 3,1,2,4; 4,1,2,3; 4,3,2,1.
@ Задачи для самостоятельного решения.
1). Напечатать число из массива X(N), предшествующее минимальному. Sub primer()
n = Val(InputBox("vvedite n"))
Dim a(5) As Integer
For i = 1 To n
a(i) = Val(InputBox("vvedite a(i)"))
Next
m = a(1): k = 1
For i = 1 To n
If m > a(i) Then m = a(i - 1): k = i - 1
Next
MsgBox (m)
MsgBox (k)
End Sub
2). Переместить элементы массива X в массив Y таким образом, чтобы в нем сначала оказалась вторая половина исходного массива X, а затем первая.
3). В массиве X(N) N произвольных чисел (N нечетное). Напечатать эти числа, начиная с центрального, затем число, стоящее рядом слева, затем справа и т.д. до достижения границ массива.
4). Имеются (рис. 6.3) массивы X(N) и Y(N) с координатами X, Y точек на плоскости в порядке их обхода. Определить (с помощью теоремы Пифагора) периметр замкнутой фигуры, с вершинами в этих координатах.
5). Построить вложенный цикл для печати таблицы умножения (как на обложке ученической тетради).
7. обРАБОТКА Символьных данных
Все символы в ПК имеют уникальные коды, значения которых закреплены в ASCII-таблице. С ней можно ознакомиться в любом справочнике. В Бейсике имеются несколько функций и операторов обработки символьных данных.
üLTRIM$(строка) –удаляет начальные пробелы в символьном выражении.
üRTRIM$(строка) –удаляет конечные пробелы в символьном выражении.
üSPACE$(числовое_выражение) –возвращает строку пробелов длиной N символов (N в пределах 0-32767).
üINSTR([начальная_позиция],строка1, строка2) –возвращает позицию первого вхождения строки2 в строку1, начиная с начальной позиции. Если начальная позиция не задана, отсчет производится с начала.