Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
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> |
- | делит на 2 и снова весь массив печатает на экран одной строкой. | + | 10 dim a(9) |
- | ┌──────────────────────────────────────────────────┐ | + | 20 for i=0 to 9:input a(i):next |
- | │ 10 dim a(9) │ | + | 30 for i=9 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=0 to 9:if a(n) mod 2=0 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> |
- | █ такие изменения, чтобы звездочки двигались не по окружности, | + | Довольно простым заданием будет внести в ту программу такие изменения, чтобы звёздочки двигались не по окружности, а по другой траектории. Для этого нужно изменить координаты положений звёздочки в строках 90–110. Если при этом точек станет больше, то изменится количество пар координат. |
- | █ а по другой траектории. Для этого нужно изменить координаты | + | |
- | █ положений звездочки в строках 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'' или случайными числами я предоставляю самому читателю. Для этого отводятся строки 20–40) |
- | Чтобы найти максимальный элемент, мы заведём переменную 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}} |