к оглавлению

Вложенные циклы. Составление и отладка более сложных циклических программ

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

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

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?

к оглавлению

Знаете ли Вы, что абстракция - это процесс изменения уровня детализации программы. Когда мы абстрагируемся от проблемы, мы предполагаем игнорирование ряда подробностей с тем, чтобы свести задачу к более простой.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution