ZX-Ревю 1993 №3-4 1992 г.

Спектрум в школе - в этот раз мы предлагаем учебную программу по математике.


Темы статьи: Программирование  

Спектрум в школе

В этот раз мы предлагаем учебную программу по математике. Но прежде, чем переходить непосредственно к программе, остановимся вот на каком вопросе. Выполните: PRINT 10000000. На экране, как и следовало ожидать, будет напечатано: 10000000. Теперь выполните: PRINT 100000000. Сейчас число на экране выглядит иначе: 1E+8. Вы видите особенность вывода на экран числовых значении большой величины. Для большинства случаев этот вариант подходит, а может быть и более удобен. Но представьте себе, что Вы создаете программу по бухгалтерскому учету или по математике и надо, к примеру, точно знать результат сложения двух десятизначных чисел с точностью до последнего знака.

Попробуйте выполнить простую Бейсик-программу:

10 LET A=100000001

20 LET B=100000000

30 PRINT A;"-";B;"=";A-B

На экране Вы увидите:

1E+8-1E+8=1

А желательно было бы видеть:

100000001-100000000=1

Осуществимо ли это?

В качестве примера, показывающего, как практически достигается такой результат, мы приводим учебную программу по математике, которая будет заниматься разложением чисел на сомножители. В том случае, если число ни на что не делится, то значит оно является простым. Программа называется "PRIME" (что в переводе означает "простое число"). Ее можно использовать как для разложения чисел на сомножители, так и только для поиска простых чисел, для чего в предлагаемой программе предусмотрен специальный режим. Максимальная величина числа, для которого можно получить результат с точностью до последнего знака, равен 2 в степени 32, что составляет 4294967296.

Программа русифицирована по методике, приведенной в '^-РЕВЮ"-92, N1,2; стр. 29. Итак, текст программы:

1 GO TO 100

2 CLEAR 64599; LOAD "chr" CODE 64600

4 RUN

5 SAVE "PRIME" LINE 2: SAVE "chr" CODE 64600,768: STOP

8 POKE 23606,88: POKE 23607,251: RETURN

9 POKE 23606,0: POKE 23607,60: RETURN

ZX-

20 PRINT #0;AT 0,0; " ПРОДОЛЖЕНИЕ - ЛЮБАЯ КЛАВИША ВВОД НОВОГО ЧИСЛА - [SPACE]" 22 PAUSE 0: INPUT ; 29 RETURN

40 LET H=INT(N/1E5) 42 IF NOT H THEN PRINT N;: RETURN 44 PRINT H;(STR$(N-1E5*(H-1)))(2 TO ); 49 RETURN

100 BORDER 1: PAPER 7: INK 0: CLS 110 POKE 23658,8 120 GO SUB 8

130 PRINT AT 2,7;"М А Т Е М А Т И К А"

140 PRINT AT 5,4;"РАЗЛОЖЕНИЕ НА СОМНОЖИТЕЛИ"

200 PRINT AT 12,4;"[S] - ПОИСК СОМНОЖИТЕЛЕЙ"

210 PRINT AT 14,4;"[P] - ПОИСК ПРОСТЫХ ЧИСЕЛ"

220 PAUSE 0: IF INKEY$<>"S" AND INKEY$<>"P" THEN GO TO 220

300 LET I$=INKEY$: CLS

500 INPUT AT 0,0; "ВВЕДИТЕ ЧИСЛО <=4294967296 ";I: LET M=I 1000 FOR J=1 TO 10 1010 LET N=M 1020 GO SUB 2000

1030 IF M=I THEN GO SUB 20: IF INKEY$=" " THEN GO TO 500 1040 LET M=M+1 1050 NEXT J: PRINT

1060 GO SUB 20: IF INKEY$=" " THEN GO TO 500 1100 GO TO 1000

2000 RESTORE 2800: IF I$="S" THEN GO SUB 40: INK 1

2010 LFT F=0: LET D=0

2020 FOR B=0 TO 52

2030 READ Z: LET D=D+Z

2100 LET Q=N/D: IF Q<D THEN GO TO 2200

2110 IF I$="P" AND Q=INT Q THEN LET M=M+1: LET N=M: GO TO 2000

2120 IF I$ = "S" AND Q= INT Q THEN PRINT "=" AND NOT F;D;"*";: LET F=1: LET N=Q: GO TO 2100 2130 NEXT B

2140 RESTORE 2900: LET B=4: NEXT B

2200 IF I$="P" THEN GO SUB 40

2210 IF NOT F THEN PRINT INK 2;" ПРОСТОЕ ЧИСЛО";

2220 IF F THEN GO SUB 40

2300 INK 0: PRINT : RETURN

2800 DATA 2,1,2,2,4

2900 DATA 2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2, 6,4,2,4,2,10,2,10

Автостарт программы происходит со строки 2, где загружается символьный набор, после чего выполняется переход на начальную строку программы. Фактическое начало программы - строка 100. В строке 120 происходит включение режима CAPS LOCK, это позволяет упростить опрос клавиатуры при помощи INKEY$.

После подготовительных операций на экран выводится главное меню программы, в котором два пункта:

"ПОИСК СОМНОЖИТЕЛЕЙ"

"ПОИСК ПРОСТЫХ ЧИСЕЛ"

Нажав "S" или "P", мы переходим на строку 300, где продолжается работа программы. В переменной 1$ запоминается выбранный режим. В строке 500 предлагается ввести исследуемое число. Анализ его начинается в строке 1000. Введенное значение числа присваивается переменной N, которая является входной величиной для подпрограммы GO SUB 2000, которая выполняет поиск сомножителей и вывод результата на экран. После этого программа делает паузу. Теперь, если нажать "SPACE", можно вернуться к запросу нового числа. Если нажать любую другую клавишу, то анализ чисел будет продолжен со следующего числа (большего на 1). То есть, можно как анализировать числа по одному, вводя их по запросу, так и анализировать массив идущих подряд чисел, введя значение начального числа. Во втором случае вывод результатов будет производиться блоками по 10 чисел (определяется переменной J в строке 1000). После вывода каждого блока результатов можно нажатием "SPACE" опять вернуться на запрос нового числа, если это нужно.

Перед вызовом подпрограммы 2000, значение числа M присваивается временной переменной N. Это необходимо делать, так как в результате работы подпрограммы 2000, значение ее входной переменной N будет испорчено.

Переменная F в подпрограмме 2000 является флагом, переключающимся из 0 в 1 в том случае, если найден хотя бы один сомножитель для данного числа, то есть если число не простое. Переменная 0 - это возможные сомножители. Весь ряд сомножителей получается путем увеличения очередного значения D на величину смещения, полученного из строк DATA. Действительно, если попробовать получать значения D при помощи формулы в строке 2030, то получим числа возможных сомножителей: 2,3,5,7,9 ... и так далее. Это ничто иное, как ряд простых чисел.

Строка 2100 проверяет, все ли возможные сомножители проверены. Если все, то переход на строку 2200 для вывода результата. Строки 2110 или 2120 (в зависимости от заданного режима) проверяют, делится ли исследуемое число на сомножитель без остатка. В режиме анализа всех чисел, в том случае, если делится без остатка, то значит найден один из сомножителей, происходит вывод его на экран и установка флага F (строка 2120) и далее выполняется продолжение анализа остатка от деления для поиска остальных сомножителей. В режиме поиска только простых чисел, зафиксированное деление без остатка говорит о том, что это число не простое, поэтому дальнейший анализ не нужен и выполняется переход к проверке следующего числа (строка 2110).

Строка 2200 выполняет печать исследуемого числа и всех его сомножителей, если они есть или печать сообщения о том, что число простое. Собственно печать чисел выполняется подпрограммой GO SUB 40. Здесь, если число меньше, чем 100000, то происходит обычная его печать, а если больше, то печать выполняется в два приема. Сначала печатается то, что выходит за пределы 100000 (переменная N, строка 44), затем, для того, чтобы напечатать младшие разряды, происходит преобразование значения числа в стринг. Поясним происходящее на примере. Пусть нам надо напечатать число 4000000027. Сначала берутся старшие разряды числа: H=40000, теперь вычисляется "остаток", увеличенный на 100000, и происходит печать его за старшими разрядами:

надо: 4000000027

печать1: 40000 <-число

печать2: 100027 <-стринг

Т эта единица не выводится, так как полученный стринг печатается (2 TO).

В заключение отметим, что поскольку программа производит многократные вычисления при поиске сомножителей, и рассчет выполняется в Бейсике, то получение результата для больших чисел может занять достаточно продолжительное время. Представьте себе, сколько сомножителей надо перебрать для того, чтобы убедиться в том, что десятизначное число является простым! Например, для числа 4294987291 - требуется 8 минут! Поэтому в качестве усовершенствования этой программы мы можем посоветовать читателям попробовать скомпилировать подпрограмму со строки 2000 для ускорения выполнения вычислений.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Конкурс - Внимание конкурс "Твоя игра"!!!
Реклама - Eсли xотитe имeть доступ к сaмым свeжим прогрaммaм в г.Волгогрaдe, обрaщaйтeсь к нaм.
Введение - Hi, all tuspeople, а также всем остальным!
Проходилка - прохождение игры "Операция Р.Р." (demo)
Chaos Construction 2001 - интервью с Pheel и EA из Antares.

В этот день...   26 апреля