Кафедра физико-математических дисциплин
Государственное образовательное учреждение Невинномысский химический колледж
У...
90 downloads
423 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 m<>n 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 <условие1> THEN <операторы1> ELSE <операторы2> или IF <условие1> THEN <операторы1> ELSE <операторы2> IF <условие2> THEN <операторы3> Наконец, так называемый «полный формат» оператора IF <условие> THEN <операторы1> <операторы2> ……………….. 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 xb THEN ?”Число “;x;”не принадлежит отрезку [“;a”;”;b;”]” «Под» каждой буквенной клавишей четыре приводимый фрагмент напоминает Вам об этом.
различных
символа,
?”Вы ввели функцию для исследования? (Y/N)”;:INPUT a$ IF a$=”Y” OR a$=”y” OR a$=”н” OR a$=”Н” THEN ?”Умница” IF a$=”n” OR a$=”N” OR a$=”т” OR a$=”Т” THEN ?”Не забудьте ввести” Определить, могут ли три положительных числа выражать длины сторон треугольника. IF a+b>c 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 THEN 10 x1 = (-b + SQR(d))/2/a: x2 = (-b-SQR(d))/2/a ?”Записывайте действительные корни:”;x1,x2:GOTO 100 END IF 10 m = -b/2/a: n = SQR(ABS(d))/2/a ?”Записывайте комплексные корни:” ?”x1= ”;m;” + i*”;n ?”x2= ”;m;” – i*”;n 100 ?”1 – продолжение решения уравнений, 2 – хватит, введите соответствующую цифру”; INPUT t IF t = 1 THEN 5 ELSE IF t = 2 THEN STOP Для завершения работы программы применен оператор STOP. А теперь замените его оператором END и объясните различия. Предлагается усложнить программу и вывести корни квадратного уравнения и по признаку равенства действительных корней, т.е. для случая d = 0. Составим программу с использованием случайных чисел – функция RND: на координатной плоскости выбрана случайная точка: 10 < x < 10; -10 < y < 10. Определить, в какой координатной четверти она находится и ее расстояние до начала координат. ----Программа 5.2.Положение точки в координатной плоскости--------x = -9 + INT(19 * RND) y = -9 + INT(19 * RND) PRINT "("; x; ","; y; ")" r = SQR(x ^ 2 + y ^ 2) IF x > 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<0. 5.8.Определить принадлежит ли введенная точка кругу с центрам (0;0) и радиусом R. 5.9.Составить программу, которая спрашивала бы сокращенное имя, а печатало полное для пяти ваших друзей. Ввод незнакомого имени должен провоцировать заявление типа: я с Вами не знаком. 5.10.Напишите программу, которая после ввода цифры с клавиатуры распечатывает ее буквами, т.е. если введена 1, то выводит «один», если 2, то «Два» и т.д. 5.11.В зависимости от цвета светофора выдавать сообщение: стой, иди, жди. 5.12.По введенной пользователем температуре воздуха выдать одно из сообщений: „Хорошая погода”, „Плохая погода”. 5.13.Запросить у пользователя стороны двух прямоугольников. Выдать сообщение, у какого прямоугольника большая площадь. 5.14.Заданы площади квадрата и круга. Выдать сообщение, поместится ли квадрат в круге или круг в квадрате. 5.15.Ссгенерируйте случайное число из (0;20). Выдайте сообщение, принадлежит ли это число интервалу (5;15). Задача для самостоятельной разработки дома. Специалисту необходимо настроить торговый автомат, реализующий два вида товара, для определенности – молоко и кефир в пакетах. Цена в течение дня не изменяется, рекомендуется задать ее операторами LET или DATA – READ. Организовать диалог примерно в такой форме. «Сколько молока и кефира покупаете?» Покупатель вводит два натуральных числа. С Вас _ рублей, _ копеек, сколько платите?» Если покупатель предлагает сумму меньшую, чем стоит покупка, пожурить его и предложить последний вопрос. «Получите _ пакетов молока, _ пакетов кефира и сдачу: _ рублей, _ копеек.» предоставить выбор: следующий покупатель или закрыто на обед. Это увлекательная задача должна понравиться Вам. В заключение занятия предлагается выполнить письменную самостоятельную работу, цель которой проверить умение набирать формулы и использование IF…THEN. Варианты работы: 27
По введенному пользователем значение функций, если
значению
⎧ ⎪3 x 2 + 3 + log 2 x , если x < 0 ⎪ x π ⎪ y = ⎨Sin 2 ( x + ) − tg , если 0 ≤ x ≤ 5 4 3 ⎪ 3 2 ⎪x + x + 3 , если x > 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 <-3 и 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 > 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 <-1 и 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 <-1.5 и 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 m<>c 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 <= .9 AND kp / n > .75 THEN oc = 4 IF kp / n <= .75 AND kp / n > .5 THEN oc = 3 IF kp / n <= .5 THEN oc = 2 PRINT "Ваша оценка"; oc PRINT "1 - продолжим, 2 - достаточно. Нажмите цифру" 200 b$ = INKEY$ IF b$ = "1" THEN 10 IF b$ = "2" THEN END ELSE 200 И наконец, на этом занятии рассмотрим организацию простейших меню в бейсик - программах. Приведем наглядный пример. *********************Программа 6.3************************** 5 CLS: PRINT TAB(30); "МЕНЮ" 31
PRINT TAB(20); "1.Сказка про белого бычка" PRINT TAB(20); "2.Сказка про серого волка" PRINT TAB(20); "3.Сказка про козленка" PRINT TAB(20); "4.Сказка про веселых гусей" PRINT TAB(20); "5.Сказка про курочку рябу" PRINT TAB(20); "6.Выход из мира сказок" PRINT 100 INPUT”Введите соответствующую цифру”;t ON t GOTO 110, 120, 130, 140, 150, 160 (Впервые применен оператор ON) 110 CLS : PRINT TAB(20); "1.Сказка про белого бычка" PRINT”&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&”:GOTO 200 GOTO 200 120 CLS : PRINT TAB(20); "2.Сказка про серого волка" PRINT "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&": GOTO 200 130 CLS : PRINT TAB(20); "3.Сказка про козленка" PRINT "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&": GOTO 200 140 CLS : PRINT TAB(20); "4.Сказка про веселых гусей" PRINT "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&": GOTO 200 150 CLS : PRINT TAB(20); "5.Сказка про курочку-рябу" PRINT "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&": GOTO 200 160 STOP 200 IF INKEY$ = "" THEN 200 ELSE 5 На примере этой простой программки по организации простенького меню необходимо хорошо уяснить как работает оператор ON и функция INKEY$. По возможности для закрепления приемов использования IF..THEN, INKEY$ можно использовать и другие конструкции. Например, передачу управления в строках 100-160 возможно организовать следующим образом: 100 t$=INKEY$ <Акцентируйте внимание на глаголах: «введите» и «нажмите»> IF t$=”1” THEN 110 ELSE IF t$=”2” THEN 120 IF t$=”3” THEN 130 ELSE IF t$=”4” THEN 140 IF t$=”5” THEN 150 ELSE IF t$=”6” THEN 160 ELSE 100 Необходимо отметить, что при организации меню или других фрагментов выбора использование буквенных клавиш иногда приводит начинающих пользователей к естественным проблемам, они забывают, что под каждой клавишей 4 различных символа. Пример. ?”Продолжить работу (Д) или выйти из программы (В), нажмите соответствующую клавишу” 32
100 t$=INKEY$ IF t$=”Д” OR t$=”д” OR t$=”L” OR t$=”l” THEN 200 IF t$=”В” OR t$=”в” OR t$=”D” OR t$=”d” THEN STOP ELSE 100 Фрагмент «реагирует» только на указанные символы, но конструкция не очень удобна.
такая
5.Программа, которая запрашивает неполное имя, а выдает полное, может выглядеть, например, так: …………………Программа 6.5……………………………………. 10 CLS : PRINT TAB(35); "Для друзей": PRINT PRINT TAB(15); "Введите своё имя с заглавной буквы не полное": PRINT PRINT TAB(20); : INPUT a$ b$ = "Тебя зовут" IF a$ = "Миша" THEN PRINT b$; " Михаил" IF a$ = "Ира" THEN PRINT b$; " Ирина" IF a$ = "Лёха" THEN PRINT b$; " Алексей" IF a$ = "Аня" THEN PRINT b$; " Анна" IF a$ = "Женя" THEN PRINT b$; " Евгений" PRINT "Я тебя не знаю": PRINT PRINT TAB(15); "Если хочешь попробовать еще введи 1" PRINT TAB(15); "Если хочешь уйти введи 2" INPUT a IF a = 1 THEN 10 ELSE IF a = 2 THEN STOP В качестве домашнего задания запишите тексты программ с более простыми конструкциями на закрепление IF..THEN. 1.Даны три положительных числа. Могут ли эти числа выражать длины сторон треугольника? Если да, то определите вид этого треугольника: остроугольный, прямоугольный, тупоугольный 2.Даны 2 точки в прямоугольной системе координат. Определить какая из точек ближе к началу координат. 3.Точка задана своими координатами в прямоугольной системе координат. Определить: какой четверти, или какой координатной оси принадлежит эта точка. 4.Остроумно реализуйте фрагмент русской сказки о витязе, который на коне перед камнем с надписью: налево пойдешь.. направо пойдешь.. прямо пойдешь. 5.Дано комплексное число z = a + bi. Найдите его модуль и аргумент. Помните, что аргумент комплексного числа принадлежит интервалу (-180o; 180o). 33
6.Дан квадрат с вершинами в точках (-1; -1); (-1; 1); (1; -1); (1; 1). В него вписан круг единичного радиуса. Генерируйте точки, принадлежащие квадрату, подсчитывайте их число, а также подсчитывайте число точек, принадлежащих кругу. Через каждую 1000 точек рассчитывайте отношение точек, принадлежащих кругу к числу всех точек, это отношение умножайте на площадь квадрата, т.е. на 4, и выдавайте сообщение. Вы будете удивлены результатом! 7.Составьте меню, содержащее темы курса математики, которые Вы изучили в первом семестре. Постарайтесь вспомнить, о чем шла речь в каждой из тем. 8.Известно, что если приращение функции в точке положительно, то эта функция в данной точке возрастает, в противном случае – убывает. Выдайте соответствующее сообщение. 9.Переработайте тренажер (Программа 6.1) и получите из проверочный тест с выставлением оценки. 10.Занимательная задача, содержащаяся во всех научно-популярных изданиях. Пусть Ваша программа реализует игру «Угадай число». Программа генерирует двузначное (трехзначное) натуральное число и предлагает пользователю угадать это число. Играющий вводит свои догадки, программа сравнивает и выдает одно из сообщений: «Недолет», «Перелет» или «Молодец! Угадал с _ попыток». Разработайте дома 2-3 из предложенных задач, запишите их тексты, по возможности, разместите на магнитном носителе, чтобы было удобно проверить Вашу работу. Что нового Вы узнали, какие умения и навыки приобрели на занятии №6? • познакомились с более сложными программами разветвляющихся структур на примерах; • усвоили и закрепили на практике форматы оператора IF..THEN; • познакомились с методикой организации простейших меню в QB; • ознакомились c оператором ON, функцией INKEY$ при организации разветвляющихся структур; • получили навыки в умении программно реализовать несложные текстовые задачи.
34
Занятие 7. Составление, отладка и тестирование программ разветвляющихся структур. Цели занятия: закрепление и контроль усвоения, простейших умений в использовании оператора IF..THEN, Вам самостоятельно предстоит конструировать несложные программы разветвляющихся структур. Вам будет предложено целый ряд заданий различного объема и сложности. Оценивать Вашу деятельность преподаватели будут по объему выполненной работы, по подробности помощи, оказываемой Вам со стороны преподавателя. Проверим выполнение домашнего задания: настоящее занятие – продолжение выполнения этих заданий. Рассмотрим задачу 6 из предыдущего занятия. Вы понимаете, что отношение числа точек, попавших в круг, к числу всех точек – это отношение площадей круга и квадрата. Если это отношение умножить на площадь квадрата, то получим площадь круга. Так как радиус круга равен 1, то его площадь численно равна числу π .
Вот один из вариантов программы. SCREEN 9: COLOR 14, 1: CLS RANDOMIZE TIMER n = 0: '****Обнуление счетчика всех точек***** k = 0: '****Обнуление счетчика точек, попавших в круг***** '***Генерируем x и y, попадающие в квадрат 2х2******** 10 x = -1 + 2 * RND: y = -1 + 2 * RND n = n + 1: '****Увеличиваем значение счетчика на 1******** IF SQR(x ^ 2 + y ^ 2) <= 1 THEN k = k + 1: '****Увеличиваем значение счетчика на 1** IF n / 9999 = n \ 9999 THEN s# = k / n * 4 PRINT "При n= "; n; "площадь круга "; s# END IF GOTO 10
35
А так может выглядеть один из вариантов занимательной игры «Угадай число» SCREEN 9: COLOR 14, 1: CLS RANDOMIZE TIMER x = INT(10 + 90 * RND) k=0 10 PRINT TAB(20); : INPUT "Введите n"; n: k = k + 1 IF n < x THEN PRINT TAB(20); "Недолет": GOTO 10 IF n > x THEN PRINT TAB(20); "Перелет": GOTO 10 PRINT TAB(20); "Молодец! Угадал с "; k; "-ой попытки" Следующие задачи для самостоятельной разработки. Постарайтесь разобраться в их смысле, составить алгоритм, разработать программу, отладить ее, подготовить доклад преподавателю о работе Вашего программного продукта. 1.Пользователем задана функция y = f(x). Выдать одно из сообщений: «Функция четная», «Функция нечетная», «Функция не относится ни к четным, ни к нечетным». Усложнить задачу, организовав предварительный диалог с пользователем: «Вы вели в программу функцию для исследования на четность – нечетность?»… 2.Пользователем заданы координаты точки на плоскости. Проверить, лежит ли эта точка в прямоугольнике, определяемой координатами вершин (-2;-2); (-2;4); (5;4); (5;-2). 3.Задана величина угла d в градусах. Определить в какой четверти он находится. Та же задача для случая, если величина угла задана в радианах. 4.Даны два действительных числа x, y. Найти среднее геометрическое, если x,y>0 среднее арифметическое этих чисел x,y<0, среднее гармоническое, если числа имеют разные знаки. 5.Определить принадлежит ли введенная точка кругу с центром (0;0) и радиусом R. 6.Написать программу, которая спрашивала бы сокращенное имя, а печатало полное для пяти ваших друзей. Ввод незнакомого имени должен провоцировать заявление типа "Я с Вами не знакома" 7.Составьте программу, которая после ввода цифры с клавиатуры распечатывает ее буквами, т.е. если введена 1, то выводит «один», если 2, то «два» и т.д. 8.Задать с клавиатуры стороны двух прямоугольников. Выдать сообщение: у какого прямоугольника большая площадь или площади равны. 9.Выдать сообщение: принадлежит ли случайное число х из отрезка [2n; 2m] отрезку [n;m]. 10.Заданы площади квадрата и круга. Определить поместится ли квадрат в круге или круг в квадрате. 36
11.Пользователь вводит натуральное число меньше 100 обозначающее его возраст. Выдайте сообщение: Вам 16 лет, или 41 год, или 54 года. 12.Вы изучаете на уроках математики производную и знаете, что если производная функции в точке положительна, то функция возрастает, если производная отрицательна, то функция убывает. Численными методами производная находится по формуле: f`(x) =
f ( x + h) − f ( x − h) , где h какое-либо малое число, например 0,01. 2h
Задача. Задана функция y = f(x) и значение аргумента х0. Определите, возрастает или убывает эта функция в заданной точке. 13.Даны 2 точки в прямоугольной системе координат. Определить какая из точек ближе к началу координат. 14.По координатам точки определить какой четверти или какой координатной оси она принадлежит 15.Пользователем задана функция y = f(x). Выдать одно из сообщений: «Функция четная», «Функция нечетная», «Функция не относится ни к четным, ни к нечетным». 16.Составить программу, которая проверяет, лежит ли точка с координатами (x, y) в прямоугольнике (0;0); (0;2); (5;2); (5;0) 17.Задана величина угла в градусах. Определить в какой четверти он находится. 18.Задана величина угла в радианах Определить в какой четверти он находится. 19.Заданы три числа. Выдать одно из сообщений: треугольник остроугольный, треугольник тупоугольный, треугольник прямоугольный, эти число не могут быть сторонами треугольника. 20.Определить принадлежит ли введенная точка кругу с центром (0;0) и радиусом R. 21.Написать программу, которая спрашивала бы сокращенное имя, а печатало полное для трех ваших друзей. На незнакомое имя программа должна ответить "Я с Вами не знакома" 22.Напишите программу, которая после ввода цифры с клавиатуры распечатывает ее буквами, т.е. если введена 1, то выводит «один», если 2, то «два» и т.д. 23.В зависимости от цвета светофора выдавать сообщение: стой, иди, жди. 24.Выдать сообщение: принадлежит ли число х интервалу [n;m]. 25.Заданы площади квадрата и круга. Определить поместится ли квадрат в круге или круг в квадрате. 26.Пользователь вводит натуральное число меньше 100 обозначающее его возраст. Выдайте сообщение: Вам 16 лет, или 41 год, или 54 года.
37
27.Задан рост 10-ти призывников. На подводной лодке могут служить те, кто выше 165см. и ниже 175см. Сколько из них будет служить на подводной лодке? 28.Даны 2 точки в прямоугольной системе координат. Определить какая из точек ближе к началу координат. 29.По координатам точки определить какой четверти или какой координатной оси она принадлежит 30.Пользователем задана функция y = f(x). Выдать одно из сообщений: «Функция четная», «Функция нечетная», «Функция не относится ни к четным, ни к нечетным». 31.Составить программу, которая проверяет, лежит ли точка с координатами (x, y) в прямоугольнике (0;0); (0;2); (5;2); (5;0) 32.Задана величина угла в градусах. Определить в какой четверти он находится. 33.Задана величина угла в радианах Определить в какой четверти он находится. 34.Заданы три числа. Выдать одно из сообщений: тр-к косоугольный, тр-к тупоугольный, тр-к прямоугольный, эти число не могут быть сторонами треугольника. 35.Определить принадлежит ли введенная точка кругу с центрам (0;0) и радиусом R. 36.Написать программу, которая спрашивала бы сокращенное имя, а печатало полное для трех ваших друзей. На незнакомое имя программа должна ответить "Я с Вами не знакома" 37.Напишите программу, которая после ввода цифры с клавиатуры распечатывает ее буквами, т.е. если введена 1, то выводит «один», если 2, то «два» и т.д. 38.В зависимости от цвета светофора выдавать сообщение: стой, иди, жди. 39.Выдать сообщение: принадлежит ли число х в интервалу [n;m]. 40.Заданы площади квадрата и круга. Определить поместится ли квадрат в круге или круг в квадрате. 41.Пользователь вводит натуральное число меньше 100 обозначающее его возраст. Выдайте сообщение: Вам 16 лет, или 41 год, или 54 года. 42.Задан рост 10-ти призывников. На подводной лодке могут служить те, кто выше 165см. и ниже 175см. Сколько из них будет служить на подводной лодке? Что нового Вы узнали и чему научились на занятии №7 • закрепили понимание программ разветвляющихся структур; • на примерах ознакомились с методом Монте - Карло; • узнали, как определять переменные двойной точности; • научились создавать несложные конструкции, реализующие выбор по задаваемым условиям. 38
Занятие 8. Понятие о циклах. Организация циклов с использованием IF…THEN и DO.. LOOP В теоретической части изучения дисциплины Вас ознакомили с понятием циклов, циклических алгоритмов. Циклический алгоритм – алгоритм, предусматривающий многократное повторение одного и того же действия (одних и тех же операций) над новыми исходными данными. К циклическим алгоритмам сводится большинство методов вычислений, перебора вариантов. Цикл программы – последовательность команд (серия, тело цикла), которая может выполняться многократно (для новых исходных данных) до удовлетворения некоторого условия. Программную реализацию организации циклов с использованием IF..THEN продемонстрируем на достаточном количестве различных примеров. Самые «яркие» и популярные задачи – это задачи на суммирование, с них и начнем демонстрацию программ по организации циклов. 1.Найти сумму всех двузначных чисел. Программа может выглядеть, например, так. …………………Программа 8.1……………………………………. s = 0: n = 9 10 n = n + 1 if n < 100 then s = s + n: goto 10 ?”Сумма двузначных чисел равна”; s Проверка условия n<100 проводится ДО операции суммирования. Обратите внимание на конструкции типа n = n + 1 и s = s + n. Они на первых порах трудно воспринимаются студентами т.к. с точки зрения математики они бессмысленны. Составим эту же программу, организовав проверку условия «число двузначное» ПОСЛЕ операции суммирования. …………………Программа 8.1.2……………………………………. s = 0: n = 9 10 n = n + 1 s=s+n if n < 100 then 10 ?”Сумма двузначных чисел равна”; s Одними из самых популярных задач являются задачи на суммирование по формуле с прекращением его по различным условиям. Обратите внимание на «золотое правило» организации суммирования: s = 0 2.Найти сумму членов числовой последовательности с общим членом an =
n3 , 2n + n
39
используя различные варианты по завершению суммирования, например: 2.1 сумму k членов, 2.2 суммировать до тех пор, пока общий член не станет меньше заданного ε. …………………Программа 8.2……………………………………. s = 0: i = 0 input”Задайте точность ε”;e 10 i = i +1: a = i^3/(2^i + i) if a > e then s = s + a: goto 10 ?”Запишите сумму”;s Переработайте программу и найдите сумму 50 членов числовой последовательности. Как и прежде, и в дальнейшем подчеркиваем, что приводится один из возможных вариантов программы, рекомендуем и коллегам и студентам искать и обязательно находить другие варианты. 3.Аналогично организуются циклы по нахождению произведений. Пример: найти произведение 50 сомножителей числовой последовательности с общим членом: an =
n +1 n2 + 3
…………………Программа 8.3……………………………………. i = :0 p = 1: ‘******Золотое правило нахождения произведения********** 10 i = i + 1 p = p*(i + 1)/(i^2 + 3) if < 50 then 10 ?”Пишите искомое произведение”;p В QB существуют и другие способы организации циклических программ. Наиболее удобной является конструкция DO…LOOP. Законспектируйте ее форматы. DO WHILE <условие, при ВЫПОЛЕНИИ которого выполняется цикл> <операторы, тело цикла> LOOP Обратите внимание, что выполняемое условие проверяется ДО операторов цикла. Возможна проверка ПОСЛЕ цикла: DO <операторы, тело цикла> LOOP WHILE <условие, при ВЫПОЛЕНИИ которого выполняется цикл> Иногда удобнее использовать конструкции «отрицания», т.е. исполнение цикла происходит при НЕВЫПОЛНЕНИИ условия.
40
DO UNTIL <условие, при НЕВЫПОЛЕНИИ которого выполняется цикл> <операторы, тело цикла> LOOP или DO <операторы, тело цикла> LOOP UNTIL <условие, при НЕВЫПОЛЕНИИ которого выполняется цикл> Приведем конкретные примеры. 1 a
4.Дано a и n. Вычислить сумму S = +
1 1 1 + 3 + ... + n . 2 a a a
…………………Программа 8.4……………………………………. LOCATE 10, 25: INPUT "Введите значение а "; a LOCATE 12, 25: INPUT "Число слагаемых"; n i = 0: s = 0 DO WHILE i < n i=i+1 s=s+1/a^i LOOP LOCATE 14, 25: PRINT "Запишите сумму"; s 5. Вывести на экран таблицу умножения по требованию. …………………Программа 8.5……………………………………. REM****Таблица умножения по требованию****** LOCATE 3, 4 INPUT "Введите число для распечатки таблицы умножения"; a n=0 DO WHILE n < 10 n=n+1 PRINT TAB(10); a; "x"; n; "="; a * n LOOP Или так: …………………Программа 8.5.1……………………………………. LOCATE 3, 4 INPUT "Введите число для распечатки таблицы умножения"; a n=0 DO n=n+1 PRINT TAB(10); a; "x"; n; "="; a * n LOOP WHILE n < 10
41
6.Вы знаете две знаменитые математические константы: число π и число e. Эйлер открыл число, названное его именем, так: это предел на бесконечности выражения 1+
1 1 1 1 1 + + + + ... + − ln(n + 1) n 2 3 4 5
Составим программу вычисления числа Эйлера, выдавая результат через n, кратные 10000, чтобы убедиться, что такой предел действительно существует. Эта программа не имеет естественного окончания, потому выход из нее только через «аварийный» останов. Один из вариантов программы. …………………Программа 8.6……………………………………. CLS : s# = 0: n = 0 10 n = n + 1: m# = LOG(n + 1) s=s+1/n IF n / 10000 = n \ 10000 THEN PRINT "при n="; n; "c= "; s# - m# GOTO 10 В этой программе использовались переменные, имя которых оканчивается знаком #. Это признак переменной ДВОЙНОЙ точности, запустив программу, Вы в этом убедитесь. 8.Условия могут быть «вложенными». Рассмотрим популярную задачу. Найти все числа в пределах 1000, делящиеся, например, на 73 …………………Программа 8.8…………………………………. 10 IF i < 1000 THEN i=i+1 IF i MOD (73) = 0 THEN PRINT i GOTO 10 END IF Использовалась функция MOD. Конструкцию i MOD (73) = 0 можно описать так: остаток от деления числа i на 73 равен нулю. 9.Еще одна популярная задача. Найти все делители введенного пользователем числа. …………………Программа 8.9…………………………………. LOCATE 2, 29: INPUT "Введите число"; n 10 IF i < n THEN i=i+1 IF n MOD (i) = 0 THEN PRINT TAB(10); i GOTO 10 END IF
42
10.В заключение урока рассмотрим еще одну задачу на суммирование. В операторе DATA заданы 10 целых, среди которых положительные и отрицательные, чисел. Найдите количество и суммы положительных и отрицательных чисел. …………………Программа 8.10……………………………………. DATA 1,-3,9,-4,7,8,-3,0,-4,2 k = 0:’****Это счетчик чтения чисел kp = 0:’****Это счетчик числа положительных чисел kо = 0:’****Это счетчик числа отрицательных чисел sp = 0:’****Это сумма положительных чисел so = 0:’****Это сумма отрицательных чисел 5 READ a: k = k + 1 IF a > 0 THEN kp = kp + 1: sp = sp + a IF a < 0 THEN ko = ko + 1: so = so + a IF k < 10 THEN 5 ?”Сумма положительных чисел”;sp;”таковых”; kp ?”Сумма отрицательных чисел”;sо;” таковых”; kо Вам предлагается интересное домашнее задание. .Двое любителей азартных игр поочередно бросают по две игральных кости, первый поставил на сумму очков 7, второй – на 8. Игра продолжается бесконечно. Кто из них выиграет? Генерируя бросание костей случайными числами, зациклите программу и выдавайте результат в процентах для каждого игрока через каждые 1000 бросаний костей каждым игроком. Таким образом, Вы узнаете, что чаще выпадает в сумме 7 или 8. Что нового Вы узнали и чему научились на занятии №8 • ознакомились на конкретных примерах с организацией программ циклических структур средствами операторов IF…THEN и DO…LOOP; • открыли для себя еще одну математическую константу: число Эйлера; • узнали, как определять переменные двойной точности; • научились организовывать счетчики и суммирование по различным условиям; • научились создавать несложные конструкции, реализующие циклические процессы.
43
Занятие 9. Составление, отладка и тестирование программ циклических структур. Завершающее занятие по составлению и отладке программ разветвляющихся и циклических структур с помощью оператора IF…THEN и DO…LOOP. На этом занятии рассмотрим программирование решений задач различной сложности: простые и более сложные конструкции организации циклов. В то же время, учитывая Ваши индивидуальные способности к программированию, максимально дифференцируем познавательный процесс на этом занятии: сильным – задачи по подготовке к олимпиаде, другим – типовые конструкции. Вначале рассмотрим занимательные задачи вычисления числа π. Вычислим число π по различным формулам и по различным программам. Найти число π
1 1 1 3 5 7
1) по формуле π = 4 * ( 1− + − + ... ) . Нетрудно видеть, что общий член ряда (так называется бесконечная сумма) можно выразить так:
2) по формуле π = 3 + 4 *
(
(−1) n−1 an = 2n − 1 1 1 1 − + − ... ) . 2 *3* 4 4 *5* 6 6 * 7 *8
В этом случае общий член ряда в скобках можно выразить так:
(−1) n−1 an = 2n(2n + 1)(2n + 2) 3) по формуле π =
⎛ ⎞ 6 ⋅ ⎜⎜1+ 1 + 1 + 1 + 1 + ... ⎟⎟ 22 32 42 52 ⎝ ⎠
А общий член ряда в скобках в этом случае можно выразить так:
an =
1 n2
Программные конструкции оформим в одной программе, отделив одну от другой, используя REM, так как поступаете Вы, работая в своей программе. Вы же можете создать разные программки по каждой формуле. Внимательно разберитесь в каждой конструкции, обращая особое внимание на условия по которым организуются циклы. В случае затруднений обращайтесь за консультацией.
44
______________Программа 9.1____________________ CLS : SCREEN 9: COLOR 14, 1 REM *******Вычисление числа π******* n = 0: s# = 0: e# = .0001: a# = 0 '10 n = n + 1 'a# = 1 / (2 * n - 1) 's# = s# + a# * (-1) ^ (n - 1) 'IF a# > e# THEN 10 's# = s# * 4 'PRINT TAB(10); "Знаете, что π = "; s# 'PRINT TAB(10); "Использовали в цикле слагаемых "; n 'LOCATE 5, 20: INPUT "Сколько слагаемых просуммировать"; i 'LOCATE 6, 20:?"Если слишком много - придется ЖДАТЬ" 'DO WHILE n < i 'n = n + 1 's# = s# + (1 / (2 * n - 1)) * (-1) ^ (n - 1) 'LOOP 'PRINT TAB(19); "Помните"; s# * 4 'LOCATE 5, 20: INPUT "Сколько слагаемых просуммировать"; i 'DO WHILE n < i 'n = n + 1 's# = s# + (1 / (2 * n * (2 * n + 1) * (2 * n + 2))) * (-1) ^ (n - 1) 'LOOP 'PRINT TAB(19); "Помните"; s# * 4 + 3 'LOCATE 10, 20: INPUT "С какой точность считать"; e# 'LOCATE 11, 20: PRINT "Если точность слишком мала - придется ЖДАТЬ" 'DO 'n = n + 1 'a# = 1 / n ^ 2 's# = s# + a# 'LOOP UNTIL a# < e# 'PRINT TAB(19); "Известно, что π = "; SQR(6 * s#) Иногда бывает удобно использовать конструкции с IF…THEN и DO…LOOP. Такая простая задача: найти количество натуральных чисел, делящихся на 19 в пределах 1000. ______________Программа 9.2____________________ 45
i = 0: k = 0 DO WHILE i < 1000 i=i+1 IF i / 19 = i \ 19 THEN k = k + 1 LOOP PRINT TAB(2); "Чисел, делящихся на 19, меньших 1000 ровно "; k 3.Найдите площадь фигуры, заключенной между полуволной синусоиды и осью оу, используя метод Монте - Карло. …………………Программа 9.3……………………………………. pi = 4 * ATN(1) k = 0: n = 0 10 x = pi * RND: y = RND: n = n + 1 IF y <= SIN(x) THEN k = k + 1 IF n / 2000 = n \ 2000 THEN PRINT pi * k / n GOTO 10 3.1Эту задачу можно обобщить. Задана функция y = f(x) и отрезок [a;b], на котором эта функция положительна, найти методом Монте – Карло интеграл от этой функции. 4.Найти предел функции y = f(x) на бесконечности. В качестве контрольного примера рассмотреть второй замечательный предел. …………………Программа 9.4……………………………………. def fna(x) = (1 + 1/x)x x0 = 10 10 x = x0 + 10 y0 = fna(x0): y = fna(x) if abs(y – y0)>1e-4 then x0 = x: goto 10 ?”Записывайте значение предела”; y Предлагаю сильным студентам усовершенствовать эту программу: 1)Организовать диалог «Ввели ли Вы функцию?” и т.д. 2)Программа вычисляет предел на плюс бесконечности, однако, некоторые функции имею другой предел на минус бесконечности. 3)Программа дважды вычисляет y(x), рационально ли это? Переопределять не только х0, но и y0. 4)А если предела не существует, то составить конструкцию, например такую, если у>105 то «предела, по-видимому, не существует» и т.д. 5.Классическая задача табулирования функции. Конечно, проще и нагляднее ее выполнить с помощью FOR…NEXT, однако, необходимо научиться организовывать цикл и с помощью IF..THEN и DO…LOOP. На отрезке [a;b] задана функция y = f(x). Разбив отрезок на n частей напечатать таблицу значений x и y. 46
…………………Программа 9.5……………………………………. DEF FNA (x) = x ^ 2 - 4 LOCATE 1, 2 INPUT "Введите начальное и конечное значения аргумента"; a, b INPUT "Введите число строк таблицы"; n h = (b - a) / n PRINT TAB(10); " x f(x)" x=a-h DO x=x+h PRINT TAB(20); x; TAB(50); FNA(x) LOOP WHILE x < b Попробуйте самостоятельно решить эту же задачу, организовав цикл с помощью IF…THEN. 6.Рассмотрим еще задачу, в решении которой используем IF…THEN и DO…LOOP. В операторе DATA размещены 10 вещественных чисел, среди которых есть целые. Вывести их на печать, найти их количество и их сумму. …………………Программа 9.6……………………………………. DATA -3.56,10.5,-10,5.61,20.543,30,5.23,4,20.98,20 n = 0: k = n: s = n LOCATE 10, 5 PRINT "Целые числа:"; DO n=n+1 READ x IF x = INT(x) THEN k = k + 1: s = s + x PRINT x; END IF LOOP WHILE n < 10 PRINT TAB(10); "Количество чисел"; k, "их сумма"; s 7. Пусть задана функция, принимающая на [a; b] значения разных знаков, т.е. она на этом отрезке имеет действительный корень. Уточнить его методом Монте-Карло. …………………Программа 9.7……………………………………. 8.Пусть задана функция y = f(x), о которой известно, что справа от значения x0 она имеет действительный корень. Найти достаточно малый интервал, содержащий этот корень. Это классическая задача 47
вычислительной уравнения.
математики:
ОТДЕЛЕНИЕ
действительного
корня
…………………Программа 9.7……………………………………. INPUT”Введите длину интервала”; h DEF FNA (x) = x ^ 2 - 4 INPUT "Справа от "; x 10 x1 = x + h y = FNA(x): y1 = FNA(x1) IF y * y1 > 0 THEN x = x + h: GOTO 10 PRINT "x="; x + h / 2 Попробуйте самостоятельно решить эту же задачу, организовав цикл с помощью IF…THEN. Эта программа отыскивает отрезок, заданной Вами длины, который содержит один действительный корень. Эта операция в вычислительной математике называется ОТДЕЛЕНИЕМ корня. Поставим задачу уточнить корень с заданной точностью. 8.Задана функция, которая на отрезке [a; b] меняет знак, т.е. содержит действительный корень. Уточнить его с заданной точностью. Методов уточнения много. Мы выберем метод Монте-Карло. …………………Программа 9.8……………………………………. SCREEN 9: COLOR 14, 1 RANDOMIZE TIMER: CLS DEFDBL X DEF fna (x) = SIN(x) 1 LOCATE 5, 10 INPUT "Введите отрезок уточнения корня функции"; a, b IF SGN(fna(a)) = SGN(fna(b)) THEN PRINT TAB(5); "Отрезок не содержит корней функции": GOTO 1 END IF LOCATE 6, 5: INPUT "Точность окончательного результата"; e DO x = a + (b - a) * RND: y = fna(x) LOOP WHILE ABS(y) > e z = INT(x / e + .5) * e PRINT TAB(10); "Записывайте корень функции"; z Попытайтесь модернизировать программу с целью ускорения ее работы. Принцип: вычисляйте два значения функции и если они имеют разные знаки – переопределяйте a и b. В заключение два варианта решения интереснейшей занимательной задачи: найти количество и сумму цифр натурального числа. …………………Программа 9.9…………………………………… С конструкцией DO…LOOP 48
s = 0: k = 0 LOCATE 2, 20: INPUT "Введите натуральное число"; n: m = n DO WHILE 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 Задачи для домашнего решения 1.С точностью до 10-4 найти сумму, самостоятельно сформулировав условие организации цикла: S=
2 3 4 5 + 2 + 3 + 4 + ... e e e e
2. Вычислить сумму, которая будет на сберегательной книжке через t лет, если на начальный период положить на книжку a рублей, а годовой прирост равен 7%. 3.Задана рекуррентная формула: xi+1 = 0,5 xi + 2,3 . Найти x100, если известно, что х0 = 3,4 4.Выясните, в какой координатной четверти расположен треугольник, образованный прямой y = ax + b и осями координат. 5.Решите систему двух линейных уравнений по формулам Крамера, выдавая сообщения: система имеет единственное решение х = .., у = .., система не имеет решения, система имеет множество решений. 49
6.Задана функция y = f(x) и отрезок [a;b], на концах которого функция принимает значения разных знаков. Проверьте, так ли это, если нет – предложите пользователю ввести новый отрезок, если да, то уточните корень уравнения f(x) = 0 с точность ε методом половинного деления. 7.Почти все студенты НХК приезжают в колледж на автобусах, получив билет исследуют его шестизначный номер. Если сумма первых трех цифр равна сумме трех последних цифр, то билетик счастливый, если эти суммы равны 13, то билетик очень счастливый. Переработайте программу 9.9, и пусть Ваша программа ответит, какой у Вас билетик. Что нового Вы узнали, какие умения и навыки приобрели на занятии №9? • познакомились с организацией циклических структур с помощью оператора IF…THEN; • познакомились с организацией циклических структур с помощью оператора DO…LOOP; • научились формулировать условия работы цикла, как ДО него, так и ПОСЛЕ; • восхитились методом Монте-Карло; • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации циклических структур.
50
Занятие 10. Организация циклов с использованием FOR…NEXT. Первое занятие по очень важной теме программирования. Рекомендуем быть внимательными. На простых, ярких и доступных примерах покажем возможности использования этого оператора. Наиболее проще организовывать циклы, используя операторы FOR (для) и NEXT (следующий). Оператор FOR открывает цикл, оператор NEXT закрывает его. Все команды, расположенные между этими операторами, будем называть телом цикла. FOR и NEXT – «неразлучны», иначе ошибка. Внимательно отслеживайте, по какой переменной цикл открывается, по какой закрывается. STEP (шаг): по умолчанию 1, если первое значение параметра цикла меньше последнего, то STEP должен быть отрицательным. 1.Вернемся к задаче табулирования функции. Задана функция y = f(x) на отрезке [a;b]. Разбив отрезок на n частей напечатать таблицу ее значений. …………………Программа 10.1……………………………………. def fna(x) = x^3 + 2*x^2 – 3*x -12 input”Введите отрезок a,b”;a,b input”Сколько строк в таблице”;n h = (b – a)/n ?” x y” for x = a to b step h ?x, fna(x) next x 2.Вернемся также к популярной задаче суммирования. Пусть необходимо найти сумму 20 членов числовой последовательности с n2 общим членом an = n . e +n
…………………Программа 10.2……………………………………. s=0 for i = 1 to 20: s = s + i^2/(exp(i) + i): next ?”Запишите сумму:”;s 3.На отрезке [a;b] задана функция y = f(x). Найти ее наибольшее и наименьшее значения на этом отрезке. …………………Программа 10.3……………………………………. DEF fna (x) = x ^ 3 / 3 + x ^ 2 - 5 * x + 3 INPUT "Введите отрезок a,b"; a, b ma = fna(a): mi = fna(a) FOR x = a TO b STEP .001 y = fna(x) IF ma < y THEN ma = y: xma = x 51
IF mi > y THEN mi = y: xmi = x NEXT x PRINT "Наибольшее значение f("; xma; ") = "; ma PRINT "Наименьшее значение f("; xmi; ") = "; mi 4.В операторе DATA помещены 10 чисел. Вывести на печать наибольшее из них. …………………Программа 10.4……………………………………. DATA 1,3,5,7,4,-3,4,11,8,2 READ m FOR i = 1 TO 9: READ a IF m < a THEN m = a NEXT PRINT "максимальное число "; m 5.Найти все делители натурального числа, меньшие самого числа. …………………Программа 10.5……………………………………. INPUT "Введите число", x FOR i = 1 TO x/2 IF x MOD i = 0 THEN PRINT "Множитель "; i NEXT i Усложните задачу: в случае, если кроме 1 множителей нет – выдавать сообщение: число простое. Задачи более интересные в плане подготовки к олимпиаде по программированию 5.1Найти все простые числа меньшие заданного числа. 5.2Есть ли в пределах первых ста натуральных чисел числа, сумма делителей которых, включая единицу, но исключая само число, равна этому числу? 5.3 В пределах от 1 до 1000 напечатать все пары простых чисел отличающихся на два. 6.Важная и нужная задача численного интегрирования. На отрезке [a,b] задана функция y = f(x). Разбить данный отрезок на n частей, определить
h=
b−a , определить x0 = a, x1 = a + h, x2 = a + n
2h, и т.д., и вычисляя yi = f(xi), определить суммы S = h(y0 + y1 + …+ yn-1), S = h(y1 + y2 + …+ yn); - это формулы прямоугольников
52
S = h( S=
y 0 + y1 + y1 + y 2 + ... y n −1 ); - формула трапеций 2
h ( y 0 + y n + 4( y1 + y3 + y5 + ... + y n−1 ) + 2( y 2 + y 4 + y 6 + ... + y n−2 )) - и 3
самая популярная формула парабол (Симпсона), n – обязательно четное число. …………………Программа 10.6……………………………………. DEF fna (x) = x ^ 3 / 3 + x ^ 2 - 5 * x + 3 INPUT "Введите пределы интегрирования a,b"; a, b n=4 10 n = n * 2: s = 0 h = (b - a) / n s = fna(a) + fna(b) FOR i = 1 TO n - 1 STEP 2: x = a + h * i s = s + 4 * fna(x): NEXT i FOR i = 2 TO n - 2 STEP 2: x = a + h * i s = s + 2 * fna(x): NEXT i PRINT "При n = "; n; "I = "; s * h / 3 GOTO 10 Суммирование нечетных и четных у мы провели в двух различных циклах. Но можно поступить и так: FOR i = 1 TO n - 1: x = a + h * i IF i / 2 = i \ 2 THEN s = s + 2 * fna(x) ELSE s = s + 4 * fna(x) NEXT i Формулы прямоугольников и трапеций запрограммируйте самостоятельно. Это задачи для самостоятельного решения. Подготовьте программы дома и представьте на проверку, по-возможности в электронном варианте. 1.Составить таблицу перевода: долларов в рубли, рублей в доллары. 2.Составить таблицу стоимости порций сыра массой 50, 100, 150, …, 1000 г., если известна цена одного килограмма. 3.Даны действительное число а, натуральное число n. Вычислить a(a - n)(a - 2n)…(a - n2). 4. Даны натуральное n, действительное x. Вычислить: sin x +sin2 x + sin3x + … + sinnx.
53
5.Даны натуральное n, действительное x. Вычислить сумму n членов
xn степенного ряда, если an = 3 . n +1
6.Дано a и n. Вычислить значение произведения a(a - n)(a - 2n)…(a - n2).
7.Вывести на экран все двузначные числа кратные 3. Подсчитать их сумму и количество. 8.Вывести на экран n членов последовательности Фибоначчи, используя рекуррентную формулу : an = an-1 + an-2. Если a1 = 1 и a2 = 1 9.Составить калибровочную таблицу определения объема жидкости в резервуаре, имеющем форму прямоугольного параллелепипеда, внутренние размеры которого a,b,c. Задайте шаг калибровочной таблицы h. Объем выражать в литрах. Что нового Вы узнали, какие умения и навыки приобрели на занятии №10? • познакомились с организацией циклических структур с помощью оператора FOR…NEXT; • усвоили, как какими переменными должны открываться и закрываться циклы; • научились формулировать условия работы цикла с указанием шага; • уверенно освоили организацию циклов по нахождению сумм; • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации циклических структур.
54
Занятие 11. Вложенные циклы. Составление и отладка более сложных циклических программ Настоящее занятие - продолжение предыдущего: углубление, закрепление и контроль умений. На занятии студенты лишь познакомятся с понятием вложенных циклов, а их широкое применение будет осуществляться в теме «Массивы». Наряду с коллективным составлением программ, Вам предстоит самостоятельно разрабатывать программы с целью индивидуализации процесса обучения. Вам будут предлагаться задачи разной сложности, выбирайте, которые адекватны Вашим знаниям и способностям. 1.Рассмотрим популярную задачу – нахождение целочисленных решений уравнения ax + by + с = 0, т.н. Диафантово уравнение. Это наиболее простой, но яркий пример организации вложенных циклов. …………………Программа 11.1……………………………………. INPUT”Введите коэффициенты уравнения a,b,c”;a,b,c INPUT”Введите отрезок для х: x1,x2”;x1,x2 INPUT”Введите отрезок для y: y1,y2”;y1,y2 FOR x = x1 TO x2 FOR y = y1 TO y2 IF a * x + b * y + c = 0 THEN PRINT x, y NEXT y, x:’Обратите внимание на порядок закрытия вложенных циклов 2.Одной из популярных задач целочисленной арифметики является задача суммирования цифр натурального числа. На предыдущем занятии мы рассматривали несколько вариантов решения такой задачи. Продолжим повышать свои умения в организации циклических программ на других вариантах. Вот один из многих вариантов такой программы. Здесь два цикла: первый организован по условию и подсчитывает количество цифр числа, второй – по параметру i, выделяет эти цифры и суммирует их. К этой задаче еще вернемся при изучении символьных переменных …………………Программа 11.2……………………………………. INPUT "Введите число ", x PRINT "Цифры заданного числа:" k=0 10 k = k + 1 m = INT(x / 10 ^ k): IF m > 0 THEN 10 ‘***Вначале пересчитали цифры и сохранили в переменной k FOR i = 1 TO k: a = x MOD 10: s = s + a: x = INT(x - a) / 10: PRINT a; : NEXT: PRINT '****Затем их просуммировали PRINT "Количество цифр "; k PRINT "Сумма цифр "; s Еще варианты решения задачи. 55
С использованием блока DO…LOOP: s = 0: k = 0 LOCATE 2, 20: INPUT "Введите натуральное число"; n DO WHILE 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 'IF x > -1 AND x <= 1 THEN y = x ^ 2 '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 =sin(x) 'IF x > -1 AND x <= 1 THEN y = x ^ 2 '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 THEN y = x ^ 3 + 3 * x ^ 2 + 3 * x + 2 IF x > -1 AND x <= 1 THEN y = x ^ 2 IF 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 <0 ⎪⎪ f ( x) = ⎨3x 2 − 4 x при 0 ≤ x ≤ 2 ⎪ 3x 2 − 4 x ⎪ при 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 - 1)) + INT(30.6 * (mm + 13)) + dd 621049 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 <= 2 THEN f = f + INT((g - 1) / 4) - INT(3 * (INT((g - 1) / 100 + 1)) / 4) f = f - INT(.4 * m + 2.3) + INT(g / 4) f = f - INT((.75 * (INT(Y / 100) + 1))) w = f + (-INT(f / 7) * 7) - 1 IF w = 1 THEN a$ = "воскресение" ELSE IF w = 2 THEN a$ = "понедельник" IF w = 3 THEN a$ = "вторник" ELSE IF w = 4 THEN a$ = "среда" IF w = 5 THEN a$ = "четверг" ELSE IF w = 6 THEN a$ = "пятница" IF w = 0 THEN a$ = "суббота" RETURN 3.Мы с Вами на первых занятиях программировали игру «Угадай число». Теперь распространим ее на числовую плоскость. Ваша программа генерирует два натуральных числа из (0; 100), те координаты точки. Вы должны найти эту точку. В научно – популярной литературе эта игра называется почему-то «Медвежья берлога», которую необходимо отыскать, пользуясь подсказками Вашей программы: «налево и прямо», «назад», «направо и назад» и т.д. Как и в простой программе считать количество попыток. 70
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Программа 13.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. CLS : SCREEN 9: COLOR 14, 1 RANDOMIZE TIMER x0 = 1 + INT(99 * RND): y0 = 1 + INT(99 * RND) PRINT TAB(10); x0, y0 k=0 10 PRINT TAB(10); : INPUT "Ваши координаты"; x, y: k = k + 1 xp$ = "направо": xl$ = "налево" yv$ = "вверх": yn$ = "вниз" i$ = " и " tx = SGN(x0 - x): ty = SGN(y0 - y) IF tx = 1 AND ty = 1 THEN PRINT TAB(10); xp$; i$; yv$ IF tx = 1 AND ty = 0 THEN PRINT TAB(10); xp$ IF tx = 1 AND ty = -1 THEN PRINT TAB(10); xp$; i$; yn$ IF tx = 0 AND ty = -1 THEN PRINT TAB(10); yn$ IF tx = -1 AND ty = -1 THEN PRINT TAB(10); xl$; i$; yn$ IF tx = -1 AND ty = 0 THEN PRINT TAB(10); xl$ IF tx = -1 AND ty = 1 THEN PRINT TAB(10); xl$; i$; yv$ IF tx = 0 AND ty = 1 THEN PRINT TAB(10); yv$ IF tx = 0 AND ty = 0 THEN PRINT TAB(5)"Нашел с "; k; "попыток"; x; y ELSE 10 А теперь найдем отгаданную точку с помощью вложенных циклов ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Программа 13.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. x0 = 1 + INT(99 * RND): y0 = 1 + INT(99 * RND) FOR x = 1 TO 99 FOR y = 1 TO 99 IF x = x0 AND y = y0 THEN PRINT TAB(5); "Берлога в точке "; x; y NEXT y, x 5.Вы находили на предыдущих занятиях длину дуги плоской кривой, она была задана одной формулой в операторе DEF FN. А что если функция задана различными выражениями при различных значениях аргумента? Например:
⎧ x3 + 2, если x < −1 ⎪ y = ⎨ x 2 , если − 1 ≤ x ≤1 ⎪e x−1 , если x >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 = x ^ 2 IF 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
106
Занятие 20. Итоговое занятие по теме. Программы, содержащие одномерные и двумерные массивы, подпрограммы. Главная цель настоящего занятия – обзор всего изученного материала и подготовка к предстоящей обязательной контрольной работе. Это подведение итогов по узловым вопросам элементов программирования: ветвления, циклы, массивы, подпрограммы. Вместе с тем преподавателям очень бы хотелось максимально заинтересовать сильных студентов, обеспечить их «достойными» задачами. Лучшая форма этого занятия – индивидуальное программирование и индивидуальные консультации, комментирование готовых программ. Вам прелагается для индивидуальной разработки ряд разнообразных текстовых задач. Вы можете консультироваться друг с другом, с преподавателем, использовать свои наработки, сделанные Вами на предыдущих занятиях Задачи для подготовки к контрольной работе. Проанализируйте каждую из этих задач, составьте алгоритм, запишите программу на бумаге, отладьте на ПК, удостоверившись в ее правильной работе. 1) Два вектора заданы своими координатами на плоскости. Выдать сообщение: какой угол образуют эти векторы: острый, тупой или прямой. 2) Координаты точки А(х;у) заданы случайно, причем –10<x<10 и – 10<у<10. Определить, в какой четверти находится точка и ее расстояние до начала координат. 3) Заданы три случайных числа из отрезка [-5;5]. Выдать сообщение: есть ли среди них противоположные. 4) Между заданными числами a и b случайно определено число с. Выдать сообщение: к какому числу оно ближе на числовой прямой, к a или к b. 5) Координаты точки А(х;у) заданы случайно, причем –10<x<10 и – 10<у<10. Определить, принадлежит ли точка кругу с радиусом 7. 6) Заданы три целых случайных числа из отрезка [-15;10]. Вывести на печать эти числа в порядке возрастания. 7) Заданы два случайных положительных числа из интервала (10; 50). Что больше: их среднее арифметическое или среднее геометрическое? 8) Задана величина угла d в градусах. Определить в какой четверти он находится. 9) Игральный кубик подбросили 10 раз. Какую сумму Вы набрали? 10) По введенным катетам прямоугольного треугольника определить его площадь и гипотенузу. 11) Пользователем заданы координаты двух точек А и В. Найдите площадь круга, диаметром которого является отрезок АВ. 107
12) Дано комплексное число z = a + bi. Найдите его модуль и аргумент. 13) Дано действительное a и натуральное n. Вычислить сумму 1 1 1 1 S = 2 + 4 + 6 + ... + n a a a a 14) Провести подсчет числа трехзначных чисел делящихся на 13. 15) Дана функция y = f(x) на отрезке [a;b]. Равномерно разбив этот
отрезок на 16 частей, напечатать значения “х” и f(x) 16) Найти произведение 5 сомножителей, которые являются членами n2 n2 + 1 1 1 1 1 1 17) Определить сумму: s = + + + ... + . (an = 2 ) 1 4 9 100 n 18) Найти сумму 16 слагаемых числовой последовательности n с общим членом an = 2 n + n +1 19) Просуммируйте n слагаемых числовой последовательности с 1 общим членом an = 2n + 1 20) Провести подсчет суммы двузначных целых чисел делящихся на
числовой последовательности an =
14. 21) Вычислить произведение 5 членов последовательности с общим членом: an =
n +1 . n
22) Найти произведение 7 сомножителей, которые являются членами n+2 числовой последовательности an = 2 n +2 23) Определить сумму n членов числовой последовательности n2 с общим членом an = 3 n . n +2 n 1 24) Найти сумму по заданному n: ∑ 2 i =1 i + 1 25) Задан одномерный целочисленный массив х(n), содержащий
положительные и отрицательные элементы. Посчитать количество элементов кратных 3. 26) Задан одномерный целочисленный массив х(16), содержащий положительные и отрицательные элементы. Найти среднее арифметические четных элементов. 27) В одномерном целочисленном массиве d(n) первую половину элементов заменить единицами, вторую нулями. 28) В массиве х(12) найти сумму элементов больших половины максимального элемента. 29) Массив a(n) заполнен случайными числами из промежутка [0;1]. Каких элементов больше: которые меньше 0,5 или тех, которые больше 0,5 108
30) В одномерном массиве a(n), заполненном положительными и
отрицательными числами, вычислить сумму элементов, которые превышают элемент равный -2. 31) Дан одномерный массив. Напечатать индексы и количество элементов, равных нулю. Если таких элементов нет, сделать соответствующее сообщение. 32) Задан одномерный целочисленный массив a(n), содержащий положительные и отрицательные элементы. Вывести на печать вместе с индексами положительные элементы. 33) В одномерном целочисленном массиве х(n) первые 2 и последние 2 элемента заменить на противоположные по знаку. 34) В произвольном одномерном массиве подсчитать количество четных элементов, имеющих четные индексы. 35) Задан массив, состоящий из натуральных чисел взятых из интервала (1; 6). Определить, сколько элементов этого массива равны 3. 36) Выяснить есть ли в одномерном массиве a(8), элементы которого принадлежат интервалу (1; 10), элементы равные своему индексу и вывести их на печать. 37) Двумерный массив x(n,n) заполнен случайными целыми числами из промежутка (-9; 9). Создать и распечатать одномерный массив, содержащий элементы, превышающие среднее арифметическое элементов двумерного массива. 38) В двумерном массиве z(n,m) только положительные элементы: 1< z(n,m) < 11. Вывести на печать элементы, значения которых равны сумме индексов 39) Двумерный массив x(n,m) заполнен случайными целыми числами из промежутка (-10; 12). Элементы, превышающие среднее арифметическое элементов массива заменить на 0. 40) Из максимальных значений строк двумерного массива d(n,n) создать и распечатать одномерный массив y(n). 41) Двумерный массив r(n,m) заполнен случайными целыми числами из промежутка (-4;7). Вывести на печать значение и индексы первого отрицательного элемента. 42) Задана матрица g(n,m).Найти среднее арифметическое максимальных элементов строк. 43) Задана матрица w(n,m). Поменять местами k-ую и s-ую строки. Естественно, k и s меньше n. Если это не так, предложить пользователю задать новые значения k и s. 44) В квадратной матрице s(n,n), заполненной только натуральными числами, найти произведение элементов, расположенных над главной диагональю. 45) Сформировать и распечатать двумерный массив z(n,n), по следующему принципу: на главной диагонали -1, над ней – элементы, равные сумме индексов, под ней – нули. 109
46) Из
элементов квадратной матрицы u(n,n) сформировать, распечатать два одномерных массива: в одном – четные элементы u(n,n), в другом – элементы, сумма индексов которых четна. 47) Задана матрица p(n,m). Найти суммы положительных и отрицательных элементов каждой строки. 48) Задана матрица q(n,m), элементы которой принадлежат промежутку (1;12). В каждой строке найти количество элементов, принадлежащих отрезку [3;7]. Эти задачи, возможно, чуть более сложны. Если уверены в своих силах, приложите свои программистские способности к их программной реализации, считайте, что Вы готовитесь к олимпиаде. 1.1.Заданы два случайных целых числа из отрезка [2;30]. Вывести на печать их общие делители или напечатать сообщение, что общих делителей эти числа не имеют. 1.2.Пользователь задает координаты центров и радиусы двух окружностей. Выяснить взаимное положение этих окружностей. 2.1.Задана функция f(x) на отрезке [a;b]. Напечатать n ее значений на этом отрезке. 2.2 Числовая последовательность задана формулой общего члена an = t/(i2 + 1), где t – константа, i изменяется от 1 до n. Найти сумму n слагаемых. Значения t и n задает пользователь. 3.1.Задан одномерный целочисленный массив a(n), содержащий положительные и отрицательные элементы. Вывести индексы и значения противоположных элементов, если таковых нет, вывести соответствующее сообщение. 3.2.Заполнить одномерный массив a(12) следующим образом: элементам, стоящим на четных местах присвоить значение 2, элементам, индекс которых кратен трем, присвоить значение 0, второе условие приоритетно. Распечатать массив. 1.Предложить популярную занимательную задачу. Известно, что число дней, прошедших после 1 марта 1700 года вычисляется по формулам: для января и февраля n = [365,25(g – 1)] + [30,6(m + 13)] + d - 612049 для всех остальных месяцев n = [365,25g] + [30,6(m + 1)] + d – 612049, где d, m, g – соответственно день, месяц, год. Легко определяется и день недели: w = n MOD 7, день n будет воскресенье при w = 0, понедельник -1, вторник – 2, среда – 3, четверг – 4, пятница – 5, суббота – 6. Предложить организовать защиту от неправильного ввода дней и месяцев, например, чтобы программа не принимала 31,04,2008 или 29,02,2007 и т.д. Организовать три подпрограммы: вычисление количества дней для января и февраля и для остальных месяцев, в которые входим с d, m, g, а выходим с n, а также подпрограмму определения дня недели. И поставить ряд задач: в какой день Вы 110
родились, сколько дней прожили, в какой день недели Ю. Гагарин полетел в космос и т.д. 2.Стенные часы отбивают удар каждые полчаса и количество часов от 1 до 12. Составить программу подсчета количества ударов за сутки. 3.В пределах от 1 до 1000 напечатать все пары простых чисел отличающихся на два. 4.Задан двумерный массив, содержащий целочисленные положительные, отрицательные и нулевые элементы. Переставить все нулевые элементы в конец двумерного массива. 5.Есть ли в пределах первых 1000 натуральных чисел числа, сумма делителей которых, включая единицу, но исключая само число, равна этому числу? 6.Натуральные простые нечетные числа, отличающиеся на 2, называются близнецами, например, 17 и 19, 29 и 31 и т.д. Напечатать пары близнецов в пределах 1000. 7. Когда-то в СССР молодые люди играли в спортлото: в карточке – натуральные числа от 1 до 49. Играющий вычеркивал 6 чисел направлял в тиражную комиссию. Пусть 6 (естественно, разных) из 49 вычеркнет Ваша программа. 8.Помогите преподавателям математики! Преподаватель вводит 4 числа, являющихся решением системы 4-х линейных уравнений с 4-мя неизвестными. Пусть Ваша программа распечатает расширенную матрицу системы, состоящую из коэффициентов при неизвестных и столбца свободных членов (который напечатать другим цветом). Значения целых коэффициентов при неизвестных берите из отрезка (8;10). Например, преподаватель ввел: x1 = -2, x2 = 3; x3 = -1; x4 = 1. Ваша программа должна напечатать, например: 10 -1 0 1 -22 Преподаватель легко напишет систему уравнений (уже зная ее -1 4 -2 -8 8 решение): -6 -4 9 6 -3 2 7 -2 0 19 ⎧10 x1 − x2 + x4 = −22 ⎪− x + 4 x − 2 x − 8 x = 8 ⎪ 1 2 3 4 ⎨ ⎪−6 x1 − 4 x2 + 9 x3 + 6 x4 = −3 ⎪⎩2 x1 + 7 x2 − 2 x3 = 19
9.Фигура в системе координат ограничена осью ох, −
π
2
≤x≤0 и
y = 1 − x2
при 0 ≤ x ≤ 1 .
y = Cosx при
Используя метод случайных чисел
найти ее площадь, выдавая промежуточные результаты для n кратных 1000. Вычисление значений функции организуйте в подпрограмме.
111
10.Объем жидкости, налитой в шарообразный резервуар диаметром d, вычисляется по формуле: v =
πh 2 6
(3d − 2h) , где h – высота налива
жидкости, приняв, например, d = 1метр, составить калибровочную таблицу определения объема жидкости в этом резервуаре с шагом, например, 5 см. Объем выражать в литрах. 11.И еще одна занимательная задача. Еще пифагорейцы назвали два натуральных числа дружественными (или содружественными), если сумма делителей каждого из них (включая единицу, но исключая само число) равна другому числу. Легко проверить, что число 6 «дружит» само с собой, к таким числам относится число 28. возникает вопрос: существуют ли различные числа, обладающие таким свойством? Древние пифагорейцы нашли без ЭВМ. Сможете ли вы отыскать пары таких чисел (в пределах 1000), составив оригинальную программу? Вот мой вариант такой программы. Но очень «медленный» алгоритм. Придумайте другой, чтобы программа работала быстро. SCREEN 9: COLOR 14, 1 t = 0
PRINT TAB(10); : INPUT "На каком промежутке ищем дружественные числа"; a, b FOR i = a TO b FOR j = a TO b si = 0: sj = 0 FOR k = 1 TO j / 2: IF j / k = j \ k THEN sj = sj + k NEXT k FOR k = 1 TO i / 2 IF i / k = i \ k THEN si = si + k NEXT k IF sj = i AND si = j THEN PRINT j, i: t = 1: i = j + 1 NEXT j, i IF t = 0 THEN PRINT "На промежутке "; a; b; "таковых нет"
12.А возможно ли в одной программе обрабатывать символьные и числовые массивы? Рассмотрим занимательную задачу. Пусть в мясном киоске реализуются мясопродукты, расфасованные по 1 кг. Указана цена 1 кг. У покупателя – пользователя d рублей. Составим программу, определяющую, какое максимальное количество килограммов каждого вида продуктов он может приобрести на свои d рублей и какую сдачу он получит при этом. SCREEN 9: COLOR 14, 1 DIM a$(6), c(6) DATA свинины,105,говядины,115,баранины,95 DATA сала,80,колбасы,87,фарша,78 FOR i = 1 TO 6: READ a$(i), c(i): PRINT a$(i); " "; c(i): NEXT i 10 INPUT "Сколько у Вас денег"; d t=0 112
FOR k = 1 TO 6: m = 0 20 m = m + 1: w = c(k) * m: sd = d - w IF sd < c(k) AND d >= c(k) THEN PRINT "На ваши "; d; " рублей Вы можете купить"; m; "кг, "; PRINT a$(k); " ваша сдача"; sd; "руб": t = 3 END IF IF sd >= c(k) THEN 20 NEXT k IF t = 0 THEN PRINT "На ваши несчастные"; d; " рублей Вы ничего не сможете купить" END IF PRINT TAB(10); "Следующий - любая клавиша": DO: LOOP WHILE INKEY$ = "" :GOTO 10 Обратите внимание на то, как в одном цикле присваиваются значения элементам символьного и числового массивов. Что Вы повторили и закрепили на занятии №20? • Повторили методику решения типовых задач на обработку одномерных и двумерных массивов; • Проанализировали смысл и содержание десятка самых разнообразных задач • Рассмотрели задачи, рекомендованные для подготовки к контрольной работе; • Провели самооценку собственной готовности к контрольной работе; • Уяснили смысл предлагаемых задач для выполнения на контрольной работе; • Самостоятельно и в микроколлективах программно реализовали предложенные задачи; • Рассмотрели более сложные задачи в целях подготовки к предстоящей олимпиаде.
113
Занятие 21. Обязательная контрольная работа по составлению программ по изученным темам. 1.Два вектора заданы своими координатами на плоскости. Выдать сообщение: какой угол образуют эти векторы: острый, тупой или прямой.
1.Координаты точки А(х;у) заданы случайно, причем –10<x<10 и –10<у<10. Определить, в какой четверти находится точка и ее расстояние до начала координат.
2.Провести подсчет числа трехзначных чисел 2. Дана функция y = f(x) на отрезке [a;b]. Найти сумму ее значений, равномерно разбив делящихся на 13. этот отрезок на 10 частей. 3.Задан одномерный целочисленный массив a(16), содержащий положительные и 3.Задан одномерный целочисленный массив отрицательные элементы. Найти средние a(n), содержащий положительные и арифметические положительных и отрицательные элементы. Создать и распечатать массив b(k), состоящий из отрицательных элементов. положительных элементов массива a(n). Вариант 2
Вариант 1
1.Между заданными числами a и b случайно определено число с. Выдать сообщение: к какому числу оно ближе на числовой прямой, к a или к b. 2.Дана функция y = f(x) на отрезке [a;b]. 2.Найти произведение 10 сомножителей, Равномерно разбив этот отрезок на 16 частей, которые являются членами числовой напечатать значения “х” и f(x) n2 последовательности an = 2 n +1 3.В одномерном целочисленном массиве d(n) 3.В массиве p(12) найти сумму элементов первую половину элементов заменить больших среднего арифметического. единицами, вторую нулями. Распечатать оба массива. Вариант 3 Вариант 4 1.Заданы три случайных числа из отрезка [-5;5]. Выдать сообщение: есть ли среди них противоположные.
1.Координаты точки А(х;у) заданы случайно, причем –10<x<10 и –10<у<10. Определить, принадлежит ли точка кругу с радиусом 7.
1.Заданы три случайных числа из отрезка [-15;10]. Напечатать эти числа и их среднее арифметическое в порядке возрастания.
2.Определить сумму: 1 1 1 1 1 . (an = 2 ) s = + + + ... + 1 4 9 100 n
2.Найти сумму 16 слагаемых числовой последовательности с общим членом n an = 2 n + n +1
3.Массив a(5) заполнен случайными числами из промежутка [0;1]. Массив b(5) заполнен соответствующими элементами массива a(5), округленными до 0,01. Определить разность сумм элементов этих массивов.
3.В одномерном массиве a(n) вычислить сумму четных элементов, имеющих четные индексы или выдать сообщение, что таких элементов нет. Вариант 6
Вариант 5 114
1.Дано действительное a и натуральное n. 1 1 1 1 Вычислить сумму S = 2 + 4 + 6 + ... + n a a a a
1.Провести подсчет числа трехзначных чисел делящихся на 13. 2.Задан одномерный целочисленный массив х(16), содержащий положительные и отрицательные элементы. Найти средние арифметические четных и нечетных элементов.
2.Задан одномерный целочисленный массив х(n), содержащий положительные и отрицательные элементы. Посчитать количество элементов кратных 3.
3. В двумерном массиве z(n,m) только положительные элементы: 1< z(n,m) < 11. Вывести на печать элементы, значения которых равны сумме индексов
3.Двумерный массив x(n,n) заполнен случайными целыми числами из промежутка (-9;9). Создать и распечатать одномерный массив, содержащий элементы, превышающие среднее арифметическое элементов двумерного массива.
Вариант 7
Вариант 8
1.Дана функция y = f(x) на отрезке [a;b]. 1.Найти произведение 10 сомножителей, Равномерно разбив этот отрезок на 10 частей, которые являются членами числовой просуммировать ее значения. n2 последовательности an = 2 n +1 2.В одномерном целочисленном массиве d(n) 2.В массиве p(n) найти сумму элементов первую половину элементов заменить больших среднего арифметического. единицами, вторую нулями. Распечатать оба массива. 3.Из максимальных значений строк 3. Двумерный массив x(n,m) заполнен двумерного массива d(n,n) создать и случайными целыми числами из промежутка распечатать одномерный массив y(n). (-10;12). Элементы, превышающие среднее арифметическое элементов массива заменить на 0.
Вариант 9
Вариант 10
.1.Определить сумму: 1 1 1 1 1 . (an = 2 ) s = + + + ... + 1 4 9 100 n
1.Найти сумму 16 слагаемых числовой последовательности с общим членом n an = 2 n + n +1
2.Массив a(5) заполнен случайными числами из промежутка [0;1]. Массив b(5) заполнен соответствующими элементами массива a(5), округленными до 0,01. Определить разность сумм элементов этих массивов. 3. Двумерный массив r(n,m) заполнен случайными целыми числами из промежутка (-4;7). Вывести на печать значение и индексы первого отрицательного элемента.
2.В одномерном массиве a(n) вычислить сумму четных элементов, имеющих четные индексы или выдать сообщение, что таких элементов нет. 3.Задана матрица g(n,m).Найти среднее арифметическое максимальных элементов строк.
Вариант 12
Вариант 11
115
1. Дана функция y = f(x) на отрезке [a;b]. 1.Провести суммирование трехзначных Найти сумму ее значений, равномерно разбив чисел делящихся на 29. этот отрезок на 10 частей. 2.Задан одномерный целочисленный массив 2.Задан одномерный целочисленный массив a(16), содержащий положительные и a(n), содержащий положительные и отрицательные элементы. Найти средние отрицательные элементы. Создать и арифметические положительных и распечатать массив b(k), состоящий из отрицательных элементов. положительных элементов массива a(n). 3.В квадратной матрице s(n,n), заполненной 3. Задана матрица w(n,m). Поменять местами только натуральными числами, найти k-ую и s-ую строки. Естественно, k и s произведение элементов, расположенных над меньше n. Если это не так, предложить главной диагональю. пользователю задать новые значения k и s.
Вариант 13
Вариант 14
Примерно такие карточки – задания Вы получите для их выполнения на контрольной работе. Работа должна быть выполнена на двойном тетрадном листе и оформлена так, как принято оформлять контрольные и практические работы по другим дисциплинам в нашем учебном заведении. Тексты задач записывать обязательно, сохраняя нумерацию заданий карточки. Программы должны быть написаны аккуратно и легко читаемы, не рекомендуется использовать несколько операторов в одной строке, это облегчит работу преподавателя по проверке. Вы познакомились на наших уроках и с помощью настоящего пособия с основными главами элементов программирования. Изучение языка продолжается. Пусть Вам будет понятно, интересно и занимательно. Желаем успехов. Составители
116