Инструменты пользователя

Инструменты сайта


msx:basic_for_beginners:basic_for_beginners

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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 (а номер строки не умножать):​+Если хотим растянуть по 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  на   в  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=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>​ 
 +Вы понялидля чего стоит ​в 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 чисел и печатает в одну строку на экран, а затем ​все чётные делит на и снова весь массив ​печатает на экран одной строкой. 
-памяти,​ где хранятся ​пронумерованные данные. ​ У  ​массива ​ есть +<​code>​ 
-имя. Например, массив А. Но в отличие от переменной с именем А, +10 dim a(9) 
-в массиве под этим именем хранится не одно число, а несколько. +20 for n=0 to 9:read a(n):print a(n);:next 
-По  ​имени  массива  и  номеру ​ можно ​ получить  любое  ​данное. +30 for n=to 9:if a(n) mod 2=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=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=to 21: read x(i),y(i):next 
-│ 20 for n=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=to 9:if a(nmod 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,2020,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''​, то можно организовать одновременное движение двух звёздочек ​по– и против ​часовой стрелки: 
-остаток от деления на равен 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}}
msx/basic_for_beginners/basic_for_beginners.1561276773.txt.gz · Последние изменения: 2019-06-23 10:59 — GreyWolf