Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_for_beginners:basic_for_beginners [2019-06-23 10:59] GreyWolf [Урок 6] |
msx:basic_for_beginners:basic_for_beginners [2022-05-09 00:46] (текущий) GreyWolf [Ссылки] |
||
---|---|---|---|
Строка 649: | Строка 649: | ||
====== Урок 6 ====== | ====== Урок 6 ====== | ||
- | Много хороших программ можно сделать, если научиться размещать печатаемый текст в нужном месте экрана. Например, можно заставить текст ползти по экрану, можно печатать не только слева направо, но и справа налево, сверху вниз, под углом… | + | Много хороших программ можно сделать, если научиться размещать печатаемый текст в нужном месте экрана. Например, можно заставить текст ползти по экрану, можно печатать не только слева направо, но и справа налево, сверху вниз, под углом… |
- | Можно организовать на экране табличку и аккуратно впечатывать числа или тексты в клетки этой таблицы… Можно, наконец, делать простенькие игры, в которых движутся не рисунки, слова. Чтобы этому научиться, нужно разобраться, как организован экран. | + | Можно организовать на экране табличку и аккуратно впечатывать числа или тексты в клетки этой таблицы… Можно, наконец, делать простенькие игры, в которых движутся не рисунки, слова. Чтобы этому научиться, нужно разобраться, как организован экран. |
- | + | На экране помещаются 24 строки текста. Они пронумерованы: первая имеет номер 0, 24–я — номер 23. Обычно в 23–й строке находятся подсказки, и ваша программа ею пользоваться не может. Чтобы убрать подсказки, используют команду ''KEYOFF'', тогда 23–ю строку можно использовать. Если нужно восстановить | |
- | На экране помещаются 24 строки текста. Они пронумерованы: первая имеет номер 0, 24-я - номер 23. Обычно в 23-й строке находятся подсказки, и ваша программа ею пользоваться не может. Чтобы убрать подсказки, используют команду ''KEYOFF'', тогда 23-ю строку можно использовать. Если нужно восстановить | + | строку с подсказками — команда ''KEYON''. |
- | строку с подсказками - команда ''KEYON''. | + | |
Сколько помещается в каждой строке символов, зависит от того, какие установлены экранный режим и ширина экрана. | Сколько помещается в каждой строке символов, зависит от того, какие установлены экранный режим и ширина экрана. | ||
Экранный режим устанавливается командой ''SCREEN'': | Экранный режим устанавливается командой ''SCREEN'': | ||
- | * ''SCREEN 0'' - до 80 символов в строке. | + | * ''SCREEN 0'' — до 80 символов в строке. |
- | * ''SCREEN 1'' - до 32 символов в строке. | + | * ''SCREEN 1'' — до 32 символов в строке. |
При включении обычно автоматически устанавливается ''SCREEN 0''. | При включении обычно автоматически устанавливается ''SCREEN 0''. | ||
- | После установки режима, командой ''WIDTH'' можно установить ширину экрана. Например, ''WIDTH 80'' устанавливает 80 символов в строке (мелкий шрифт). Такая команда не сработает в 1-м экранном режиме (Максимально ''WIDTH 32''). Команда WIDTH 40 в 0-м режиме установит 40 символов в строке (крупный шрифт). | + | После установки режима, командой ''WIDTH'' можно установить ширину экрана. Например, ''WIDTH 80'' устанавливает 80 символов в строке (мелкий шрифт). Такая команда не сработает в 1–м экранном режиме (Максимально ''WIDTH 32''). Команда'' WIDTH 40'' в 0–м режиме установит 40 символов в строке (крупный шрифт). |
- | Все дальнейшие примеры (если не оговаривается особо) приведены из расчёта на 0-й режим, 80-символьный экран и пустую служебную строку. | + | Все дальнейшие примеры (если не оговаривается особо) приведены из расчёта на 0–й режим, 80–символьный экран и пустую служебную строку. |
Команда ''LOCATE'' позволяет указать, где будет печатать следующий после неё ''PRINT''. Например, | Команда ''LOCATE'' позволяет указать, где будет печатать следующий после неё ''PRINT''. Например, | ||
Строка 669: | Строка 668: | ||
LOCATE 30,12:PRINT "Привет" | LOCATE 30,12:PRINT "Привет" | ||
</code> | </code> | ||
- | напечатает "Привет", начиная с 30-й позиции в 12-й строке. (Вы не забыли, что нумерация идёт от 0?) | + | напечатает "Привет", начиная с 30–й позиции в 12–й строке. (Вы не забыли, что нумерация идёт от 0?) |
- | Если в ''LOCATE'' использовать не числа, а переменные, то можно в цикле печатать красивые вещи. Например, напечатаем уголком слово "привет": | + | Если в ''LOCATE'' использовать не числа, а переменные, то можно в цикле печатать красивые вещи. Например, напечатаем уголком слово "привет": |
<code> | <code> | ||
10 for i=0 to 10:locate i,i:print"Привет!":next | 10 for i=0 to 10:locate i,i:print"Привет!":next | ||
20 for i=0 to 10:locate 10-i,11+i:print"Привет!":next | 20 for i=0 to 10:locate 10-i,11+i:print"Привет!":next | ||
</code> | </code> | ||
- | Посмотрите, как программка работает. В 10-й строке LOCATE в качестве номера строки и номера позиции использует одно и то же число (i). В 20-й строке мы хотим, чтобы позиция уменьшалась, а номер строки увеличивался. Поэтому рассчитываем их по-разному. | + | Посмотрите, как программка работает. В 10–й строке ''LOCATE'' в качестве номера строки и номера позиции использует одно и то же число (i). В 20–строке мы хотим, чтобы позиция уменьшалась, а номер строки увеличивался. Поэтому рассчитываем их по–разному. |
- | Если хотим растянуть по X в 2 раза, нужно номер позиции умножить на 2 (а номер строки не умножать): | + | Если хотим растянуть по X в 2 раза, нужно номер позиции умножить на 2 (а номер строки не умножать): |
<code> | <code> | ||
10 for i=0 to 10:locate i*2,i:print"Привет!":next | 10 for i=0 to 10:locate i*2,i:print"Привет!":next | ||
Строка 688: | Строка 687: | ||
10 for i=0 to 23:locate i*3.5,i:print"ШШШШШШ":next | 10 for i=0 to 23:locate i*3.5,i:print"ШШШШШШ":next | ||
</code> | </code> | ||
- | Выполнив пример, вы заметите, что когда программа допечатает до низа, весь экран дёрнется вверх. Одна из причин этого- та, что Бейсик, окончив программу, печатает "Ok" и при этом переводит строку, поднимая экран. Чтобы этого не было, зациклим программу, то-есть, добавим к ней строчку: | + | Выполнив пример, вы заметите, что когда программа допечатает до низа, весь экран дёрнется вверх. Одна из причин этого — та, что Бейсик, окончив программу, печатает "Ok" и при этом переводит строку, поднимая экран. Чтобы этого не было, зациклим программу, то–есть, добавим к ней строчку: |
<code> | <code> | ||
20 goto 20 | 20 goto 20 | ||
</code> | </code> | ||
- | Но даже и в этом случае экран дёрнулся вверх, хотя и меньше, чем раньше. Виноват ''print'', который после последней строчки переводит строку. Если вы добавите после …ШШШ%%"%% знак <;>, то все будет в порядке. | + | Но даже и в этом случае экран дёрнулся вверх, хотя и меньше, чем раньше. Виноват ''print'', который после последней строчки переводит строку. Если вы добавите после …ШШШ%%"%% знак <;>, то все будет в порядке. |
<WRAP box> | <WRAP box> | ||
Строка 699: | Строка 698: | ||
<WRAP box> | <WRAP box> | ||
- | Ещё труднее, но вы постараетесь, напечатать текст справа налево сверху вниз. | + | Ещё труднее, но вы постараетесь, напечатать текст справа налево сверху вниз. |
</WRAP> | </WRAP> | ||
- | Сделаем программу, которая пишет текст под каким-нибудь углом, и, дойдя до границы экрана, отражается от не1, как на рисунке: | + | Сделаем программу, которая пишет текст под каким–нибудь углом, и, дойдя до границы экрана, отражается от не1, как на рисунке: |
<code> | <code> | ||
┌────────────────────лл────────────лл┐ | ┌────────────────────лл────────────лл┐ | ||
Строка 716: | Строка 715: | ||
└───────────лл────────────────лл─────┘ | └───────────лл────────────────лл─────┘ | ||
</code> | </code> | ||
- | Поскольку количество шагов не задано, лучше использовать не цикл ''FOR'', а ''GOTO'', и координаты X и Y для ''LOCATE'' рассчитывать независимо друг от друга. Рассмотрим последовательность действий: | + | Поскольку количество шагов не задано, лучше использовать не цикл ''FOR'', а ''GOTO'', и координаты X и Y для ''LOCATE'' рассчитывать независимо друг от друга. Рассмотрим последовательность действий: |
- | 1) Заведём переменные X и Y для ''LOCATE''. | + | - Заведём переменные X и Y для ''LOCATE''. |
- | 2) Заведём переменные DX и DY, которые показывают, на сколько | + | - Заведём переменные DX и DY, которые показывают, на сколько изменяются X и Y в каждом шаге. |
- | изменяются X и Y в каждом шаге. | + | - Напечатаем слово в позиции X,Y |
- | 3) Напечатаем слово в позиции X,Y | + | - Изменим X на DX и проверим, не зашли ли на левый или правый край экрана. Если зашли, нужно поменять DX на -DX, чтобы двигаться в противоположном направлении. |
- | 4) Изменим X на DX и проверим, не зашли ли на левый или | + | - Изменим Y на DY и проверим так же верхнюю и нижнюю границы экрана. |
- | правый край экрана. Если зашли, нужно поменять DX на -DX, | + | - Для продолжения вернёмся к п.3 и все повторим. |
- | чтобы двигаться в противоположном направлении. | + | <code> |
- | 5) Изменим Y на DY и проверим так же верхнюю и нижнюю границы | + | 10 screen 0:keyoff:width 80 |
- | экрана. | + | 20 x=10:y=10:dx=1:dy=1 |
- | 6) Для продолжения вернемся к 3) и все повторим. | + | 30 locate x,y:print"*"; |
- | ┌──────────────────────────────────────┐ | + | 40 x=x+dx:if x>78 or x<1 then dx=-dx |
- | │ 10 screen 0:keyoff:width 80 │ | + | 50 y=y+dy:if y>22 or y<1 then dy=-dy |
- | │ 20 x=10:y=10:dx=1:dy=1 │ | + | 60 goto 30 |
- | │ 30 locate x,y:print"*"; │ | + | </code> |
- | │ 40 x=x+dx:if x>78 or x<1 then dx=-dx │ | + | Всем бы хороша эта программа, но через некоторое время в FIXME |
- | │ 50 y=y+dy:if y>22 or y<1 then dy=-dy │ | + | |
- | │ 60 goto 30 │ | + | |
- | └──────────────────────────────────────┘ | + | |
- | Всем бы хороша эта программа, но через некоторое время в FIXME | + | ====== Урок 7 ====== |
+ | Часто бывает так, что какой–либо цикл нужно повторить несколько раз. Для этого его помещают в другой цикл. Получается цикл в цикле или вложенные циклы. | ||
- | ====== Урок 7 ====== | + | Например, нужно сделать на экране 5 строк, в каждой из которых имеется десять чисел (1,3,5,… каждое на 2 больше предыдущего). |
<code> | <code> | ||
- | Часто бывает так, что какой-либо цикл нужно повторить нес- | + | 10 screen0:width80:keyoff |
- | колько раз. Для этого его помещают в другой цикл. Получается | + | 20 for st=1 to 5 :'Изменяется номер строки |
- | цикл в цикле или вложенные циклы. | + | 30 for po=1 to 10:'Изменяем номер позиции |
- | Например, нужно сделать на экране 5 строк, в каждой из которых | + | 40 locate po*4,st:print po*2-1; |
- | имеется десять чисел (1,3,5,... каждое на 2 больше предыдуще- | + | 50 next:next:'Закрыли оба цикла |
- | го). | + | </code> |
- | ┌────────────────────────────────────────────┐ | + | В 40–й строке мы умножили PO на 4 в ''LOCATE'', чтобы цифры располагались не подряд, а через 4 позиции (иначе слепятся). |
- | │ 10 screen0:width80:keyoff │ | + | |
- | │ 20 for st=1 to 5 :'Изменяется номер строки │ | + | |
- | │ 30 for po=1 to 10:'Изменяем номер позиции │ | + | |
- | │ 40 locate po*4,st:print po*2-1; │ | + | |
- | │ 50 next:next:'Закрыли оба цикла │ | + | |
- | └────────────────────────────────────────────┘ | + | |
- | В 40-й строке мы умножили PO на 4 в LOCATE, чтобы цифры | + | |
- | располагались не подряд, а через 4 позиции (иначе слепятся). | + | |
- | При изменении PO на 1 мы хотим печатать числа, которые | + | |
- | отличаются на 2. Поэтому в PRINT'е увеличиваем PO в 2 раза. | + | |
- | Но тогда будут числа 2,4,6,... Чтобы были 1,3,5... отнимаем 1. | + | |
- | Почти так же делается таблица Пифагора (таблица умножения), в | + | При изменении PO на 1 мы хотим печатать числа, которые отличаются на 2. Поэтому в ''PRINT'' увеличиваем PO в 2 раза. Но тогда будут числа 2,4,6,… Чтобы были 1,3,5… отнимаем 1. |
- | которой каждое число равно произведению номера строки, на | + | |
- | номер столбца, в котором оно находится. | + | |
- | ┌────────────────────────────────────────────┐ | + | |
- | │ 10 screen0:width80:keyoff │ | + | |
- | │ 20 for st=1 to 9 :'Изменяется номер строки │ | + | |
- | │ 30 for po=1 to 9 :'Изменяем номер столбца │ | + | |
- | │ 40 locate po*4,st:print po*st;:next:next │ | + | |
- | └────────────────────────────────────────────┘ | + | |
- | █ Пора, читатель, делать задания немного посложнее. Сделайте | + | Почти так же делается таблица Пифагора (таблица умножения), в которой каждое число равно произведению номера строки, на номер столбца, в котором оно находится. |
- | █ программу, которая печатает на экране ту же таблицу | + | <code> |
- | █ Пифагора но с рамкой и заголовками сверху и слева: | + | 10 screen0:width80:keyoff |
- | █ 1 2 3 4 и т.д. | + | 20 for st=1 to 9 :'Изменяется номер строки |
- | █ ┌──────────────── | + | 30 for po=1 to 9 :'Изменяем номер столбца |
- | █ 1│ 1 2 3 4 | + | 40 locate po*4,st:print po*st;:next:next |
- | █ 2│ 2 4 6 8 | + | </code> |
- | █ 3│ 3 6 9 12 | + | <WRAP box> |
- | █ 4│ 4 8 12 16 | + | Пора, читатель, делать задания немного посложнее. Сделайте программу, которая печатает на экране ту же таблицу Пифагора но с рамкой и заголовками сверху и слева: |
+ | 1 2 3 4 и т.д. | ||
+ | ┌──────────────── | ||
+ | 1│ 1 2 3 4 | ||
+ | 2│ 2 4 6 8 | ||
+ | 3│ 3 6 9 12 | ||
+ | 4│ 4 8 12 16 | ||
+ | </WRAP> | ||
- | Если вы справились с этим заданием, то разберетесь в | + | Если вы справились с этим заданием, то разберётесь в программе, которая двигает звёздочку сверху вниз в первой колонке, затем сверху вниз во второй, … |
- | программе, которая двигает звездочку сверху вниз в первой | + | <code> |
- | колонке, затем сверху вниз во второй, ... | + | 10 screen0:width80:keyoff:xs=0:ys=0 |
- | ┌─────────────────────────────────────┐ | + | 20 for x=0 to 78:for y=0 to 21 |
- | │ 10 screen0:width80:keyoff:xs=0:ys=0 │ | + | 30 locate x,y:print"*";:'нарисовали |
- | │ 20 for x=0 to 78:for y=0 to 21 │ | + | 40 locate xs,ys:print" ";:'стерли |
- | │ 30 locate x,y:print"*";:'нарисовали │ | + | 50 xs=x:ys=y:next:next |
- | │ 40 locate xs,ys:print" ";:'стерли │ | + | </code> |
- | │ 50 xs=x:ys=y:next:next │ | + | В 50–й строке переназначаются xs,ys — координаты места для стирания. |
- | └─────────────────────────────────────┘ | + | |
- | В 50-й строке переназначаются xs,ys- координаты места для | + | |
- | стирания. | + | |
- | █ Вы поняли приведенный пример, если вы сумеете его переделать | + | <WRAP box> |
- | █ так, чтобы звездочки двигались горизонтально, сначала вдоль | + | Вы поняли приведённый пример, если вы сумеете его переделать так, чтобы звёздочки двигались горизонтально, сначала вдоль самой верхней строки, потом ниже, ниже… |
- | █ самой верхней строки, потом ниже, ниже... | + | </WRAP> |
- | Несколько труднее сделать, чтобы звездочка сначала двигалась | + | Несколько труднее сделать, чтобы звёздочка сначала двигалась вниз, а в следующем столбце — вверх и т.д. |
- | вниз, а в следующем столбце - вверх и т.д. | + | <code> |
- | ┌──────────────────────────────────────────┐ | + | 10 screen0:width80:y=0:xs=0:ys=0:dy=1 |
- | │ 10 screen0:width80:y=0:xs=0:ys=0:dy=1 │ | + | 20 for x=0 to 78:for k=0 to 21:y=y+dy |
- | │ 20 for x=0 to 78:for k=0 to 21:y=y+dy │ | + | 30 locate x,y:print"*"; |
- | │ 30 locate x,y:print"*"; │ | + | 40 locate xs,ys:print" "; |
- | │ 40 locate xs,ys:print" "; │ | + | 50 xs=x:ys=y:next:dy=-dy:next |
- | │ 50 xs=x:ys=y:next:dy=-dy:next │ | + | </code> |
- | └──────────────────────────────────────────┘ | + | Как видите, в 20 строке К — не координата Y, а просто счётчик. Y же равен вначале нулю, а в цикле меняется не на 1, как K, а на DY, который (в конце 50–й строки) принимает значения либо 1 (вниз), либо -1 (вверх). |
- | Как видите, в 20 строке К- не координата Y, а просто счетчик. | + | |
- | Y же равен вначале нулю, а в цикле меняется не на 1, как K, а | + | |
- | на DY, который (в конце 50-й строки) принимает значения либо | + | |
- | 1 (вниз), либо -1 (вверх). | + | |
- | █ Считайте, что вы поняли этот пример, а также пример со | + | <WRAP box> |
- | █ змейкой из 6-го урока, если вы сделаете в нем движение не | + | Считайте, что вы поняли этот пример, а также пример со змейкой из 6–го урока, если вы сделаете в нем движение не одной звёздочки, а змейки из звёздочек. |
- | █ одной звездочки, а змейки из звездочек. | + | </WRAP> |
- | Еще пример на вложенные циклы: Пусть программа печатает в | + | Ещё пример на вложенные циклы: Пусть программа печатает в одной строке ряд чисел: 1,8,15,…,71, в следующей строке — ряд 2,9,16,…,72, дальше 3,10,17,…,73 и так до строки с рядом 9,16,…,79. |
- | одной строке ряд чисел: 1,8,15,...,71, в следующей строке - | + | |
- | ряд 2,9,16,...,72, дальше 3,10,17,...,73 и так до строки с | + | |
- | рядом 9,16,...,79. | + | |
- | Первая переменная цикла (A) будет задавать номер строки, а | + | Первая переменная цикла (A) будет задавать номер строки, а тем самым — начальное значение ряда. Вторая (B) будет задавать числа в ряду и изменяться от A до A+70 с шагом 7: |
- | тем самым- начальное значение ряда. Вторая (B) будет задавать | + | <code> |
- | числа в ряду и изменяться от A до A+70 с шагом 7: | + | 10 for a=1 to 9 |
- | ┌────────────────────────────────────────────────────┐ | + | 20 for b=a to A+70 step 7:print b;:next:print:next |
- | │ 10 for a=1 to 9 │ | + | </code> |
- | │ 20 for b=a to A+70 step 7:print b;:next:print:next │ | + | В 20–й строке пустой ''PRINT'' — чтобы перейти на новую строку. |
- | └────────────────────────────────────────────────────┘ | + | |
- | В 20-й строке пустой PRINT - чтобы перейти на новую строку. | + | |
- | █ Сделайте подобную программу, чтобы она печатала такие ряды: | + | <WRAP box> |
- | █ 1,4,7,...,34 | + | Сделайте подобную программу, чтобы она печатала такие ряды: |
- | █ 4,7,10,...,37 | + | 1,4,7,…,34 |
- | █ 7,10,13,...,40 и т.д. ... до ряда 34,37,40,...,67 | + | 4,7,10,…,37 |
+ | 7,10,13,…,40 и т.д. … до ряда 34,37,40,…,67 | ||
+ | </WRAP> | ||
+ | ====== Урок 8 ====== | ||
+ | Представьте себе случай, когда одинаковые действия нужно выполнить для множества данных. Например, каждое из 20–ти чисел нужно увеличить в 2 раза. Ясно, что эту работу нужно делать в цикле. Для этого есть несколько способов: | ||
+ | |||
+ | Первый способ очень прост. Мы в цикле запрашиваем данные у пользователя и тут же их обрабатываем. Например, пусть программа сложит 10 чисел, введённых пользователем: | ||
+ | <code> | ||
+ | 10 S=0:for n=1 to 10 | ||
+ | 20 input"Введите число";a | ||
+ | 30 S=S+a:next | ||
+ | 40 print "Сумма всех чисел =";S | ||
</code> | </code> | ||
- | ====== Урок 8 ====== | + | Если данные заранее известны программисту, их удобнее поместить в программу, а не запрашивать командой ''INPUT''. Делают это с помощью команд ''DATA'' (данные) и ''READ'' (читать): |
+ | После слова ''DATA'' размещаются через запятую нужные данные. | ||
+ | После слова ''READ'' стоит имя переменной (или несколько, через запятую), куда нужно занести очередное данное. Не обязательно все данные размещать в одной строке программы. ''DATA'' могут находиться в любом месте программы. Нужно только помнить, что ''READ'' считывают из ''DATA'', начиная с самой первой встреченной в программе и до самой последней подряд. Если команд ''READ'' больше, чем ''DATA'', то будет выдано сообщение об ошибке (OUT OF DATA — ЗА ПРЕДЕЛАМИ ДАННЫХ). Если данные считываются в цикле, то это | ||
+ | значит, что число повторений больше, чем данных. | ||
+ | Посмотрите предыдущий пример с использованием ''READ'' и ''DATA'': | ||
<code> | <code> | ||
+ | 10 S=0:for n=1 to 10:read a:S=S+a:next | ||
+ | 20 print "Сумма всех чисел =";S | ||
+ | 30 data 1,4,23,11,4,52,4,2,5,2 | ||
+ | </code> | ||
- | Представьте себе случай, когда одинаковые действия нужно | + | Нередко бывает, что данные нужно обработать вторично. Но ведь после первой обработки ''READ'' установлен на последнюю ''DATA''! |
- | выполнить для множества данных. Например, каждое из 20-ти | + | |
- | чисел нужно увеличить в 2 раза. Ясно, что эту работу нужно | + | |
- | делать в цикле. Для этого есть несколько способов: | + | |
- | Первый способ очень прост. Мы в цикле запрашиваем данные у | + | Чтобы его переустановить на начало, используется команда ''RESTORE'' (переустановка). Если нужно повторить обработку данных не с самого начала программы, а с определённой строки, после ''RESTORE'' пишут номер строки, где начинаются нужные данные. |
- | пользователя и тут же их обрабатываем. Например, пусть | + | |
- | программа сложит 10 чисел, введенных пользователем: | + | |
- | ┌─────────────────────────────────┐ | + | |
- | │ 10 S=0:for n=1 to 10 │ | + | |
- | │ 20 input"Введите число";a │ | + | |
- | │ 30 S=S+a:next │ | + | |
- | │ 40 print "Сумма всех чисел =";S │ | + | |
- | └─────────────────────────────────┘ | + | |
- | Если данные заранее известны программисту, их удобнее | + | Например, чтобы звёздочка ходила по кругу зададим ей координаты в ''DATA'', а когда опишем полную окружность, сделаем ''RESTORE'': |
- | поместить в программу, а не запрашивать INPUT'ом. Делают это с | + | <code> |
- | помощью команд DATA (данные) и READ (читать): | + | 10 color15,1,1:screen1:keyoff:xs=0:ys=0 |
- | После слова DATA размещаются через запятую нужные данные. | + | 20 for i=1 to 21: read xn,yn:locate xn,yn:print"*" |
- | После слова READ стоит имя переменной (или несколько, через | + | 30 locate xs,ys:print" ";:xs=xn:ys=yn:next |
- | запятую), куда нужно занести очередное данное. Не обязательно | + | 40 restore:goto20 |
- | все данные размещать в одной строке программы. DATA могут | + | 50 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21 |
- | находиться в любом месте программы. Нужно только поминить, что | + | 60 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 |
- | READ'ы считывают из DATA, начиная с самой первой встреченной в | + | 70 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8 |
- | программе и до самой последней подряд. Если READ'ов больше, | + | </code> |
- | чем DATA, то будет выдано сообщение об ошибке (OUT OF DATA - | + | Здесь одним ''READ'' читаем 2 данных XN и YN. Старые координаты (для стирания) держим в переменных XS,YS. |
- | ЗА ПРЕДЕЛАМИ ДАННЫХ). Если данные считываются в цикле, то это | + | Кстати, ''SCREEN1'' в этом фрагменте выбран из тех соображений, что в нем каждое знакоместо — квадрат. В ''screen 0'' окружность превращается в эллипс, так как знакоместо заужено по X. |
- | значит, что число повторений больше, чем данных. | + | |
- | Посмотрите предыдущий пример с использованием READ и DATA: | + | В качестве следующего примера, где ''READ'' читает не только числовые, но и текстовые величины, приведу программу медленной (буква за буквой) печати текстов, которые записаны в ''DATA'': |
- | ┌────────────────────────────────────────┐ | + | <code> |
- | │ 10 S=0:for n=1 to 10:read a:S=S+a:next │ | + | 10 screen0:width80:keyoff |
- | │ 20 print "Сумма всех чисел =";S │ | + | 20 read n:'Взяли количество строк |
- | │ 30 data 1,4,23,11,4,52,4,2,5,2 │ | + | 30 for i=1 to n:read a$:'Взяли текст строки |
- | └────────────────────────────────────────┘ | + | 40 for k=1 to len(a$):b$=mid$(a$,k,1):'взяли букву |
+ | 50 print b$;:fork=0to50:next:'поставили букву и задержались | ||
+ | 60 next:d$=input$(1):'Написали строку. Ждем нажатия клавиши | ||
+ | 70 print:next:'перевели строку и повторим со следующей | ||
+ | 80 print:print"Дo свидания":end:'Закончив, попрощались | ||
+ | 90 '---------------- сам текст ----------------------- | ||
+ | 100 data 4,"Однажды, в студеную зимнюю пору" | ||
+ | 110 data "Я из лесу вышел, был сильный мороз." | ||
+ | 120 data "Гляжу, поднимается медленно в гору" | ||
+ | 130 data "Лошадка, везущая хворосту воз." | ||
+ | </code> | ||
+ | Вы поняли, для чего стоит 4 в 100–й строке? Правильно, для первого ''READ''. | ||
- | Нередко бывает, что данные нужно обработать вторично. Но ведь | + | ''READ'' и ''DATA'' — очень удобны, но лишь в тех нечастых случаях, когда все данные нужно читать и обрабатывать подряд. А как быть, когда надо через одно? А если с конца в начало? |
- | после первой обработки READ установлен на последнюю DATA! | + | |
- | Чтобы его переустановить на начало, используется команда | + | |
- | RESTORE (переустановка). Если нужно повторить обработку данных | + | |
- | не с самого начала программы, а с определенной строки, после | + | |
- | RESTORE пишут номер строки, где начинаются нужные данные. | + | |
- | Например, чтобы звездочка ходила по кругу зададим ей координа- | + | Во многих задачах вас выручат массивы. Массив — это табличка в памяти, где хранятся пронумерованные данные. У массива есть имя. Например, массив А. Но в отличие от переменной с именем А, в массиве под этим именем хранится не одно число, а несколько. |
- | ты в DATA, а когда опишем полную окружность, сделаем RESTORE: | + | |
- | ┌────────────────────────────────────────────────────────┐ | + | |
- | │ 10 color15,1,1:screen1:keyoff:xs=0:ys=0 │ | + | |
- | │ 20 for i=1 to 21: read xn,yn:locate xn,yn:print"*" │ | + | |
- | │ 30 locate xs,ys:print" ";:xs=xn:ys=yn:next │ | + | |
- | │ 40 restore:goto20 │ | + | |
- | │ 50 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21│ | + | |
- | │ 60 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 │ | + | |
- | │ 70 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8�│�� | + | |
- | └────────────────────────────────────────────────────────┘ | + | |
- | Здесь одним READ'ом читаем 2 данных XN и YN. Старые координаты | + | |
- | (для стирания) держим в переменных XS,YS. | + | |
- | Кстати, SCREEN1 в этом фрагменте выбран из тех соображений, | + | |
- | что в нем каждое знакоместо- квадрат. В screen 0 окружность | + | |
- | превращается в эллипс, так как знакоместо заужено по X. | + | |
- | В качестве следующего примера, где READ читает не только | + | По имени массива и номеру можно получить любое данное. Например, если мы хотим напечатать 20–е число из массива WWW, то мы напишем: ''print www(20)'' . Для того, чтобы запомнить число в нужное место массива, нужно как и с переменной использовать присваивание: ''www(20)=62.11''. Номер элемента массива может быть записан не только числом, но и переменной, в которой находится это число. Это позволяет использовать массив в цикле, где индекс (номер в скобках) меняет своё значение. Например, посмотрите, как выполняется такая задача: программа получает от пользователя 10 чисел, а затем печатает их в строку в обратном порядке: |
- | числовые, но и текстовые величины, приведу программу медленной | + | <code> |
- | (буква за буквой) печати текстов, которые записаны в DATA: | + | 10 dim a(9) |
- | ┌────────────────────────────────────────────────────────────┐ | + | 20 for i=0 to 9:input a(i):next |
- | │ 10 screen0:width80:keyoff │ | + | 30 for i=9 to 0 step -1:print a(i):next |
- | │ 20 read n:'Взяли количество строк │ | + | </code> |
- | │ 30 for i=1 to n:read a$:'Взяли текст строки │ | + | Как видите, программа несложная. Остаются неясными детали: В 10–й строке стоит команда ''DIM'', которая объявляет номер последнего элемента массива. С этого момента Бейсик зарезервировал 10 (от 0 до 9) элементов и заполнил их нулями. В 20–строке вместо нулей мы ''INPUT'' заносим новые значения, а в |
- | │ 40 for k=1 to len(a$):b$=mid$(a$,k,1):'взяли букву │ | + | 30–й строке печатаем в обратном порядке. |
- | │ 50 print b$;:fork=0to50:next:'поставили букву и задержались│ | + | |
- | │ 60 next:d$=input$(1):'Написали строку. Ждем нажатия клавиши│ | + | |
- | │ 70 print:next:'перевели строку и повторим со следующей │ | + | |
- | │ 80 print:print"Дo свидания":end:'Закончив, попрощались │ | + | |
- | │ 90 '---------------- сам текст ----------------------- │ | + | |
- | │ 100 data 4,"Однажды, в студеную зимнюю пору" │ | + | |
- | │ 110 data "Я из лесу вышел, был сильный мороз." │ | + | |
- | │ 120 data "Гляжу, поднимается медленно в гору" │ | + | |
- | │ 130 data "Лошадка, везущая хворосту воз." │ | + | |
- | └────────────────────────────────────────────────────────────┘ | + | |
- | Вы поняли, для чего стоит 4 в 100-й строке?Правильно, для | + | |
- | первого READ'а. | + | |
- | READ и DATA - очень удобны, но лишь в тех нечастых случаях, | + | Если программа попытается использовать элемент массива с номером, большим, чем объявлено в ''DIM'', то Бейсик сообщит об ошибке: "SUBSCRIPT OUT OF RANGE" или "ИНДЕКС ЗА ПРЕДЕЛАМИ РЯДА". |
- | когда все данные нужно читать и обрабатывать подряд. А как | + | |
- | быть, когда надо через одно? А если с конца в начало? | + | |
- | Во многих задачах вас выручат массивы. Массив - это табличка в | + | Составим такую программу: программа заносит из ''DATA'' в массив 10 чисел и печатает в одну строку на экран, а затем все чётные делит на 2 и снова весь массив печатает на экран одной строкой. |
- | памяти, где хранятся пронумерованные данные. У массива есть | + | <code> |
- | имя. Например, массив А. Но в отличие от переменной с именем А, | + | 10 dim a(9) |
- | в массиве под этим именем хранится не одно число, а несколько. | + | 20 for n=0 to 9:read a(n):print a(n);:next |
- | По имени массива и номеру можно получить любое данное. | + | 30 for n=0 to 9:if a(n) mod 2=0 then a(n)=a(n)/2 |
- | Например, если мы хотим напечатать 20-е число из массива WWW, | + | 40 print a(n);:next |
- | то мы напишем: print www(20) . Для того, чтобы запомнить число | + | 50 data 1,4,23,11,4,52,4,2,5,2 |
- | в нужное место массива, нужно как и с переменной использовать | + | </code> |
- | присваивание: www(20)=62.11. Номер элемента массива может быть | + | |
- | записан не только числом, но и переменной, в которой находится | + | |
- | это число. Это позволяет использовать массив в цикле, где | + | |
- | индекс (номер в скобках) меняет свое значение. Например, | + | |
- | посмотрите, как выполняется такая задача: программа получает | + | |
- | от пользователя 10 чисел, а затем печатает их в строку в | + | |
- | обратном порядке: | + | |
- | ┌─────────────────────────────────────────┐ | + | |
- | │ 10 dim a(9) │ | + | |
- | │ 20 for i=0 to 9:input a(i):next │ | + | |
- | │ 30 for i=9 to 0 step -1:print a(i):next │ | + | |
- | └─────────────────────────────────────────┘ | + | |
- | Как видите, программа несложная. Остаются неясными детали: В | + | |
- | 10-й строке стоит команда DIM, которая объявляет номер | + | |
- | последнего элемента массива. С этого момента Бейсик зарезерви- | + | |
- | ровал 10 (от 0 до 9) элементов и заполнил их нулями. В 20-й | + | |
- | строке вместо нулей мы INPUT'ом заносим новые значения, а в | + | |
- | 30-й строке печатаем в обратном порядке. | + | |
- | Если программа попытается использовать элемент массива с номе- | + | В 30–й строке проверяется, чётное ли число (для чётных остаток от деления на 2 равен 0 ). Если чётное, то делим на 2. |
- | ром, большим, чем объявлено в DIM, то Бейсик сообщит об | + | В 40–й строчке печатается a(n), независимо от того, делили его на 2 или нет. |
- | ошибке: "SUBSCRIPT OUT OF RANGE" или "ИНДЕКС ЗА ПРЕДЕЛАМИ РЯДА". | + | У вас может возникнуть вопрос: почему в 40–й строке после окончания печати не стоит команда END? Дело в том, что когда окончится цикл, программа перейдёт на последнюю, 50–ю строку, и, ничего не сделав, закончится. (Команда ''DATA'' не выполняет никаких действий. Она просто хранит данные для ''READ''. Поэтому команды ''DATA'' можно размещать в любом месте программы.) |
- | Составим такую программу: программа заносит из DATA в массив | + | Попробуем с помощью массивов улучшить программу, в которой звёздочка движется по кругу. Занесём координаты в массив. |
- | 10 чисел и печатает в одну строку на экран, а затем все четные | + | Обращение к массиву происходит быстрее, чем ''READ'', поэтому движение ускорится. Кроме того, можно пустить звёздочку в обратном направлении: |
- | делит на 2 и снова весь массив печатает на экран одной строкой. | + | <code> |
- | ┌──────────────────────────────────────────────────┐ | + | 10 color15,1,1:screen1:keyoff:xs=0:ys=0 |
- | │ 10 dim a(9) │ | + | 20 for i=1 to 21: read x(i),y(i):next |
- | │ 20 for n=0 to 9:read a(n):print a(n);:next │ | + | 30 for i=21 to 1 step -1:locate x(i),y(i):print"*" |
- | │ 30 for n=0 to 9:if a(n) mod 2=0 then a(n)=a(n)/2 │ | + | 40 locate xs,ys:print" ";:xs=x(i):ys=y(i):next |
- | │ 40 print a(n);:next │ | + | 50 goto20 |
- | │ 50 data 1,4,23,11,4,52,4,2,5,2 │ | + | 60 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21 |
- | └──────────────────────────────────────────────────┘ | + | 70 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 |
+ | 80 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8 | ||
+ | </code> | ||
- | В 30-й строке проверяется, четное ли число ( для четных | + | Если обойтись без ''FOR'' в 30 строке, сделать цикл по старинке, с помощью ''GOTO'', то можно организовать одновременное движение двух звёздочек по– и против часовой стрелки: |
- | остаток от деления на 2 равен 0 ). Если четное, то делим на 2. | + | <code> |
- | В 40-й строчке печатается a(n), независимо от того, делили его | + | 10 color15,1,1:screen1:keyoff:x1=0:y1=0:x2=0:y2=0 |
- | на 2 или нет. | + | 20 dim x(21),y(21):for t=1 to 21: read x(t),y(t):next |
- | У вас может возникнуть вопрос: почему в 40-й строке после | + | 30 t=1:k=21 |
- | окончания печати не стоит команда END? Дело в том, что когда | + | 40 locate x(t),y(t):print"*";:locate x1,y1:print" "; |
- | окончится цикл, программа перейдет на последнюю, 50-ю строку, | + | 50 x1=x(t):y1=y(t):t=t+1:if t=22 then t=1 |
- | и, ничего не сделав, закончится. (Команда DATA не выполняет | + | 60 locate x(k),y(k):print"Ш";:locate x2,y2:print" "; |
- | никаких действий. Она просто хранит данные для READ. Поэтому | + | 70 x2=x(k):y2=y(k):k=k-1:if k=1 then k=21 |
- | DAT'ы можно размещать в любом месте программы.) | + | 80 goto40 |
+ | 90 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21 | ||
+ | 100 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 | ||
+ | 110 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8 | ||
+ | </code> | ||
+ | Надеюсь, без объяснений понятно, как 50–й строке делают, чтобы дойдя до 21 переменная t снова стала =1, а в 70–й строке k, дойдя до 1 снова становится =21. | ||
+ | В строке 60 использована "Ш", а не "*", чтобы в разные стороны двигались разные фигуры. | ||
+ | Переменные x1,y1 и x2,y2 хранят координаты места для стирания. | ||
- | Попробуем с помощью массивов улучшить программу, в которой | + | <WRAP box> |
- | звездочка движется по кругу. Занесем координаты в массив. | + | Довольно простым заданием будет внести в ту программу такие изменения, чтобы звёздочки двигались не по окружности, а по другой траектории. Для этого нужно изменить координаты положений звёздочки в строках 90–110. Если при этом точек станет больше, то изменится количество пар координат. |
- | Обращение к массиву происходит быстрее, чем READ, поэтому | + | |
- | движение ускорится. Кроме того, можно пустить звездочку в | + | |
- | обратном направлении: | + | |
- | ┌────────────────────────────────────────────────────────┐ | + | |
- | │ 10 color15,1,1:screen1:keyoff:xs=0:ys=0 │ | + | |
- | │ 20 for i=1 to 21: read x(i),y(i):next │ | + | |
- | │ 30 for i=21 to 1 step -1:locate x(i),y(i):print"*" │ | + | |
- | │ 40 locate xs,ys:print" ";:xs=x(i):ys=y(i):next │ | + | |
- | │ 50 goto20 │ | + | |
- | │ 60 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21│ | + | |
- | │ 70 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 │ | + | |
- | │ 80 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8�│�� | + | |
- | └────────────────────────────────────────────────────────┘ | + | |
- | Если обойтись без FOR в 30 строке, сделать цикл по старинке, с | + | Не забудьте внести изменения в строки 20,30,50,70, где это количество учитывается. |
- | помощью GOTO, то можно организовать одновременное движение | + | </WRAP> |
- | двух звездочек по- и против часовой стрелки: | + | |
- | ┌─────────────────────────────────────────────────────────┐ | + | |
- | │ 10 color15,1,1:screen1:keyoff:x1=0:y1=0:x2=0:y2=0 │ | + | |
- | │ 20 dim x(21),y(21):for t=1 to 21: read x(t),y(t):next │ | + | |
- | │ 30 t=1:k=21 │ | + | |
- | │ 40 locate x(t),y(t):print"*";:locate x1,y1:print" "; │ | + | |
- | │ 50 x1=x(t):y1=y(t):t=t+1:if t=22 then t=1 │ | + | |
- | │ 60 locate x(k),y(k):print"Ш";:locate x2,y2:print" "; │ | + | |
- | │ 70 x2=x(k):y2=y(k):k=k-1:if k=1 then k=21 │ | + | |
- | │ 80 goto40 │ | + | |
- | │ 90 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21│ | + | |
- | │ 100 data 14,20, 12,18, 10,15, 9,12, 9,9, 10,7, 12,4 │ | + | |
- | │ 110 data 14,2, 17,1, 20,1, 23,2, 25,3, 27,5, 29,8�│�� | + | |
- | └─────────────────────────────────────────────────────────┘ | + | |
- | Надеюсь, без объяснений понятно, как в 50-й строке делают, | + | |
- | чтобы дойдя до 21 переменная t снова стала =1, а в 70-й строке | + | |
- | k, дойдя до 1 снова становится =21. | + | |
- | В строке 60 использована "Ш", а не "*", чтобы в разные стороны | + | |
- | двигались разные фигуры. | + | |
- | Переменные x1,y1 и x2,y2 хранят координаты места для стирания. | + | |
- | █ Довольно простым заданием будет внести в эту программу | ||
- | █ такие изменения, чтобы звездочки двигались не по окружности, | ||
- | █ а по другой траектории. Для этого нужно изменить координаты | ||
- | █ положений звездочки в строках 90-110. Если при этом | ||
- | █ точек станет больше, то изменится количество пар координат. | ||
- | █ Не забудьте внести изменения в строки 20,30,50,70, где это | ||
- | █ количество учитывается. | ||
+ | Массивы можно, конечно, использовать не только для координат, но и для хранения любых других данных. | ||
- | Массивы можно, конечно, использовать не только для координат, | + | Попробуем с помощью массивов составить личный телефонный справочник. В массиве |
- | но и для хранения любых других данных. Попробуем с помощью | + | FA$(9) будем держать фамилии 10–ти друзей. В массиве NO(9) будем держать их телефоны. Программа попросит ввести фамилию, разыщет её в массиве FA$ и по тому же индексу из массива NO возьмёт телефонный номер. Вы, конечно же, будете использовать не 10, а нужное вам число друзей и настоящие их фамилии с телефонами: |
- | массивов составить личный телефонный справочник. В массиве | + | <code> |
- | FA$(9) будем держать фамилии 10-ти друзей. В массиве NO(9) | + | 10 dim fa$(9),no(9) |
- | будем держать их телефоны. Программа попросит ввести фамилию, | + | 20 for k=0 to 9:read fa$(k),no(k):next |
- | разыщет ее в массиве FA$ и по тому же индексу из массива NO | + | 30 input "Введите фамилию";f$ |
- | возьмет телефонный номер. Вы, конечно же, будете использовать | + | 40 for k=0 to 9:if f$=fa$(k) then 60 |
- | не 10, а нужное вам число друзей и настоящие их фамилии с те- | + | 50 next:print"Нет в справочнике!":goto 30 |
- | лефонами: | + | 60 print"Телефон ";no(k):goto 30 |
- | ┌───────────────────────────────────────────────────────┐ | + | 70 data Петров,29045,Коваль,23433,Павлов,23321 |
- | │ 10 dim fa$(9),no(9) │ | + | 80 data Сурков,21412,Моргунов,29981,Мышкин,24337 |
- | │ 20 for k=0 to 9:read fa$(k),no(k):next │ | + | 90 data Ауль,22221,Монахов,27725,Робов,21111,Пак,23324 |
- | │ 30 input "Введите фамилию";f$ │ | + | </code> |
- | │ 40 for k=0 to 9:if f$=fa$(k) then 60 │ | + | В 20–й строке заполнили массивы из ''DATA''. Обратите внимание, в ''DATA'' фамилии не стоят в кавычках. Это допускается с текстами только в случае, если текст состоит из одного слова без запятых или других знаков. В иных случаях текст в ''DATA'' должен заключаться в кавычки. |
- | │ 50 next:print"Нет в справочнике!":goto 30 │ | + | |
- | │ 60 print"Телефон ";no(k):goto 30 │ | + | |
- | │ 70 data Петров,29045,Коваль,23433,Павлов,23321 │ | + | |
- | │ 80 data Сурков,21412,Моргунов,29981,Мышкин,24337 │ | + | |
- | │ 90 data Ауль,22221,Монахов,27725,Робов,21111,Пак,23324│ | + | |
- | └───────────────────────────────────────────────────────┘ | + | |
- | В 20-й строке заполнили массивы из DATA. Обратите внимание, в | + | |
- | DATA фамилии не стоят в кавычках. Это допускается с текстами | + | |
- | только в случае, если текст состоит из одного слова без | + | |
- | запятых или других знаков. В иных случаях текст в DATA должен | + | |
- | заключаться в кавычки. | + | |
- | В 40-й строке в цикле просматриваем все фамилии из массива, и | + | |
- | если найдем совпадающую с введенной фамилией, то переходим на | + | |
- | строку 50, где печатаем телефон из массива no с таким же | + | |
- | индексом K, как и найденная фамилия. Если же фамилию в массиве | + | |
- | не нашли, то после окончания цикла сработает print из 50-й | + | |
- | строки. | + | |
- | █ Сделайте программу, которая спрашивает название школьного | + | В 40–й строке в цикле просматриваем все фамилии из массива, и если найдём совпадающую с введённой фамилией, то переходим на строку 50, где печатаем телефон из массива no с таким же индексом K, как и найденная фамилия. Если же фамилию в массиве не нашли, то после окончания цикла сработает ''print'' из 50–й строки. |
- | █ предмета и печатает имя-отчество преподавателя. | + | |
- | Сделаем программу "Электронный продавец", используя массивы. | + | <WRAP box> |
- | Это поможет упростить нахождение цены купленного продукта, | + | Сделайте программу, которая спрашивает название школьного предмета и печатает имя–отчество преподавателя. |
- | уменьшит объем программы при большем количестве предлагаемых | + | </WRAP> |
- | товаров: | + | |
- | ┌───────────────────────────────────────────────────────┐ | + | |
- | │ 10 color15,1:screen0:keyoff:width80:s=0 │ | + | |
- | │ 20 read kol:dim towar$(kol),cena(kol) │ | + | |
- | │ 30 for k=1 to kol:read towar$(k),cena(k):next │ | + | |
- | │ 40 '----- прочли данные ------ начинаем цикл ----- │ | + | |
- | │ 50 cls:print "М Е Н Ю:" │ | + | |
- | │ 60 for k=1 to kol:locate 0,k+1:print k;towar$(k); │ | + | |
- | │ 70 locate 30,k+1:print cena(k);:next │ | + | |
- | │ 80 locate30,21:input"Введите выбранный номер";n │ | + | |
- | │ 90 locate30,21:print" "; │ | + | |
- | │ 100 locate30,21:input"Сколько штук берете";t │ | + | |
- | │ 110 s=s+t*cena(n) │ | + | |
- | │ 120 locate30,21:print" "; │ | + | |
- | │ 130 locate30,21:input"Будем продолжать (да/нет)";yes$ │ | + | |
- | │ 140 if yes$="да" or yes$="ДА" or yes$="Да" then 50 │ | + | |
- | │ 150 print "Общая сумма";s;"руб. Заплатите в кассу!" │ | + | |
- | │ 160 data 5 │ | + | |
- | │ 170 data "журнал <Мурзилка>",40,"аквариум",400 │ | + | |
- | │ 180 data "булочка с изюмом",45,"джинсы",17000 │ | + | |
- | │ 190 data "шоколад <milki way>",250 │ | + | |
- | └───────────────────────────────────────────────────────┘ | + | |
- | В работе программиста с массивами часто необходимо найти | + | Сделаем программу "Электронный продавец", используя массивы. |
- | максимальный (минимальный) элемент массива, упорядочить | + | Это поможет упростить нахождение цены купленного продукта, уменьшит объем программы при большем количестве предлагаемых товаров: |
- | (отсортировать) массив по возрастанию (убыванию), по алфавиту | + | <code> |
- | (для текстового массива). Поучимся это делать: | + | 10 color15,1:screen0:keyoff:width80:s=0 |
+ | 20 read kol:dim towar$(kol),cena(kol) | ||
+ | 30 for k=1 to kol:read towar$(k),cena(k):next | ||
+ | 40 '----- прочли данные ------ начинаем цикл ----- | ||
+ | 50 cls:print "М Е Н Ю:" | ||
+ | 60 for k=1 to kol:locate 0,k+1:print k;towar$(k); | ||
+ | 70 locate 30,k+1:print cena(k);:next | ||
+ | 80 locate30,21:input"Введите выбранный номер";n | ||
+ | 90 locate30,21:print" "; | ||
+ | 100 locate30,21:input"Сколько штук берете";t | ||
+ | 110 s=s+t*cena(n) | ||
+ | 120 locate30,21:print" | ||
+ | 130 locate30,21:input"Будем продолжать (да/нет)";yes$ | ||
+ | 140 if yes$="да" or yes$="ДА" or yes$="Да" then 50 | ||
+ | 150 print "Общая сумма";s;"руб. Заплатите в кассу!" | ||
+ | 160 data 5 | ||
+ | 170 data "журнал <Мурзилка>",40,"аквариум",400 | ||
+ | 180 data "булочка с изюмом",45,"джинсы",17000 | ||
+ | 190 data "шоколад <milki way>",250 | ||
+ | </code> | ||
- | Найдем максимальный элемент массива. (Заполнить массив из DATA | + | В работе программиста с массивами часто необходимо найти максимальный (минимальный) элемент массива, упорядочить (отсортировать) массив по возрастанию (убыванию), по алфавиту (для текстового массива). Поучимся это делать: |
- | или случайными числами я предоставляю самому читателю. Для | + | |
- | этого отводятся строки 20-40) | + | |
- | Чтобы найти максимальный элемент, мы заведем переменную MA, | + | |
- | куда вначале поместим 0-й элемент из массива. Просмотим по | + | |
- | очереди все остальные элементы, и если встретится больший MA, | + | |
- | запомним в MA уже его. Таким образом, просмотрев весь массив, | + | |
- | мы будем иметь в MA максимальный элемент: | + | |
- | ┌──────────────────────────────────────────┐ | + | |
- | │ 10 dim a(19) │ | + | |
- | │ . . . │ | + | |
- | │ 50 ma=a(0) │ | + | |
- | │ 60 for k=1 to 19:if a(k)>ma then ma=a(k) │ | + | |
- | │ 70 next:print"Максимум=";ma │ | + | |
- | └──────────────────────────────────────────┘ | + | |
- | Иногда нужно найти не только максимальное число в массиве, но | + | Найдём максимальный элемент массива. (Заполнить массив из ''DATA'' или случайными числами я предоставляю самому читателю. Для этого отводятся строки 20–40) |
- | и узнать его номер.(Прежде, чем смотреть решение, попытайтесь | + | |
- | это сделать сами.) | + | |
- | Для этого заведем переменную N, куда вначале занесем номер | + | Чтобы найти максимальный элемент, мы заведём переменную MA, куда вначале поместим 0–й элемент из массива. Просмотрим по очереди все остальные элементы, и если встретится больший MA, запомним в MA уже его. Таким образом, просмотрев весь массив, мы будем иметь в MA максимальный элемент: |
- | 0-го элемента, а при обновлении MA будем запоминать новый | + | <code> |
- | номер (k): | + | 10 dim a(19) |
- | ┌──────────────────────────────────────────────┐ | + | … |
- | │ 10 dim a(19) │ | + | 50 ma=a(0) |
- | │ . . . │ | + | 60 for k=1 to 19:if a(k)>ma then ma=a(k) |
- | │ 50 ma=a(0):n=0 │ | + | 70 next:print"Максимум=";ma |
- | │ 60 for k=1 to 19:if a(k)>ma then ma=a(k):n=k │ | + | |
- | │ 70 next:print"Максимум=";ma;"по номеру";n │ | + | |
- | └──────────────────────────────────────────────┘ | + | |
</code> | </code> | ||
+ | Иногда нужно найти не только максимальное число в массиве, но и узнать его номер.(Прежде, чем смотреть решение, попытайтесь это сделать сами.) | ||
+ | |||
+ | Для этого заведём переменную N, куда вначале занесём номер 0–го элемента, а при обновлении MA будем запоминать новый номер (k): | ||
+ | <code> | ||
+ | 10 dim a(19) | ||
+ | … | ||
+ | 50 ma=a(0):n=0 | ||
+ | 60 for k=1 to 19:if a(k)>ma then ma=a(k):n=k | ||
+ | 70 next:print"Максимум=";ma;"по номеру";n | ||
+ | </code> | ||
====== Ссылки ====== | ====== Ссылки ====== | ||
Строка 1135: | Строка 1014: | ||
- | {{tag>MSX BASIC Book}} | + | {{tag>Programming MSX BASIC}} |