Контрольная работа. Образцы выполнения заданий. Алгоритмизация и программирование (на qbasic). Введение

Вид материалаКонтрольная работа

Содержание


SELECT CASE a
Процедура-функция FUNCTION…END FUNCTION
2.4.Вспомогательные алгоритмы и процедуры.
Переменная цикла
Оператор цикла DO LOOP [{WHILE | UNTIL}].
Операторы цикла DO WHILE/UNTIL LOOP и WHILE WEND.
Процедурные блоки SUB и FUNCTION.
Например, вызов функции М =
End function
Процедура объявляется следующим образом
PRINT "A”,”B”,”'C" тогда на экране появится : A B C Если вы вводите PRINT "A";'
Для решения задачи
CLS Резервируем в ОЗУ место под объявляемый двумерный массив DIM F$(l TO 4, 1 TО 3)
6. Ввод массивов.
Ввод одномерного массива
9. Вывод (печать) массивов.
Print а(i)
11. Print "массив в “ for i=1 то n for j=1 to m print b(i,j)
12. Суммирование элементов массива
15. Транспонирование матрицы
...
Полное содержание
Подобный материал:
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

PRINT “K11"; “K12", “S1“; SPC(20); “K21"; “K22", “S2"

1 :

PRINT

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. 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

PRINT

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

PRINT

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

PRINT

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

PRINT

NEXT I

PRINT “ оценки по экзаменам “

FOR I=1 TO M

PRINT “ студент – “; I ; “ “;

FOR J=1 TO N

PRINT A(I,J); “ “;

NEXT J

PRINT

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


PRINT

NEXT I


PRINT «В ГРУППЕ СТУДЕНТОВ- »; M ; » ИЗ НИХ:»

PRINT

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

PRINT

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; “ТАБЛИЦА СПОРТСМЕНОВ МИРА”

PRINT

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)280

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


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