Кафедра физико-математических дисциплин
Государственное образовательное учреждение Невинномысский химический колледж
У...
90 downloads
422 Views
764KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Кафедра физико-математических дисциплин
Государственное образовательное учреждение Невинномысский химический колледж
Учебное пособие
«Элементы программирования на языке QuickBASIC» Часть 1 для студентов первого курса всех специальностей
Невинномысск 2006
Аннотация Настоящее пособие адресовано студентам первого курса всех специальностей, изучающих элементы программирования на языке QuickBASIC в рамках общеобразовательной дисциплины «Информатика». Пособие может быть использовано студентами, как на уроках, так и для самостоятельного изучения языка. Причем, оно применимо как в твердой копии, так и в электронном виде, первое – предпочтительнее. Если студент пропустил занятие, то настоящее пособие для него – сборник индивидуальных консультаций. Пособие адресовано и преподавателям, осваивающим содержание и методику преподавания дисциплины. Часть 1 содержит учебный материал, определенный рабочей программой: линейные структуры, разветвляющиеся структуры, циклы, массивы. В части 2 будет рассмотрена графика в QuickBASIC и функции обработки символьных переменных. Приложения: Магнитный вариант настоящего пособия «EL_LEKC» - электронные лекции, бейсик - папка «Электронные лекции» - методическая разработка «Уроки информатики» - методическая разработка составители Капустин Е.И. Васько О.Н.
2
Оглавление № Наименование разделов и тем занятий зан . 1 Среда Qbasic. Освоение клавиатуры, набор знаков и символов. 2 Переменные и константы, имена переменных. Присвоение значений переменным. 3 Стандартные функции. Набор выражений, содержащих функции. 4 Программы линейной структуры, принципы составления, отладки, тестирования 5 Реализации разветвляющихся алгоритмов. Форматы оператора IF…THEN 6 Операторы перехода. Организация простейших меню. 7 Составление и отладка программ разветвляющихся структур. 8 Понятие о циклах. Организация циклов с использованием IF…THEN. 9 Составление, отладка и тестирование программ циклических структур. 10 Организация циклов с использованием FOR…NEXT. 11 Вложенные циклы. Составление и отладка более сложных циклических программ 12 Организация подпрограмм в Qbasic. 13 Итоговое занятие по теме. Составление и отладка более сложных программ 14 Одномерные массивы: определение, заполнение, печать. 15 Типовые задачи обработки одномерных массивов 16 Более сложные задачи обработки одномерных массивов 17 Двумерные массивы: определение, заполнение, печать. 18 Типовые задачи обработки двумерных массивов. 19 Реализация более сложных алгоритмов обработки двумерных массивов 20 Итоговое занятие. Программы, содержащие одномерные и двумерные массивы, подпрограммы 21 Обязательная контрольная работа: составление и отладка программ по изученным темам.
3
М Стр Календарн . сроки изучения 1
6
13.01-17.01
1
10 20.01-24.01
1
16 20.01-24.01
1
20 27.01-31.01
1
24 3.02-7.02
1 1
30 3.02-7.02 35 10.02-14.02
2
39 17.02-21.02
2
44 17.02-21.02
2 2
51 24.02-28.02 55 3.03-7.03
2 2
60 3.03-7.03 68 10.03-14.03
3
74 17.03-21.03
3 3
79 17.03-21.03 88 24.03-28.03
4 4 4
92 31.03-4.04 95 31.03-4.04 99 7.04-11.04
4
107 14.04-18.04
4
114 14.04-18.04
Предисловие для студента Перед Вами пособие по начальному освоению самого простого языка высокого уровня QuickBASIC, изучаемого в колледже студентами первого курса в рамках дисциплины «Информатика». Это – пособие, а значит должно быть использовано Вами комплексно: занятия на уроках и самостоятельная работа с пособием. В нем доступно изложены «первые шаги» в изучении языка. Вопросы описания операторов освещены кратко, но вполне доступно. А вот примеров приведено больше, чем в любом другом учебнике, как с программами, так и для самостоятельной разработки. Цель такой методики построения пособия: заинтересовать студента изучением действующих программ и разработкой своих по приводимым текстам задач. Для удобства работы студента с пособием рекомендуется проделать следующее. Установить на свой домашний ПК среду QuickBASIC и оболочку Norton Commander. Корректный вывод символов кириллицы в современных ОС, не поддерживающих DOS, возможен только после запуска драйвера keyrus.com, находясь непосредственно в оболочке NC. В свои документы скопируйте магнитный вариант этого пособия с тем, чтобы Вы всегда и в любое время обратиться к нему. Магнитным приложением к пособию являются т.н. электронные лекции, которые будут использованы на уроках. Но продолжить их изучение можно и дома, установив папку с бейсик – файлами «ELLEKC». О том, как пользоваться этими лекциями, расскажет на уроках преподаватель, об этом можно прочитать и в пособии. Нужно ли делать твердую копию этого пособия? Если Вы посещаете все занятия, активно на них работаете, хорошо понимаете смысл, форматы операторов и функций, то дома возможно пользоваться только электронным вариантом. Если Вы пропустили занятие, то необходимо распечатать соответствующий «ИКС» и ликвидировать пробелы в знаниях и умениях с его помощью. И просьба к студентам, которые будут активно использовать это пособие. Оно формировалось в магнитном варианте в основном методом «копировать - вставить». При этом использовался богатый дидактический материал, накопленный на кафедре. Потому, не исключены повторения текстов и даже решений одной и той же задачи. Прошу Вас, если заметили такое, предложите заменить повторы аналогичной задачей, ее смысл и сценарий придумайте сами. Заранее благодарю. Если появятся вопросы по отдельным задачам и программам – обращайтесь и вы получите полноценную консультацию.
4
Предисловие для преподавателя Уважаемый коллега. Естественно Вы ознакомились с предисловием для студента, его содержание должно быть известно Вам и в какой-то мере относится к вашей работе с пособием. В особенности, заключительная просьба, обращенная к студентам. Помимо того, внимательным образом будут рассмотрены любые предложения по изменению, улучшению качества и расширению этого пособия. При обучении языку преподаватель, как правило, ориентируется на тот или иной учебник или справочник. Это пособие не похоже на учебник, Его структуру сформировал многолетний опыт преподавания курса, сотрудничество с коллегами, и просто занятие этим языком в качестве компьютерного сопровождения преподавания математики, математических исследований и просто – хобби. В пособии учебный материал разбит по занятиям, таким образом, он разделен на поурочные индивидуальные консультации студента. Студент может скопировать лишь отдельные, пропущенные им уроки, и самостоятельно проработать материал. Это разделение по занятиям полностью соответствует календарно-тематическому плану второго семестра. Уроки – главы неравнозначны по объему, трудности, насыщенности. Потому преподаватель не должен неукоснительно следовать предлагаемому таким образом разделению и объему материала. Работа над пособием продолжалась длительное время, накапливался дидактический материал, вместе с коллегами по кафедре оттачивалась методика проведения каждого урока. Считаем предлагаемый ракурс обучения основам языка оптимальным. В этой работе нет ссылок на литературу, нет даже такой страницы, т.к. считаем это пособие авторским. Для облегчения работы преподавателя еще ранее создана методическая разработка для преподавателя: на что обратить внимание, как «преподнести» тот или иной вопрос, какими примерами проиллюстрировать конструкции, операторы, функции и т.д. Мы на кафедре создали и опробовали новую форму проведения занятий по обучению языку – электронные лекции. Существует подробная методическая разработка о том, как использовать эти лекции. Сами же лекции на языке QB находятся во всех компьютерных классах, в которых преподается информатика. Желаем успехов, коллега.
5
Занятие 1. Среда QB, ее загрузка. Освоение клавиатуры, набор знаков и символов. Уважаемые студенты. Вы приступаете к изучению популярнейшего языка программирования: QBASIC. Это первое вводное занятие. Название языка программирования BASIC – это первые буквы английских слов Beginner’s All-purpose Symbolic Instruction Code (Всецелевой язык программирования для начинающих). Впрочем, на английском языке слово basic – означает основной, базовый. Созданный в начале 60-х годов прошлого веки двумя профессорами Дартмунского университета Джоном Кенеми и Томасом Куртцом, BASIC превратился в в современный язык высокого уровня, продолжая оставаться простым и доступным для всех пользователей – от любителей до профессионалов. Создание Microsoft QuickBasic (сокращенное обозначение – QB) в середине 80-х годов произвело настоящую революцию в мире BASIC. В настоящее время QB изучают все: студенты и школьники, строители и экономисты, с этого языка начинают свой путь в программирование будущие программисты. Желаем Вам успехов в изучении этого простого и интересного языка. Чтобы начать составлять первые программы на QВ необходимо ознакомиться со средой, в которой работают программы на QB. Надеемся, Вы знакомы с NC. Загрузите NC, найдите в NC каталог QBASIC (как правило, на логическом диске С) и раскройте его. Станьте курсором на стартовый файл qbasic.exe и нажмите Enter. Вы в среде QB. На некоторых компьютерах это делается проще – из меню пользователя. Освойте. Сначала прочитайте, а затем клавишей Esc отмените его. Начинаем работу! Сейчас Вам предстоит освоить набор знаков и символов в среде QB. Каждую строку начинайте с символа ‘ (на клавише с буквой Э), смысл этого будет ясен позже. Научитесь переходить с английского расклада клавиатуры на русский. Как правило, сочетание левых Ctrl Shift дает расклад «Англ», правых – «Рус». Если на Вашем компьютере это делается иначе – обратитесь к лаборанту компьютерного класса. Наберите, например, такие строки: ‘Я, студент группы ЭВМ-11 Иванов Владимир приступаю к изучению ‘языка QBASIC ‘Nevinka NHK for next randomize timer Обязательно в режиме «Англ.» уверенно освойте набор очень нужных в дальнейшем символов: ‘()+/\^*$#;:“?=При наборе текста на русском языке различайте строчные и заглавные буквы, символы на «Англ.» набирайте только строчными буквами, эту привычку Вы по достоинству оцените в дальнейшем. Клавиша Caps Look меняет расклад клавиатуры заглавные – строчные. Если надпись Caps Look подсвечена, то клавиатура в режиме – загл. 6
Всегда помните об этом. Так как чаще всего работают в режиме строчных букв, то заглавные буквы набирают с нажатой клавишей Shift. Наберите в качестве закрепления: ‘?”Невинномысск – красивый город, а НХК – лучшее, что есть в нем” Кавычки набирайте только в режиме «Англ.». Освойте работу с клавишами Home и End, став на какой-либо символ в строке. Правильно, первая переводит курсор на начало строки, вторая – на конец строки. Привычка работать с этими клавишами значительно ускорит ввод программ. А что делает с курсором клавиша Insert? Курсор _ и курсор . Исследуйте, используя клавиши Delete и Backspase, что делает их нажатие в различных режимах курсора с символами, стоящими над курсором и слева от курсора. Правильный вывод Вы сделали, поэтому курсор _ называют курсором в режиме вставки, а курсор - это курсор в режиме замены. Как правило, во всех системах работают курсором в режиме вставки, это удобно и в QB. Постарайтесь привыкнуть к этому. Следующее обязательное умение: выделение символа, слова, строки, последовательности строк. Это делается клавишами управления курсором при нажатой клавише Shift. Наберите какую либо строку. ‘”Студенты НХК самые толковые и развитые” И выделите в ней слово «толковые». Если необходимо выделить строку или часть ее, используйте клавиши Home и End при нажатой Shift. Потренируйтесь, Наберите несколько строк. ‘****Я учусь только на отлично******* ‘***screen 9:color 14,1:locate 20,40:cls ‘***pi#=4*atn(1):a=15.567:b=.124 ‘***read m,n,k: data 15,23,-9 Используя эти строки приобретите следующее очередное необходимое умение: с помощью клавиш Enter и Delete научитесь раздвигать строки – клавиша Enter (создавать между строками «пустые» строки) и удалять их – клавиша Delete. Enter – популярнейшая клавиша. Однако, в QB нажатие этой клавиши при курсоре, находящемся внутри строки, разрывает строку! А как восстановить разорванную строку? Установите это и потренируйтесь. Научимся пользоваться верхним меню. Alt – курсор в верхнем меню. Клавиши управления курсором перемещают его по меню. Esc – выход из меню. В какой-либо строке выделите слово. Верхнее меню, редактирование, копировать, Enter. Переместите курсор в другое место и снова: верхнее меню, редактирование, вставить, Enter. Увидели результат. Впрочем, операции «копировать - вставить» можно выполнять с помощью т.н. быстрых клавиш. Сочетание клавиш Ctrl и Insert проводит 7
копирование выделенного фрагмента, а сочетание Shift и Insert производит вставку этого фрагмента в то место программы, в котором находится курсор. Попробуйте. В качестве закрепления выполните упражнение. Сформируйте на экране строки, не набирая каждую из них, а используйте операции «копировать - вставить», внося изменения во вставленные строки. ‘for i = 1 to n: s1 = s1+a(i): next i ‘for j = 1 to n: s2 = s2+a(j)^2: next j ‘for k = 1 to n: s3 = s3+sqr(a(k)): next k ‘if a>b then z = a – b else z = b – a ‘if mn then z = a – b else z = b – a Получилось? Старайтесь эти операции проводить безошибочно и быстро. И будьте внимательны: точка, двоеточие, запятая, точка с запятой – очень разные символы в программировании! В этом курсе Вы будете составлять и отлаживать программы, на последующих занятиях их дорабатывать и изменять, поэтому эти программы необходимо сохранять на жестком диске. Запишите алгоритмы сохранения и открытия своих программ. Вы набрали программу, ее сохранение. Вход в верхнее меню Alt? Курсор высветил «Файл», Enter, стать на «Сохранить как…», Enter – перед Вами две панели сохранения файлов в QB. Передвижение курсора по панелям осуществляется клавишей Tab. Станьте этой клавишей на две точки нижней панели и нажмите пробел, на этой панели – каталоги диска С. Все студенты, изучающие QB, сохраняют свои файлы в каталоге ВР. Станьте курсором на этот каталог и раскройте его – клавиша Enter. Клавишей Tab станьте в верхнее меню, клавишей Delete уберите *, оставив .BAS и до точки наберите имя файла. Это буквы английского алфавита, в имени могут быть и цифры, но имя не должно содержать никаких других символов, ?.,;* и т.д. Например: masha1.bas, pavel.bas, pavel22.bas, ylia.bas и т.д. Нажмите Enter, файл сохранен. Чтобы не забыть сохраненное имя Вашего файла, запишите его в конспект. В дальнейшем через каждые 5-10 минут работы за компьютером выбирайте в «Файл» «Сохранить» и все Ваши наработки будут сохранены. Научимся сразу же и открывать свои файлы, чтобы на каждом последующем занятии снять эти проблемы. Открывать свои файлы будете по следующему алгоритму. Alt – верхнее меню, Файл, открыть. Клавишей Tab поместите курсор на две точки в правой панели и нажмите пробел. Клавишами управления курсора «найдите» каталог ВР и раскройте его – клавиша Enter. Переместитесь (клавиша Tab) на левую панель и найдите свой файл и раскройте его – клавиша Enter. Ваш файл загружен. Законспектируйте в Ваш конспект эти алгоритмы. Вы работали за компьютером. По окончанию занятия необходимо сохранить свой файл, во вкладке «файл» стать курсором на «выход» и 8
нажать Enter. Спросите у преподавателя, надо ли выключать компьютеры, если «да», то с должным умением проделать это. Задания для самостоятельной работы. -провести анализ учебной и научно – популярной литературы по различным версиям языка домашних библиотек, библиотеки колледжа; - установить на домашние компьютеры QB, закрепить полученные на занятии умения. • • • • • • • •
Чему мы научились и какие умения приобрели на первом занятии? открывать среду QB; освоили набор английских и русских букв, цифр и символов в ней; входить в верхнее меню, осуществлять перемещения курсора; выделять символы, слова, строки; копировать, вырезать выделенные фрагменты двумя способами: с использованием вкладок верхнего меню и используя «быстрые клавиши»; вставлять в нужное место программы вырезанный или скопированный объект; сохранять свои наработки на жестком диске; открывать свои файлы.
9
Занятие 2. Переменные и константы, имена переменных. Присвоение значений переменным. Чтобы приступить к составлению первых программ, на этом занятии необходимо освоить информацию и овладеть умениями не только объявленных в наименовании занятия. С чего же будут начинаться Ваши программы на QB? Экранные режимы. Оператор SCREEN _ определяет, в каком формате использовать экран. Так, если Ваша программа начинается с SCREEN 9 – это означает, что в текстовом режиме будет определено 25 строк и 80 столбцов, а в графическом 640 точек по горизонтали и 350 – по вертикали (Запишите это, во второй половине семестра будем изучать графику). SCREEN 7 – это режим текстовый 25х40, графический 320х200. Режимы 3, 8, 12 рассмотрите самостоятельно по учебникам и справочникам. На уроках мы будем работать в SCREEN 9 Цветовой режим. Оператор COLOR определяет цвет символов и цвет фона, он имеет два аргумента: первый аргумент – номер цвета символов, второй – цвет фона, например, COLOR 14,1 задаст цветовой режим: желтые символы по голубому фону. Полезно записать номера цветов. 0 – черный 1 – голубой 2 – зеленый 3 – бирюзовый 4 – красный 5 – розовый 6 – коричневый 7 – белый 8 – серый 9 – ярко голубой 10 – ярко-зеленый 11 – ярко-бирюзовый 12 – ярко-красный 13 – ярко-розовый 14 – желтый 15 – ярко-белый Вы самостоятельно определяйте режим, в котором будут работать Ваши программы. Очистка экрана – оператор CLS – очищает экран. Таким образом, каждую программу на QB рекомендуется начинать примерно так: SCREEN 9: COLOR 14,1: CLS Давайте в начале программы набирать строку: RANDOMIZE TIMER: pi = 4*ATN(1) Ее смысл будет понятен на последующих занятиях. Это начало всех наших программ: SCREEN 9: COLOR 14,1: CLS RANDOMIZE TIMER: pi = 4*ATN(1) Далее в приводимых для примера программах вместо этих строк мы будем писать: ***************Программа 12,2*****************************, 10
что означает – первый индекс – номер занятия, второй – номер программы. Освойте следующие операции. Запуск и останов программ на QB. Два способа запуска: 1) через верхнее меню: в верхнем меню выбрать «запуск» и два раза нажать Enter; 2) сочетание клавиш Shift F5. Обратите внимание, именно с клавишей Shift, а не просто F5. Прекращение выполнения программы производится программно (операторы END и STOP) – это Вы освоите на последующих занятиях и установите в их работе отличие. И т.н. «аварийный останов» - сочетание клавиш Ctrl Scroll Look. (Запомнить!) Информатика различает три вида констант: целые, действительные (вещественные) и символьные. Программы же оперируют с ПЕРЕМЕННЫМИ, которым присваиваются значения. Особое внимание – именам переменных. Имена переменных могут содержать латинские буквы и цифры, но обязательно имя начинается с буквы: a, m, aaa, b123, p3a и не содержать никаких символов: ().*,, :;? и т.д. Например, a, sss, k12, ylia, andrey, min, f567 z$, p33$ rt$ и т.д т.д. – это имена переменных. Но именами переменных не могут быть такие обозначения как: 1a, a*a, m?n и т.д. Символьные переменные должны иметь в конце записи символ $, например: a$, b22$, aaa$ и т.д. Присвоение значений переменным. В QB используют три способа присвоения значений переменным. 1.Оператор LET . Присваивает переменной конкретное действительное или символьное значение. Его форматы. LET a = 3.567: b = -.238: c = 12: ‘***это означает, что переменные a, b и с получили действительные значения. В QB собственно LET можно не вносить в программу, этот оператор воспринимается, как говорят программисты «по умолчанию», в отличие от других версий бейсика. a1 = -23.45 aa = -8.5 b = 1.48E-6: ‘**это означает, что переменная b = 1.48*10-6 , обратите на это внимание и не ошибайтесь! m$ = “Маша” : t$ = “QB”: ‘***Так присваивают значения этим оператором символьным переменным Обратите внимание на то, что знакомый нам знак « = » в программировании чаще будем называть «присвоить значение». Примеры ошибочного применения оператора LET. a = “Миша”: r$ = 1: u = “НХК” 11
Не следует думать, что справа от знака равенства может быть действительное число или символьная переменная в кавычках. Если, например, переменные a и b имеют какие-либо значения, то строка c = a + b присвоит переменной с значение их суммы. 2.Оператор INPUT присваивает значения переменным в следующих форматах: INPUT a:’**при работе программы на этой строке программа высвечивает знак «?», что означает приглашение пользователю набрать действительное значение и нажать Enter. Чтобы пользователь и сам программист знали, что же запрашивает программа, то всегда используйте следующий формат: INPUT “Введите значение коэффициента к”;k Обратите внимание, что в кавычках можно использовать любые буквы и символы, кроме самих кавычек, но вне кавычек только латинские. Одним оператором можно присваивать значения нескольким переменным. INPUT “Введите коэффициенты квадратного уравнения а, в, с”; a,b,c Вы должны через запятую набрать три действительных числа и лишь затем нажать Enter. Не ошибайтесь! INPUT “Введите Ваши имя, фамилию”; r$, f$:’**Наберем Миша, Иванов и Enter. Символьным переменным будут присвоены значения. Ошибочное использование оператора INPUT, проанализируйте почему. INPUT “Введите название Вашей группы”; s:’**Вы ввели ЭВМ-11 и получили сообщение об ошибке! INPUT “Введите температуру воздуха”;r,t,u Операторы READ – DATA. О присвоении действительных значений. DATA 3,5.67,8.9,-5.2 READ p, q, m, n Это означает, что переменные, перечисленные в операторе READ, получат следующие значения: p = 3 q = 5.67 m = 8.9 n = -5.2 Операторы DATA-READ могут быть помещены в любых частях программы: они «найдут друг друга» и между ними могут располагаться какие угодно строки, не содержащие переменных из READ. Испытайте самостоятельно, что будет, если в READ имен переменных больше, чем значений в DATA, а если иначе? Аналогично присваиваются символьные значения. DATA Юля, Маша, Оля READ a1$, a2$, a3$ Если убрать знак $ хотя бы в одной переменной получим сообщение об ошибке. 12
Настоятельно рекомендуется работать в режиме строчных латинских букв, это будет в дальнейшем Вами оценено! Научились присваивать переменным значения, а как убедиться, что такое присвоение состоялось? Знакомимся с самым популярным оператором языка. Оператор вывода PRINT. Никогда не набирайте эти 5 букв, QB сам превращает ? в PRINT. Его форматы: PRINT “Я, Иванов Игорь приступаю к изучению QB”:’**Это просто сообщение, выводимое на экран. PRINT a:’*****будет выведено на печать значение переменной a PRINT”Получите решение уравнения”;x:’**Комментарий и значение переменной х PRINT”Получите корни квадратного уравнения”;x1,x2 PRINT « t = »; t PRINT a;b;c PRINT a,b,c Выясните самостоятельно отличие этих двух конструкций. Постоянные «спутники» оператора PRINT оператор LOCATE m,n и функция TAB (n). Рассмотрим их. Оператор LOCATE m,n устанавливает курсор в позицию m,n, т.е. на mую строку и n-ый столбец. Вспомните экранные режимы, в частности, SCREEN 9 и определите какие значения Вы можете придавать m и n. Если не использовать оператор LOCATE m,n, то информация, выводимая и запрашиваемая оператором INPUT и выводимая оператором PRINT, будет размещаться в левом верхнем углу экрана с 1го столбца. Пусть Ваши программы будут хорошо оформленными, используйте такие, например, конструкции. LOCATE 10,35: INPUT”Введите а”;a LOCATE 12,36: PRINT”Получите определитель”;d LOCATE 20,40: PRINT «Тебя зовут»; t$ Функция TAB (n) Конструкция PRINT TAB(20)”НХК” выведет на экран сообщение с 20 – го столбца, а конструкция PRINT TAB(15)”a =”;a выведет сообщение чему равна переменная а с 15-го столбца. Заметим, что аргументы LOCATE пишут без скобок через запятую, аргумент TAB – в скобках. В заключение занятия – несколько «живых» программок. 2.1.Предложите пользователю ввести два числа и выведите на экран их сумму, среднее арифметическое и произведение. ***************Программа 2,1***************************** INPUT”Введите два числа”;a,b s = a + b: sa = (a + b)/2: p = a*b LOCATE 8,20: PRINT”Получите их сумму”;s PRINT TAB(20) ”Получите их среднее арифметическое”;sa LOCATE 13,20: PRINT”Получите их произведение”;p END:’***Это оператор окончания программы******* 13
Впрочем, отдельно можно было не вычислять значения переменных s, sa, p, если их значения не используются далее в программе, их вычисления организовать в операторе PRINT. ***************Программа 2,1***************************** INPUT”Введите два числа”;a,b LOCATE 8,20: PRINT”Получите их сумму”; a + b PRINT TAB(20) ”Получите их среднее арифметическое”;(a + b)/2 LOCATE 13,20: PRINT”Получите их произведение”; a*b 2.2.Составьте программу, которая бы запрашивала имя пользователя, а затем здоровалась с ним. ***************Программа 2,2***************************** LOCATE 6,20:INPUT”Введите Ваше имя”;a$ LOCATE 8,20: PRINT”Здравствуйте ”; a$ Попытайтесь составить простые программы для закрепления полученных знаний и умений. Программы, в которых присваиваются значения переменным, проводятся вычисления по известным формулам и выводятся результаты вычислений, называют программами линейных структур. Они самые простые. 2.3.Два вектора заданы своими координатами. Найти их скалярное произведение. 2.4.Вычислить определитель второго порядка. Используйте для ввода значений элементов определителя операторы READ-DATA. 2.5.Два сопротивления соединены последовательно (параллельно). Найдите их общее сопротивление. 2.6.Вычислить площадь поверхности и объем цилиндра. Известны радиус и высота цилиндра. 2.7.На экзамене «а» студентов получили пятерки, «b» -4, и «с» получили тройки. Вычислите средний балл. 2.8. Сколько рулонов обоев необходимо купить, чтобы оклеить комнату длиной a м, шириной b м, высотой h м. Ширина рулона обоев 53 см, длина в рулоне 10 м. На окна и двери приходится 18% площади стен, в отходы – 5% площади обоев. 2.9.Покупатель приобрел n штучного товара по цене с. Поблагодарите за покупку и сообщите ему сколько он должен уплатить. 2.10.Найти площадь кольца, внутренний радиус которого равен r1, а внешний r2. Эти простые задачи примите в качестве домашнего задания. А также отрабатывайте навыки быстрого и безошибочного набора букв и символов и подготовьте набор формул из различных областей знаний для их последующего переложения на QB. 14
Что нового Вы узнали и чему научились? • познакомились с экранными и цветовыми режимами; • научились оформлять начало (первые строки) своих программ; • по приведенным примерам организовывать комментарий оператором REM (‘), хотя речь о нем не шла. Этот оператор не обрабатывается программой и несет информацию самому программисту, пользователю, преподавателю для проверки; • убедились, что каждая строка программы начинается с ОПЕРАТОРА, если в строке несколько операторов, то они разделяются двоеточием: • усвоили типы переменных и формирование их ИМЕН; • главное – научились тремя способами присваивать переменным значения; • проводить несложные арифметические операции с переменными и выводить результаты на печать; • почувствовали «эстетику» расположения информации на экране и никогда Ваши программы не будут запрашивать и выводить информацию с позиции 1,1 (это по умолчанию, если отсутствует оператор LOCATE); • получили представление о программах (скорее, программках) линейных структур.
15
Занятие 3. Стандартные функции QB. Набор и печать значений выражений, содержащих функции. Ответственное занятие, от которого будет зависеть Ваш успех в освоении основ программирования. Причем, не только на QB. Внимательно отнеситесь к изучению стандартных функций, постарайтесь выработать навык безошибочного набора математических формул. Вам известны функции, изученные и изучаемые в курсе математики и других дисциплин. Как задаются и вычисляются их значения на языках программирования? Вначале рассмотрим хорошо Вам известные из математики функции: Sinx, Cosx, tgx, arctgx, ⎜х ⎜ На QB эти функции записываются в весьма естественном виде: a = SIN(x): m = COS(t): n = TAN(q) y = ATN(p):’*****это функция arctgx***** Если аргументам x, t, q, p, были присвоены какие-либо значения, то переменным a, m, n, y будут присвоены значения указанных функций. Обратите внимание, что аргументы всех функций на QB пишутся только в скобках. Аргументы тригонометрических функций не градусы, а действительные числа (обратите внимание!). В качестве аргументов могут быть действительные числа, так строка r = SIN(2) присвоит переменной r значение синуса действительного числа 2. Написание на QB всех функций осуществляйте только строчными буквами и если Вы сделали правильно QB сам «сделает» их заглавными. Почему мы на прошлом занятии записали pi = 4*ATN(1)? Так мы присвоили переменной pi значение 3.1415926.. Вам хорошо известно, что arctg1 =
π
4
.
⎜х ⎜- часто используемый модуль числа, на QB это ABS(x), почемуто студенты часто ошибаются и пишут АВС (?). y = ex, (ее график называют экспонентой, часто и саму функцию) – популярнейшая функция, многие процессы и явления изменяются именно по этому закону. На QB (и на других языках) это EXP(x). Попросите QB ? EXP(1) и Вы увидите знакомое Вам значение 2.718281828.. А возведение в степень переменных, констант осуществляется с помощью знака «^». Набирают x^2 (это x2), a^(x/2) и т.д. Никогда не набирайте EXP^x - плохая ошибка! Логарифмическая функция. QB «знает» только натуральный логарифм – lnx. И набирают LOG(x). Если необходимо найти логарифм по произвольному основанию a, то используют формулу перехода: LOG(x)/LOG(a)
16
Функция y = x . На QB это SQR(x), а вот корни произвольной степени придется записывать так: 4 x 3 ⇒ x^(3/4), что не одно и то же, что x^3/4, подумайте почему (!). Особое внимание уделим функциям, которые редко используются в традиционной математике, но довольно популярны в программировании. Функция SGN(x) – знак числа, она принимает только 3 значения: 1, если х > 0, -1, если х < 0 и 0, если ее аргумент равен нулю. Функция MOD. x = a MOD(3) – эта конструкция означает, что переменной х присваивается значение равное остатку от деления целой части числа а на 3, в дальнейшем эта конструкция может использоваться в качестве признака деления. Аргументом в скобках может быть и переменная. Очень популярная в программировании функция, которой мы будем часто пользоваться, функция RND. Кстати, на Ваших МК есть такая кнопочка. Функция генерирует случайные числа из интервала (0; 1) На самом деле числа псевдослучайные, т.е. при каждом запуске получают одни и те же значения. Чтобы сделать их «более случайными» каждая программа, использующая RND, снабжается строкой RANDOMIZE TIMER, этот оператор «запускает» генератор случайных чисел. См. предыдущее занятие. Часто необходимо сгенерировать случайные числа из заданного интервала (a;b). Согласитесь с конструкцией: x = a + (b – a)*RND. Переменная х получит значение, принадлежащее интервалу (a;b). Более подробно остановиться на функциях INT и CINT. Функция INT(x) – целая часть числа х, причем – это ближайшее целое число, стоящее на числовой прямой слева от х. Естественно y = x INT(x) – это дробная часть числа. Функция же СINT(x) округляет число х до ближайшего целого. (Предлагаем студентам самостоятельно изучить аналогичную функцию FIX.) В силу того, что CINT имеет ограничения по значениям аргумента, рекомендовать использовать функцию INT(x). Полезно здесь же научить округлять с заданной точностью, например: х = 7.45632 x = (INT(x*100+.5))/100, при этом переменной х будет присвоено значение 7.46. Если х = 7.45332, то округленному до сотых долей х будет присвоено значение 7.45. Или x = (СINT(x*100))/100. Еще примеры применения INT(x). Пусть переменной х пользователь присвоил или получил в результате вычислений значение угла в радианах: х = 2.45378. Перевести в градусы и минуты (QB «не знает» этой меры углов). y = 180*2.45378/pi – это угол в градусах с десятичными долями. yg = INT(y) – это целое число градусов, ym = (СINT((y – yg)*60*100))/100 – это целое число минут. И выводите на печать значения переменных yg и ym. 17
Обратный перевод: g – целое число градусов, m – целое число минут. Получить радианную меру этого угла. x = (g + m*60)*pi/180. Используя приведенные примеры перевести самостоятельно в рубли и копейки сумму, выраженную десятичной дробью, например, х = 45.67854 рублей. Получить ответ: «С Вас 45 рублей и 68 копеек». Функция пользователя, оператор DEF FN_, где _ - идентификатор – какая-либо буква латинского алфавита. Отметим, что DEF FN может задавать функции более чем одной переменной, что его задание должно обязательно предшествовать первому обращению к нему, что программа может содержать несколько функций пользователя, отличающихся идентификатором, т.е. не более 26. Например: DEF FNA(x) = x^2 – 5*x + 3 DEF FNB(x,y) = y*x^2 – y^3*x + 3*y*x – SIN(2*x) и т.д. Теперь, используя полученную информацию, необходимо выработать устойчивые навыки по набору математических выражений. Учимся набирать на QB формулы: Пусть необходимо вычислить значение функции x π x2 + y3 + 2Sin ⎛⎜ + ⎞⎟ ⎝4 3⎠ z ( x, y ) = log ( x + y ) 2 ****************Программа 3.1********************************** INPUT”Введите х и у”; x,y z = (SQR(x^2 + y^2) + 2*SIN(x/4 + pi/3))/((LOG(ABS(x + y))/LOG(2)) PRINT “z = “;z Будьте внимательны при использовании скобок – «золотое правило»: сколько скобок открыто, столько же должно быть закрыто. При наборе дробей помните: ВЕСЬ числитель делится, как правило, на ВЕСЬ знаменатель, не забывайте о скобках. Рекомендуется работать в режиме строчных латинских букв, это очень полезно – сам QB будет проверять правильность набора. Например, так. ****************Программа 3.2********************************** input”Введите a и b”;a,b t=((cos(a+b))^2-log(a*b)/log(2))/(a+sqr(a^2+b^2))/abs(a+b) ?”Получите t=”;t Посмотрите, что сделал с набранной программой QB. А теперь восстановите набранную формулу: запишите ее на языке обычной алгебры.
18
Пусть необходимо вычислить значение выражения, зависящего от двух переменных. Некоторые студенты во избежание ошибок «разбивают» эту формулу на отдельные части. Sinx + ( x + y )2 m= ; x 2 + y 2 + 3 e x + arctgx ****************Программа 3.3********************************** INPUT”Введите х и у”; x,y t = sin(x) + (x + y)^2 p = sqr(x^2 + y^2) q = (exp(x) + atn(x))^(1/3) ?”Получите m”; t/(p + q) Чтобы научиться программировать формулы, их надо программировать, проверять у QB, консультироваться с товарищами, проверять у преподавателя, только не словами: «Найдите у меня ошибку»… В качестве домашнего задания запрограммируйте несколько формул: готовьтесь к самостоятельной работе!
p=
Cos 2 a + Sin2b − tg (a + b) ; log 2 (a + Cos5b) + lg(a + b )
Cos 2 ( x + 0,3) + ( x − y)3 r= ; 2 x + 1 + 5 ( x + lgx) 4
r=
u=
tg 3 2 x − 4 ( x 2 + 3) −
x 2
2 + 3− x
2
ln(2 x + 3) + x + 3
2 x 2 + 3 (5x + e2 x )2
Что нового Вы узнали и чему научились? • ознакомились со стандартными функциями QB, обратив особое внимание на функции, которые еще не использовали в математике; • научились округлять действительные числа с заданной точностью; • ознакомились с заданием функции пользователя; • переводить радианы в градусы и градусы в радианы; • по математическим формулам находить значения переменных на QB.
19
Занятие 4. Программы линейной структуры, принципы составления, отладки, тестирования. На занятии 2 уже шла речь о таких программах. Программы линейной структуры: присвоение значений переменным, производство вычислений, вывод результатов. Цель занятия: развить и закрепить умения составлять несложные программы линейных структур, с тем, чтобы эти умения успешно применять при разработке более сложных конструкций. Повторите содержание предыдущих занятий. Учимся на конкретных, ярких примерах. Вначале составим программы с комментариями. Внимательно разберитесь в каждом символе этих программ, задайте вопросы. 1.Дана прямая ax + by + c = 0 и точка с координатами x0; y0. Найти расстояние от точки до прямой по формуле
ax0 + by 0 + c a2 + b2
.
************************Программа 4.1*********************************** PRINT”Дано общее уравнение прямой ax + by + c = 0” INPUT”Введите коэффициенты a, b, c”;a, b, c INPUT”Введите координаты точки x,y”;x0, y0 d = ABS(a*x0 + b*y0 + c) r = SQR(a^2 + b^2) PRINT”Искомое расстояние равно”; d/r 2. По введенным катетам прямоугольного треугольника вычислить площадь, гипотенузу, высоту, проведенную из вершины прямого угла на гипотенузу, и острые углы. Значения углов выразить в градусах и минутах. ************************Программа 4.2*********************************** PRINT”По традиции а и b – катеты, с - гипотенуза” INPUT”Введите катеты a, b”;a, b с = SQR(a^2 + b^2):’***Вычислили гипотенузу*********** s = a*b/2:’***Вычислили площадь*********** h = a*b/c:’***Вычислили высоту*********** ta = а/b:’***Нашли тангенс угла А*********** ua = ATN(ta) :’***Вычислили угол А в радианах*********** ub = pi/2 – ua:’****Вычислили угол В радианах******* uag = 180*ua/pi:’**Градусная мера угла А в десятичной записи uac = int(uag):’****Градусы – целая часть******* mina = cint((uag-uac)*100):’****Целое число минут угла А*********** ‘******Аналогично определяем градусы и минуты угла В******** ubg = 180*ub/pi:’**Градусная мера угла B в десятичной записи ubc = int(ubg):’****Градусы – целая часть******* minb = cint((ubg-ubc)*100):’****Целое число минут угла B*********** 20
‘**Выводим ответы**************** PRINT”Гипотенуза”; c PRINT”Площадь”; s ; “кв. ед.” PRINT”Высота”; h PRINT”Угол А”;uac;” градусов “;mina; “минут” PRINT”Угол B”;ubc;” градусов “;minb; “минут” 3.Дана функция y = f(x), значение аргумента x0 и приращение аргумента Δx. Найти приращение функции. Как помните из курса математики Δf(x0) = f(x0 + Δx) – f(x0) Для контрольного примера введем функцию:
(
log3 3x Sinx + x3 + x
f ( x) = 3
)
x3 + x + Cos 2 x + x
************************Программа 4.3*********************************** DEF FNA(x) = …проделайте это самостоятельно…… ?”Введите х0”;: INPUN x ?”Введите приращение”;:INPUN h f1 = DEF FNA(x + h): f2 = DEF FNA(x) ?”Приращение”; f1 – f2 4. Дано значение синуса аргумента первой четверти. Вычислить значения других тригонометрических функций. ************************Программа 4.4********************************** ?”Введите значение синуса, помните, что 0 < Sinx < 1”;: INPUN s c = SQR(1- s^2) t = s/c: ct = 1/t ?”Записывайте” ?”Косинус”;с ?”Тангенс”; t ?”Котангенс”; ct 5.Две точки на плоскости заданы своими координатами. Найти расстояние между ними. ************************Программа 4.5********************************** INPUN “Введите координаты первой точки x1,y1”; x1,y1 INPUN “Введите координаты второй точки x2,y2”; x2,y2 d = SQR((x2 – x1)^2 + (y2 – y1)^2)) ?”Расстояние между точками”; d 6.Решить систему двух линейных уравнений с двумя неизвестными методом Крамера. ************************Программа 4.6********************************** REM***Здесь коэффициенты при неизвестных и свободный член первого уравнения****** 21
DATA 3,5,-7 REM***Здесь коэффициенты при неизвестных и свободный член второго уравнения****** DATA 1,8,12 READ a1,b1,c1,a2,b2,c2 d = a1*b2 – a2*b1: dx = c1*b2 – c2*b1: dy = c2*a1 – a2*c1 x = dx/d: y = dy/d ?”Записывайте решение”; x,y Следующие задачи рассмотрите самостоятельно и программы в электронном виде представьте на проверку преподавателю. 7.Два вектора заданы своими координатами. Найти их скалярное произведение и угол между ними. 8.Составить программу, которая бы спрашивала имя пользователя и здоровалась с ее обладателем. 9.Вычислить площадь поверхности и объема цилиндра. Известен радиус и высота цилиндра. 10.Известна длина окружности L. Найти площадь круга, ограниченного этой окружностью. 11.Найти площадь кольца, внутренний радиус которого равен r1, а внешний r2 12.Размеры комнаты axb, высота 2,3м. Дверь и окна занимают 15% площади стен. Комнату необходимо оклеить обоями, при оклейке 10% идут на обрезки. Размеры рулона обоев 10х0,7м. Сколько рулонов обоев необходимо приобрести, чтобы оклеить комнату? 13.Составить программы перевода одних единиц в другие, если: 1 дюйм = 2.54 см., 1 доллар = 29.78 руб.,1 миля = 1.609 км. Задача 14 для домашней работы. 14.Треугольник задан длинами своих сторон. Найти его площадь по формуле Герона, высоты по формуле ha = по формуле ma =
2 a
p( p − a)( p − b)( p − c) , медианы
1 2b 2 + 2c 2 − a 2 , биссектрисы по формуле 2
22
2 pbc( p − a ) abc , радиус описанной окружности R = , b+c 4 p ( p − a )( p − b)( p − c) S радиус вписанной окружности r = . p
ta =
А теперь выполните письменную самостоятельную работу и представьте на проверку. Вычислить значение функции при заданном пользователем значении аргумента. Вариант (t,p,z,q,m,w) укажет преподаватель. −
cos3 x 2 + sin x 3
z=
p=
log 3 ( x + 5 ) + x + 5 2
arctg t= 3
m=
(x 4
2
x x +1
q=
+ 3) + tg ( 2 x + 1) + x 2
sin x + cos 4 ( x + 1)
x 2
3 + 5− x
2
2 x + 1 + 3 ( 2 x + 1)
2
log 3 sin x + 2− x
arctg ( x + 1) + 3 x
1 + x + x3 + 3 x w= sin x + sin 2 x + sin x 2
tg 3 x + e −2 x
Чему Вы научились на занятии №4 ? • формулировать текстовые задачи из курса математики для их реализации на QB; • в конкретных задачах присваивать переменным значения различными способами; • записывать формулы математики на QB; • выводить результаты вычислений; • получили представление об отладке программ на QB.
23
Занятие 5. Реализации разветвляющихся алгоритмов. Форматы оператора IF…THEN Программ линейной структуры на практике нет или почти нет. Программа на любом языке должна «уметь» осуществлять ВЫБОР в зависимости от тех или иных условий. Такой выбор определяет дальнейший ход решения задачи, обработки данных и т.д. Этот выбор реализуется оператором IF…THEN… Реализуется он в таких форматах. IF THEN или IF THEN ELSE или IF THEN ELSE IF THEN Наконец, так называемый «полный формат» оператора IF THEN ……………….. END IF Если условие выполняется, то будут выполнены все операторы, размещенные между строкой IF THEN и строкой END IF, которая означает: конец условия. Рассмотрим конкретные примеры, вводя новые служебные слова. 5.1.Выдать сообщение: делится ли число на 3
понятия
и
IF a / 3 = a \ 3 THEN ?”Число”;a;”делится на 3”: ‘это простейший формат 5.2. Выдать сообщение, какое из двух чисел больше. IF a>b THEN ?” Число”;a;”больше числа”;b ELSE ” Число”;b;”больше числа”;a:’ ELSE – иначе 5.3. Выдать одно из сообщений: число а – четное или число а не является целым IF a MOD(2)=0 THEN ?” Число”;a;”четное” ELSE IF a - INT(a) 0 THEN ?” Число”;a;”не является целым" Объясните самостоятельно: что означает конструкция: a - INT(a) 0? Обратите внимание, как использовалась функция MOD, практически не используемая в математике Пример применения полного формата: IF a>0 THEN 24
?”Натуральный логарифм числа”;a”равен”;LOG(a) ?”Десятичный логарифм числа”;a”равен”;LOG(a)/LOG(10) ?”Квадратный корень из числа”;a”равен”;SQR(a) END IF Условия, следующие за IF, могут быть более сложные. Примеры более сложных условий в операторе IF с использованием служебных слов AND и OR. (и, или) Приведем примеры. Запросы очевидны. IF x>a AND xc AND a+c>b AND b+c>a THEN ? ” Числа”;a,b,c;”могут быть сторонами треугольника” В дальнейшем Вам практически в каждой программе придется создавать конструкции с IF.. THEN. Будьте внимательны. Для расширения круга задач, введем понятие МЕТКИ и оператора перехода. Метка в QB (как вариант, существуют другие способы) это НОМЕР строки. Простой пример: IF a$=”r” THEN GOTO 10 ELSE GOTO 100 Это означает, что если a$ имеет значение r, то УПРАВЛЕНИЕ передается на строку, начинающуюся с натурального числа 10, если a$ имеет другое значение, управление будет передано на строку 100. Вы поняли, что означает оператор GOTO, переведите с английского. Для закрепления рассмотрите и законспектируйте конкретные программы. ----Программа 5.1. Решить квадратное уравнение ax2 + bx + c = 0---------
25
5 INPUT”Введите коэффициенты квадратного уравнения a, b, c”;a,b,c d = b^2-4*a*b IF d 0 AND y > 0 THEN PRINT "Точка находится в I четверти, расстояние до начала координат"; r IF x < 0 AND y > 0 THEN PRINT "Точка находится в II четверти, расстояние до начала координат"; r IF x < 0 AND y < 0 THEN PRINT "Точка находится в III четверти, расстояние до начала координат"; r IF x > 0 AND y < 0 THEN PRINT "Точка находится в IV четверти, расстояние до начала координат"; r Следующие задачи выполните самостоятельно, введите в ЭВМ, добейтесь безусловно верной работы программ и представьте на проверку преподавателю. 5.3.Составить программу, классифицирующую треугольники (остроугольные, прямоугольные, тупоугольные). 5.4.Даны 2 точки в прямоугольной системе координат. Определить какая из точек ближе к началу координат. 26
5.5.Задана величина угла d в градусах. Определить в какой четверти он находится. 5.6.В киоске продается газета стоимостью 5 руб. и журнал стоимостью 15 руб. Составить программу, которая спрашивает о желании покупателя (журнал или газета?), принимает деньги и предлагает причитающуюся сдачу. 5.7.Даны два действительных числа x, y. Найти среднее геометрическое, если x,y>0 среднеарифметическое этих чисел x,y 5 ⎪ ⎩ x+5 ⎧x + y ⎪⎪ x если x ≤ 1 и y ≤ −1 z = ⎨ e− y ⎪ ⎪⎩Cos ( x − y ) + Cos 2 ( x + y ) если x > 1 и
аргументов
вычислить
y > −1
⎧ a3 − a 4 − a5 ⎪ , если a ≤ 0 e( a − Sina ) ⎪ ⎪⎪ f = ⎨log 3 ( 3 a 2 , если 0 < a ≤ 1 ⎪ 4 ⎪a , в осталных случаях ⎪ ⎪⎩ ⎧tg 2 x3 , a ≤ 0 ⎪ m = ⎨a 2 − Cos 5 a, 0 < a ≤ 1 ⎪e Sinx − Sina 2 , в осталных случаях ⎩
⎧ a 2 + 4a + 5, при a ≤ 2 ⎪ p=⎨ 1 , в противном случае ⎪ 2 ⎩ a + 4a + 5 Дано: действительное число x. Вычислить f(x), если: ⎧x 3 , при x ≤ 0 ⎪ f ( x ) = ⎨log 2 ( x 2 + 1), при 0 < x ≤ 1 ⎪x 4 , при 1 < x ≤ 2 ⎩ При х > 2 выдать сообщение "Аргумент не входит в область определения" Дано: действительное число x. Вычислить f(x), если: ⎧ ⎪x 3 + 1, при - 3 ≤ x ≤ 0 ⎪⎪ π f ( x ) = ⎨Sin (2x + ), при 0 < x ≤ 2 3 ⎪ x 1 + ⎪ , при 2 < x ≤ 5 ⎪⎩ 3x + 2 При x 5 выдать сообщение "Аргумент не входит в область определения"
28
Дано: действительное число x. Вычислить f(x), если: ⎧ ⎪3x 3 + ln x при - 4 ≤ x ≤ −1 ⎪⎪ π f ( x ) = ⎨tg (2 x + ), при - 1 < x ≤ 0 4 ⎪ x + e 1 ⎪ , при 0 < x ≤ 4 ⎪⎩ 3x + 5 При x 4 выдать сообщение "Аргумент не входит в область определения" Дано: действительное число x. Вычислить f(x), если: ⎧ ⎪ Cosx + 2 − 2 x при - 1 ≤ x ≤ 1 ⎪ f ( x ) = ⎨arctg(2 x + 3), при 1 < x ≤ 3 ⎪ e x −1 + x , при 3 < x ≤ 5 ⎪ ⎩ 3x При x 5 выдать сообщение "Аргумент не входит в область определения" Дано: действительное число x. Вычислить f(x), если: ⎧ ⎪ tgx + 2 − 2 x при - 1.5 ≤ x ≤ −0.5 ⎪ f ( x ) = ⎨2, при - 0.5 < x ≤ 1 ⎪ e − 2 x + 3x , при 1 < x ≤ 2 ⎪ ⎩ 3x + 2 При x 2 выдать сообщение "Аргумент не входит в область определения"
Что нового Вы узнали и чему научились на занятии №5? • познакомились с программами разветвляющихся структур; • усвоили и закрепили на практике форматы оператора IF..THEN; • познакомились на конкретных примерах с программами, реализующие разветвляющиеся алгоритмы; • ознакомились с типовыми задачами, решение которых предполагает использование IF..THEN; • закрепили умение программировать математические формулы на языке QB;
29
Занятие 6. Организация простейших меню в бейсик программах. Более сложные конструкции использования оператора IF...THEN На занятии 5 были рассмотрены простейшие конструкции реализации разветвляющихся алгоритмов. Рассмотрим более сложные конструкции с введением новых понятий и операторов. Типовые задачи: составление тренажеров, тестов, простейших меню в бейсик программах. Начнем с задачи: первокласснику необходимо хорошо запомнить таблицу умножения. Составляем для него специальный тренажер. Программа может выглядеть так. *************Программа 6.1 Простейший тренажер**************************** INPUT”Сколько примеров тебе задать”;n (Введем понятие СЧЕТЧИКА. Это целочисленная переменная, которая увеличивает свое значение как правило, на единицу при выполнении определенных условий) k = 0:’**Обнуление счетчика неверных ответов k1 = 0:’**Обнуление счетчика верных ответов 5 a = 1 + INT(10*RND): b = 1 + INT(10*RND): с = a * b ‘**формирование случайных целых чисел и расчет их произведения 10 ? a; “x”; b;” = “;:INPUT m:’**печать вопроса и запрос ответа IF mc THEN ?”Неверно, попробуй еще” k=k+1 IF k < 4 THEN 10 END IF ‘**В полном формате IF..THEN анализируется ответ и дается всего 4 попытки на ввод правильного ответа k1 = k1 + 1:’**Подсчет числа верных ответов IF n < k1 THEN ?”Умница, следующее задание”:GOTO 5 Предлагается усложнить эту программу, выдавать в заключение резюме: с какой попытки и сколько ученик дал правильных ответов. Более сложные программы представляют тесты, модные в наше время. В качестве пробного примера приведем тест для второклассника, осваивающего устный счет в пределах 100, кстати, второклассник не знает отрицательных чисел и это необходимо учесть при составлении теста. Программа может выглядеть так. **********************Программа 6.2************************************ 10 CLS : INPUT "Сколько примеров тебе предложить"; n k = 0:’***Обнуление счетчика предлагаемых примеров 30
kp = 0:’***Обнуление счетчика правильных ответов IF n < 10 THEN PRINT "Это очень мало!" ELSE 12 PRINT "Нажми любую клавишу и закажи побольше примеров" 11 IF INKEY$ = "" THEN 11 ELSE GOTO 10 (Здесь впервые нами использована функция INKEY$. Она принимает СИМВОЛЬНОЕ значение, один символ, первой нажатой клавиши. Если она не имеет никакого значения – клавиша не нажата, т.е “” – «пустопусто», то управление передается на ту же 11 строку, пока не будет нажата какая-либо клавиша) 12 t = SGN(-.5 + RND): IF t = -1 THEN a$ = "-" ELSE a$ = "+" (В строке 12 формируется знак + или -, т.е. определяется на сложение или вычитание будет выполнятся пример) 13 IF t = -1 THEN 50 (Строка 13: если упражнение на вычитание, то управление передается на строку 50) 15 a = INT(10 + 90 * RND): b = INT(10 + 80 * RND) IF a + b > 100 THEN 15 (Формирование слагаемых с проверкой условия: не превышает ли сумма числа 100) k = k + 1’***Увеличение счетчика примеров на 1 PRINT a; a$; b; "="; : INPUT c: IF c = a + b THEN kp = kp + 1 (Увеличение счетчика правильных ответов) GOTO 100 50 a = INT(10 + 90 * RND): b = INT(10 + 80 * RND) IF a < b THEN 50’***Проверка условия: уменьшаемое меньше вычитаемого) k=k+1 PRINT a; a$; b; "="; : INPUT c: IF c = a - b THEN kp = kp + 1 100 IF k < n THEN 12’***”Идем за следующим прмером**** (Далее формируем оценку, разберитесь самостоятельно - как) IF kp / n > .9 THEN oc = 5 IF kp / n .75 THEN oc = 4 IF kp / n .5 THEN oc = 3 IF kp / n 0 k=k+1 p = n - (n \ 10) * 10 s=s+p PRINT TAB(20); p; n = n \ 10 LOOP PRINT PRINT TAB(10); "Количество цифр равно "; k PRINT TAB(10); "Сумма цифр равна "; s И с использованием блока IF…THEN 10 IF n / 10 > 0 THEN k=k+1 p = n - (n \ 10) * 10 s=s+p PRINT TAB(20); p; n = n \ 10 GOTO 10 END IF PRINT TAB(10); "Количество цифр равно "; k PRINT TAB(10); "Сумма цифр равна "; s Математика позволяет подсчитать количество цифр натурального числа непосредственно, одной формулой. Для тех, кто изучал логарифмы, нет большого труда увидеть, что k = INT(log(x)/log(10)) + 1 и есть количество цифр числа х. Занимательное продолжение этой программы. Дан автобусный билетик – шестизначное натуральное число, все знают, какие билетики считаются «счастливыми»: сумма первых трех цифр равна сумме последних трех цифр, а если эти суммы равны 13, то билетик «очень счастливый». Пусть Ваша программа на введенное шестизначное число выдаст одно из сообщений: билет очень счастливый, билет счастливый, билет несчастливый. 3.Очень любят студенты программировать «бегущую строку». Вот один из многих вариантов. …………………Программа 11.3……………………………………. '**********Бегущая строка************* a$ = "НХК" 10 CLS FOR i = 1 TO 80 LOCATE 10, i: COLOR 14, 1: PRINT a$ 56
FOR j = 1 TO 10000: NEXT j LOCATE 10, i: COLOR 1, 1: PRINT a$ NEXT GOTO 10 На примере этой простой программы вводим понятие «пустого цикла». Вы понимаете, что задерживать выполнение программы с помощью пустого цикла – это не самое простейшее решение, в QB существует специальный оператор, задерживающий выполнение программы: SLEEP [секунды], предлагаю освоить его самостоятельно. Предлагаю так же организовать бегущую строку не только справа налево, но и наоборот, а так же снизу вверх, сверху вниз, написать свое имя «лесенкой» по главной диагонали, по обеим диагоналям и т.д. 4.Мы уже находили наибольшее и наименьшее значения функции одной переменной на отрезке. Поставим задачу отыскать наибольшее и наименьшее значения функции ДВУХ переменных z = f(x;y) на прямоугольнике [x1;x2]; [y1;y2]. Программа может быть такой. …………………Программа 11.4……………………………………. SCREEN 9: COLOR 4, 2 DEF fna (x, y) = x ^ 2 + y ^ 2 PRINT TAB(10); : INPUT "Введите отрезок изменения х"; x1, x2 PRINT TAB(10); : INPUT "Введите отрезок изменения у"; y1, y2 max = fna(x1, y1): xmax = x1: ymax = y1 min = fna(x1, y1): xmin = x1: ymin = y1 PRINT TAB(10); : INPUT "Введите шаг поиска по х"; hx PRINT TAB(10); : INPUT "Введите шаг поиска по y"; hy FOR x = x1 TO x2 STEP hx FOR y = y1 TO y2 STEP hy IF fna(x, y) > max THEN max = fna(x, y): xmax = x: ymax = y IF fna(x, y) < min THEN min = fna(x, y): xmin = x: ymin = y NEXT y, x PRINT TAB(10); : PRINT "Максимальное значение f("; xmax; ";"; ymax; ") = "; max PRINT TAB(10); : PRINT "Минимальное значение f("; xmin; ";"; ymin; ") = "; min 5.Рассмотрим популярную задачу на вложенные циклы. Найти пары чисел, являющихся координатами точек, которые лежат на окружности x2 + y2 = 169 …………………Программа 11.4……………………………………. PRINT TAB(9); : INPUT "Интервал по х"; x1, x2 PRINT TAB(9); : INPUT "Интервал по у"; y1, y2 57
FOR x = x1 TO x2: FOR y = y1 TO y2 IF x ^ 2 + y ^ 2 = 169 THEN PRINT TAB(10); x, y NEXT y, x 5.Обобщим эту интересную задачу. Пусть дано уравнение с двумя переменными f(x;y) = 0. Найти его целочисленные решения или выдать сообщение, что таковых на указанных пользователем промежутках нет. …………………Программа 11.5……………………………………. DEF fna (x, y) = x ^ 2 + x * y + 5 * x + 7 * y – 30:’левая часть уравнения K=0:’***обнуляем признак PRINT TAB(15); : INPUT "Введите x1,x2"; x1, x2 PRINT TAB(15); : INPUT "Введите y1,y2"; y1, y2 FOR x = x1 TO x2 FOR y = y1 TO y2 IF fna(x, y) = 0 THEN PRINT TAB(15); x, y: k = k+1 NEXT y NEXT x IF k>0 THEN ?”На указанном прямоугольнике решений нет” 6. Стенные часы отбивают удар каждые полчаса и количество часов от 1 до 12. Составить программу подсчета количества ударов за сутки. …………………Программа 11.6……………………………………. s=0 FOR i = 1 TO 12: s = s + i: NEXT i PRINT "Ударов за сутки "; 2 * s + 24 7.Объем жидкости в резервуаре, имеющего форму шара вычисляется по формуле:
1 V = π h 2 (3d − 2h) , где d – внутренний диаметр шара, h – высота 6
налива жидкости. Напечатайте калибровочную таблицу, отражающую зависимость объема от высоты налива. …………………Программа 11.6…………………………………… INPUT "Внутренний диаметр резервуара в метрах"; d: d = d * 100 INPUT "Шаг таблицы в сантиметрах"; hg PRINT "Высота объем" PRINT "налива в см жидкости в л." FOR h = 0 TO d STEP hg v = pi * h ^ 2 * (3 * d - 2 * h) / 6 PRINT INT(h), INT(v / 1000) NEXT h
58
7.На отрезке [a;b] задана непрерывная функция y = f(x). «Проходя» этот отрезок с достаточно малым шагом h, найдите приближенно длину дуги кривой y = f(x). …………………Программа 11.7…………………………………… DEF fna (x) = SIN(x) PRINT TAB(10); : INPUT "Введите отрезок a,b"; a, b s = 0: h = .001 FOR x = a TO b - h STEP h dy = fna(x + h) - fna(x) m = SQR(h ^ 2 + dy ^ 2) s=s+m NEXT x PRINT TAB(10); "Длина дуги равна"; s Следующие задачи попробуйте спрограммировать самостоятельно, конструируя циклы с помощью FOR…NEXT. 1.Имитировать 10-кратное бросание двух игральных костей. Какую сумму Вы набрали? 2.Монету подбросили 100 раз. Подсчитайте количество выпавших «орлов». 3.Проверьте функцию RND «на случайность». Сгенерируйте 100 чисел из интервала (-1; 1) и подсчитайте количество положительных и отрицательных. Их оказалось поровну? 4.Найти суммы по заданному n. n n n 1 n n+3 lg(n + 1) 4.1∑ 2 4.2∑ n 4.3∑ n 4.4∑ 3 i =1 n + 1 i =1 2 + n i =1 e + 2 i =1 n + n n
5.Как Вы знаете из курса физики, энергия движущего тела вычисляется
mv 2 . Вычислить суммарную энергию тела, если по формуле:W = 2
скорость v изменяется от v1 до v2 с шагом hv, а масса m изменяется от m1 до m2 с шагом hm. Какие умения и навыки Вы приобрели на занятии №11? • Углубили понимание организации циклов с помощью оператора FOR…NEXT; • рассмотрели конкретные интересные задачи и их программную реализацию; • закрепили использование понятия «признак»; • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации циклических структур.
59
Занятие 12. Организация подпрограмм в QB. Цель занятия – ознакомить Вас на примерах с важнейшим понятием программирования - ПОДПРОГРАММА. Впервые в этом курсе применим необычную форму обучения – электронную лекцию. Главная сущность таких занятий в том, что Вы будете получать информацию не со слов преподавателя, не с доски, а с экранов мониторов. Как же работать с электронной лекцией? -Внимательно изучите и обязательно законспектируйте предлагаемый Вам теоретический материал. -законспектируйте и поработайте с программами, предложенными в качестве примеров, для этого необходимо удалить оператор REM со строк конкретной программы и запустить всю программу. После окончания работы с программой снова восстановить REM и перейти к следующей программе. Рекомендуем студентам внести изменения в программу и записать под другим именем, с тем, чтобы текст лекции сохранялся неизменным и доступным для студентов других подгрупп. Текст лекций помещены здесь с той целью, чтобы преподаватель мог руководить Вашей учебной деятельностью, используя эту твердую копию информации, которую Вы не читайте, а изучайте в электронном виде. Итак, первая лекция, посвященная понятию подпрограмма. CLS : SCREEN 9: COLOR 14, 1 pi = 4 * ATN(1) ________________Листинг электронной лекции для преподавателя_________ '* Уважаемые студенты! Познакомьтесь с очень важным вопросом в программировании '* Организация и использование ПОДПРОГРАММ '* Поступите так: что-нибудь измените в этом файле, например, вместо '* этих строк поместите свое имя и сохраните файл под другим именем '* с тем, чтобы Вы работали в СВОЕМ файле. Проделайте это, пожалуйста. 'Уважайте студентов других подгрупп. '* Подпрограмма - это группа операторов или часть программы, описывающая '* некоторый алгоритм, который можно многократно использовать, обращаясь '* к нему из различных точек программы. Использование подпрограмм уменьшает '* общее количество операторов в программе, чем обеспечивает '* более эффективное использование памяти. '* В языке Бейсик подпрограмма оформляется как группа операторов, '* которая должна выполняться при обращении к ней. '* Обращение к подпрограмме осуществляется оператором GOSUB n, где '* n - номер строки, с которой начинается подпрограмма. '* Подпрограмма может содержать обращения к другим '* подпрограммам. При этом внутренняя подпрограмма считается вложенной. '* После завершения выполнения подпрограммы управление должно быть возвращено '* в ту точку программы, из которой сделан переход в подпрограмму. Выход из '* подпрограммы осуществляется с помощью оператора RETURN, который '* автоматически возвращает управление строке, следующей за строкой, где '* расположен оператор GOSUB. Все подпрограммы должны завершаться RETURN. '* При многократном обращении к подпрограмме
60
'* один оператор RETURN может обслуживать несколько операторов GOSUB. '* Два предупреждения. Первое. '* Необходимо внимательно отслеживать имена переменных, используемых в '* подпрограмме и в основном теле программы. Например, в основной программе '* Вы организуете цикл по i и в подпрограмме у Вас тоже цикл по i. '* Программа работать не будет!!! Будьте внимательны. '* И второе. Внимательно следите за тем, с КАКОЙ (какими) переменной Вы '*" идете" в подпрограмму и, особенно, с КАКОЙ (какими) "возвращаетесь". '* Ведь до последующего обращения к подпрограмме значение переменной, полу'* ченное в подпрограмме должно быть "использовано", иначе оно будет утеряно. '*И еще проблема при использовании подпрограмм. Как правило, подпрограммы '* располагают в конце программы, а значит основное тело программы '* должно завершаться либо каким либо переходом, либо END, иначе получите '*" Ошибка: RETURN без GOSUB", понятно почему. '*************************************************************************** '* Первый пример приведем с подробными комментариями. '* Важное значение во многих разделах математики играет понятие "число '* сочетаний из n по k". (обязательно n>=k) В дальнейшем Вы будете его изучать. '* Вычисляется оно по формуле С = n!/(k!*(n-k)!). 3 раза необходимо вычислять '* факториалы. Их вычисление организуем в подпрограмме. '* Снимите REM, где необходимо и запустите программу, предварительно '* изучив и законспектировав ее '5 INPUT "Введите n и k"; n, k: 'Запросили у пользователя исходные данные 'IF n < k THEN PRINT "Вы не правы, повторите ввод": GOTO 5: 'Защита от дураков" '* Идем в подпрограмму за n! Но подпрограмма вычисляет факториал натурального '*"х" и запоминает его значение в переменной "y". Значит необходимо: 'x = n: GOSUB 50: 'Пришли с y = n!, его необходимо запомнить! 'p = y '*Теперь идем за k!? аналогично: 'x = k: GOSUB 50: 'Пришли с y = k!, запоминаем и его: 'q = y: 'И идем за (n-k)! 'x = n - k: GOSUB 50: 'Пришли с y = (n-k)! и вычисляем "С" 'c = p / q / y: 'Выводим ответ 'PRINT "Число сочетаний из"; n; "по"; k; "равно"; c 'END '50 ' Подпрограмма вычисления факториала 'IF x = 0 THEN y = 1: GOTO 20 'y = 1: FOR i = 1 TO x: y = y * i: NEXT i '20 RETURN '* Окончание первой программы******************************************* '* Восстановите REM в освоенной программе******************************* '* Вы уже составляли программу табулирования функции: вывод ее n значений '* на отрезке [a;b]. Функцию мы задавали оператором DEF FN '*А если функция задана несколькими формулами при различных значениях '* аргумента? Необходимо организовать подпрограмму. 'INPUT "Введите отрезок a,b"; a, b 'INPUT "Введите число строк таблицы значений n"; n 'h = (b - a) / n 'FOR x = a TO b STEP h 'GOSUB 100 'PRINT x, y 'NEXT x
61
'END '100 '* Подпрограмма вычисления значений функции 'IF x 1 THEN y = x 'y = (INT(y * 1000 + .5)) / 1000 'x = (INT(x * 1000 + .5)) / 1000 'RETURN '* Окончание программы табулирования функции '* Вы уже составляли программу вычисления интеграла по формуле трапеций '*на отрезке [a;b]: I = h*((f(a)+f(b))/2+f(a+h)+f(a+2h)+...+f(b-h)) '*где h = (b - a)/n '* Функцию мы задавали оператором DEF FN '*А если функция задана несколькими формулами при различных значениях '* аргумента? Необходимо организовать подпрограмму. 'INPUT "Введите отрезок a,b"; a, b 'n = 4 '5 n = n * 2 'h = (b - a) / n 's = 0 'x = a: GOSUB 100: s = s + y 'x = b: GOSUB 100: s = s + y 's = s / 2 'FOR x = a + h TO b - h STEP h 'GOSUB 100 's = s + y 'NEXT x 's = s * h 'PRINT "При n="; n; "значение интеграла равно"; s 'GOTO 5 '100 '* Подпрограмма вычисления значений функции 'IF x 1 THEN y = cos(x) 'RETURN '* Окончание программы интегрирования функции '* Составим программу с двумя подпрограммами '* Студент ведет вычисления по формуле, аргументы a,b,c,d задает в градусах: '* z = (COS(a) + SIN(b) + 3) / SQR(COS(c) + SIN(d) + 3) '* Организуем подпрограмму перевода градусов в радианы и подпрограмму '* вычисления выражения w = COS(p) + SIN(q) + 3 '10 INPUT "Введите значения углов a,b,c,d в градусах"; a, b, c, d 'g = a: GOSUB 30: p = r 'g = b: GOSUB 30: q = r 'GOSUB 40: ch = w 'g = c: GOSUB 30: p = r 'g = d: GOSUB 30: q = r 'GOSUB 40: zn = SQR(w) 'z = ch / zn 'PRINT "Записывайте ответ: z = "; z 'END
62
'30 'Подпрограмма перевода градусов в радианы: входим с g, выходим с r 'r = g * pi / 180: RETURN '40 ' Подпрограмма вычисления выражения COS(p) + SIN(q) + 3 'w = COS(p) + SIN(q) + 3: RETURN '* Окончание программы '*********************************************************************** '* Подпрограммы широко применяются в графике, мы будем изучать ее позже. '* В качестве отдыха рассмотрите программу, ее не переписывайте в конспект. '* Снимите REM в нашей последней на сегодня программе 'CLS : SCREEN 9: 'pi = 4 * ATN(1) 'COLOR 4, 0: PRINT "Большая Медведица и Кассиопея вращаются вокруг Полярной звезды 'COLOR 14, 0: WINDOW (-70, -70)-(70, 70) 'CIRCLE (0, 0), .3, 12 'k = 1.2 'FOR f = 0 TO 1000 STEP .003 't = f - .05: a = 30: GOSUB 100: t = f: a = 17: GOSUB 100 't = f - .4: a = 33: GOSUB 100: t = f - .65: a = 23: GOSUB 100 't = f - 1.2: a = 27: GOSUB 100: t = f - 1.4: a = 40: GOSUB 100 't = f - 1.4: a = 55: GOSUB 100: t = f + 3: a = 33: GOSUB 100 't = f + 2.8: a = 43: GOSUB 100: t = f + 2.5: a = 33: GOSUB 100 't = f + 2.2: a = 43: GOSUB 100: t = f + 2: a = 33: GOSUB 100 'FOR i = 1 TO 700: NEXT i 't = f - .05: a = 30: GOSUB 200: t = f: a = 17: GOSUB 200 't = f - .4: a = 33: GOSUB 200: t = f - .65: a = 23: GOSUB 200 't = f - 1.2: a = 27: GOSUB 200: t = f - 1.4: a = 40: GOSUB 200 't = f - 1.4: a = 55: GOSUB 200: t = f + 3: a = 33: GOSUB 200 't = f + 2.8: a = 43: GOSUB 200: t = f + 2.5: a = 33: GOSUB 200 't = f + 2.2: a = 43: GOSUB 200: t = f + 2: a = 33: GOSUB 200 'NEXT f '100 'Подпрограмма рисования звезд 'x = a * COS(t): y = k * a * SIN(t): CIRCLE (x, y), .3: RETURN '200 'Подпрограмма стирания звезд 'x = a * COS(t): y = k * a * SIN(t): CIRCLE (x, y), .3, 0: RETURN '* Окончание программы
А теперь рассмотрим и прокомментируем несколько задач, реализация которых предусматривает организацию подпрограмм. 1.Вычислить значение выражения:
m=
( x + 2) 2 + x + e − x ( y + 2) 2 + y + e − y + ( z + 2) 2 + z + e − z
Организовать вычисление подпрограмме.
значений
63
квадратных
корней
в
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, SCREEN 9: COLOR 14, 1 2 CLS PRINT TAB(22); : INPUT "Введите x,y,z"; x, y, z t = x: 'Присвоение t значения x, т.к. в подпрограмме 'использована переменная t GOSUB 100: 'Идем в подпрограмму с переменной t p = b: 'Запоминаем значение первого корня в переменной p t = y: 'Присвоение t значения GOSUB 100: 'Идем в подпрограмму с переменной t q = b: 'Запоминаем значение второго корня в переменной q t = z: 'Присвоение t значения z GOSUB 100: 'Идем в подпрограмму с переменной t s = p / (q + b):’**Вычисляем значение выражения COLOR 7: PRINT TAB(18); "Записывайте ответ"; s: COLOR 14 PRINT TAB(22); "1 - новые данные, 2 - окончание работы" PRINT TAB(22); "Нажмите соответствующую клавишу" 5 g$ = INKEY$ IF g$ = "1" THEN 2 ELSE IF g$ = "2" THEN STOP ELSE 5 100 '***Подпрограмма вычисления корня****** b = SQR((t + 2) ^ 2 + ABS(t + EXP(-t))) RETURN 2.Как известно, автомобильные номера – это буквы с тремя цифрами. Если сумма этих цифр номера равна 7 – такой номер будем считать счастливым, а если 13 – это несчастливый номер. Сколько автомобилей, имеющих разные номера, имеют счастливые и несчастливые номера? ,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, SCREEN 9: COLOR 14, 1 CLS GOTO 20 10 '******Подпрограмма суммирования цифр******* m = n: p = n: 'переменным m и p присвоили значения n ts = n \ 100: 'выделяем первую цифру - сотни ds = (m - ts * 100) \ 10: 'выделяем вторую цифру - десятки ed = p - ts * 100 - ds * 10: 'выделяем третью цифру - единицы s = ts + ds + ed: 'суммируем RETURN 20 k7 = 0: k13 = 0: 'обнуляем счетчики FOR i = 0 TO 999 n = i: GOSUB 10: 'переменной n присваиваем значение i и направляемся в подпрограмму IF s = 7 THEN k7 = k7 + 1 IF s = 13 THEN k13 = k13 + 1 64
NEXT i PRINT TAB(20); "Счастливых номеров"; k7 PRINT TAB(20); "Несчастливых номеров"; k13 Изменим программу с тем, чтобы она не только подсчитывала количество нужных нам номеров, но и распечатывала их ,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.2.1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, GOTO 20 10 '******Подпрограмма суммирования цифр******* m = n: p = n : ts = n \ 100: ds = (m - ts * 100) \ 10 ed = p - ts * 100 - ds * 10 s = ts + ds + ed RETURN 20 k7 = 0 FOR i = 0 TO 999 n = i: GOSUB 10 IF s = 7 THEN k7 = k7 + 1: PRINT i; NEXT i PRINT TAB(20); "Счастливых номеров"; k7 PRINT : PRINT : PRINT : PRINT : PRINT k13 = 0 FOR i = 0 TO 999 n = i: GOSUB 10 IF s = 13 THEN k13 = k13 + 1: PRINT i; NEXT i PRINT TAB(20); "Несчастливых номеров"; k13 Мы уже рассматривали задачу табулирования функции. А что, если функция задана не одной формулой, а различными для различных значений аргумента, например, так:
⎧ ⎪ x3 + 3x 2 + 3 x + 2 при x ≤ −1 ⎪ f ( x) = ⎨ x 2 при − 1 < x ≤ 1 ⎪ x+4 ⎪ при x >1 ⎩ 3x + 2 Это означает, что вычисление значений функции необходимо находить в подпрограмме. ,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, SCREEN 9: CLS COLOR 14, 8 LOCATE 2, 5 65
INPUT "введите отрезок a,b"; a, b PRINT TAB(5); : INPUT "число строк таблицы"; n h = (b - a) / n PRINT TAB(15); "x"; TAB(30); "y" FOR x = a TO b STEP h GOSUB 10 PRINT TAB(10); x; TAB(25); y NEXT x END 10 '***** подпрограмма вычисления значения функции ******* IF x -1 AND x 1 THEN y = (x + 4) / (3 * x + 2) RETURN Найти значение функции:
z=
Coca + Sinb + 3 , если a = 17°, b = 23°, c = 39°, d = 43° Cocc + Sind + 3
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, SCREEN 9: CLS COLOR 14, 8 pi = 4 * ATN(1) READ a, b, c, d x = a * pi / 180: y = b * pi / 180 GOSUB 200 z1 = w 'это числитель x = c * pi / 180: y = d * pi / 180 GOSUB 200 z2 = SQR(w) 'это знаменатель z = z1 / z2: LOCATE 10, 10: PRINT "z="; z END 200 '***** подпрограмма ****** w = COS(x) + SIN(y) + 3 RETURN DATA 17,23,39,43 Задания для самостоятельной работы 12.5. Написать письмо стандартной формы, адресованное различным людям. Текст письма расположить в подпрограмме. 12.6 Вычислить:
66
⎧ 3x 2 − 4 x ⎪ 2 x + 3 при -5 ≤ x 2 ⎩⎪ 3x + 2 2 Вычисление выражения 3x − 4x организовать в подпрограмме. 12.7Величина x изменяется от -5 до 5 с шагом 1. найти сумму значений
e x + e− x . Вычисление y организуйте в подпрограмме. y= 2 Какими знаниями Вы овладели, какие умения и навыки Вы приобрели на занятии №12? • познакомились с понятием «подпрограмма», условия реализации программ, содержащих подпрограммы; • научились работать с электронной лекцией: снимаем REM в нужном месте и запускаем программу, нет необходимости вводить эту программу – очень эффективная форма работы; • рассмотрели конкретные интересные задачи, программная реализация которых требует применения подпрограмм; • научились суммировать цифры натурального числа; • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации подпрограмм.
67
Занятие 13 Составление и отладка более сложных программ, содержащих выбор, циклы и подпрограммы. Итоговое занятие по теме. Мы изучили конструкции ветвления, научились программировать циклы типа «До» и «После» с помощью IF…THEN, DO…LOOP и FOR…NEXT, умеем использовать подпрограммы. Настоящее занятие – подведение итогов по изученному материалу, закрепление и проверка Ваших умений и навыков. Несколько задач подробно разберем совместно. Затем Вам будут предложены задачи для самостоятельной разработки. 1.Задача. даны три числа, проверить, могут ли они являться сторонами треугольника, если «да», то вычисление его медиан и высот организовать в подпрограммах. В результате работы программы выдать длины медиан и высот. ________________Программа 13.1________________ 10 CLS PRINT TAB(15); "Введите три числа, выражающие стороны треугольника"; INPUT a, b, c REM**Из трех чисел выбираем наибольшее и сохраняем в а** IF b > a AND b > c THEN SWAP a, b IF c > a AND c > b THEN SWAP a, c REM**Проверяем, могут ли они быть сторонами треугольника** IF a ^ 2 > b ^ 2 + c ^ 2 THEN PRINT TAB(10); "Вы не правы - это не треугольник" PRINT TAB(10); "Нажмите пробел и введите три числа снова" DO: LOOP WHILE INKEY$ " ": GOTO 10: '**Обратите внимание на '**эту конструкцию и применяйте ее в дальнейшем***** END IF p = (a + b + c) / 2: s = SQR(p * (p - a) * (p - b) * (p - c)) REM*** Это вычислили полупериметр и площадь по формуле Герона REM** Организуем меню выбора***** 15 CLS : t = 0 LOCATE 5, 30: PRINT "Будете вычислять:" PRINT TAB(32); "M - медианы" PRINT TAB(32); "V - высоты" PRINT TAB(26); "Нажмите соответствующую клавишу" '**Выбор медианы или высоты**** 20 a$ = INKEY$ IF a$ = "M" OR a$ = "m" OR a$ = "ь" OR a$ = "Ь" THEN t = 1 IF a$ = "V" OR a$ = "v" OR a$ = "М" OR a$ = "м" THEN t = 2 IF t = 1 THEN 22 IF t = 2 THEN 24 ELSE 20 IF t = 1 THEN 68
22 PRINT TAB(35); "Записывайте:" x = a: y = b: z = c: GOSUB 30: PRINT TAB(32); "m1 = "; m x = a: y = c: z = b: GOSUB 30: PRINT TAB(32); "m2 = "; m x = b: y = c: z = a: GOSUB 30: PRINT TAB(32); "m3 = "; m END IF IF t = 2 THEN 24 PRINT TAB(35); "Записывайте:" x = a: GOSUB 40: PRINT TAB(32); "v1 = "; v x = b: GOSUB 40: PRINT TAB(32); "v2 = "; v x = c: GOSUB 40: PRINT TAB(32); "v3 = "; v END IF '**И очередной диалог с пользователем***** LOCATE 15, 30: PRINT "Продолжение" PRINT TAB(32); "N - новый треугольник" PRINT TAB(32); "D - другие элементы этого треугольника" PRINT TAB(32); "T - Окончание работы" PRINT TAB(26); "Нажмите соответствующую клавишу" 25 a$ = INKEY$ IF a$ = "N" OR a$ = "n" OR a$ = "Т" OR a$ = "т" THEN 10 IF a$ = "D" OR a$ = "d" OR a$ = "В" OR a$ = "в" THEN 15 IF a$ = "T" OR a$ = "t" OR a$ = "Е" OR a$ = "е" THEN END ELSE 25 30 '******Подпрограмма вычисления медиан********* m = SQR(2 * x ^ 2 + 2 * y ^ 2 - z ^ 2) / 2 RETURN 40 '******Подпрограмма вычисления высот********* v=2*s/x RETURN 2.Интереснейшая познавательная задача. В какой день Вы родились? Сколько дней прожили на свете? Вы хотите узнать? Пожалуйста, компьютерная программа ответит на эти вопросы! Только воспользуйтесь формулами. Число дней после 01,01,1700 до любой даты до 28.02.2100 вычисляется по формулам: Для января и февраля: n = [ 365,25(g – 1) ] + [30,6(m + 13)] + d - 621049 Для остальных месяцев: n = [ 365,25g ] + [30,6(m + 1)] + d – 621049, где квадратные скобки означают целую часть выражения, т.е. функция INT. d, m, g – соответственно день, месяц, год указанной даты, n – число дней после 01.03.1700 до введенной Вами даты. По параметру w можно найти день недели указанной даты, разберитесь по листингу программы, как это можно сделать. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Программа 13.2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. SCREEN 9: COLOR 14, 1 69
CLS PRINT : PRINT PRINT TAB(10); : INPUT "Введите сегодняшний день месяц год "; d, m, g dd = d: mm = m: gg = g GOSUB 40: s = nn 10 CLS : PRINT TAB(10); : INPUT "Введите день месяц год Вашего рождения"; d, m, g dd = d: mm = m: gg = g GOSUB 40: s1 = nn t = s - s1 PRINT TAB(30); "Вы прожили"; t; " дней" GOSUB 50: PRINT TAB(30); "Ваш день рождения "; : PRINT ; a$ PRINT : PRINT '**Диалог с пользователем********* PRINT TAB(10); "1 - для друго дня рождения или 2 - выход" PRINT TAB(10); "Нажмите соответствующую клавишу" 30 a$ = INKEY$ IF a$ = "1" THEN 10 IF a$ = "2" THEN END ELSE 30 40 '**********Подпрограмма. Число дней после 1,1,1700 ********** IF mm 2 THEN nn = INT(365.25 * gg) + INT(30.6 * (mm + 1)) + dd - 621049 RETURN 50 '******* Подпрограмма. Определение дня недели **************** f = 365 * g + d + 31 * (m - 1) IF m 1 ⎩ Это значит, что необходимо организовать подпрограмму по вычислению значений функции. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Программа 13.5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. 71
SCREEN 9: COLOR 14, 1 CLS s=0 PRINT TAB(10); : INPUT "Начальное и конечное значения аргумента"; a, b h = (b - a) / 1000 FOR x = a TO b - h STEP h GOSUB 10: y1 = y x=x+h GOSUB 10 dl = SQR((y1 - y) ^ 2 + h ^ 2) s = s + dl NEXT x PRINT TAB(10); "Длина дуги равна"; s END 10 REM******* Подпрограмма вычисления значений функции ******** IF x < -1 THEN y = x ^ 3 + 2 IF x >= -1 AND x 1 THEN y = EXP(x - 1) RETURN В заключение итогового занятия спрограммируйте самостоятельно следующие задачи. 6. А теперь очень легкое упражнение. Напишите письмо стандартной формы, адресованное различным людям. Текст письма расположите в подпрограмме. 7.Определите и напечатайте 5 случайных двузначных целых чисел, сумма которых равна 100. 8.Используя циклы по аргументам оператора LOKATE обрамите экран монитора 2-3-мя рядами каких-нибудь символов, которые имеют различные, случайные цвета. 9.Используя циклы по аргументам оператора LOKATE, напечатайте свое имя лесенками по основной и вспомогательной диагоналям. 10.Дано трехзначное натуральное число. Напечатать его цифры и составить из этих цифр путем их перестановки другие трехзначные числа, например: 123 – это задано пользователем. Пусть Ваша программа найдет 132, 213, 231, 312, 321.
72
11.Пользователь задает положительное «а» и натуральное n. Возведите «а» в степень n не пользуясь операцией возведения в степень «^». 12.Пользователь задает целое положительное число а. Среди чисел:
1 1 1 1 1 1 1, 1 + , 1 + + , 1 + + + ,... 2 2 3 2 3 4
найдите первое, превышающее заданное а. Какими знаниями Вы овладели, какие умения и навыки Вы приобрели на занятии №13? • на конкретных примерах закрепили понятие «подпрограмма», условия реализации программ, содержащих подпрограммы; • познакомились с реализацией ряда занимательных задач; • рассмотрели конкретные интересные задачи, программная реализация которых требует применения подпрограмм и циклов; • научились оформлять экран монитора иcпользуя циклы в операторе LOCATE; • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации подпрограмм и циклов.
73
Занятие 14. Одномерные массивы: определение, заполнение, печать. Цель занятия: научить определять, заполнять, распечатывать одномерные массивы. А также Вы должны научиться алгоритмизировать и программировать простейшие типовые задачи обработки одномерных массивов. Вам предлагается ознакомиться с этим вопросом через электронную лекцию, как работать с лекцией, Вы уже ознакомлены. В конце лекции приведены задачи для самостоятельной работы, законспектируйте их и выполните те, которые не вызывают особых затруднений. Невыполненные задачи – это Ваше домашнее задание. Для обязательного выполнения сегодня - 1, 3, 5, 7, 15 Определение, заполнение, печать одномерных массивов. Простейшие программы обработки одномерных массивов. SCREEN 9: COLOR 14, 1: CLS : RANDOMIZE TIMER ''*Одномерный массив - множество, поставленное в соответствие '*натуральным числам. В математике это - индексированные переменные '*Определение, заполнение и вывод одномерного массива ********** '*Примеры простейших задач на двумерные массивы ********** '**** Это задание, определение двумерного массива ******** 'PRINT TAB(10); : INPUT "Сколько элементов в массиве?"; n 'DIM x(n) '*Число элементов можно задать оператором LET или определить '*массив с определенным числом элементов: DIM x(12) '*В одной строке с оператором DIM можно задавать несколько массивов: '*DIM a(10),b(n),c(m) '*Необходимо помнить, что строка с оператором DIM должна обрабатываться '*программой только ОДИН РАЗ, иначе - ошибка, узнайте какая... '*А теперь каждую программку законспектируйте, снимите REM '*и можете запускать на проверку, убеждаясь в их работе '*Заполнение одномерного массива с клавиатуры******* 'INPUT "Сколько элементов в массиве"; n 'DIM x(n) 'FOR i = 1 TO n 'PRINT "x("; i; ") ="; : INPUT x(i) 'NEXT j, i '*** А это программка распечатки массива ******** 'FOR i = 1 TO n 'PRINT x(i) '*Проверьте как будет распечатываться массив, если после х(i) поставить ;или, 'NEXT i '**** А это заполнение массива случайными числами******** '*Не забудьте вначале определить массив 'PRINT TAB(10); : INPUT "из какого отрезка a,b брать значения x(i)"; a, b 'FOR i = 1 TO n:x(i) = INT(a + (b - a) * RND):NEXT i '***************************************************** '***А так его можно ввести с помощью DATA-READ ************ '***Здесь располагайте элементы массива, их должно быть n ************ 'DATA 2,6,-8,6,4,6,7,8,9,0,6,8 'FOR i = 1 TO n:READ x(i):NEXT i
74
'*Элементы массива можно определить и по заданной формуле ** '* Например 'FOR i = 1 TO n 'x(i) = (i ^ 3 + SQR(i + 1)) / i 'NEXT i '*Последнее замечание. Если элементов в массиве меньше 10, то массив '*определяется средой QBASIC по умолчанию, т.е. оператор DIM в программе '*можно не размещать, чего делать не советуем... '*** Хорошо разберитесь с тем, что прочитали и законспектировали *** '*** А далее, собственно, решение типовых задач обработки массивов** 'Приведем примеры. Задача1 . В одномерном целочисленном массиве содержатся 'положительные и отрицательные элементы. Найти их средние арифметические 'PRINT TAB(10); : INPUT "Сколько элементов в массиве?"; n 'DIM x(n) 'PRINT TAB(10); : INPUT "Из какого отрезка a,b брать значения x(i)"; a, b 'FOR i = 1 TO n 'x(i) = INT(a + (b - a) * RND) 'PRINT x(i); 'NEXT i 'sp = 0: so = 0: kp = 0: ko = 0 'FOR i = 1 TO n 'IF x(i) > 0 THEN kp = kp + 1: sp = s + sp 'IF x(i) < 0 THEN ko = ko + 1: so = s + sp 'NEXT i 'sap = sp / kp: sao = so / ko '*Выводим ответ 'PRINT TAB(10);"Среднее арифметическое положительных ";sap 'PRINT TAB(10);"Среднее арифметическое отрицательных ";sao '*Задача 2. Выяснить есть ли в одномерном целочисленном '* массиве, в котором содержатся положительные и отрицательные элементы '* противоположные элементы, вывести их на печать или выдать сообщение '* что противоположных нет 'INPUT "Сколько элементов в массиве"; n 'DIM x(n) 'a = -4: b = 5 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT : PRINT 'k = 0 'FOR i = 1 TO n - 1: FOR j = 1 + i TO n 'IF x(i) = -x(j) AND x(i) 0 THEN 'PRINT TAB(10); "x("; i; ") = - x("; j; ")", , x(i), x(j) 'k = k + 1 'END IF 'NEXT j, i 'IF k = 0 THEN PRINT TAB(5); "Как видите, противоположных нет" '* Еще простейшие задачи, перепишите их в конспект, решайте *********** '* их сейчас, решайте дома, консультируйтесь друг с другом ************* '* Итак, задан одномерный целочисленный массив, содержащий положительные* '* и отрицательные элементы, заполните его случайными числами и распечатайте* '*1) Найти сумму его четных и нечетных элементов* '*2) Найти сумму элементов, кратных 6 или выдать сообщение, что таких нет* '*3) Найти сумму элементов, больших введенного пользователем числа*
75
'*4) Найти количество больших среднего арифметического всех элементов* '*5) Отрицательные элементы заменить единицами ** '*6) Заменить отрицательные элементы их модулями ******************* '*7) Вывести на печать вместе с индексами элементы, кратные трем ******** '*8) Вывести на печать суммы элементов с четными и нечетными индексами* '*9)Подсчитать сколько раз в массиве встречается максимальный элемент* '*10)Найти наименьший положительный элемент* '*11)Найти элементы массива, значения которых совпадают с индексом* '*12)Заменить каждый элемент массива суммой предыдущих* '*13)Изменить знак всех нечетных элементов* '*14)Подсчитать количество четных элементов, имеющих нечетные индексы* '*15)Подсчитать сколько раз встречается в массиве элементы равные заданному ‘**числу, введенному пользователем '* И так далее. * '* Успехов в освоении операций над массивами! Следующее занятие – контроль усвоения.
Приведем для примера несколько программ, реализующие несложные задачи по обработке одномерных массивов. SCREEN 9: COLOR 14, 1: CLS '****Задача 12***** '****Заменить элементы массива, начиная со второго суммой предыдущих***** INPUT "Сколько элементов в Вашем массиве"; n a = 2: b = 12 DIM x(n) FOR i = 1 TO n x(i) = INT(a + (b - a) * RND) PRINT x(i); NEXT i PRINT : PRINT FOR i = 2 TO n x(i) = x(i) + x(i - 1) NEXT i FOR i = 1 TO n: PRINT x(i); : NEXT i
Вам предстоит не только составлять программы обработки одномерных массивов, но и «защищать» свои работы, это предстоит и на устном экзамене. Поэтому приведем программу с подробным комментарием: что надо знать при защите работ. Элементы массива х(12) принимают значения натуральных чисел из интервала (1; 10). Вывести на печать значения и индексы тех элементов, которые равны своему индексу. После каждой строки следует комментарий. Номера строк поставлены для того, чтобы сделать этот комментарий понятным
76
SCREEN 9 Эта строка, как помните, определяет экранный режим: 25 строк, 80 позиций по горизонтали COLOR 14, 1 Оператор устанавливает цветовой режим: желтый – цвет символов, голубой – цвет фона CLS Очистка экрана RANDOMIZE TIMER Элементам массива будем присваивать случайные значения, чтобы при каждом запуске они принимали различные значения, запускаем генератор случайных чисел DIM x(12) Определяем массив, имя элементов – «х», их количество 12 5 FOR i = 1 TO 12 Открываем цикл по параметру i, который изменяется от 1 до 12 с шагом 1 x(i) = INT(1 + 10 * RND) Всем 12-ти элементам массива присваиваем случайные натуральные значения из указанного интервала PRINT x(i); Выводим на печать значения элементов массива в строку – «;» NEXT i Если i < 12 то управление передается на строку 5, если i = 12, то управление передается на следующую строку 10 10 PRINT Т.н. «пустой PRINT», он вводится с тем, чтобы последующая информация выводилась на следующей строке после вывода элементов массива, т.е. «отменяет» «;» k=0 Присваиваем переменной k нулевое значение. Это т.н. «признак», если нужные элементы будут найдены, то этот признак будет изменен, если нет – то у k останется нулевое значение 12 FOR i = 1 TO 12 Открываем цикл по параметру i, который изменяется от 1 до 12 с шагом 1 15 IF x(i) = i THEN Ставим условие, оговоренное в условии задачи: элемент равный своему индексу, если такой элемент будет найден, то будет исполняться блок 15- 30 иначе управление будет передано на строку 35 20 PRINT TAB(10); "x("; i; ")="; i Печать соответствующего элемента вместе с индексом 25 k = 1 Изменение признака в связи с выполнением условия в строке 15 30 END IF 77
Прекращение действия условия строки 15 35 NEXT i Если i < 12 то I увеличивается на 1 и управление передается на строку 12, если i = 12, то управление передается на следующую строку 40 40 IF k = 0 THEN PRINT "Таких элементов нет" Вывод отрицательного результата Переменную k определили как признак. Но можно под этой переменной подразумевать т.н. счетчик. Для этого изменить строку 25 k = k + 1 и вывод результата осуществить так: 40 IF k > 0 THEN PRINT “Как видите таких элементов ровно”; k ; ELSE PRINT "Таких элементов нет" Выполняя домашнее задание старайтесь комментировать каждую строку так или примерно так, как это было сделано выше. Какими знаниями Вы овладели, какие умения Вы приобрели на занятии №14? • Познакомились с одномерными массивами, усвоили оператор DIM • Конспектируя электронную лекцию усвоили как определяется массив; • Усвоили способы присвоения элементам массива значений; • Т.к. мы не решаем конкретные технические и экономические задачи, то в большинстве случаев будем «заполнять» массив случайными числами, интервал для них может задавать пользователь или программист оператором LET; • Рассмотрели примеры задач на обработку одномерного массива; • Ознакомились с методикой «защиты» своих программ по обработке одномерных массивов.
78
Занятие 15. Типовые задачи обработки одномерных массивов Цель занятия: оценить понимание электронной лекции, умений определять, заполнять и распечатывать одномерные массивы, программировать простейшие операции обработки одномерных массивов. Таким образом, настоящее занятие – продолжение и развитие первого занятия по одномерным массивам. Контрольные вопросы для проведения занятия. *Что есть одномерный массив, привести примеры использования индексированных переменных в других дисциплинах. *Какой оператор ОПРЕДЕЛЯЕТ массивы? *Способы присвоения значений элементам массива. *Как вывести элементы массива на печать? *Как можно классифицировать задачи по обработке одномерных массивов. Итак, массив можно определить, спросив у пользователя количество элементов, или определить их количество в операторе DIM: DIM х(12), у(20). В тренировочных упражнениях будем присваивать значения элементам массива случайные значения, взятые из интервала (а; b) Значения a и b лучше задавать оператором LET. Запомните! Прежде чем решать задачу на обработку массива, его сначала необходимо ОПРЕДЕЛИТЬ, ПРИСВОИТЬ ЗНАЧЕНИЯ ЕГО ЭЛЕМЕНТАМ, РАСПЕЧАТАТЬ. И только затем в новом цикле приступать к его обработке, т.у. решению задачи. Условно классифицируем типовые задачи на обработку одномерных массивов. -поиск и вывод элементов массива по какому-либо условию -замена элементов массива по какому-либо признаку -подсчет количества элементов по какому-либо признаку -суммирование элементов массива по какому-либо признаку Теперь рассмотрите программы, прокомментируйте их работу, подробно объясните каждую строку. В целях сокращения объема разработки настоящего занятия в некоторых строках через двоеточие помещено более чем более одного оператора. Вы же, вводя программы в память ЭВМ, каждый оператор размещайте в отдельной строке, в таком случае программа будет легче читаться, в ней лучше находить ошибки. SCREEN 9: COLOR 14, 1: CLS RANDOMIZE TIMER '*Из букв своей фамилии сформировать символьный массив. Распечатать его '*слева на право и с права на лево 'SCREEN 9: COLOR 14, 1: CLS : LOCATE 10, 30 'DATA Р,о,м,а,с,ь 'DIM a$(6) 'FOR i = 1 TO 6:'READ a$(i): 'PRINT a$(i); 'NEXT i
79
'PRINT : PRINT : 'FOR i = 6 TO 1 STEP -1 'PRINT a$(i); 'NEXT i '*Дан массив. Напечатать индексы и количество элементов, равных 0 '*Если таких нет, сделать соответствующее сообщение 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'a = -5: b = 5 'DIM x(n) 'FOR i = 1 TO n 'x(i) = CINT(a + (b - a) * RND): 'PRINT x(i); 'NEXT i:'PRINT 'k = 0 'FOR i = 1 TO n 'IF x(i) = 0 THEN 'k = k + 1:'PRINT "x("; i; ")="; x(i) 'NEXT i 'IF k > 0 THEN PRINT "Нулевых элементов"; k; ELSE PRINT "Нулевых элементов нет" '*Определить и вывести на печать, первое отрицательное значение массива '*b(n) вместе с индексом. Массив содержит положительные и отрицательные '*элементы. 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'a = -3: b = 3 'DIM x(n) 'FOR i = 1 TO n 'x(i) = CINT(a + (b - a) * RND): PRINT x(i); 'NEXT i: 'PRINT 'FOR i = 1 TO n 'IF x(i) < 0 THEN 'PRINT "x("; i; ")="; x(i) 'i = n: '**Обратите внимание на эту строку! 'END IF 'NEXT i 'PRINT "Это первый отрицательный элемент" '*Информация о среднесуточной температуре за месяц хранится в массиве '*Определить среднемесячную температуру, количество дней, когда '*температура была ниже нуля. 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'DIM a(30) 'a = -5: b = 20 's = 0: '*Обнуляем сумму для подсчета средней температуры за месяц 't = 0: '* Обнуляем счетчик для подсчета дней когда температура ниже нуля 'FOR i = 1 TO 30: a(i) = INT(a + (b - a) * RND) 's = s + a(i): 'PRINT a(i); 'NEXT i: 'PRINT
80
'cr = s / 30 'FOR i = 1 TO 30 'IF a(i) < 0 THEN t = t + 1 'NEXT i: PRINT 'PRINT "В месяце "; t; " дней имели температуру ниже нуля" 'PRINT "Среднемесячная температура равна "; cr '*В распечатке массива выделить отдельными цветами максимальный и '*минимальный элементы. 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -9: 'b = 13 'max = a(1): min = a(1) 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i: PRINT 'FOR i = 1 TO n 'IF a(i) > max THEN max = a(i) 'IF a(i) < min THEN min = a(i) 'NEXT i 'FOR i = 1 TO n 'IF a(i) = max THEN COLOR 15 'IF a(i) = min THEN COLOR 10 'PRINT a(i); 'COLOR 14 'NEXT i '*В произвольном массиве подсчитать количество нечетных элементов, '*имеющих четные индексы 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -9: 'b = 13 'k = 0 'FOR i = 1 TO n: 'a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i: PRINT 'FOR i = 1 TO n 'IF (a(i) / 2 a(i) \ 2) AND (i / 2 = i \ 2) THEN k = k + 1 'NEXT i 'PRINT "Количество нечетных элементов имеющих четные индексы равно "; k '*Вывести суммы элементов с четными и нечетными индексами 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -9: b = 13 'k = 0: '*Обнуляем сумму элементов с четными индексами
81
't = 0: '*Обнуляем сумму элементов с нечетными индексами 'FOR i = 1 TO n: 'a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i: PRINT 'FOR i = 1 TO n 'IF i / 2 = i \ 2 THEN k = k + a(i) 'IF i / 2 i \ 2 THEN t = t + a(i) 'NEXT i 'PRINT "Сумма элементов с четными индексами равна "; k 'PRINT "Сумма элементов с нечетными индексами равна "; t '*Дан одномерный массив a(n). Вывести на печать значения, индексы и '*количество отрицательных элементов 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -9: b = 13: k = 0 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i 'PRINT 'FOR i = 1 TO n 'IF a(i) < 0 THEN PRINT "x("; i; ") = "; a(i): k = k + 1 'NEXT i 'PRINT "Кол-во отрицательных элементов равно "; k '*Вывести на печать равные элементы массива вместе с их индексами 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'FOR i = 1 TO n: 'a(i) = INT(10 * RND + 1): PRINT a(i); 'NEXT i: PRINT 'FOR i = 1 TO n - 1 'FOR j = i + 1 TO n 'IF (a(i) = a(j)) THEN PRINT "x("; i; ") = x("; j; ") = "; a(i) 'NEXT j: NEXT i '*Дан массив a(n) и число С.Найти сумму элементов которые меньше заданного С 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'INPUT "Введите число С"; c 'DIM a(n) 'k = 0 'FOR i = 1 TO n: a(i) = INT(10 * RND + 1): PRINT a(i); 'NEXT i 'PRINT 'FOR i = 1 TO n: IF a(i) < c THEN k = k + a(i) 'NEXT i: 'PRINT 'PRINT "Сумма чисел меньших С равна "; k
82
'*Элементы массива a(n) принимают только значения 1,2 и 3. '*переставьте его элементы так чтобы в начале находились элементы '*равные 1, затем 2, а в конце 3 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = 1: b = 4 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i: PRINT 'FOR j = 1 TO n 'FOR i = 1 TO n - 1 'IF a(i) > a(i + 1) THEN SWAP a(i), a(i + 1) 'NEXT i: 'NEXT j 'FOR i = 1 TO n: PRINT a(i);: NEXT i '*В массиве хранится информация о стоимости 30 видов товаров. '* Найти стоимость двух самых дорогих товаров 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'DIM a(30) 'a = 100: b = 1000: max = 0 'FOR i = 1 TO 30 'a(i) = INT(a + (b - a) * RND): PRINT a(i); 'NEXT i 'FOR i = 1 TO 30 'IF a(i) > max THEN max = a(i) 'NEXT i 'PRINT "1-й самый дорогой товар равен "; max 'FOR i = 1 TO 30: IF a(i) = max THEN a(i) = 0 'NEXT i 'max = 0 'FOR i = 1 TO 30 'IF a(i) > max THEN max = a(i) 'NEXT i 'PRINT "2-й самый дорогой товар равен "; max '*Дан одномерный массив, содержащий положительные и отрицательные эл-ты. '* Найти наименьший из положительных элементов 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -10: b = 10 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i);: NEXT i 'PRINT 'm = 100 'FOR i = 1 TO n 'IF a(i) > 0 AND a(i) < m THEN m = a(i)
83
'NEXT i 'PRINT "Наименьший положительный элемент"; m '*Сколько раз в одномерном массиве встречается максимальный элемент? 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -10: b = 10 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i);: NEXT i: PRINT 'm = a(1) 'FOR i = 2 TO n 'IF a(i) > m THEN m = a(i) 'NEXT i 'PRINT "Наибольший элемент"; m 'k = 0 'FOR i = 1 TO n 'IF a(i) = m THEN k = k + 1 'NEXT i 'PRINT "Он встречается в массиве"; k; "раз" '*Заданны массивы a(n) и b(n).Сформировать и распечатать массивы s(n) и p(n), '*состоящие соответственно из сумм и произведений элементов данных массивов. 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n), b(n), s(n), p(n) 'a = -1: b = 8 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'b(i) = INT(a + (b - a) * RND) 'NEXT i 'FOR i = 1 TO n: PRINT a(i);: NEXT i 'PRINT : PRINT : 'FOR i = 1 TO n: PRINT b(i);: NEXT i 'PRINT 'FOR i = 1 TO n: s(i) = a(i) + b(i) 'PRINT s(i);: NEXT i 'PRINT : PRINT : 'FOR i = 1 TO n: p(i) = a(i) * b(i) 'PRINT p(i); 'NEXT i '*Всем элементам массива a(12) присвоено значение 1 '*Заменить элементы следующим образом: элементам стоящим '*на четных местах присвоить значение 2, элементам, индекс которых кратен 3 '*присвоим значение 0, второе условие приоритетно. Распечатать массив 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'DIM a(12) 'FOR i = 1 TO 12 'a(i) = 1: NEXT i
84
'FOR i = 1 TO 12 'IF i \ 2 = i / 2 THEN a(i) = 2 'NEXT i 'FOR i = 1 TO 12 'IF (i \ 3 = i / 3) THEN a(i) = 0 'PRINT TAB(10); "x("; i; ") ="; a(i) 'NEXT i '*Задан одномерный целочисленный массив a(n), содержащий положительные и '*отрицательные элементы. Вывести индексы и значения противоположных '*элементов если таковых нет, вывести соответствующее сообщение 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n) 'a = -10: b = 10 'FOR i = 1 TO n: a(i) = INT(a + (b - a) * RND) 'PRINT a(i); 'NEXT i: PRINT 'FOR i = 1 TO n - 1 'FOR j = i + 1 TO n 'IF (a(i) = -a(j)) THEN PRINT "x("; i; ") = "; a(i); " = x("; j; ") = "; a(j) 'NEXT j 'NEXT i '*Задан одномерный массив x(20) значения которого от 2 с шагом 0.03 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'DIM a(20) 'a(1) = 2 'FOR i = 2 TO 20: a(i) = a(i - 1) + .03 'PRINT a(i);: NEXT i '*Из элементов массива a(n) кратных 3 сформировать массив b(k)или выдать '*сообщение, что таких элементов нет 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n), b(n) 'FOR i = 1 TO n: a(i) = INT(10 * RND + 1) 'PRINT a(i);: NEXT i 'FOR i = 1 TO n 'IF a(i) / 3 = a(i) \ 3 THEN k = k + 1: b(k) = a(i) 'NEXT i 'PRINT 'IF k = 0 THEN PRINT "Таких чисел нет" 'FOR i = 1 TO k: PRINT b(i); 'NEXT i '*Дано n случайных точек на отрезке [a,b] Посчитать значение функции '* y=cosx+xsinx в этих точках. Результат записать в массив 'SCREEN 9: COLOR 14, 1: CLS
85
'RANDOMIZE TIMER 'INPUT "Введите координаты отрезка [a,b]"; a, b 'INPUT "Сколько вы возьмёте случайных чисел "; n 'DIM a(n) 'FOR i = 1 TO n 'x = INT(a + (b - a) * RND) 'a(i) = COS(x) + x * SIN(x) 'PRINT a(i); 'NEXT i '*Дан одномерный массив имеющий не все нулевые элементы '*Получить новый массив путем исключения нулевых элементов 'SCREEN 9: COLOR 14, 1: CLS 'RANDOMIZE TIMER 'INPUT "Сколько элементов в Вашем массиве"; n 'DIM a(n), b(n) 'FOR i = 1 TO n: a(i) = INT(10 * RND - 5) 'PRINT a(i);:NEXT i 'FOR i = 1 TO n 'IF a(i) 0 THEN k = k + 1: b(k) = a(i) 'NEXT i: PRINT 'FOR i = 1 TO k: PRINT b(i);: NEXT i
Выберите 3-4 задачи по своим силам и вкусам и разработайте программы и их защиту 1.Найти сумму элементов массива. 2. Найти сумму положительных элементов массива. 3. Найти сумму отрицательных элементов массива. 4.Найти сумму элементов, которые меньше заданного числа. 5. Найти сумму элементов, имеющих четный индекс. 6. Найти сумму четных элементов. 7.Посчитать количество элементов, делящихся на 5 или выдать сообщение, что таковых нет. 8.Пожительные элементы заменить единицами, отрицательные нулями. 9.Все элементы со значениями меньше 5-ти в данном одномерном массиве заменить нулями. 10.Вывести суммы элементов с четными и нечетными индексами. 11. В массиве подсчитать количество положительных и отрицательных элементов. 12.Найти среднее арифметическое элементов массива. 13.Найти наименьший положительный элемент массива. 14.Каждый третий элемент массива заменить числом 10. 15.Найти количество элементов массива больших среднего арифметического его элементов. 16.Есть ли среди положительных элементов массива элементы, равные своему индексу, в противном случае выдать сообщение, что таковых нет. 86
17.Найти максимальный и минимальный элементы массива. 18. Подсчитать сколько раз в массиве встречается максимальный (минимальный) элемент. 19.Найдите наибольший индекс отрицательного элемента. 20.Есть ли среди элементов массива противоположные числа? Какие умения и навыки Вы приобрели на занятии №15? • Классифицировали типовые задачи обработки одномерных массивов. • Рассмотрели типовые, но различные задачи на одномерные массивы • Овладели опытом анализа текстовых задач по обработке массивов; • Представили на проверку свои первые программы по обработке одномерных массивов;
87
Занятие 16. Более сложные задачи обработки одномерных массивов На этом занятии Вам предстоит ознакомиться с программами, реализующими более сложные алгоритмы обработки одномерных массивов. Форма работы – очередная электронная лекция. В настоящей разработке приводится текст этой лекции. SCREEN 9: COLOR 14, 1: CLS RANDOMIZE TIMER '*Рассмотрим более сложные задачи на обработку одномерных массивов '*Задача 1. Из элементов двух массивов составить один массив '**Т.н. задача - сложение массивов** 'INPUT "Сколько элементов в массивах"; n, m 'DIM x(n), y(m), z(n + m) 'a = -9: b = 10 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND) 'PRINT x(i); 'NEXT i: PRINT 'FOR i = 1 TO m: y(i) = INT(a + (b - a) * RND) 'PRINT y(i); 'NEXT: PRINT 'FOR i = 1 TO n: z(i) = x(i): NEXT 'k = 1 'FOR i = n + k TO n + m: z(n + k) = y(k): k = k + 1: NEXT 'FOR i = 1 TO n + m: PRINT z(i); : NEXT i '******Задача 2. Сжатие массива ************************ '*Удалить из массива все элементы, равные нулю* 'INPUT "Сколько элементов в массиве"; n 'DIM x(n), y(n) 'a = -4: b = 5 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT 'k = 0 'FOR i = 1 TO n 'IF x(i) 0 THEN k = k + 1: y(k) = x(i) 'NEXT 'FOR i = 1 TO k: PRINT y(i); : NEXT '*******Задача 3. Разделение массива ****************** '*Из элементов массива получить два массива, разделив его элементы ‘по какому-либо признаку, например, по знаку элементов 'INPUT "Сколько элементов в массиве"; n 'DIM x(n), y(n), z(n) 'a = -9: b = 12 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT 88
'k = 0: t = 0 'FOR i = 1 TO n 'IF x(i) < 0 THEN k = k + 1: y(k) = x(i) 'IF x(i) > 0 THEN t = t + 1: z(t) = x(i) 'NEXT 'PRINT 'FOR i = 1 TO k: PRINT y(i); : NEXT i 'PRINT 'FOR i = 1 TO t: PRINT z(i); : NEXT i '*Задача 4.Упорядочивание массива по возрастанию или по убыванию*** 'INPUT "Сколько элементов в массиве"; n 'DIM x(n) 'a = -9: b = 12 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT 'FOR j = 1 TO n 'FOR i = 1 TO n - 1 'IF x(i) > x(i + 1) THEN SWAP x(i), x(i + 1) 'NEXT i, j 'FOR i = 1 TO n: PRINT x(i); : NEXT i '*******Задача 5. Вставка в массив ****************** '*А как вставить число в уже определенный массив? 'INPUT "Сколько элементов в массиве"; n 'DIM x(n + 1) 'a = -9: b = 12 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT : PRINT 'INPUT "На какое место поставить элемент"; r 'INPUT "Чему он равен"; t 'FOR i = n + 1 TO r STEP -1: x(i) = x(i - 1): NEXT i 'x(r) = t 'FOR i = 1 TO n + 1: PRINT x(i); : NEXT '**Задача 6. Инверсия массива: перестановка его элементов*** 'INPUT "Сколько элементов в массиве"; n 'DIM x(n) 'a = -9: b = 12 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT : PRINT 'FOR i = 1 TO n / 2 'SWAP x(i), x(n - i + 1) 'NEXT 'PRINT 'FOR i = 1 TO n: PRINT x(i); : NEXT 89
'*******Задача 7. Переставить все нулевые элементы в конец массива********** 'INPUT "Сколько элементов в массиве"; n 'DIM x(n), y(n) 'a = -3: b = 2 'FOR i = 1 TO n: x(i) = INT(a + (b - a) * RND): PRINT x(i); : NEXT i 'PRINT : PRINT 'k = 0 'FOR i = 1 TO n: IF x(i) 0 THEN k = k + 1: y(k) = x(i) 'NEXT i 'FOR i = 1 TO n: PRINT y(i); : NEXT i '******* Задача 7.1 Та же задача, но без дополнительного массива***** 'FOR i = 1 TO n 'FOR j = 1 TO n - 1 'IF x(j) = 0 THEN SWAP x(j), x(j + 1) 'NEXT j, i 'PRINT 'FOR i = 1 TO n: PRINT x(i); : NEXT '* Законспектируйте задачи для самостоятельного решения************** '*(1)В массиве a(n) вычислить сумму четных элементов, имеющих четные индексы или выдать сообщение, что таких элементов нет* '*(2)В массиве a(n) каждый элемент заменить суммой предыдущих.**** '*(3)В целочисленном массиве a(n) исключить элементы, кратные 3** '*(4)Проверьте, есть ли целочисленном массиве x(n), если есть, найдите '* наибольший индекс отрицательного элемента** '*(5)Задан массив. Поменять местами а)второй и пятый элементы; б)третий и максимальный элементы; в)первый и минимальный элементы.* '*(7)Найти сумму элементов массива, стоящих а)до наибольшего элемента; '*8) после наибольшего; с)между наибольшим и наименьшим элементами.**** '*(9) Элементы массива a(n) принимают только значения 1,2 и 3. Переставьте его элементы таким образом, чтобы вначале находились элементы, равные 1, затем 2, и в конце массива 3. Задачи для домашней работы. 1.Дан целочисленный массив a(n). Подсчитайте, сколько раз встречается в этом массиве максимальное по величине число. 2.Изменить знак всех нечетных элементов массива. 3.Для массива r(n), имеющего положительные и отрицательные элементы вычислить среднее арифметическое положительных и отрицательных элементов. 4.Вычислить суммы элементов с четными и нечетными индексами. 90
5.Информация о среднесуточной температуре воздуха за месяц задана в виде массива. Определить, сколько дней t была ниже 0. 6.Дан одномерный массив произвольной размерности, в котором не все элементы равны нулю. Получить новый массив путем исключения нулевых элементов. 7.Даны два массива x и y, получить новый массив Z. Элементами массива Z сначала является элементы массива x, а затем элементы массива y. Какие умения и навыки Вы приобрели на занятии №16? • Рассмотрели интереснейшие задачи на обработку массивов, классифицировали эти задачи; • Рассмотрели типовые задачи, такие как инверсия массива, упорядочивание массива и другие. • Умножили свой опыт анализа текстовых задач по обработке массивов; • Самостоятельно программно реализовали алгоритмы по обработке одномерных массивов;
91
Занятие 17. Двумерные массивы: определение, заполнение, печать. В первом семестре в курсе математики Вас знакомили с определителями и матрицами. Матрица – прямоугольная таблица элементов одинаковой природы, каждый элемент матрицы имеет двойной индекс: первый – номер строки, второй – номер столбца. Если число строк равно числу столбцов, то такую матрицу будем называть квадратной. В учебной литературе принято параметр строк (первый индекс элемента матрицы) обозначать переменной i, параметр столбцов – второй индекс – j. Естественно, двумерные массивы будем заполнять, распечатывать и обрабатывать во вложенных циклах. Когда Вы вычисляли определители, то использовали понятия главной и вспомогательной диагоналей. Сформулируем признаки элементов, принадлежащих основной и вспомогательной диагоналям, а также понятия НАД и ПОД соответствующими диагоналями. Если индексы равны, то такой элемент принадлежит главной диагонали. Если i > j, то элемент находится ПОД главной диагональю, если i < j, то такой элемент – над главной диагональю. Нетрудно видеть, что если индексы удовлетворяют условию i = n – j + 1, то элемент принадлежит вспомогательной диагонали. Если i < n – j + 1, то элемент – над вспомогательной диагональю, в противном случае – под вспомогательной диагональю. Изучение материала – не простого, но важного – начнем с знакомства и конспектирования очередной электронной лекции. Математики чаще говорят – матрица, программисты – двумерный массив. Внимательно изучайте и обязательно конспектируйте эту лекцию, без освоения материала этой лекции Вам в дальнейшем будет невозможно обрабатывать двумерные массивы. SCREEN 9: COLOR 14, 1: CLS : RANDOMIZE TIMER ‘********* Заполнение и вывод двумерного массива ********** '********* Примеры простейших задач на двумерные массивы ********** '*Двумерный массив - это матрица, содержащая n строк и m cтолбцов * '* Первый индекс - номер строки, 2-ой - столбца ********** REM**** Это задание, определение двумерного массива ******** PRINT TAB(10); : INPUT "Сколько строк в массиве?"; n PRINT TAB(10); : INPUT "Сколько столбцов в массиве?"; m DIM x(n, m) REM**** А это заполнение двумерного массива случайными числами******** PRINT TAB(10); : INPUT "из какого отрезка a,b брать значения x(i,j)"; a, b FOR i = 1 TO n: FOR j = 1 TO m x(i, j) = INT(a + (b - a) * RND) NEXT j, i '***************************************************** '***А так его можно ввести с клавиатуры************ 'FOR i = 1 TO n: FOR j = 1 TO m 'PRINT "x("; i; ","; j; ") ="; : INPUT x(i, j) 'NEXT j, i
92
'***А так его можно ввести с помощью DATA-READ ************ '***Располагайте элементы построчно(!), их должно быть nxm ************ 'DATA 2,6,-8,6,4,6,7,8,9,0,6,8 'FOR i = 1 TO n: FOR j = 1 TO m 'READ x(i, j) 'NEXT j, i '* Элементы массива можно определить и по заданной формуле ** '*** ************ Например 'FOR i = 1 TO n: FOR j = 1 TO m 'x(i, j) = (i ^ 3 - SQR(j + 1)) / (i + j) 'NEXT j, i ‘CLS '*** А это программка распечатки двумерного массива ******** COLOR 10 FOR i = 1 TO n: FOR j = 1 TO m LOCATE 3 + i * 2, 20 + j * 5: PRINT x(i, j) NEXT j, i COLOR 14 '********************************************************* '*** Хорошо разберитесь с тем, что выше **** '*** А далее, собственно, решение Ваших задач ******************* '** Как только начнете решать свою задачу, сохраните файл под другим именем* '** Здесь формулируйте задачу ************** '** Приведу пример. Из произвольного двумерного массива вывести на печать '** значения и индексы наибольшего и наименьшего элементов '* Массив уже заполнен одним из приведенных способов ‘min = x(1, 1): max = x(1, 1): mi = 1: mj = 1: bi = 1: bj = 1 ‘FOR i = 1 TO n FOR j = 1 TO m ‘IF x(i, j) < min THEN min = x(i, j): mi = i: mj = j ‘IF x(i, j) > max THEN max = x(i, j): bi = i: bj = j ‘NEXT j ‘NEXT i ‘PRINT '**** Выводим ответ ***************************** ‘PRINT TAB(10); : PRINT "Максимальный элемент x("; bi; ","; bj; ") ="; max ‘PRINT TAB(10); : PRINT "Минимальный элемент x("; mi; ","; mj; ") ="; min ‘END Рассмотрим еще одну задачу. Окрасить элементы матрицы по какому-либо признаку '********Окраска элементов массива по какому-либо признаку** SCREEN 9: COLOR 14, 1: CLS : RANDOMIZE TIMER PRINT TAB(10); : INPUT "Введите размерность квадратной матрицы"; n DIM x(n, n) a = -9: b = 9 FOR i = 1 TO n: FOR j = 1 TO n x(i, j) = INT(a + (b - a) * RND) NEXT j, i COLOR 14, 1 FOR i = 1 TO n: FOR j = 1 TO n LOCATE 3 + i * 2, 20 + j * 5: PRINT x(i, j) NEXT j, i
93
COLOR 14 FOR i = 1 TO n: FOR j = 1 TO n LOCATE 13 + i * 2, 20 + j * 5: IF i = n - j + 1 THEN COLOR 14: PRINT x(i, j) LOCATE 13 + i * 2, 20 + j * 5: IF i < n - j + 1 THEN COLOR 4: PRINT x(i, j) LOCATE 13 + i * 2, 20 + j * 5: IF i > n - j + 1 THEN COLOR 7: PRINT x(i, j) LOCATE 13 + i * 2, 20 + j * 5: PRINT x(i, j) NEXT j, i '* Еще простейшие задачи, перепишите их в конспект, решайте *********** '* их сейчас, решайте дома, консультируйтесь друг с другом ************* '* Итак, задан двумерный массив, содержащий положительные *** '** и отрицательные элементы, заполните и распечатайте его ******** '*1) Найти сумму его элементов, найти суммы положительных, отрицательных * '*2) Найти сумму элементов главной диагонали ******************* '*3) Найти сумму элементов, стоящих под (над) главной диагональю **** '*4) Найти количество положительных (отрицательных) элементов ************** '*5) Элементы над главной диагональю заменить единицами ******************* '*6) Заменить отрицательные элементы их модулями ******************* '*7) Вывести на печать вместе с индексами элементы, кратные трем ********
'* Огромных Вам успехов в освоении двумерных массивов **** Следующее занятие будет посвящено именно таким задачам. Какие знания и умения Вы приобрели на занятии №17? • Актуализировали понятия определителя и матрицы; • Усвоили, что элементы двумерных массивов имеют двойной индекс – первый указывает на номер строки элемента, второй – на номер столбца; • Научились определять двумерные массивы, присваивать им значения; • Научились выводить на печать двумерные массивы в естественном виде – в виде матрицы; • Рассмотрели примеры задач на обработку двумерных массивов; • Самостоятельно программно реализовали алгоритмы по обработке одномерных массивов; • Получили задачи для самостоятельной разработки.
94
Занятие 18. Типовые задачи обработки двумерных массивов. Занятие – продолжение и закрепление изученного материала по двумерным массивам на занятии 17. Проведем классификацию типовых задач обработки двумерных массивов. Задачи на замену элементов массива по какому-либо признаку. Задачи на поиск и вывод элементов массива по какому-либо признаку. Задачи на нахождение сумм и подсчет количества элементов, удовлетворяющих какому-либо признаку. Задачи на нахождение сумм элементов строк, столбцов и диагоналей. Задачи на формирование одномерных массивов из элементов двумерных массивов по какому либо признаку. Задачи на поиск наибольших (наименьших) элементов строк (столбцов) двумерных массивов. Этот список будет продолжен на последующих уроках. Чаще всего Вы будете работать с квадратными матрицами, поэтому вначале своих программ запросите у пользователя: INPUT” Введите размерность матрицы»; n Затем определите массив так: DIM x(n,n) Затем присвойте элементам массива значения. Т.к. мы не решаем конкретных технических задач, то рекомендуется присваивать элементам массива случайные значения из какого-либо интервала, концы которого задавайте оператором LET. Заполнение массива проведите, например, так: a = -9: b = 9 FOR i = 1 TO n: FOR j = 1 TO n: x(i, j) = INT(a + (b - a) * RND) NEXT j, i И не торопитесь приступать собственно к решению задачи, а выведите матрицу на печать так: FOR i = 1 TO n: FOR j = 1 TO m LOCATE 3 + i * 2, 20 + j * 5: PRINT x(i, j) NEXT j, i А теперь приступайте собственно к задаче. Например, так. Задача. Дана квадратная матрица. Сформировать и распечатать два одномерных массива: один составлен из сумм элементов строк матрицы, второй - из наибольших элементов строк этой матрицы SCREEN 9: RANDOMIZE TIMER COLOR 14, 1: CLS PRINT TAB(5); : INPUT "Введите размерность матрицы"; n DIM x(n, n): '**объявляем двумерный массив*** 95
DIM s(n), m(n): '**объявляем два одномерных массива*** a = -9: b = 9: '*присвоение значений концам интервала, из которого '***будут принимать значения элементы массива***** FOR i = 1 TO n: FOR j = 1 TO n x(i, j) = INT(a + (b - a) * RND): '*присвоение значений элементам массива NEXT j, i '***распечатали двумерный массив ******** COLOR 10 FOR i = 1 TO n: FOR j = 1 TO n LOCATE 1 + i * 2, 15 + j * 5: PRINT x(i, j) NEXT j, i COLOR 14 FOR i = 1 TO n: '**открываем цикл по строкам по параметру i**** s = 0: '***обнулили суммы элементов каждой строки******** m = x(i, 1): '***объявили наибольшим первый элемент каждой строки******** FOR j = 1 TO n: '**открываем цикл по столбцам по параметру j**** s = s + x(i, j): '*прибавили к сумме элемент i-той строки******* IF m < x(i, j) THEN m = x(i, j): '*переопределили максимальный элемент*** NEXT j: '*закрытие цикла по столбцам, если j > n, то из этого цикла '*вышли с переменной s, имеющей значение суммы элементов i-той строки '***и переменной m, имеющей значение наибольшего элемента i-той строки s(i) = s: '**присвоение элементу одномерного массива суммы элементов i-той строки m(i) = m: '**присвоение элементу одномерного массива значения наибольшего элемента i-той строки NEXT i: '**закрытие цикла по строкам COLOR 4 PRINT "Массив, составленный из сумм элементов строк:" FOR i = 1 TO n PRINT s(i); : NEXT i PRINT COLOR 7 PRINT "Массив, составленный из наибольших элементов строк:" FOR i = 1 TO n PRINT m(i); : NEXT i А теперь самостоятельно приступайте к разработке задач: 18.1 Задачи вывода элементов по условию. -вывести элемент, расположенный в правом верхнем углу массива; -вывести наибольший (наименьший ) элемент массива; -вывести любой элемент второй строки массива, определив столбец случайно; 96
-вывести все элементы третьей строки массива; -вывести все элементы второго столбца массива; 18.2 Задачи на расчеты и вывод результатов. -найти сумму элементов массива; -найти среднее арифметическое элементов массива; -суммы элементов строк массива, занести эти суммы в одномерный массив; -суммы элементов столбцов массива, занести эти суммы в одномерный массив; -определить произведение элементов, указанной пользователем строки; -подсчитать количество элементов, превышающих среднее арифметическое элементов массива; -определить есть ли среди элементов массива элементы, равные заданному пользователем числу; 18.3.Задачи на замены. -все четные элементы массива увеличивать на 1; -из всех нечетных элементов массива вычесть последний элемент соответствующего столбца; -все элементы массива, суммы индексов которых четна, заменить числом –1; И т.д. Наиболее часто приходится работать с квадратными матрицами, у которых число строк равно числу столбцов. Часть приведенных в п 18.4 задач разобрать на уроке, другую часть Вам предлагается выполнить дома. 18.4 Дана квадратная матрица a(n,n). В этой матрице: 1. вычислить сумму всех ее элементов. 2. вычислить сумму элементов над главной диагональю. 3. вычислить сумму элементов под главной диагональю 4. вычислить сумму элементов главной диагонали. 5. вычислить сумму элементов вспомогательной диагонали. 6. вычислить сумму элементов строки, номер строки задает пользователь. 7. вычислить сумму элементов столбца, номер столбца задает пользователь. 8. определить наибольший и наименьший элементы с их индексами. 9. определить суммы положительных и отрицательных элементов. 10. определить сумму элементов, больших заданного числа t. 11.сформировать массив a(n,n), элементы которого образованы по правилу b(i,j)=(2a(i,j)+3)(3a(i,j)-2). 12. найти среднее значение сумм диагональных элементов. 13. сформировать одномерный массив из элементов главной диагонали. 14. все элементы главной диагонали заменить наибольшим элементом всего массива. 97
15.ко всем четным элементам массива прибавить 1. 16.все элементы, сумма индексов которых четна заменить на -1. 17. заменить элементы второго столбца суммой элементов этого столбца. 18. вставить после второй строки строку, состоящую из единиц. 19. все отрицательные элементы записать в одномерный массив. 20. все отрицательные элементы записать в один одномерный массив, положительные в другой. 21. все четные элементы записать в один одномерный массив, нечетные - в другой. 22. записать в одномерный массив по возрастанию элементы данной матрицы. 23. заменить нулем все элементы кроме элементов первых и последних строк и столбцов. 24. вывести на печать индексы нулевых элементов или выдать сообщение о том, что таковых нет. Какие знания, умения и навыки Вы приобрели на занятии №18? • Классифицировали типовые задачи по обработке двумерных массивов; • Закрепили операции определения, присвоения значений, распечатки двумерного массива; • Рассмотрели примеры задач на обработку двумерных массивов; • Самостоятельно программно реализовали алгоритмы по обработке двумерных массивов; • Получили задачи для самостоятельной разработки.
98
Занятие 19. Реализация более сложных алгоритмов обработки двумерных массивов Словосочетание «более сложных алгоритмов» весьма условно. Для студентов специальности 2202 это стандартные, типовые задачи, которые необходимо освоить безусловно! На этом занятии приведем в электронном виде формулировку задач и их программную реализацию. Вам необходимо вникнуть в суть задачи, при необходимости задать вопрос преподавателю, снять REM и убедиться в ее работе. Безусловно, внести в свои конспекты. Программы приводятся без комментариев с предложением к Вам разобраться самостоятельно и «защитить» понимание их работы. Итак, задачи. SCREEN 9: COLOR 14, 1: CLS RANDOMIZE TIMER '*******************Оглавление******************** '***1 - от одномерного массива к двумерному********* '***2 - вспомогательная диагональ квадратной матрицы***** '***3 - транспонирование прямоугольной матрицы***** '***4 - поиск равных элементов матрицы***** '***5 - удаление строки или столбца матрицы***** '***6 - добавление строки или столбца в матрицу***** '***7 - формирование симметричной матрицы ***************** '***8 - магический квадрат ******************************** '**Снимайте REM и запускайте по очереди программы '***Больших Вам успехов! Е.И.************************ 1 - Из одномерного к двумерному (понятна задача?). Если нет. Задан одномерный массив, необходимо образовать из его элементов матрицу, считывая элементы массива построчно. 'INPUT "Сколько элементов в одномерном массиве"; n 'DIM a(n) '3 INPUT "Сколько строк в двумерном массиве"; k 'IF n / k n \ k THEN PRINT "Ты не прав, n должно делиться на к": GOTO 3 'DIM b(k, n / k) 'FOR i = 1 TO n 'a(i) = INT(-10 + 20 * RND) 'PRINT a(i); 'NEXT i 'PRINT : PRINT 'p = 0 'FOR i = 1 TO k: FOR j = 1 TO n / k 'p = p + 1: b(i, j) = a(p) 'NEXT j, i 'FOR i = 1 TO k: FOR j = 1 TO n / k 'LOCATE 5 + i * 2, 20 + j * 5: PRINT b(i, j) 99
'NEXT j, i '***2 - вспомогательная диагональ квадратной матрицы***** 'n = 4: m = 4 'DIM a(n, m) 'a = -8: b = 9 'REM**** Это заполнение двумерного массива случайными числами* 'FOR i = 1 TO n: FOR j = 1 TO m 'a(i, j) = INT(a + (b - a) * RND) 'NEXT j, i '*** А это его распечатка ************************* 'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 3 + i * 2, 5 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 '****Это один из признаков вспомогательной диагонали ******* 'FOR i = 1 TO n: FOR j = 1 TO m 'IF j = n - i + 1 THEN a(i, j) = 0 ELSE a(i, j) = 1 'NEXT j, i '*******А это еще один*********** 'FOR i = 1 TO n: FOR j = 1 TO m 'IF i + j > n + 1 THEN a(i, j) = 1 'IF i + j < n + 1 THEN a(i, j) = -1 'NEXT j, i 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 13 + i * 2, 5 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 3 - транспонирование прямоугольной матрицы – замена строк столбцами, столбцов - строками 'INPUT "сколько строк в массиве?"; n 'INPUT "сколько столбцов в массиве?"; m 'DIM a(n, m), b(m, n) 'a = -8: b = 9 'REM**** Это заполнение двумерного массива случайными числами* 'FOR i = 1 TO n: FOR j = 1 TO m 'a(i, j) = INT(a + (b - a) * RND) 'NEXT j, i '*** А это его распечатка ************************* 'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 3 + i * 2, 1 + j * 5: PRINT a(i, j) 'NEXT j, i 100
'COLOR 14 'FOR i = 1 TO n: FOR j = 1 TO m 'b(j, i) = a(i, j): NEXT j, i 'SWAP n, m: '****Подумайте, зачем это...***** 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 13 + i * 2, 1 + j * 5: PRINT b(i, j) 'NEXT j, i 'COLOR 14 '***4 - поиск равных элементов матрицы***** INPUT "сколько строк в массиве?"; n INPUT "сколько столбцов в массиве?"; m DIM a(n, m) INPUT "из какого отрезка a,b брать значения x(i,j)"; a, b REM**** Поиск равных элементов двумерного массива ******** FOR i = 1 TO n: FOR j = 1 TO m a(i, j) = INT(a + (b - a) * RND) NEXT j, i COLOR 10 FOR i = 1 TO n: FOR j = 1 TO m LOCATE 3 + i * 2, 1 + j * 5: PRINT a(i, j) NEXT j, i COLOR 14 FOR i = 1 TO n: FOR j = 1 TO m r = a(i, j) FOR k = i TO n FOR q = j + 1 TO m IF a(k, q) = r THEN PRINT "a("; i; ","; j; ") = a("; k; ", "; q; ") = "; r NEXT q NEXT k NEXT j, i '***5 - удаление строки или столбца матрицы***** 'INPUT "сколько строк в массиве?"; n 'INPUT "сколько столбцов в массиве?"; m 'DIM a(n, m) 'a = -9: b = 9 'FOR i = 1 TO n: FOR j = 1 TO m 'a(i, j) = INT(a + (b - a) * RND) 'NEXT j, i 'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 3 + i * 2, 1 + j * 5: PRINT a(i, j) 'NEXT j, i 101
'COLOR 14 'INPUT "Удалить строку"; t 'FOR i = t TO n - 1: FOR j = 1 TO m 'SWAP a(i, j), a(i + 1, j) 'NEXT j, i 'n = n - 1: FOR i = 1 TO n: FOR j = 1 TO m: a(i, j) = a(i, j): NEXT j, i 'INPUT "Удалить столбец"; t 'FOR j = t TO m - 1: FOR i = 1 TO n: SWAP a(i, j), a(i, j + 1) 'NEXT i, j 'm = m - 1: FOR i = 1 TO n: FOR j = 1 TO m: a(i, j) = a(i, j): NEXT j, i 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 13 + i * 2, 1 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 '***6 - добавление строки или столбца в матрицу***** n = 4: m = 4 'DIM a(n + 1, m) 'a = -8: b = 9 'FOR i = 1 TO n: FOR j = 1 TO m 'a(i, j) = INT(a + (b - a) * RND) 'NEXT j, i 'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE i * 2, 5 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 'INPUT "Какую строку вставить"; r 'FOR i = n TO r STEP -1: FOR j = 1 TO m 'SWAP a(i, j), a(i + 1, j) 'NEXT j, i 'PRINT "Введите строку, после набора каждого элемента - Enter" 't = CSRLIN 'FOR j = 1 TO m: LOCATE t, 2 + 3 * j: INPUT a(r, j): NEXT j 'FOR i = 1 TO n + 1: FOR j = 1 TO m 'LOCATE 13 + i * 2, 5 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 '*****Самостоятельно разработайте программу вставки столбца******** '***7 - формирование симметричной матрицы ***************** 'n = 4: m = 4 'DIM x(n, m) 'a = -10: b = 10 'FOR i = 1 TO n: FOR j = 1 TO m 'x(i, j) = INT(a + (b - a) * RND) 'NEXT j, i 102
'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 1 + i * 2, 20 + j * 5: PRINT x(i, j) 'NEXT j, i 'COLOR 14 '*****Матрица называется симметричной, если x(i,j)=x(j,i)*** 'FOR i = 1 TO n: FOR j = 1 TO m 'IF i > j THEN x(i, j) = x(j, i) 'NEXT j, i 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 10 + i * 2, 20 + j * 5: PRINT x(i, j) 'NEXT j, i '*8 - магический квадрат. Это занимательная классическая задача. Вспомните известную картину известного художника. '*Магический квадрат это квадратная матрица, у которой суммы элементов строк, столбцов и диагоналей РАВНЫ * '*Это задача уже для олимпиады, постарайтесь разобраться в этой интересной программе 'n = 3: m =3 'DIM a(n, m), s(n ^ 2 + 2) 'a = 1: b = 6 'k = 0 '5 k = k + 1 'LOCATE 1, 35: PRINT k 'FOR i = 1 TO n: FOR j = 1 TO m 'a(i, j) = INT(a + (b - a) * RND) 'NEXT j, i 'COLOR 10 'FOR i = 1 TO n: FOR j = 1 TO m 'LOCATE 2 + i * 2, 15 + j * 5: PRINT a(i, j) 'NEXT j, i 'COLOR 14 'PRINT 'PRINT "Строки:" 'FOR i = 1 TO n: 's = 0: FOR j = 1 TO m: s = s + a(i, j) 'NEXT j 's(i) = s 'PRINT s(i); 'NEXT i 'PRINT 'PRINT "Столбцы:" 'FOR i = 1 TO n: 's = 0: FOR j = 1 TO m: s = s + a(j, i) 103
'NEXT j 's(n + i) = s 'PRINT s(n + i); 'NEXT i 'PRINT 'PRINT "Диагонали:" 's1 = 0: s2 = 0 'FOR i = 1 TO n: 'FOR j = 1 TO m 'IF i = j THEN s1 = s1 + a(i, j) 'IF i + j = n + 1 THEN s2 = s2 + a(i, j) 'NEXT j: NEXT i 's(2 * N + 1) = s1: s(2 * N + 2) = s2: 'PRINT s1; s2 'PRINT 'FOR i = 2 TO 2 * N + 2: 'IF s(1) s(i) THEN 5 'NEXT i 't = a(1, 1) 'FOR i = 1 TO N: FOR j = 1 TO m 'IF a(i, j) = t THEN 10 ELSE END '10 NEXT j, i 'GOTO 5 '**********************Задача по экономике************************ '*У фирмы три магазина. Известен доход каждого магазина в каждый день первой декады месяца. ОПРЕДЕЛИТЬ 'SCREEN 9: COLOR 1, 14 'RANDOMIZE TIMER: CLS 'DIM a(3, 10) 'FOR i = 1 TO 3 'FOR j = 1 TO 10 'a(i, j) = INT(10 + 50 * RND) 'NEXT j, i 'FOR i = 1 TO 3 'LOCATE 1 + i, 2: PRINT "Магазин №"; i 'FOR j = 1 TO 10 'LOCATE 1, 11 + j * 6: PRINT j; "-е" 'LOCATE 1 + i, 12 + j * 6: PRINT a(i, j) 'NEXT j 'NEXT i '*1)Какой из магазинов получил максимальный общий доход за 10 дней 's = 0: max = 0: k = 0 'FOR i = 1 TO 3 'FOR j = 1 TO 10 's(i) = s(i) + a(i, j) 104
'NEXT j 'IF s(i) > max THEN max = s(i): k = i 'NEXT i 'PRINT TAB(7); "Максимальный доход получил"; k; "магазин, он получил"; max; "руб" '*2)Какого числа фирма получила максимальный общий доход 'w = 0: max = 0: k = 0 'FOR j = 1 TO 10 'FOR i = 1 TO 3 'w(j) = w(j) + a(i, j) 'NEXT i 'IF w(j) > max THEN max = w(j): k = j 'NEXT j 'PRINT TAB(5); "Максимальный доход в размере"; max; "руб фирма получила"; k; "числа данного месяца" '*3)Какой магазин и какого числа получил максимальный доход за 10 дней 'max = 0: den = 0: mag = 0 'FOR i = 1 TO 3 'FOR j = 1 TO 10 'IF a(i, j) > max THEN max = a(i, j): mag = i: den = j 'NEXT j, i 'PRINT TAB(2); "Магазин №"; mag; "получил максимальный доход в размере"; max; "руб"; den; "числа данного месяца" '*4)Для каждого магазина, определить какого числа этот магазин получил '*максимальный доход 'den = 0 'FOR i = 1 TO 3 'max = 0 'FOR j = 1 TO 10 'IF a(i, j) > max THEN max = a(i, j): den = j 'NEXT j 'PRINT TAB(5); "Максимальную сумму в размере"; max; "руб заработал"; i; "магазин за"; den; "день" 'NEXT i '*5)Для каждого дня, определить какой магазин в этот день получил максимальный '* доход 'mag = 0 'FOR j = 1 TO 10 'max = 0 'FOR i = 1 TO 3 'IF a(i, j) > max THEN max = a(i, j): mag = i 'NEXT i 105
'PRINT TAB(5); "В"; j; "день магазин №"; mag; "получил наибольший доход в размере"; max; "руб" 'NEXT j А теперь получите задания для самостоятельной разработки 19.1Сформировать и вывести на печать квадратную единичную матрицу: элементы главной диагонали равны 1, все другие 0 19.2Вмассиве а(n,n) элементы определяются как a(i,j) = i-j. Определить индексы и вывести на печать нулевые элементы. 19.3В массиве а(5,6) найти разность между суммой элементов второй строки и пятого столбца. 19.4В массиве а(5,4) поменять местами 1 и 2 столбцы, 3 и 4-ый. 19.5Сформировать одномерный массив из элементов массива а(5,5), кратных трем. 19.6Найти число пар равных элементов и вывести их на печать вместе с их индексами. (!) 19.7В квадратной матрице a(n;n) удалить k-ую строку, t-ый столбец, естественно, k