Контрольная работа. Образцы выполнения заданий. Алгоритмизация и программирование (на qbasic). Введение
Вид материала | Контрольная работа |
- Контрольная работа по информатике и икт для 10класса. Тема «Алгоритмизация и программирование», 12.22kb.
- Методические указания домашняя контрольная работа №1 по дисциплине «Налогообложение, 681.22kb.
- Контрольная работа и ее краткая характеристика дкр, 446.71kb.
- Рабочая программа по дисциплине "алгоритмизация и программирование" для специальности, 136.39kb.
- Рабочая программа по дисциплине "алгоритмизация и программирование" для специальности, 136.78kb.
- Учебно-методический комплекс по дисциплине «Алгоритмизация и программирование» для, 352.01kb.
- Лабораторная работа, 166.92kb.
- Рабочая программа по дисциплине "алгоритмизация и программирование" для специальности, 140.41kb.
- Контрольная работа оценка выполнения контрольных заданий, задач и тестов; при пропуске, 10.19kb.
- Задания по выполнению контрольных работ по курсу, 79.13kb.
1 2
SELECT CASE a
CASE 1: PRINT b$; "очень плохо"
CASE 2: PRINT b$; "плохо"
CASE 3: PRINT b$; "удовлетворительно"
CASE 4: PRINT b$; "хорошо"
CASE 5: PRINT b$; "отлично"
CASE ELSE: PRINT "Такой оценки нет"
END SELECT
END
На рисунке показана блок-схема алгоритма.
Рис.14. Блок-схема алгоритма с многоальтернативным выбором
Пример 7.
Даны длины сторон треугольника, определить вид треугольника и его площадь. Выполнить контроль вводимых чисел. Составить блок-схему и программу.
Решение
Вид треугольника определим, сравнивая стороны, а площадь вычислим по формуле Герона. Задание «выполнить контроль вводимых чисел» означает, что программа в случае ввода чисел, которые не могут быть сторонами треугольника, должна выдавать сообщение об ошибках данных.
Три числа нельзя рассматривать как стороны треугольника, если хотя бы одно из них меньше или равно 0, или сумма двух любых чисел больше третьего ( Должно быть: а+b≤c )
На рис. 15 представлена схема алгоритма данной программы.
Рис.15. Блок-схема алгоритма программы определения вида треугольника
А вот её программа на языке Паскаль:
Таблица-результат к примеру 7
Составьте теперь программу на языке QBASICк примеру 7.
Пример 8. Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке.
Предоставим пользователю возможность выбрать функцию через простейшую имитацию меню, в котором каждой функции соответствует некоторое число (код):
В зависимости от значения введенного кода выбирается одна из функций. На рис. 16.представлена схема алгоритма программы.
Ниже представлена программа, реализующая разработанный алгоритм.
Рис.16.Блок-схема к примеру 8: вычисление значений функции согласно меню.
Самостоятельно:
Составьте программу к примеру 8 на языке QBASIC.
2.3.6.Процедуры-функции и процедуры.
Процедурой называется часть программы, реализующая вспомогательный алгоритм и допускающая многократное обращение к ней из различных мест основной программы.
Процедуры
Оператор SUB…END SUB выделяет начало и конец процедуры.
Синтаксис: SUB имя [ (список) ] [STATIC]
[ операторы ]
[EXIT SUB]
[ операторы ]
END SUB
Параметры:
имя – глобальное имя процедуры, ограниченное длиной в 40 символов
список – список, разделённых запятыми имён переменных, передаваемых процедуре при её вызове.
В операторе предусмотрен альтернативный выход с помощью EXIT SUB.
Процедура-функция FUNCTION…END FUNCTION
Синтаксис: FUNCTION имя [список ][STATIC]
[операторы]
имя = выражение
[операторы]
END FUNCTION
Параметры:
- имя объявляет имя функции
- список – это список разделённых запятой аргументов – формальных параметров, которым из основной программы передаются и присваиваются значения аргументов – фактических параметров
- атрибут STATIC указывает, что переменные являются локальными в функции и сохраняются между её вызовами.
- Запись имя = выражение возвращает значение функции, присвоенное её имени
В отличие от процедуры-функции FUNCTION имя процедуры SUB не может быть использовано в выражениях. Процедуры могут быть рекурсивными, т.е. могут вызывать сами себя. Вызов процедуры SUB…END SUB выполняется оператором CALL.
Синтаксис 1: CALL имя процедуры [(список аргументов)]
Синтаксис 2: имя процедуры [список аргументов]
..
2.4.Вспомогательные алгоритмы и процедуры.
….
----*----*--*---
ЦИКЛЫ
Для реализации циклических процессов используют операторы циклов.
В теории программирования выделяют несколько основных видов циклов:
• цикл-пока (рис. 17, а);
• цикл-до (рис. 17, б);
• счетный цикл (рис. 17, в).
Цикл-пока. Синтаксическая диаграмма оператора «цикл-пока» приведена на рис. 18. Условие представляет собой логическое выражение. Оператор тела цикла повторяется, пока условие истинно, условие проверяется на входе. Если при входе в цикл условие не выполняется, то оператор тела цикла игнорируется.
Если в тело цикла необходимо поместить несколько операторов, то используют составной оператор.
Цикл-до. Операторы тела цикла повторяются до выполнения условия, условие проверяется на выходе, т.е. тело цикла всегда выполняется хотя бы один раз. Синтаксическая диаграмма оператора «цикл-до» приведена на рис. 19. В тело цикла можно поместить несколько операторов, разделив их точкой с запятой «;».
Рис. 17. Структура циклов:а - цикл-пока, б - цикл-до и в — счетный цикл
Рис. 18. Синтаксическая диаграмма <Цикл-пока>
Рис. 19. Синтаксическая диаграмма <Цикл-до>
Рис. 20. Синтаксическая диаграмма <Цикл с заданным количеством повторений>
Счетный цикл. Цикл выполняется, пока переменная (параметр) цикла принимает значения в заданном диапазоне с определенным шагом. Синтаксическая диаграмма оператора приведена на рис.20.
Переменная цикла должна иметь порядковый тип. Выражение 1 определяет начальное значение параметра цикла, выражение 2 - конечное значение параметра цикла. Соответственно начальное и конечное значения должны принадлежать к тому же типу, что и параметр цикла. Если используется служебное слово to, то при каждом выполнении цикла переменной цикла присваивается следующее значение порядкового типа переменной
Пример 9. Разработать программу вычисления суммы n первых
натуральных чисел.
Сумма определяется методом накопления. Количество суммируемых чисел известно, поэтому используем цикл с заданным количеством повторений. При каждом проходе к сумме будем добавлять переменную цикла, которая будет изменяться от 1 до n. Перед циклом переменную суммы необходимо
обнулить.
На рис. 21представлен алгоритм программы. Анализ алгоритма показывает, что он неструктурный, так как в нем присутствует цикл суммирования, который не является ни циклом-пока, ни циклом-до, ни циклом с заданным количеством повторений. Для реализации данного алгоритма необходимо его преобразовать в структурный, чтобы можно было использовать один из имеющихся операторов цикла.
INPUT n
S=0
FOR I=1 TO n
S=S+I
NEXT I
PRINT”Сумма “;n;”чисел равна”;S
Пример 10. Разработать программу, определяющую сумму ряда
с заданной точностью ε (епсилон).
Из соответствующих разделов математики известно, что суммой ряда называется предел, к которому стремится последовательность частичных сумм .данного ряда, если он существует. Если такой предел существует, то ряд называется сходящимся, в противном случае -расходящимся. Также известно, что знакопеременный ряд сходится, если
где- соответственно n-й и n+1-й члены ряда.
Кроме того, доказано, что
где S - сумма ряда, а {- сумма n членов ряда.
Следовательно, для получения требуемого результата будем накапливать частичную сумму элементов ряда, пока очередной член ряда не станет меньше заданной погрешности:
Поскольку количество повторений цикла определить нельзя, попробуем преобразовать неструктурный цикл к циклу-пока. Для этого необходимо операцию S=S+R продублировать: одну копию поместить до цикла, а вторую - в конце цикла. Операторы S=0 и S=S+R, записанные до цикла, заменим оператором S=l, так как в этот момент R=l. Условие выхода из цикла также необходимо заменить на противоположное. Окончательный вариант фрагмента алгоритма с циклом-пока показан на рис. 23,
Его реализация представлена ниже:
Рис. 22. Алгоритм определения суммы ряда с заданной точностью
Рис. 23. Структурные варианты алгоритма:
а - с использованием цикла-пока и б - с использованием цикла-до
Тот же алгоритм можно преобразовать так, чтобы цикл можно было реализовать с использованием цикла-до (рис. 23,6). Ниже представлена соответствующая программа.
Оператор цикла DO LOOP [{WHILE | UNTIL}].
Этот оператор называется циклом с постусловием, т. к. проверка условия осуществляется после каждого выполнения тела цикла.
DO
<операторы>
LOOP [{WHILE | UNTIL} условие]
Цикл выполняется до тех пор, пока условие не станет истинным. Например, проверка на то, чтобы задать длину последовательности, осуществляется следующим образом:
DO
PRINT "ВВЕДИТЕ ДЛИНУ ПОСЛЕДОВАТЕЛЬНОСТИ N - "
INPUT N%
LOOP UNTIL N%>0
Цикл выполняется до тех пор, пока пользователь не введет положительное число.
При использовании UNTIL цикл выполняется до тех пор, пока не выполнится условие, а при использовании WHILE цикл выполняется только при выполнении условия и заканчивается, если условие нарушается.
Операторы цикла DO WHILE/UNTIL LOOP и WHILE WEND.
Эти циклы называются циклами с предусловием, т. к. проверка проводится до начала очередной итерации:
DO [{WHILE | UNTIL} condition]
<тело цикла>
LOOP
или
WHILE <условие>
<тело цикла>
WEND
Цикл WHILE выполняется, пока условие истинно. Как только условие нарушается, выполнение цикла завершается. Если используется UNTIL, то выполнение происходит до тех пор, пока условие не станет истинным.
Например, та же проверка вводимой длины последовательности может быть задана как
INPUT N%
WHILE N%<=0
PRINT "ВВЕДИТЕ ДЛИНУ ПОСЛЕДОВАТЕЛЬНОСТИ N= "
INPUT N%
WEND
Замечание.До первого входа в цикл переменной N% уже должно быть присвоено какое-либо значение.
Процедурные блоки SUB и FUNCTION.
В QBASIC можно объявлять и использовать подпрограммы.
При вызове подпрограммы (функции или процедуры) выполнение основной программы приостанавливается и управление передается в подпрограмму По окончании работы подпрограммы управление возвращается основной программе.
Основное, не формальное, различие между процедурой и функцией состоит что процедура только выполняет какую-либо законченную последовательность действий , не возвращая результата работы в основную программу, а функция и выполняет действия, и возвращает результат.
Например, вызов функции М = MIN (X, Y) вернет в основную программу значение наименьшего из двух чисел, и это значение будет присвоено переменной М.
Функция может быть объявлена так:
FUNCTION имя функции [(список параметров)] [STATIC]
<операторы>
имя функции = выражение
<операторы>
END FUNCTION
где ИМЯ функции - имя функции и тип данных, которые она возвращает (%,&, !,#, or $);
список параметров - список переменных, с помощью которых вызывается с указанием типов в этих переменных:
переменная [( )] [AS тип ] [,переменная[( )] [AS тип]]...
Тип (INTEGER, LONG, SINGLE, DOUBLE, STRING и т. д.).
STATIC - объявляет, что локальные переменные данной функции сохраняются между вызовами самой функции.
Можно объявлять функции и по-другому.
Главное, чтобы вызовы функции в программе следовали после её объявления.
DEF FN имя функции [(список параметров)]
<операторы>
FN имя функции = выражение
<операторы>
[EXIT DEF]
<операторы>
END DEF
Считается, что второй способ объявления функций более традиционен.
Процедура объявляется следующим образом:
SUB имя подпрограммы [(список параметров)][STATIC]
<операторы>
END SUB
***
ПОДПРОГРАММЫ
CLS
RANDOMIZE TIMER
S1 = 0: S2 = 0
PRINT “K11"; “K12", “S1“; SPC(20); “K21"; “K22", “S2"
1 :
S=S1: GOSUB 2 : S1 = S
S=S2: GOSUB 2 : S2 = S
IF (S1 < 101) AND (S2 < 101) THEN GOTO 1
IF S1 > S2 THEN PRINT "Выиграл первый игрок“ : END
IF S1 < S2 THEN PRINT "Выиграл второй игрок“ ELSE PRINT "Ничья"
END
2:
K1 = INT(RND(1) * 6) + 1
K2 = INT(RND(1) * 6) + 1
S = S + K1 + K2
PRINT K1; K2, S; SPC(20);
RETURN
***
ЗАДАЧИ С РЕШЕНИЯМИ К
КОМПЬЮТЕРНОМУ ПРАКТИКУМУ
1. Ввести три целых числа.
INPUT А, В, С
Числа вводятся с клавиатуры через запятую, а затем нажимается клавиша
687,32345,-985
2. Для вывода данных на экран дисплея применяется оператор PRINT. При использовании этого оператора можно употреблять в качестве разделителей запятую или точку с запятой:
PRINT А, В; С;
Точка с запятой в конце списка выражений отменяет символы "возврат каретки" и "перевод строки". Использование запятой приводит к так называемому "зонному" выводу данных, где под "зоной" понимается расстояние в 14 символов (колонок). При использовании точки с запятой в качестве разделителя данные выводятся последовательно, друг за другом.
Например, для того чтобы вывести на экран 3 символа, нужно написать так:
PRINT "A”,”B”,”'C"
тогда на экране появится :
A B C
Если вы вводите
PRINT "A";'rB";"C"
то на экране появится :
ABC
Самостоятельные задания
1. Написать программу, которая позволяет вычислить банковский процент на вклады из расчета 12 % годовых..
-------------
3. Задача Даны натуральные числа M u N. Определить их наибольший общий делитель NOD.
Для решения этой задачи можно использовать несколько алгоритмов. Например, самый простой из них состоит в порождении с помощью цикла натуральных чисел, которые являются делителями одновременно М и N. Самый большой из этих делителей и является, по определению, NOD.
REM НОД
INPUT "N = "; N
INPUT " M >= N, M = "; M
WHILE M < N OR N <=0 OR M <=0
INPUT "N = "; N
INPUT " M >= N, M = "; M
WEND
NOD=1
FOR I = 2 TO N
IF (N / I = N \ I) AND (M / I = M \ I) THEN NOD = I
NEXT I
PRINT " MOD ("; N; ", "; M; ") ="; NOD
N = ?12 M>=N,M = ?15 MOD(12,15) =3 N = ?13 M>=N,M = ?59 MOD(13,59) =1 |
Результат
Для решения задачи:
• вводим натуральные числа М и N;
• в цикле от двух до наименьшего числа N порождаем число I и проверяем, является ли оно одновременно делителем М и N;
• запоминаем этот делитель в переменной NOD;
• выводим результат.
Переменные:
M,N- исследуемые числа;
I- переменная цикла;
NOD- наибольший общий делитель.
Это задача может быть решена с помощью алгоритма Евклида.
REM
INPUT M,N
R0=M:R=N
R1= R MOD R0
IF R1=0 THEN NOD = R
PRINT R1,R, R0
WHILE R1>0
R0=R
R=R1
R1=R MOD R0
PRINT R1, R, R0
WEND
PRINT”NOD(“;M;”,”;N;”N;”)=”;R
? 17,12 5 12 17 2 5 12 1 2 5 0 1 2 NOD(17, 12)= 1 ? 9,6 3 6 9 0 3 6 NOD(9, 6) =3 |
4.Даны натуральные числа M u N. Определить их наименьшее общее кратное NOК.
REM NOK
INPUT "N = "; N
INPUT " M >= N, M =”;M
WHILE M < N
INPUT "N = "; N
INPUT " M >= N, M =”;M
WEND
NOD= 1
FOR I = 2 TO N
IF (N / I = N \ I) AND (M/I=M \ I) THEN NOD = I
NEXT I
NOK = NOD * (N \ MOD)*(M \ NOD)
PRINT ”NOK (”;”N”,”;”M;”)=”;NOK
Для решения задачи
• вводим натуральные числа М и N;
• в цикле от двух до меньшего числа N порождаем число I и проверяем, является ли оно одновременно делителем М и N;
• запоминаем этот делитель в переменной NOD;
• учитывая, что NOK= NOD* (N\NOD) * (M\NOD), выводим результат.
Переменные:
Ми N-исследуемые числа
I-переменная
NOD – наибольший общий делитель;
NOK – наименьшее общее кратное.
5.
Составить программу, которая выводила бы на экран сведения об экзаменах и находила бы в ней фамилии студентов, сдавших экзамен на "ОТЛИЧНО".
Решение
Дано: F$(i,l) — фамилия i-го студента;
F$(i,2) — номер билета, доставшегося ему ; F$(i,3) — полученная им оценка
на экзамене ( i= 1, 2, 3, 4).
Требуется: вывести F$(i,J), где i = 1, 2, 3, 4; j = 1, 2, 3; F$(k,l) — фамилия k-го ученика при F$(k,3) = "ОТЛИЧНО".
С
начала разработаем алгоритм будущей программы, блок-схема которого наглядно демонстрирует вложенность циклов по i и по j, характерную для обработки двумерных массивов В таких циклах счетчики шагов — независимо изменяющиеся переменные. Причем переменная, допустим i, управляющая работой внешнего цикла, меняется медленнее, чем переменная J, управляющая работой внутреннего цикла. Алгоритм начинается с команды печати названия столбцов будущей таблицы. Эта команда не содержит имен переменных, значения которых связаны со значениями I или J, и поэтому выполняется однажды, до начала работы циклов с I и J в качестве счетчиков шагов цикла. Далее при каждом закрепляемом значении номера I строки таблицы ( i= 1, 2, 3, 4), изменяя значения номеров столбцов J в границах, указанных постановкой задачи, мы построчно вводим элементы таблицы и тут же выводим их на экран дисплея.
Отметим, что ввод исходных значений и их вывод могут осуществляться раздельно, в двух
последовательных, никак не связанных, но также
вложенных циклах. Для этого тела внутренних циклов должны быть различными: в первом из них тело внутреннего цикла будет содержать команду ввода, во втором — команду вывода.
Теперь запишем программу:
'Очистка экрана
CLS
Резервируем в ОЗУ место под объявляемый двумерный массив
DIM F$(l TO 4, 1 TО 3)
'Выводим на экран названия полей ( заголовки трёх столбцов) таблицы
LOCATE 10, 20
COLOR 14
PRINT "ФАМИЛИЯ", "НОМЕР БИЛЕТА", "ОЦЕНКА"
‘Из блока данных считываем символьные данные таблицы по строкам
FOR I = 1 TО 4
FOR J = 1 TО 3
READ F$(I, J)
NEXT J
NEXT I
FOR I = 1 TO 4
LOCATE 10 + I * 2, 20
FOR J = 1 TO 3
COLOR 2
'Отличные оценки выводим красным цветом
IF F$(I, 3) = "ОТЛИЧНО" AND J = 1 THEN COLOR 4
PRINT F$(I, J),
NEXT J
NEXT I
'Хранение исходных данных в блоках данных.
'Данные храним как символьные константы
' Выравнивание текста в таблице осуществляем с помощью пробелов
DATA ИВАНОВ," 1", ХОРОШО, ПЕТРОВ, " 14", ОТЛИЧНО
DATA СИДОРОВ," 22", ОТЛИЧНО , СИДОРОВА," 5",ХОРОШО
END
RUN
ФАМИЛИЯ НОМЕР БИЛЕТА ОЦЕНКА
ИВАНОВ 1 ХОРОШО
ПЕТРОВ 14 ОТЛИЧНО
СИДОРОВ 22 ОТЛИЧНО
СИДОРОВА 5 ХОРОШО
6. Ввод массивов.
Элементами ввода операторов INPUT (READ) могут быть только переменные — неиндексированные (простые) или индексированные (элементы массивов). Поэтому для ввода массивов нужно составить программу, обеспечивающую изменение индексов и последовательное заполнение элементов массивов данными.
Ввод одномерного массива
PRINT *ВВЕДИТЕ" ;N; “ ЭЛЕМЕНТОВ МАССИВА А"
FOR I=l TO N
INPUT A(I)
NEXT I
7. Ввод двумерного массива
При вводе двумерного массива необходимо организовать двойной цикл: внешний — по номеру строки, внутренний — по номеру столбца.
Ввод матрицы по строкам
PRINT "ВВЕДИТЕ МАССИВ В ПО СТРОКАМ”
FOR 1=1 ТО N
PRINT "ВВЕДИТЕ “;I;” –Ю СТРОКУ”
FOR J=l TO М
INPUT B(I,J)
NEXT J
В случае необходимости можно организовать заполнение массива
по столбцам. Для этого внешний цикл должен быть организован по номеру столбца (J), а внутренний — по номеру строки (I) с соответствующими границами изменения индексов.
PRINT "ВВЕДИТЕ МАССИВ В ПО СТОЛБЦАМ”
FOR J=l ТО M.
PRINT “ВВЕДИТЕ";J;”-ЫЙ СТОЛБЕЦ”
FOR I=1 ТО N
INPUT B(I,J)
NEXT I
NEXT J
В соответствии с приведенной программой элементы массива должны набираться на клавиатуре в следующем порядке: В (1,1),В(2,1).....B(N,1), В(1,2), (2,2).....B(N,2).....В(1,М),
В(2,М)..... B(N,M).
Если число вводимых элементов невелико, можно не использовать циклы, а все элементы указать явно в списке ввода.
Например, для ввода массива В размером 2X2 можно использовать операторы
PRINT "ВВЕДИТЕ МАССИВ В П0 СТРОКАМ”
INPUT B(1,l),B(1,2),B(2,1),B(2,2)
8. Пример. Ввод нескольких массивов одного размера можно осуществлять в одном цикле.
PRINT "ВВЕДИТЕ МАССИВЫ АИС”
PRINT "НАБИРАТЬ ЭЛЕНЕНТЫ МАССИВОВ ПООЧЕРЕДНО"
FOR I=1 ТО N
INPUT А(I)_,С(I)
NEXT I
Нажатие клавиши ВК можно осуществлять после набора на клавиатуре двух чисел (значений А(1), С(1)).
Однако такой способ ввода часто является причиной ошибок. Более естественно вводить сначала все элементы одного массива, затем другого. Для этого ввод каждого массива нужно осуществлять в отдельном цикле.
Если вводимые массивы имеют разные размеры, то второй способ является практически единственно возможным.
9. Вывод (печать) массивов.
При выводе массивов необходимо обеспечить наглядность и удобство восприятия полученных результатов.
Вывод одномерного массива, как правило, целесообразно осуществлять в строку, сопровождая поясняющим текстом.
PRINT "МАССИВ А"
FOR 1=1 ТО N
PRINT А(I);
NEXT I
В приведенной программе вывод массива А в строку обеспечивается использованием точки с запятой в операторе PRINT. PRINT без списка (последняя строка ) осуществляет возврат каретки после окончания вывода массива А.
При выводе двух или нескольких одномерных массивов одного размера часто удобно вывести их как расположенные параллельно столбцы
10.
PRINT "МАССИВ А","МАССИВ В”
FOR I=1 ТО N
PRINT А(I)_,B(I)
NEXT I
Вывод двух или более массивов различных размеров, как правило, осуществляется в строку. Вывод нового массива начинается с новой строки.
Двумерные массивы необходимо выводить в привычном виде (по строкам), начиная вывод новой строки массива в новую строку экрана.
11.
PRINT "МАССИВ В “
FOR I=1 ТО N
FOR J=1 TO M
PRINT B(I,J),
NEXT J
NEXT I
Для улучшения наглядности в этом случае можно предложить два способа.
1) В операторе (4 –я строка ) вместо точки с запятой использовать запятую Тогда вывод каждого элемента строки будет осуществляться в новую зону, так что элементы одинаковых столбцов будут располагаться в одинаковых зонах, т. е. строго друг под другом.
2) Вывод всех элементов матрицы по единому формату с использованием оператора PRINT USING (##.##),B(I,J);
12. Суммирование элементов массива.
Для одномерного массива А={ x 1, x2, x3, … x n } размерности п необходимо вычислить S=
S=0
FOR 1=1 ТО N
S=S+A(I)
NEXT I
13.Для двумерного массива В размером NXM необходимо вычислить
S=
REМ ВЫЧИСЛЕНИЕ СУММЫ ЭЛ-ТОВ МАТРИЦЫ
S=0
FOR 1=1 ТО N
FOR J=l TO M
S-S+B(I,J)
NEXT J
NEXT I
14.
REM СУННИРОВАНИЕ МАТРИЦЫ ПО СТРОКАМ
FOR 1=1 ТО N
S=0
FOR J=l TO M
S=S+B(I,J)
NEXT J
D(I)=S
NEXT I
На поиск в массиве элемента с заданными значениями индексов затрачивается время. (Адрес 1-го элемента определяется прибавлением к адресу начала массива значения I.) Поэтому для повышения эффективности в приведенной выше программе при вычислении суммы каждой строки используется простая переменная S, что исключает многократное обращение к элементам массива D.
15.
Транспонирование матрицы. Необходимо заменить строки матрицы её столбцами, а столбцы — строками.
RЕМ ТРАНСПОНИРОВАНИЕ КВАДРАТНОЙ МАТРИЦЫ
FOR I=1 ТО N-1
FOR J=I+1 TO N
Р=А(I,J) : A(I,J)=A(J,I) : A(J,I)=P
NEXT J
NEXT I
16. СУММИРОВАНИЕ ЭЛЕМЕНТОВ МАССИВА, УДОВЛЕТВОРЯЮЩИХ
ЗАДАННОМУ УСЛОВИЮ.
REM СУММИРОВАНИЕ ЭЛЕМЕНТОВ МАССИВА, УДОВЛЕТВОРЯЮЩИХ
ЗАДАННОМУ УСЛОВИЮ.
S=o
FOR 1=1 ТО N
IF P(I)<=T TO 100
90 S=S+P(I)
100 NEXT I
110RETURN
Список используемых переменных.
Исходные данные: N — размер массива, Р — массив размером N,
Т — заданное значение, с которым сравниваются элементы массива Р.
Результат: S — сумма элементов массива Р, удовлетворяющих заданному условию.
Вспомогательные переменные: I — индекс — управляющая переменная цикла.
17.
Упорядочение массива. Требуется расположить элементы массива в порядке возрастания (убывания).
Для решения этой задачи существует много различных методов .Здесь рассматривается один из методов, основанный на поиске минимального (максимального) элемента массива или его части.
Вначале найдем минимальный элемент массива и поменяем его местами с первым элементом, затем найдем минимальный элемент из оставшихся элементов (кроме первого) и поменяем его местами со вторым элементом. После нахождения минимального из последних двух элементов массива и размещения его на. предпоследнем месте на последнем автоматически останется самый большой элемент .
Список используемых переменных.
Исходные данные: N — размер массива, А — массив размером N.
Результат: А — массив размером N, упорядоченный по возрастанию.
Вспомогательные переменные: Р — переменная для хранения промежуточного значения минимального элемента, К — индекс минимального элемента, I — индекс элемента упорядоченного массива — управляющая переменная внешнего цикла, J — индекс элемента части массива, в которой ищется минимальный элемент — управляющая переменная внутреннего цикла.
При перестановке элементов (минимального и 1-го (строка 1070)) вспомогательная переменная не требуется, так как значение минимального элемента находится в переменной Р.
Проверка массива на упорядоченность. Для заданного массива А размером п требуется определить, является ли массив упорядоченным. Результат присвоить символьной переменной.
Для определенности предположим, что проверяется упорядоченность массива по возрастанию. Если массив упорядочен, то для каждой пары соседних элементов должно выполняться условие aii-1 i=1, . . ., п— 1.
Если ни для какого i условие не было нарушено, то массив упорядочен. Если для какого-либо i условие нарушается, массив не является упорядоченным
Список используемых переменных. Исходные данные: N — размер массива, А — массив размером N,
For i=1 to N-1
P=A(I):K=1
FOR J=1+1 TO N
IF A(J)>=P THEN 1060
1050 P=A(J):K=J
1060 NEXT J
A(K)= A(I): A(I)=P
NEXT I
RETURN
18.
Сортировка методом «без возврата в начало» ,то есть «простым обменом» или «метод пузырька».
Повысить быстродействие алгоритма можно, просматривая каждый раз массив до конца.
При просмотре сравнивать пары рядом стоящих элементов массива и при необходимости менять их местами. В худшем случае, при сортировке по возрастанию наименьший по величине элемент может стоять в конце массива. Чтобы переместить его на место первого элемента, требуется n-1 просмотр (n — размер массива). В других случаях сортировку можно заканчивать, если при очередном просмотре массива не было смены мест элементов. Алгоритм использует вложенные циклы. Параметр внешнего цикла — счетчик просмотров (шагов). Параметр внутреннего цикла — номера сравниваемых при просмотре элементов массива.
Возьмем массив: [6, 3, 8, 1, 4]. Каждый шаг работы алгоритма — это просмотр массива с начала до конца, сравнение пар рядом стоящих элементов и смена мест элементов, не удовлетворяющих условию сортировки (если первый элемент пары по величине больше второго элемента).
Исходный массив: 6, 3, 8, 1, 4:
-
Исходный массив:
6
3
8
1
4
после первого шага:
6
1
4
8
после второго шага:
1
4
6
8
после третьего шага:
3
4
6
8
после четвертого шага:
1
3
4
6
8
после пятого шага:
1
3
4
6
8
В первом шаге происходит последовательно смена мест элементов, равных 6 и 3, затем 8 и 1, затем 8 и 4. Во втором шаге меняются местами числа 6 и 1, 6 и 4. После третьего шага получаем упорядоченный массив. Можно заканчивать сортировку. Но алгоритм продолжает работать, если не вставить в него проверку окончания работы по отсутствию смены мест элементов. В следующей программе 1 такой проверки нет. В программе используется оператор SWAP.
SWAP — оператор
Обменивает величины двух переменных.
Синтаксис: SWAP переменная 1, переменная 2
Программа 18
REM ‘сортировка методом пузырька
CLS:RANDOMIZE TIMER
INPUT “РАЗМЕРНОСТЬ МАССИВА РАВНА”,N
DIM A(N)
PRINT ‘‘Исходный массив‘‘
FOR I=1 TO N
A(I)=INT(RND*100): PRINT A(I);
NEXT:PRINT
FOR I=1 TO N ‘ внешний цикл-счётчик шагов’
FOR J=1 TO N-1 ‘ внутренний цикл-счётчик номеров’
IF A(J)>A(J+1) THEN SWEP A(I),A(J+1)
NEXT J
NEXT I
PRINT”Упорядоченный массив: “
FOR I=1 TO N:PRINT A(I);:NEXT I
END
Двумерный массив преобразовать в одномерный, выполнить сортировку по возрастанию и упорядоченный одномерный массив преобразовать в двумерный. Все четыре массива вывести на экран.
Решение
В программе объявляются два массива — двумерный и одномерный. Затем двумерный массив заполняется случайными числами и распечатывается. После этого двумерный массив преобразуется в одномерный, который в процессе преобразования распечатывается. Далее одномерный массив сортируется по возрастанию и распечатывается. Завершает программу преобразование упорядоченного одномерного массива в двумерный и распечатка двумерного массива.
Программа 19
DIM a(n, m), b(n* m)
FOR i = 1 TO n: FOR j = 1 TO m
a(i, j) = INT(RND * 10): PRINT a(i, j);
NEXT j: PRINT : NEXT i: PRINT
FOR i = 1 TO n: FOR j = 1 TO m
b(i- 1)*m + j) = a(i, j): PRINT b((i- !)*r
NEXT j, i: PRINT FOR i = 1 TO n* m - 1: FOR j = i + 1 TO n * m
IF b(i ) > b( j) THEN SWAP b( i) , b(j)
NEXT j: NEXT i: PRINT
FOR i = 1 TO n * m
PRINT b(i );
NEXT: PRINT : PRINT
FOR i = 1 TO n: FOR j = 1 TO m
a(i, j) = b(i-1)*m + j): PRINT a(i, j);
NEXT j: PRINT : NEXT i :END
Пусть задан исходный двухмерный массив а( 2, 3).
Запишем результаты требуемых в задаче его преобразований:
1) 2,0,7 2)2,0,7,1,6,4 3)0,1,2,4,6,7 4)0, 1, 2
1, 6, 4 4, 6, 7
Выпишем фрагмент программы:
FOR i = 1 ТО n: FOR j = 1 ТО m
b((i - 1) * m + j) = a(i, j): PRINT b((i - 1) * m + j);
NEXT j, i: PRINT
Первый оператор тела цикла — оператор присваивания. Он последовательно присваивает элементам одномерного массива b(n*m) значения соответствующих элементов исходного двухмерного массива.
Развернем работу выделенного фрагмента по циклам преобразования выбранного массива a(n, m) = а(2, 3).
b((j-1)*m+j)=a(i,j)
i=1 j=1 b(1)=a(1,1) b(1)=2
i=1 j=2 b(2)=a(1,2) b(2)=0
…………………………..
REM ‘Сортировка двумерного массива’
CLS
RANDOMIZE TIMER
INPUT”n,m”;n,m
DIM z(m, n)
FOR i = I TO m: FOR i = 1 TO n
z(i, j) = INT(RND * 10): PRINT z(i, j);
NEXT j: PRINT
NEXT i
max => -109
FOR i= 1 TO m
min =-109: s = 0
FOR j = 1 TO n
s = s + z(i, j)
IF z(i, j) < min THEN min = z(i, j): p = j
NEXT j
IF s > max THEN max = s: r = i: t = min: w = p
NEXT i
PRINT "Smax = "; max; "Nmax = "; r; "Zmin = "; t; "Nmin =”;w
END
20. Задача коммивояжера
Дано множество из N (N < 11) городов, между которыми проложены дороги, длина которых известна. В каком порядке должен посетить их все коммивояжер, чтобы путь его был минимальным? Маршрут начинается в городе L. На каждом шаге коммивояжер выбирает тот город, расстояние до которого минимально.
Алгоритм, описанный в данной задаче, называется "жадным", т. к. на каждом шаге приходится выбирать экстремальное значение.
Решение
Для решения этой задачи нам надо задать матрицу расстояний
METR(N, N), где каждый элемент, находящийся на I-й строке и в J-м столбце, соответствует расстоянию между городами I и J. Очевидно, что матрица расстояний симметрична относительно главной диагонали и сами элементы главной диагонали равны нулю.
Для того чтобы отделять города , в которых уже был коммивояжер от городов, которые он еще не посетил, нам понадобится вспомогательный массив В. В этот массив последовательно будем заносить города, которые коммивояжер уже посетил. Находясь в городе X и пытаясь определить следующий город У, до которого расстояние минимально, города из массива В рассматривать не нужно.
Выбрав город У, мы заносим его в массив В.
REM ‘Задача коммивояжера’
INPUT "ВВЕДИТЕ РАЗМЕР МАТРИЦЫ N = “;N%
DIM METR (N%, N%), B(N%)
REM формируем матрицу расстояний
K= 1
FOR I = 1 ТО N%
FOR J = I TO N%
IF I <> J THEN METR (I, J) = К + RND (K) ELSE METR (I, J) = 0
METR (J, I) = METR (I, J)
K = K+ 1
NEXT J
NEXT i
REM ‘выводим на экран матрицу расстояний’
FOR i = 1 ТО N
FOR J = 1 TO N
PRINT METR ( i , J),
NEXT J
NEXT i
REM ‘вводим город - начало маршрута’
INPUT "ВВЕДИТЕ НОМЕР ГОРОДА, ИЗ КОТОРОГО НАЧИНАЕТСЯ МАРШРУТ ";X
К = 1: В(1) = X: COST = О
FOR I = 1 ТО N - 1
MIN = 100
FOR J = 1 ТО N
REM ‘определяем, посетил ли коммивояжер город J’
F = 0
FOR T = 1 ТО N%
IF J = B(T) THEN F = 1
NEXT T
IF F = 0 AND METR(X, J) <> 0 AND METR(X, J) < MIN THEN
Y = J: MIN = METR(X, J)
ENDIF
NEXT J
REM ‘определяем город для посещения ‘
COST = COST + MIN
В( i + 1) = Y
X = Y
NEXT i
REM ‘выводим цену маршрута и сам маршрут’
PRINT "COST = "; COST
FOR i = 1 TO N%-1
PRINT B( i) ;
NEXT i
Для решения задачи:
• вводим размер матрицы;
• формируем матрицу расстояний METR и выводим ее на экран;
• вводим город X, из которого начинаем движение;
• организуем 3 вложенных цикла, с помощью которых находим минимальный маршрут;
• выводим результат на экран.
Переменные:
В - массив городов, которые посетил коммивояжер;
N % - количество городов;
X - первый город, из которого коммивояжер начинает маршрут;
F, К, X, Y, MIN - вспомогательные переменные;
J, I, T - переменные циклов;
COST - стоимость наименьшего маршрута, т. е. его длина;
METR - матрица расстояний.
Рис. Результат работы программы
21. ВЕДОМОСТЬ СДАЧИ ЭКЗАМЕНОВ
REM’ ВЕДОМОСТЬ‘
REM’ Ввод числа студентов и экзаменов’
20 FOR I=1 то 5
Next I
INPUT ” Введите число студентов-“; M
INPUT ” Введите число экзаменов - “; N
DIM A (M, N), B(M)
REM’ Ввод оценок за экзамены’
FOR I=1 то M
FOR J=1 то N
80 PRINT “ Студент- “; I ; “ экзамен-“; J
INPUT “ Получил оценку “; A (I,J)
IF A (I, J)>=2 AND A (I,J)<=5 Then 100
PRINT “ некорректный ввод оценки ! Повторите!;”
PRINT “ (допустимый диапазон – от 2 до 5)”
GOTO 80
100 NEXT J
NEXT I
REM’ Вывод таблицы оценок на экране’
FOR I=1 то 20
NEXT I
PRINT “ оценки по экзаменам “
FOR I=1 TO M
PRINT “ студент – “; I ; “ “;
FOR J=1 TO N
PRINT A(I,J); “ “;
NEXT J
NEXT I
REM анализ успеваемости
FOR I=1 TO M
B(I) = 0
NEXT I
FOR I=1 TO M
FOR Y =1 TO N
IF A(I,Y) < > 2 THEN G0T0 260
B (I) =2
J=N
260 G0T0 270
270 B (I) = B (I) + A(I,J)
NEXT J
NEXT I
OTL = 0
HOR = 0
NEU=0
FOR I=1 TO M
IF B(I) < > 2 THEN GOTO 360
NEU = NEU+1
GOTO 390
360 FL = B (I) / N
IF FL = 5 THEN OTL = OTL + 1
IF FL <5 AND FL >= 4 THEN HOR = HOR + 1
390 NEXT I
REN « Вывод результатов анализа на экране»
FOR I=1 TO 4
NEXT I
PRINT «В ГРУППЕ СТУДЕНТОВ- »; M ; » ИЗ НИХ:»
PRINT «ОТЛИЧНИКОВ - »; OTL
IF OTL > 0 THEN PRINT OTL ELSE PRINT «НЕТ»
PRINT «ХОРОШИСТОВ - » ; HOR
IF HOR >0 THEN PRINT HOR ELSE PRINT «НЕТ»
PRINT «НЕУСПЕВАЮЩИХ - »; NEU
IF NEU >0 THEN PRINT NEU ELSE PRINT «НЕТ»
END
RUN
ОЦЕНКИ ПО ЭКЗАМЕНАМ
СТУДЕНТ- 1 4 4 4 5
2 3 4 4 4
3 2 5 5 4
…………………….
В ГРУППЕ СТУДЕНТОВ-3, ИЗ НИХ:
ОТЛИЧНИКОВ-0
ХОРОШИСТОВ-3
НЕУСПЕВАЮЩИХ-1
22.
Дан числовой массив, состоящий из известного количества элементов. Найти сумму положительных элементов массива.
Пусть имеем массив А(5,4) из чисел, которые будем вводить с клавиатуры.
В ячейку S будем собирать сумму элементов , для этого организуем цикл.
DIM A(5,4)
S=0
REM’ВВОД ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
INPUT A(I,J)
NEXT J
NEXT I
REM’ПЕЧАТЬ ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
PRINT”ИСХОДНЫЕ ДАННЫЕ”; A(I,J);
NEXT J
NEXT I
REM’СУММИРОВАНИЕ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
IF A(I,J)>0 THEN S=S+ A(I,J)
NEXT J
PRINT “СУММА “;I; “ ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ МАССИВА РАВНА “; “S= “ ;S
NEXT I
RUN
ИСХОДНЫЕ ДАННЫЕ
4 8 7 1
5 9 4 2
6 3 6 7
2 4 7 5
6 3 1 8
СУММА 20 ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ МАССИВА РАВНА S=98
23.
Соревнования по плаванию проводятся отдельно в Европе и в Америке. Результаты 100 лучших спортсменов каждого континента представлены в виде таблиц, содержащая в порядке занятых мест фамилии спортсменов, страны, которые они представляют, и результаты.
Составить список 100 лучших спортсменов мира в порядке, определяемом результатами.
Решение. Результаты по каждому континенту могут быть представлены в виде двух символьных массивов (фамилий стран) и одного числового (результатов) размером 100. Массивы результатов упорядочены по возрастанию.
Задача сводится к объединению двух упорядоченных массивов результатов в один упорядоченный массив. Массивы фамилий и стран также объединяются в соответствии с результатами.
При решении задачи может быть использован алгоритм o6ъединения двух упорядоченных массивов в один, также упорядоченный с некоторой модификацией, связанной с необходимостью объединения не одного, а трех массивов , и получением при объединении только первых M=I00 элементов, так что ситуация, когда один из исходных массивов полностью исчерпан, не возникает и, следовательно, завершение цикла определяется окончанием формирования результирующих массивов.
Список используемых переменных.
Исходные данные:A$, E$— массивы фамилий, размером N;
A1$, Е1$— массивы представляемых стран, размерам N; А2, Е2 — упорядоченные массивы результатов, размером N;
N — размер исходных таблиц, М — размер результирующей таблицы (МN).
Результат:W$, W1$, W2$,- массивы фамилий, стран в результатов лучших спортсменов, размером М.
Вспомогательные переменные:
К — индекс — управляющая переменная цикла, I, J – индексы.
Программа № 1
DIM A$(100), E$(100), А1$(100), Е1$(100)
DIM A2(100), E2(100), W$(100), W1$(100), W2(100)
PRINT "ВВЕДИТЕ РАЗМЕРЫ ТАБЛИЦ ( ИСХОДНОЙ И РЕЗУЛЬТАТОВ)"
INPUT N,M
PRINT "ВВОД РЕЗУЛЬТАТОВ ПЕРВЕНСТВА EBPOПЫ – ФАМИЛИЯ,”;
PRINT "СТРАНА, РЕЗУЛЬТАТ”
FOR I=1 ТО N
INPUT Е$(I), Е1$(I), Е2(I)
NEXT I
PRINT "ВВОД РЕЗУЛЬТАТОВ ПЕРВЕНСТВА АМЕРИКИ – ФАМИЛИЯ,";
PRINT ”СТРАНА, РЕЗУЛЬТАТ”
FOR I=1 ТО N
INPUT А$(I), A1$(I), A2(I)
NEXT I
GOSUB 220
PRINT ТАВ(10); M; “ТАБЛИЦА СПОРТСМЕНОВ МИРА”
FOR I=1 ТО М
PRINT TAB (5);W$(I);TAB(30);W1$(I);TAB(50);W2(I)
NEXT I
210 STOP
220 REM ПОДПРОГРАММА ОБЪЕДИНЕНИЯ ТАБЛИЦ
230 I=1 : J=1 : K=0
240 IF K>M G0TO 290
250 K=K+1
260 IF A2(I)
270 W2(K)=E2(J) : W$(K)=E$(J) : W1$(K)=E1$(J) : J=J+1 : G0TO 240
280 W2(K)=A2(I) : W$(K)=A$(I) : W1$(K)=A1$(I) : I=I+1 : G0TO 240
290 RETURN
Результат:
A$— массив фамилий, упорядоченный по результатам,
R — упорядоченный массив результатов.
Вспомогательные переменные:
Р — переменная для хранения промежуточного значения максимального элемента, К — индекс максимального элемента,
I — индекс элемента упорядоченного массива — управляющая переменная внешнего цикла подпрограммы упорядочения,
J — управляющая переменная внутреннего цикла в подпрограмме упорядочения,
Q$ — переменная, используемая при перестановке фамилий (элементов массива A$).
В программе используется алгоритм упорядочения массива .
После упорядочения место спортсмена определяется индексом соответствующего элемента массива (возможность одинаковых результатов игнорируется).
24. Группа из шести студентов сдала пять экзаменов но пяти различным предметам. Составьте программу, которая бы выводила на экран эти сведения. Кроме этого, программа должна вычислять:
- сколько отличников , хорошистов , троечников; их фамилии;
- количество неуспевающих студентов и их фамилии.
DECLARE SUB Chtenie ( )
DECLARE SUB Obrabotka (RezTest AS INTEGER, ocenka AS INTEGER)
CONST n = 20 'Максимальное число студентов в группе
CONST Baza ="Baza2.bas"
CONST Rez = "Rezyltat.Bas"
TYPE ItogiSesZap
Famil AS STRING * 14
NaborOcenok AS STRING * 9
END TYPE 'ItogiSesZap
DIM SHARED ChisloStyd AS INTEGER 'Фактическое число студентов
DIM SHARED Stydentu(1 TO n) AS ItogiSesZap
DIM SHARED RezTest AS INTEGER
DIM SHARED ocenka AS INTEGER 'Исследуемая 'оценка
'Основная программа
Chtenie
'Прочла данные из файла #1 в массив Stydentu( ) и определила ChisloStyd OPEN Rez FOR OUTPUT AS #2 'Открыли файл #2 для записи
PRINT #2, "Успеваемость группы студентов: "
FOR ocenka = 5 ТО 2 STEP -1
SELECT CASE ocenka
CASE 5
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Отличники: "
CASE 4
PRINT #2. Spase$'Пропуск строки
PRINT #2, "Хорошисты: "
CASE 3
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Троечники: "
CASE 2
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Неуспевающие: "
END SELECT
Obrabotka RezTest. ocenka
IF RezTest = 1 THEN
PRINT #2, "отсутствуют"
END IF
NEXT ocenka
CLOSE #2
END 'Zad_4_3
SUB Chtenie
'Построчно считывает из файла Bazal.Bas в массив записей Stydentu( ) данные 'об успеваемости студентов, подсчитывает их число
ChisloStyd
DIM i AS INTEGER
DIM Stroka AS STRING
OPEN Baza FOR INPUT AS #1
i = 0 'ChisloStyd = 0
WHILE (NOT EOF(D) OR i = n
'Читает из файла #1 в строку Stroka
LINE INPUT #1, Stroka
i = i + 1 'Счетчик числа строк
Stydentu(i).Famil = MID$(Stroka , 1, 14)
Stydentu(i).NaborOcenok = MID$(Stroka , 15, 9)
WEND #1
CLOSE #1
ChisloStyd = i - 1
END SUB 'Chtenie
SUB Obrabotka (RezTest AS INTEGER, ocenka AS INTEGER)
'Распечатывает фамилии студентов с минимальной оценкой Ocenka
'Если таких студентов нет, то RezTest = 1
DIM i AS INTEGER ' Текущий номер строки
DIM s AS INTEGER ' Счетчик числа студентов с MinOcenka> Ocenka
DIM j AS INTEGER ' Номер предмета
DIM k AS INTEGER ' Для выбора оценки в NaborOcenok
DIM MinOcenka AS INTEGER ' Минимальная оценка
DIM MasOcenok(1 TO 5) AS INTEGER 'Массив оценок для каждого студента
RezTest = 0 'Исходное состояние флага тестирования
s = 0 'Для накопления числа студентов, не удовлетворяющих критерию
к = 0 'Для выбора оценки из Stydentu(i).NaborOcenok
FOR i = 1 TO ChisloStyd
FOR j = 1 TO 5
k = 2 * j - 1
MasOcenok(j) = VAL(MID$(St.ydentu(i) .NaborOcenok, k, 1))
NEXT j
MinOcenka = MasOcenok(1)
FOR j = 2 TO 5
IF MasOcenok(j) < MinOcenka THEN MinOcenka = MasOcenok(j)
NEXT j
IF MinOcenka = ocenka THEN
PRINT #2, Stydentu(i).Famil ELSE
s = s + 1
END IF
IF s = ChisloStyd THEN RezTest = 1
NEXT i
END SUB 'Obrabotka
Пример набора файла Baza2.Bas
Гришин 5 5 5 5 5
Гурованов 4 3 4 5 5
Комаров 4 4 5 4 5
Кошкин 4 4 4 4 4
Матроскин 3 3 3 4 3
Федосеева 3 5 2 4 2
Отличники: Гришин
Хорошисты: Комаров, Кошкин
Троечники: Гурованов , Матроскин
Неуспевающие: Федосеева
24. Вычислить, за сколько лет в Сбербанке при начальном вкладе S и процентах годового прироста р будет накоплена сумма S1 .
Все величины в постановке задачи имеют имена-идентификаторы, кроме числа лет, за которые будет накоплена требуемая сумма. Обозначим ее буквой к.
Для упрощения записей введем переменную d — величину прироста за год.
Эта задача на сложные проценты.
Результат вычисляем по формулам: d = S*p/100 (прирост за год),
S = S+d (накопленная сумма),
к = к+1 (счетчик лет).
Программа 24
RЕМ Задача с неизвестным заранее числом циклов
RЕМ "Храните деньги в Сбербанке"
CLS 'очистка экрана
INPUT "Вклад, процент, сумма"; S, p, S1
DO WHILE S
d = S*p/100 ' прирост за год
S = S+d 'вклад в конце года
к = к+1 'число лет
STOP
PRINT "Сумма ";S1;" будет накоплена за ";к; " лет"
END
Для проверки правильности работы программы «Храните деньги в Сбербанке» можно предложить , например, такой контрольный тест:
S = 200, р = 10, S1 = 250.
Тест легко рассчитать вручную:
S = S+d k = k+1
200+20 = 220 k = 0+1 = 1
220+22 = 242 k = 1+1 = 2
242+24.2 = 266.2 k = 2+1 = 3
d = S*p/100 200*10/100 = 20 220*10/100 = 22 242*10/100 = 24.2
Расчеты показывают, что при начальном вкладе 200 и проценте годовых -- 10, желаемую сумму накоплений (250 рублей) нужно ждать 3 года.
Решая подобные задачи, интересно проследить динамику роста искомой величины по циклам. В нашем случае — роста вклада по годам. Для этого в тело цикла включают операторы PRINT, которые выводят на экран интересующие программиста переменные. Вывод можно оформить в виде таблицы с заголовками колонок.
Для уменьшения числа ошибок и удобства ввода с клавиатуры большого количества разнотипных данных используют несколько операторов INPUT. Особенно полезно это делать при приглашениях ввода, содержащих подробные требования к вводимым данным. С учетом последних замечаний программу, использующую Синтаксис 2 оператора DO...LOOP, можно записать так:
RЕМ Накопления в Сбербанке
CLS
INPUT "Начальный вклад = ", S
INPUT "Процент за год = ", р
INPUT "Желаемая сумма = ", S1
PRINT "Прирост", "Сумма ", "Год"
DO
d = S*p/100 : PRINT d, S = S+d : PRINT S,k = k+1 : PRINT k
LOOP UNTIL S> = S1
PRINT "За "; k; " года накоплено"; S1
END
На экране монитора:
Начальный вклад = 200 Процент за год = 10 Желаемая сумма = 250 Прирост d; " руб." Сумма
20 220 1
22 242 2
24.2 266.2 3
За 3 года накоплено 266.2 руб.
При решении задач желательно по возможности освобождаться от ввода констант с клавиатуры. Особенно их ввод нежелателен при многочисленных запусках, сопровождающих отладку сложной программы. В рассмотренной задаче константой может быть, например, процент за год р. Его можно ввести в программу оператором LET или, например так: р = 10.
25.
REM Вложенные циклы. Таблица умножения.
CLS
PRINT "Таблица умножения"
FOR i = 1 ТО 9 'внешний цикл, номера строк таблицы
FOR j = 1 ТО 9 'внутренний цикл, номера столбцов таблицы PRINT USING "###"; i * j; 'печать произведения
NEXT j
PRINT 'переход к печати на следующей строке
NEXT: END
В программе используется оператор PRINT USING. Рассмотрим его.
PRINT USING - оператор
Выводит строковые и числовые данные в соответствии с заданным форматом.
Синтаксис (сокращённый): PRINT USING формат; список [{,|;}]
Параметр формат содержит специальные символы, определяющие формат вывода данных, в частности, символы #.
Параметр список — это строковые или числовые выражения, разделенные запятыми или точками с запятой.
Рассмотрим примеры.
В программе: На экране монитора:
PRINT USING "# #.# #"; .78 0.78
PRINT USING "##.##"; 86.4 86.40
PRINT USING "# # #.# #"; 525.4637 525.46
Как правило, одну и ту же задачу можно решить различными способами. Наиболее привлекательны при этом наиболее простые, оригинальные, быстрые алгоритмы решения. При реализации алгоритмов программами приходится решать задачу выбора операторов, оформления ввода данных, вывода результатов, записи комментариев и т.д. Считают, что лучшей из решающих задачу программ будет та, которая при прочих равных условиях имеет в своем составе меньше операторов. Такую программу быстрее вводить, легче исправлять и отлаживать.