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

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


msx:basic_for_beginners:basic_for_beginners

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
msx:basic_for_beginners:basic_for_beginners [2019-06-23 16:44]
GreyWolf [Урок 8]
msx:basic_for_beginners:basic_for_beginners [2022-05-09 00:46] (текущий)
GreyWolf [Ссылки]
Строка 810: Строка 810:
  
 ====== Урок 8 ====== ====== Урок 8 ======
-FIXME 
  
-Представьте ​ себе ​ случай, ​ когда ​ одинаковые ​ действия ​ нужно выполнить для множества ​ данных. ​ Например, ​ каждое ​ из  20-ти чисел нужно увеличить в 2 раза. Ясно, ​ что ​ эту ​ работу ​ нужно делать в цикле. Для этого есть несколько способов:​+Представьте себе случай,​ когда одинаковые действия нужно выполнить для множества данных. Например,​ каждое из 20ти чисел нужно увеличить в 2 раза. Ясно, что эту работу нужно делать в цикле. Для этого есть несколько способов:​
  
-Первый способ очень прост. Мы в  цикле ​ запрашиваем ​ данные у пользователя ​ и  тут ​ же  их  обрабатываем. ​ Например, ​  ​пусть программа сложит 10 чисел, введённых пользователем:​+Первый способ очень прост. Мы в цикле запрашиваем данные у пользователя и тут же их обрабатываем. Например,​ пусть программа сложит 10 чисел, введённых пользователем:​
 <​code>​ <​code>​
 10 S=0:for n=1 to 10 10 S=0:for n=1 to 10
Строка 822: Строка 821:
 </​code>​ </​code>​
  
-Если ​ данные ​ заранее ​ известны ​  ​программисту, ​  ​их   ​удобнее поместить в программу,​ а не запрашивать командой ''​INPUT''​. Делают это с помощью команд ''​DATA''​ (данные) и ''​READ''​ (читать):​ +Если данные заранее известны программисту,​ их удобнее поместить в программу,​ а не запрашивать командой ''​INPUT''​. Делают это с помощью команд ''​DATA''​ (данные) и ''​READ''​ (читать):​ 
-После слова ''​DATA'' ​ размещаются ​ через ​ запятую ​ нужные ​ данные. +После слова ''​DATA''​ размещаются через запятую нужные данные. 
-После слова ''​READ''​ стоит имя переменной ​ (или ​ несколько, ​ через запятую),​ куда нужно занести очередное данное. Не  обязательно все данные размещать в  одной ​ строке ​ программы. ​ ''​DATA'' ​ могут находиться в любом месте программы. Нужно только помнить,​ что ''​READ''​ считывают из ''​DATA'',​ начиная с самой первой встреченной в программе и до самой последней подряд. ​ Если команд ''​READ'' ​ больше,​ чем ''​DATA'',​ то будет выдано сообщение об ошибке (OUT OF  DATA  ​- ​ЗА ПРЕДЕЛАМИ ДАННЫХ). Если данные считываются в цикле, то  это+После слова ''​READ''​ стоит имя переменной (или несколько,​ через запятую),​ куда нужно занести очередное данное. Не обязательно все данные размещать в одной строке программы. ''​DATA''​ могут находиться в любом месте программы. Нужно только помнить,​ что ''​READ''​ считывают из ''​DATA'',​ начиная с самой первой встреченной в программе и до самой последней подряд. Если команд ''​READ''​ больше,​ чем ''​DATA'',​ то будет выдано сообщение об ошибке (OUT OF DATA — ЗА ПРЕДЕЛАМИ ДАННЫХ). Если данные считываются в цикле, то это
 значит,​ что число повторений больше,​ чем данных. значит,​ что число повторений больше,​ чем данных.
  
-Посмотрите предыдущий пример с  использованием ​ ''​READ'' ​ и  ''​DATA'':​ +Посмотрите предыдущий пример с использованием ''​READ''​ и ''​DATA'':​ 
-┌────────────────────────────────────────┐ +<​code>​ 
-│ 10 S=0:for n=1 to 10:read a:​S=S+a:​next ​ +10 S=0:for n=1 to 10:read a:​S=S+a:​next 
-│ 20 print "​Сумма всех чисел =";​S ​       │ +20 print "​Сумма всех чисел =";S 
-│ 30 data 1,​4,​23,​11,​4,​52,​4,​2,​5,​2 ​        │ +30 data 1,​4,​23,​11,​4,​52,​4,​2,​5,​2 
-└────────────────────────────────────────┘+</​code>​
  
-Нередко бывает,​ что данные нужно обработать вторично. Но  ведь +Нередко бывает,​ что данные нужно обработать вторично. Но ведь после первой обработки ​''​READ'' ​установлен на  последнюю ​''​DATA''​!
-после первой обработки ​ READ  установлен ​ на  последнюю ​ DATA! +
-Чтобы ​ его ​ переустановить ​ на  начало, ​ используется ​ команда +
-RESTORE (переустановка). Если нужно повторить обработку данных +
-не с самого начала программы,​ а с определенной ​ строки, ​ после +
-RESTORE пишут номер ​ строки, ​ где ​ начинаются ​ нужные ​ данные.+
  
-Например,​ чтобы ​звездочка ходила ​по кругу зададим ей координа+Чтобы его переустановить на началоиспользуется команда ​''​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  ​читает ​ не  ​только +Например,​ чтобы звёздочка ходила по кругу зададим ей координаты в ''​DATA''​а когда опишем полную окружностьсделаем ''​RESTORE''​
-числовые, но и текстовые величины, приведу программу медленной +<​code>​ 
-(буква за буквой) печати текстов ​которые  записаны ​ в  DATA+10 color15,1,1:screen1:keyoff:xs=0:ys=0 
-┌────────────────────────────────────────────────────────────┐ +20 for i=1 to 21: read xn,yn:locate xn,​yn:​print"​*"​ 
-│ 10 screen0:width80:​keyoff ​                                 │ +30 locate xs,ys:print" ";:xs=xn:ys=yn:next 
-│ 20 read n:'​Взяли количество строк ​                         │ +40 restore:goto20 
-│ 30 for i=1 to n:read a$:'​Взяли текст строки ​               │ +50 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21 
-│ 40 for k=1 to len(a$):​b$=mid$(a$,k,1):'​взяли букву ​        │ +60 data 14,20, 12,18, 10,15, 9,12,  9,9,   ​10,​7, ​ 12,4 
-│ 50 print b$;:fork=0to50:next:'поставили букву и задержались│ +70 data 14,2,  17,1,  20,1,  23,2,  25,3,  27,5,  29,8 
-│ 60 next:​d$=input$(1):'​Написали строку. Ждем нажатия клавиши│ +</​code>​ 
-│ 70 print:​next:'​перевели строку ​и повторим со следующей     │ +Здесь одним ''​READ''​ читаем 2 данных XN и YN. Старые координаты (для стирания) ​держим в переменных XS,YS. 
-│ 80 print:​print"​Дo свидания":​end:'​Закончив, попрощались     │ +Кстати, ''​SCREEN1'' ​в этом фрагменте выбран из тех соображений, что в нем каждое знакоместо — квадрат. В ''​screen 0'' ​окружность превращается в эллипстак как ​знакоместо ​заужено по X.
-│ 90 '​---------------- сам ​текст ----------------------- ​    │ +
-│ 100 data 4,"​Однажды, в студеную ​зимнюю пору" ​              │ +
-│ 110 data "Я из лесу вышел, был сильный мороз." ​            │ +
-│ 120 data "​Гляжу, поднимается медленно ​в гору" ​             │ +
-│ 130 data "​Лошадка, везущая хворосту воз." ​                 │ +
-└────────────────────────────────────────────────────────────┘ +
-Вы поняли, для чего стоит 4  в  100-й ​ строке?​Правильно,  для +
-первого READ'​а.+
  
-READ и DATA - очень ​удобны, но лишь в  тех  ​нечастых  ​случаях, +В качестве следующего примера,​ где ''​READ'' ​читает не только числовые, но и текстовые величины, приведу программу медленной (буква за буквой) печати текстов, которые записаны в ''​DATA'':​ 
-когда все данные нужно читать и  обрабатывать  ​подряд.  А  как +<​code>​ 
-быть, когда надо через одно? А если с конца в начало+10 screen0:​width80:​keyoff 
 +20 read n:'​Взяли количество строк 
 +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''​ — очень удобныно лишь в тех нечастых ​случаяхкогда все данные нужно ​читать и обрабатывать подряд. ​А как ​быть, когда надо ​через одно? А если с конца в начало?
-памяти,​ где хранятся пронумерованные данные. ​ У  массива ​ есть +
-имя. Например,​ массив А. Но в отличие от переменной с именем А, +
-в массиве под этим именем ​хранится ​не одно ​число, ​а несколько. +
-По  имени ​ массива ​ и  номеру ​ можно ​ получить ​ любое ​ данное. +
-Напримересли мы хотим напечатать 20-е число из массива ​ WWW, +
-то мы напишем: print www(20) . Для того, чтобы запомнить число +
-в нужное место массива, ​нужно ​как ​и с переменной ​ использовать +
-присваивание:​ 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-й строке печатаем в обратном порядке.+
  
-Если программа попытается ​использовать элемент массива с номе- +Во многих задачах вас выручат массивы. Массив — это ​табличка в памяти,​ где хранятся пронумерованные данные. У массива ​есть имя. Например, массив А. Но в отличие от переменной с именем А, в массиве под этим именем хранится не одно число, а несколько.
-ром, большим, чем  объявлено  ​в ​ DIM,  ​то  Бейсик  ​сообщит  об +
-ошибке: "​SUBSCRIPT OUT OF RANGE" или "​ИНДЕКС ЗА ПРЕДЕЛАМИ РЯДА"​.+
  
-Составим ​такую программупрограмма ​заносит из DATA  в  ​массив +По имени массива и номеру можно ​получить любое данное. Например, если ​мы хотим напечатать 20–е число ​из массива WWW, то мы напишем: ''​print www(20)''​ . Для того, ​чтобы запомнить число в нужное место ​массива,​ нужно как и с переменной использовать присваивание: ''​www(20)=62.11''​. Номер элемента массива может быть записан не только числом, но и переменной,​ в которой ​находится это число. Это позволяет использовать массив ​в цикле, где индекс (номер в скобках) меняет своё значение. Например,​ посмотрите, как выполняется такая задача:​ программа получает ​от пользователя 10 чисел, а затем печатает их в строку в обратном порядке:​ 
-10 чисел и печатает в одну строку на экран, а затем ​все четные +<​code>​ 
-делит на и снова весь массив ​печатает на экран одной строкой. +10 dim a(9) 
-┌──────────────────────────────────────────────────┐ +20 for i=0 to 9:input a(i):next 
-│ 10 dim a(9)                                      │ +30 for i=to 0 step -1:print a(i):next 
-│ 20 for n=0 to 9:read a(n):print a(n);:next       │ +</​code>​ 
-│ 30 for n=to 9:if a(n) mod 2=then a(n)=a(n)/2 │ +Как видитепрограмма несложная. Остаются неясными детали:​ В 10–й строке стоит команда ''​DIM''​которая объявляет номер последнего элемента массива. С этого момента Бейсик зарезервировал 10 (от 0 до 9) элементов и заполнил их нулями. В 20–строке вместо нулей мы ''​INPUT''​ заносим новые значенияа в 
-│ 40 print a(n);:next                              │ +30–й строке печатаем в обратном порядке.
-│ 50 data 1,4,23,11,4,​52,​4,​2,​5,​2 ​                  │ +
-└──────────────────────────────────────────────────┘+
  
-В 30-й строке  ​проверяется, ​ четное ​ ли  число ​ (  для ​ четных +Если программа попытается использовать элемент массива с номером, большим, чем объявлено ​в ''​DIM''​, то Бейсик сообщит об ошибке: "​SUBSCRIPT OUT OF RANGE" ​или "​ИНДЕКС ЗА ПРЕДЕЛАМИ РЯДА"​.
-остаток от деления на 2 равен 0 ). Если четное,​ то делим на 2. +
-В 40-й строчке ​печатается ​a(n), независимо от того, делили его +
-на 2 или нет. +
-У вас ​может возникнуть вопрос: ​ почему  в  40-й  ​строке ​ после +
-окончания печати не стоит команда END? Дело в том,  что  ​когда +
-окончится цикл, программа перейдет ​на последнюю50-ю  строку, +
-и, ничего не сделав, закончится. (Команда ​ DATA  не  выполняет +
-никаких действий. Она просто хранит данные для ​ READ.  ​Поэтому +
-DAT'ы можно размещать в любом месте программы.)+
  
-Попробуем с помощью массивов ​ улучшить ​ программу, ​ в  которой +Составим такую программу:​ программа заносит из ''​DATA''​ в массив 10 чисел и печатает в одну строку на экран, а затем все чётные делит на 2 и снова весь массив печатает на экран одной строкой. 
-звездочка движется по  кругу. ​ Занесем  координаты ​ в  массив. +<​code>​ 
-Обращение к массиву ​ происходит ​ быстрее, ​ чем ​ READ,  поэтому +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 
-┌────────────────────────────────────────────────────────┐ +40 print a(n);:​next 
-│ 10 color15,​1,​1:​screen1:​keyoff:​xs=0:​ys=0 ​               │ +50 data 1,​4,​23,​11,​4,​52,​4,​2,​5,​2 
-│ 20 for i=1 to 21: read x(i),​y(i):​next ​                 │ +</​code>​ 
-│ 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 ​        │ +В 30–й строке проверяется,​ чётное ли число (для чётных остаток от деления на 2 равен 0 ). Если чётное,​ то делим на 2. 
-│ 50 goto20 ​                                             │ +В 40–й строчке печатается a(n), независимо от того, делили его на 2 или нет. 
-│ 60 data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21 +У вас может возникнуть вопрос:​ почему в 40–й строке после окончания печати не стоит команда END? Дело в том, что когда окончится цикл, программа перейдёт на последнюю,​ 50–ю строку,​ и, ничего не сделав,​ закончится. (Команда ''​DATA''​ не выполняет никаких действий. Она просто хранит данные для ''​READ''​. Поэтому команды ''​DATA''​ можно размещать в любом месте программы.) 
-│ 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�│�� +Попробуем с помощью массивов улучшить программу,​ в которой звёздочка движется по кругу. Занесём координаты в массив. 
-└────────────────────────────────────────────────────────┘+Обращение к массиву происходит быстрее,​ чем ​''​READ''​, поэтому движение ускорится. Кроме того, можно пустить звёздочку в обратном направлении:​ 
 +<​code>​ 
 +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 
 +</​code>​
  
-Если обойтись без FOR в 30 строке,​ сделать цикл по старинке,​ с +Если обойтись без ​''​FOR'' ​в 30 строке,​ сделать цикл по старинке,​ с помощью ​''​GOTO''​, то можно организовать одновременное движение двух звёздочек по– и против часовой стрелки:​
-помощью GOTO, то  можно ​ организовать ​ одновременное ​ движение +
-двух звездочек пои против часовой стрелки:​+
 <​code>​ <​code>​
 10 color15,​1,​1:​screen1:​keyoff:​x1=0:​y1=0:​x2=0:​y2=0 10 color15,​1,​1:​screen1:​keyoff:​x1=0:​y1=0:​x2=0:​y2=0
Строка 964: Строка 919:
 70 x2=x(k):​y2=y(k):​k=k-1:​if k=1 then k=21 70 x2=x(k):​y2=y(k):​k=k-1:​if k=1 then k=21
 80 goto40 80 goto40
-90  data 29,11, 29,14, 27,17, 25,19, 23,20, 20,21, 17,21+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 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 110 data 14,2,  17,1,  20,1,  23,2,  25,3,  27,5,  29,8
 </​code>​ </​code>​
-Надеюсь,​ без объяснений понятно,​ как ​ ​в ​ 50-й  строке ​ делают,​ +Надеюсь,​ без объяснений понятно,​ как ​ 50й строке делают,​ чтобы дойдя до 21 переменная t снова стала =1, а в 70й строке k, дойдя до 1 снова становится =21. 
-чтобы дойдя до 21 переменная t снова стала =1, а в 70-й строке +В строке 60 использована "​Ш",​ а не "​*",​ чтобы в разные стороны двигались разные фигуры.
-k, дойдя до 1 снова становится =21. +
-В строке 60 использована "​Ш",​ а не "​*",​ чтобы в разные стороны +
-двигались разные фигуры.+
 Переменные x1,y1 и x2,y2 хранят координаты места для стирания. Переменные x1,y1 и x2,y2 хранят координаты места для стирания.
  
-█ Довольно простым ​ заданием ​ будет ​ внести ​ в  эту  программу +<WRAP box> 
-█ такие изменения,​ чтобы звездочки двигались не по окружности,​ +Довольно простым заданием будет внести в ту программу такие изменения,​ чтобы звёздочки двигались не по окружности,​ а по другой траектории. Для этого нужно изменить координаты положений звёздочки в строках 90110. Если при этом точек станет больше,​ то изменится количество пар координат.
-█ а по другой траектории. Для этого нужно изменить ​ координаты +
-█ положений ​ звездочки ​ в  строках ​ 90-110.  Если ​ при ​  ​этом +
-█ точек станет больше,​ то изменится количество пар ​ координат+
-█ Не забудьте внести изменения в строки 20,​30,​50,​70, ​ где ​ это +
-█ количество учитывается.+
  
 +Не забудьте внести изменения в строки 20,​30,​50,​70,​ где это количество учитывается.
 +</​WRAP>​
  
-Массивы можно, конечно,​ использовать не только для ​ координат,​ 
-но и для хранения любых других ​ данных. ​ Попробуем ​ с  помощью 
-массивов составить личный ​ телефонный ​ справочник. ​ В  массиве 
-FA$(9) будем держать фамилии 10-ти ​ друзей. ​ В  массиве ​ NO(9) 
-будем держать их телефоны. Программа попросит ввести ​ фамилию,​ 
-разыщет ее в массиве FA$ и по тому же индексу ​ из  массива ​ NO 
-возьмет телефонный номер. Вы, конечно же, будете ​ использовать 
-не 10, а нужное вам число друзей и настоящие их фамилии с  те- 
-лефонами:​ 
-┌───────────────────────────────────────────────────────┐ 
-│ 10 dim fa$(9),​no(9) ​                                  │ 
-│ 20 for k=0 to 9:read fa$(k),​no(k):​next ​               │ 
-│ 30 input "​Введите фамилию";​f$ ​                        │ 
-│ 40 for k=0 to 9:if f$=fa$(k) then 60                  │ 
-│ 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-й 
-строки. 
  
-█ Сделайте программу, которая  ​спрашивает  название  школьного +Массивы можно, конечно, использовать не только для координат, но и для хранения любых других ​данных.
-█ предмета ​и печатает имя-отчество преподавателя.+
  
-Сделаем программу "​Электронный продавец", ​ используя ​ массивы. +Попробуем с помощью массивов составить личный телефонный справочник. В массиве 
-Это поможет упростить ​ нахождение ​ цены ​ купленного ​ продукта,​ +FA$(9) будем держать фамилии 10–ти друзей. В массиве NO(9) будем держать их телефоны. Программа попросит ввести фамилию,​ разыщет её в массиве FA$ и по тому же индексу из массива NO возьмёт телефонный номер. Вы, конечно же, будете использовать не 10, а нужное вам число друзей и настоящие их фамилии с телефонами:​ 
-уменьшит объем программы при большем ​ количестве ​ предлагаемых +<​code>​ 
-товаров:​ +10 dim fa$(9),​no(9) 
-┌───────────────────────────────────────────────────────┐ +20 for k=0 to 9:read fa$(k),​no(k):​next 
-│ 10 color15,​1:​screen0:​keyoff:​width80:​s=0 ​              │ +30 input "​Введите фамилию";​f$ 
-│ 20 read kol:dim towar$(kol),​cena(kol) ​                │ +40 for k=0 to 9:if f$=fa$(k) then 60 
-│ 30 for k=1 to kol:read towar$(k),​cena(k):​next ​        │ +50 next:​print"​Нет в справочнике!":​goto 30 
-│ 40 '----- прочли данные ------ начинаем цикл -----    │ +60 print"​Телефон ";​no(k):​goto 30 
-│ 50 cls:print "М Е Н Ю:" ​                              │ +70 data Петров,​29045,​Коваль,​23433,​Павлов,​23321 
-│ 60 for k=1 to kol:locate 0,k+1:print k;​towar$(k); ​    │ +80 data Сурков,​21412,​Моргунов,​29981,​Мышкин,​24337 
-│ 70 locate 30,​k+1:​print cena(k);:​next ​                 │ +90 data Ауль,​22221,​Монахов,​27725,​Робов,​21111,​Пак,​23324 
-│ 80 locate30,​21:​input"​Введите выбранный номер";​n ​      │ +</​code>​ 
-│ 90 locate30,​21:​print" ​                      "; ​       │ +В 20–й строке заполнили массивы из ''​DATA''​. Обратите внимание,​ в ''​DATA''​ фамилии не стоят в кавычках. Это допускается с текстами только в случае,​ если текст состоит из одного слова без запятых или других знаков. В иных случаях текст в ''​DATA''​ должен заключаться в кавычки. 
-│ 100 locate30,​21:​input"​Сколько штук берете";​t ​         │ + 
-│ 110 s=s+t*cena(n) ​                                    │ +В 40–й строке в цикле просматриваем все фамилии из массива,​ и если найдём совпадающую с введённой фамилией,​ то переходим на строку 50, где печатаем телефон из массива no с таким же индексом K, как и найденная фамилия. Если же фамилию в массиве не нашли, то после окончания цикла сработает ''​print''​ из 50–й строки. 
-│ 120 locate30,​21:​print" ​                      "; ​      │ + 
-│ 130 locate30,​21:​input"​Будем продолжать (да/​нет)";​yes$ ​ +<WRAP box> 
-│ 140 if yes$="​да"​ or yes$="​ДА"​ or yes$="​Да"​ then 50    │ +Сделайте программу,​ которая спрашивает название школьного предмета и печатает имя–отчество преподавателя. 
-│ 150 print "​Общая сумма";​s;"​руб. Заплатите в кассу!" ​  │ +</​WRAP>​ 
-│ 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)+Найдём максимальный элемент массива. (Заполнить массив из ''​DATA''​ или случайными числами я предоставляю самому читателю. Для этого отводятся строки 2040)
  
-Чтобы найти максимальный элемент,​ мы  заведём ​ переменную ​ MA, куда вначале поместим 0-й элемент ​ из  массива. Просмотрим по очереди все остальные элементы,​ и если встретится больший ​ MA, запомним в MA уже его. Таким образом,​ просмотрев весь ​ массив,​ мы будем иметь в MA максимальный элемент:​+Чтобы найти максимальный элемент,​ мы заведём переменную MA, куда вначале поместим 0й элемент из массива. Просмотрим по очереди все остальные элементы,​ и если встретится больший MA, запомним в MA уже его. Таким образом,​ просмотрев весь массив,​ мы будем иметь в MA максимальный элемент:​
 <​code>​ <​code>​
 10 dim a(19) 10 dim a(19)
Строка 1061: Строка 994:
 </​code>​ </​code>​
  
-Иногда нужно найти не только максимальное число в массиве, ​ но +Иногда нужно найти не только максимальное число в массиве,​ но и узнать его номер.(Прежде,​ чем смотреть решение,​ попытайтесь это сделать сами.)
-и узнать его номер.(Прежде,​ чем смотреть решение, ​ попытайтесь +
-это сделать сами.) ​+
  
-Для этого заведём переменную N,  куда ​ вначале ​ занесём ​ номер 0-го элемента,​ а при ​ обновлении ​ MA  будем ​ запоминать ​ новый номер (k):+Для этого заведём переменную N, куда вначале занесём номер 0го элемента,​ а при обновлении MA будем запоминать новый номер (k):
 <​code>​ <​code>​
 10 dim a(19) 10 dim a(19)
Строка 1083: Строка 1014:
  
  
-{{tag>​MSX BASIC Book}} +{{tag>Programming ​MSX BASIC}}
msx/basic_for_beginners/basic_for_beginners.1561297472.txt.gz · Последние изменения: 2019-06-23 16:44 — GreyWolf