Настоящее занятие - продолжение предыдущего: углубление, закрепление и контроль умений. На занятии студенты лишь познакомятся с понятием вложенных циклов, а их широкое применение будет осуществляться в теме “Массивы”. Наряду с коллективным составлением программ, Вам предстоит самостоятельно разрабатывать программы с целью индивидуализации процесса обучения. Вам будут предлагаться задачи разной сложности, выбирайте, которые адекватны Вашим знаниям и способностям.
1.Рассмотрим популярную задачу – нахождение целочисленных решений уравнения ax + by + с = 0, т.н. Диафантово уравнение. Это наиболее простой, но яркий пример организации вложенных циклов.
…………………Программа 11.1…………………………………….
INPUT”Введите коэффициенты уравнения a,b,c”;a,b,c
INPUT”Введите отрезок для х: x1,x2”;x1,x2
INPUT”Введите отрезок для y: y1,y2”;y1,y2
FOR x = x1 TO x2
FOR y = y1 TO y2
IF a * x + b * y + c = 0 THEN PRINT x, y
NEXT y, x:’Обратите внимание на порядок закрытия вложенных циклов
2.Одной из популярных задач целочисленной арифметики является задача суммирования цифр натурального числа. На предыдущем занятии мы рассматривали несколько вариантов решения такой задачи. Продолжим повышать свои умения в организации циклических программ на других вариантах. Вот один из многих вариантов такой программы. Здесь два цикла: первый организован по условию и подсчитывает количество цифр числа, второй – по параметру i, выделяет эти цифры и суммирует их. К этой задаче еще вернемся при изучении символьных переменных
…………………Программа 11.2…………………………………….
INPUT "Введите число ", x
PRINT "Цифры заданного числа:"
k = 0
10 k = k + 1
m = INT(x / 10 ^ k): IF m > 0 THEN 10
‘***Вначале пересчитали цифры и сохранили в переменной k
FOR i = 1 TO k: a = x MOD 10: s = s + a: x = INT(x - a) / 10: PRINT a; : NEXT: PRINT
'****Затем их просуммировали
PRINT "Количество цифр "; k
PRINT "Сумма цифр "; s
Еще варианты решения задачи.
С использованием блока DO…LOOP:
s = 0: k = 0
LOCATE 2, 20: INPUT "Введите натуральное число"; n
DO WHILE n > 0
k = k + 1
p = n - (n \ 10) * 10
s = s + p
PRINT TAB(20); p;
n = n \ 10
LOOP
PRINT TAB(10); "Количество цифр равно "; k
PRINT TAB(10); "Сумма цифр равна "; s
И с использованием блока IF…THEN
10 IF n / 10 > 0 THEN
k = k + 1
p = n - (n \ 10) * 10
s = s + p
PRINT TAB(20); p;
n = n \ 10
GOTO 10
END IF
PRINT TAB(10); "Количество цифр равно "; k
PRINT TAB(10); "Сумма цифр равна "; s
Математика позволяет подсчитать количество цифр натурального числа непосредственно, одной формулой. Для тех, кто изучал логарифмы, нет большого труда увидеть, что k = INT(log(x)/log(10)) + 1 и есть количество цифр числа х.
Занимательное продолжение этой программы. Дан автобусный билетик – шестизначное натуральное число, все знают, какие билетики считаются “счастливыми”: сумма первых трех цифр равна сумме последних трех цифр, а если эти суммы равны 13, то билетик “очень счастливый”. Пусть Ваша программа на введенное шестизначное число выдаст одно из сообщений: билет очень счастливый, билет счастливый, билет несчастливый.
3.Очень любят студенты программировать “бегущую строку”. Вот один из многих вариантов.
…………………Программа 11.3…………………………………….
'**********Бегущая строка*************
a$ = "НХК"
10 CLS
FOR i = 1 TO 80
LOCATE 10, i: COLOR 14, 1: PRINT a$
FOR j = 1 TO 10000: NEXT j
LOCATE 10, i: COLOR 1, 1: PRINT a$
NEXT
GOTO 10
На примере этой простой программы вводим понятие “пустого цикла”.
Вы понимаете, что задерживать выполнение программы с помощью пустого цикла – это не самое простейшее решение, в QB существует специальный оператор, задерживающий выполнение программы: SLEEP [секунды], предлагаю освоить его самостоятельно.
Предлагаю так же организовать бегущую строку не только справа налево, но и наоборот, а так же снизу вверх, сверху вниз, написать свое имя “лесенкой” по главной диагонали, по обеим диагоналям и т.д.
4.Мы уже находили наибольшее и наименьшее значения функции одной переменной на отрезке. Поставим задачу отыскать наибольшее и наименьшее значения функции ДВУХ переменных z = f(x;y) на прямоугольнике [x1;x2]; [y1;y2]. Программа может быть такой.
…………………Программа 11.4…………………………………….
SCREEN 9: COLOR 4, 2
DEF fna (x, y) = x ^ 2 + y ^ 2
PRINT TAB(10); : INPUT "Введите отрезок изменения х"; x1, x2
PRINT TAB(10); : INPUT "Введите отрезок изменения у"; y1, y2
max = fna(x1, y1): xmax = x1: ymax = y1
min = fna(x1, y1): xmin = x1: ymin = y1
PRINT TAB(10); : INPUT "Введите шаг поиска по х"; hx
PRINT TAB(10); : INPUT "Введите шаг поиска по y"; hy
FOR x = x1 TO x2 STEP hx
FOR y = y1 TO y2 STEP hy
IF fna(x, y) > max THEN max = fna(x, y): xmax = x: ymax = y
IF fna(x, y) < min THEN min = fna(x, y): xmin = x: ymin = y
NEXT y, x
PRINT TAB(10); : PRINT "Максимальное значение f("; xmax; ";"; ymax; ") = "; max
PRINT TAB(10); : PRINT "Минимальное значение f("; xmin; ";"; ymin; ") = "; min
5.Рассмотрим популярную задачу на вложенные циклы. Найти пары чисел, являющихся координатами точек, которые лежат на окружности x2 + y2 = 169
…………………Программа 11.4…………………………………….
PRINT TAB(9); : INPUT "Интервал по х"; x1, x2
PRINT TAB(9); : INPUT "Интервал по у"; y1, y2
FOR x = x1 TO x2: FOR y = y1 TO y2
IF x ^ 2 + y ^ 2 = 169 THEN PRINT TAB(10); x, y
NEXT y, x
5.Обобщим эту интересную задачу. Пусть дано уравнение с двумя переменными f(x;y) = 0. Найти его целочисленные решения или выдать сообщение, что таковых на указанных пользователем промежутках нет.
…………………Программа 11.5…………………………………….
DEF fna (x, y) = x ^ 2 + x * y + 5 * x + 7 * y – 30:’левая часть уравнения
K=0:’***обнуляем признак
PRINT TAB(15); : INPUT "Введите x1,x2"; x1, x2
PRINT TAB(15); : INPUT "Введите y1,y2"; y1, y2
FOR x = x1 TO x2
FOR y = y1 TO y2
IF fna(x, y) = 0 THEN PRINT TAB(15); x, y: k = k+1
NEXT y
NEXT x
IF k>0 THEN ?”На указанном прямоугольнике решений нет”
6. Стенные часы отбивают удар каждые полчаса и количество часов от 1 до 12. Составить программу подсчета количества ударов за сутки.
…………………Программа 11.6…………………………………….
s = 0
FOR i = 1 TO 12: s = s + i: NEXT i
PRINT "Ударов за сутки "; 2 * s + 24
7.Объем жидкости в резервуаре, имеющего форму шара вычисляется по формуле:
, где d – внутренний диаметр шара, h – высота налива жидкости. Напечатайте калибровочную таблицу, отражающую зависимость объема от высоты налива.
…………………Программа 11.6……………………………………
INPUT "Внутренний диаметр резервуара в метрах"; d: d = d * 100
INPUT "Шаг таблицы в сантиметрах"; hg
PRINT "Высота объем"
PRINT "налива в см жидкости в л."
FOR h = 0 TO d STEP hg
v = pi * h ^ 2 * (3 * d - 2 * h) / 6
PRINT INT(h), INT(v / 1000)
NEXT h
7.На отрезке [a;b] задана непрерывная функция y = f(x). “Проходя” этот отрезок с достаточно малым шагом h, найдите приближенно длину дуги кривой y = f(x).
…………………Программа 11.7……………………………………
DEF fna (x) = SIN(x)
PRINT TAB(10); : INPUT "Введите отрезок a,b"; a, b
s = 0: h = .001
FOR x = a TO b - h STEP h
dy = fna(x + h) - fna(x)
m = SQR(h ^ 2 + dy ^ 2)
s = s + m
NEXT x
PRINT TAB(10); "Длина дуги равна"; s
Следующие задачи попробуйте спрограммировать самостоятельно, конструируя циклы с помощью FOR…NEXT.
1.Имитировать 10-кратное бросание двух игральных костей. Какую сумму Вы набрали?
2.Монету подбросили 100 раз. Подсчитайте количество выпавших “орлов”.
3.Проверьте функцию RND “на случайность”. Сгенерируйте 100 чисел из интервала (-1; 1) и подсчитайте количество положительных и отрицательных. Их оказалось поровну?
4.Найти суммы по заданному n.
5.Как Вы знаете из курса физики, энергия движущего тела вычисляется по формуле:. Вычислить суммарную энергию тела, если скорость v изменяется от v1 до v2 с шагом hv, а масса m изменяется от m1 до m2 с шагом hm.
Какие умения и навыки Вы приобрели на занятии №11?