Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Учреждение образования
«Белорусский государственный педагогический университет
имени Максима Танка»
Математический факультет
Кафедра прикладной математики и информатики
КУРСОВАЯ РАБОТА
Разработка интерактивных мультимедийных моделей для решения логических задач
Студент ___________ Пехота М.О.
Научный руководитель
___________Быкадоров Ю.А.
Защищена «____» _________2013г.
с отметкой «_________________»
_____________________ / _________________
_____________________ /__________________
Минск, 2013
ОГЛАВЛЕНИЕ 2
ВВЕДЕНИЕ 3
ГЛАВА 1. МОДЕЛЬ ДЛЯ ПОШАГОВОЙ РЕАЛИЗАЦИИ РЕШЕНИЯ ЛОГИЧЕСКОЙ ЗАДАЧИ «ВОЛК, КОЗА, КАПУСТА» 4
ГЛАВА 2. МОДЕЛЬ ДЛЯ ПОШАГОВОЙ РЕАЛИЗАЦИИ РЕШЕНИЯ ЛОГИЧЕСКОЙ ЗАДАЧИ «ВЗВЕШИВАНИЕ МОНЕТ»…………….6
ГЛАВА 3. МОДЕЛЬ ДЛЯ ПОШАГОВОЙ РЕАЛИЗАЦИИ РЕШЕНИЯ ЛОГИЧЕСКОЙ ЗАДАЧИ «ПЕРЕЛИВАНИЯ» 9
ЗАКЛЮЧЕНИЕ 11
БИБЛИОГРАФИЧЕСКИЙ СПИСОК 12
ПРИЛОЖЕНИЯ 13
Приложение к Главе 1 13
Приложение к Главе 2 17
Приложение к Главе 3 20
В нашей современной действительности повсеместно происходит ускорение информационных процессов. Не только возможности компьютерной техники, но и скорость внедрения технических и программных средств в повседневную жизнь и образовательный процесс возрастает почти по закону Мура. И это требует от нас постоянной работы по самосовершенствованию, поиску возможностей для повышения качества использования этих ресурсов.
Возможно, это покажется банальным напоминать о важности решения логических задач. Однако зачастую мы, повторяя прописные истины, не задумываемся об их глубинных смыслах. Поэтому бывает полезно «освежить» собственную память, определиться заново в понимании взаимосвязей причин и их следствий, чтобы лучше понимать, откуда и куда двигаться, с какой именно целью.
Логические задачи дошли до нас с самых древних времён. Например, самая древняя из задач типа «переправы» «Волк, коза и капуста» встречается в сочинениях англосакского математика Алкуина (ок. 735804). Но хоть эти задачи довольно старые, они не теряют своей актуальности и в наше время. Решение логических задач это не только очень увлекательный, но и крайне полезный способ времяпрепровождения, как для школьников, так и для взрослых. Логические головоломки это не привычные всем со школы математические задачи. Это целые истории, в которые нужно вжиться, прочувствовать, уловить незаметные с первого взгляда связи. Это и притягивало миллионы людей к решению таких задач как тысячу лет назад, так и в наши дни. Сегодня существует множество мультимедийных моделей для решения различных логических задач, некоторые из них я вам продемонстрирую. Для их создания я выбрал язык программирования ActionScript 3.0 и, соответственно, программу Adobe Flash Professional CS6.
Цель: Выбор подходящих программных средств и создание мультимедийных моделей для решения логических задач. Подбор набора логических задач.
Задачи: Создание моделей для пошаговой реализации решения логических задач («Волк, коза, капуста», «Взвешивание монет», «Переливания»).
Задачи типа «переправы» одни из самых старинных логических задач. Как уже упоминалось, самая древняя из них «Волк, коза и капуста» - встречается в сочинениях VIII века. Рассмотрим принцип её решения.
Условие задачи: Один человек должен был перевезти через реку волка, козу и кочан капусты. И не удалось ему найти другого судна, кроме как такого, которое могло выдержать только двоих из них. Нельзя было волка оставить с козой, а козу с капустой. Задача переправить всех невредимыми.
Принцип решения: Рассмотрим пары «волк коза» и «коза капуста».
В первой паре присваиваем волку индекс А1, а козе П1.
Во второй паре присваиваем коз индекс А2, а капусте П2.
Следовательно, у волка индекс А1, у козы П1А2, а у капусты П2.
Сначала перемещаем объект, являющийся активным и пассивным одновременно (в данном случае козу), затем возвращаемся обратно, берём любой оставшийся объект (волка или капусту), перевозим на другой берег, берём объект с индексами А и П (козу), переправляем обратно, берём другой объект (капусту или волка), переправляем на другой берег, возвращаемся назад, забираем объект с индексами А и П (козу), и переправляем на другой берег.
Рис.1 - Задача о волке, козе и капусте (с помощью ActionScript 3.0)
Лодочник выступает в роли статиста, так что его мы не будем учитывать при построении модели. В предложенной мною визуализации задачи (см. рис.1) для того, чтобы поместить пассажира (будь то животное или кочан) в лодку или на берег из лодки, необходимо нажать на эту цель. При нажатии на кнопку «Переправить» лодка переправляется к противоположному берегу, а находящийся в ней пассажир (если он там был) сразу высаживается на него.
Задачи на взвешивание достаточно распространённый вид математических задач. В таких задачах от решающего требуется локализовать отличающийся от остальных предмет по весу за ограниченное число взвешиваний. Поиск решения в этом случае осуществляется путем операций сравнения, правда, не только одиночных элементов, но и групп элементов между собой.
В качестве примера рассмотрим задачу о 12 монетах (в усложнённом варианте).
Условие задачи: Имеется 12 золотых монет. Одна из них фальшивая, но не известно, легче она или тяжелее остальных. Найти фальшивую монету за 3 взвешивания и установить, легче она или тяжелее.
Принцип решения: Сложность задачи в том, что не известно, легче или тяжелее фальшивый объект. Делим на 3 группы. На чаши весов кладём монеты №№ 1, 2, 3, 4 и №№ 5, 6, 7, 8. Возможны два случая:
Случай 1. Весы в равновесии. Следовательно, фальшивая монета в третьей группе монет с №№ 9, 10, 11, 12. Сравним вес трёх из них, например, №№ 9, 10, 11 с монетами №№ 1, 2, 3. Если весы в равновесии, то фальшивая монета - № 12, и если сравнить её с № 1, то можно определить, легче она или тяжелее. Если же весы не в равновесии, то фальшивая монета одна из №№ 9, 10, 11, причём по положению чашки сразу можно выяснить, легче или тяжелее фальшивая монета. Затем кладём на весы по одной монете и определяем фальшивую монету.
Случай 2. Первое взвешивание не привело к равновесию. Пусть перетянула чашка с монетами №№ 1, 2, 3 и 4. Тогда фальшивая монета среди №№ 1, 2, 3, 4 и более тяжёлая, или она среди монет №№ 5, 6, 7, 8 и более лёгкая. Следовательно, монеты №№ 9, 10, 11, 12 настоящие. Вторым взвешиванием сравним монеты №№ 9, 10, 11 и 5 с монетами №№ 3, 4, 6, 7. Тогда возможны три случая:
Случай 2.1. Весы в равновесии. Следовательно, выбранные монеты настоящие, а фальшивая либо среди монет под №№ 1, 2 и более тяжёлая, либо под № 8 и более лёгкая. Сравнивая монеты №№ 1 и 2, установим, что фальшивая монета лёгкая под № 8, если весы останутся в равновесии или, что фальшивая тяжёлая № 1 или № 2 та, которая перетянет.
Случай 2.2. Перетянет группа монет №№ 9, 10, 11 и 5. Тогда в этой группе фальшивой монеты быть не может, так как монета № 5 взята из группы более лёгких, а монеты №№ 9, 10 и 11 настоящие, и эта чашка весов не могла бы перетянуть с тремя настоящими и одной фальшивой монетой. Следовательно, фальшивая одна из монет под №№ 3, 4, 6, 7 и именно из группы, которая при первом взвешивании оказалась легче, то есть либо № 6, либо № 7. Более лёгкая из них выявляется третьим взвешиванием.
Случай 2.3. Перетянет группа монет №№ 3, 4, 6 и 7. Тогда фальшивая монета более тяжёлая и находится на перетянувшей чашке весов - № 3 или № 4, или фальшивая монета более лёгкая и, следовательно, находится в группе монет №№ 9, 10, 11 и 5. В последнем случае это монета № 5, так как монеты №№ 9, 10 и 11 настоящие.
Следовательно, фальшивой монетой может быть одна из трёх: № 3 или № 4 (и тогда она более тяжёлая) или № 5 (и тогда она более лёгкая). Взвешиваем монеты №№ 3 и 4, и тогда если одна из монет перетянет, она и будет фальшивой, или если весы будут в равновесии, тогда монета № 5 фальшивая и тяжелее остальных.
Рис.2 Задача о взвешивании (с помощью ActionScript 3.0)
В предложенной мною визуализации задачи (см. рис.2) можно необходимые для взвешивания монеты помечать синим или красным цветом, относя к одной из чаш весов. На каждом шаге (при нажатии кнопки «Взвесить») весы наклоняются в одну из сторон, где вес наибольший, или приводятся в равновесие, если чаши нагружены одинаково. После трёх взвешиваний нужно ввести номер монеты, которую вы считаете фальшивой. Программа обработает ваш ответ и скажет, был он верным или нет. В дополнении к этому ведётся счёт партиям: количество выигрышей к общему количеству игр. То есть желательно стремиться к результату 10/10, 100/100 и т.д. Таким образом, стороннему человеку легче определить, верно вы поняли алгоритм решения задачи или же выбирали номер наугад.
Задачи типа «переливания» имели большую практическую ценность, как в древние времена, так и в наши дни. В таких задачах с помощью сосудов известных емкостей требуется отмерить некоторое количество жидкости. При решении таких задач необходимо учитывать следующие замечания: разрешается наливать в сосуд ровно столько жидкости, сколько в нем помещается; разрешается переливать всю жидкость из одного сосуда в другой, если она в него вся помещается; разрешается отливать из одного сосуда в другой столько жидкости, сколько необходимо, чтобы второй сосуд стал полным. Рассмотрим самую типичную из таких задач.
Условие задачи: Есть два ведра объёмом 5 и 9 литров. Необходимо с помощью этих двух вёдер получить 3 литра воды.
Принцип решения: Наполняем 9-литровое ведро, выливаем 5 литров из 9-литрового в 5-литровое ведро, выливаем, переливаем 4 литра в маленькое ведро, наполняем большое ведро, сливаем из него один литр в маленькое ведро, выливаем маленькое ведро и переливаем 5 литров воды в маленькое ведро. В большом ведре осталось 3 литра воды.
Рис.3.1 Задача о переливании (с помощью ActionScript 3.0)
В предложенной мною визуализации задачи (см. рис.3.1) имеется 5 кнопок (по 2 «Набрать» и «Вылить», которые относятся к каждому из вёдер, и «Перелить», работающая лишь тогда, когда установлена команда в одну из радиокнопок). Для удобства восприятия каждые 2 литра в каждом сосуде отмечены специальными линиями. Программа работает так, что если в каком-то из сосудов остаётся необходимые 3 литра жидкости, появляется анимация, поздравляющая игрока с успешным выполнением задания и предлагающая закрепить свои умения в её решении (см. рис.3.2).
Рис.3.2 Поздравления с успешным выполнением задачи о переливании
В данной работе были созданы модели для пошаговой реализации решения логических задач «Волк, коза, капуста», «Взвешивание монет», «Переливания». Были практически подтверждены многогранность логических задач, существование различных способов их решения.
Приложение к Главе 1
Рис.4.1 Расположение слоёв в задаче «Волк, коза, капуста»
Как можно заметить на рис.4.1, на Слое 1 я разместил все предметы (клипы, фон и др.), на Слое 2 код самой программы., который приведён ниже.
import flash.events.MouseEvent;
var arr1:Array = new Array(); // Массив месторасположения персонажей
var arr2:Array = new Array(); // Массив клипов (кнопок)
tf1.text = "";
arr1["Волк"] = 0;
arr1["Коза"] = 0;
arr1["Капуста"] = 0;
arr2["Волк"] = btn2;
arr2["Коза"] = btn3;
arr2["Капуста"] = btn4;
// 0 - на левом берегу(координата по Х: -200)
// 1 - в лодке слева (координата по Х: -50)
// 2 - в лодке справа (координата по Х: 50)
// 3 - на правом берегу (координата по Х: 200)
var kol:uint = 0; // Количество пассажиров в лодке
var ygrek:uint = 0; // Положение клипа (кнопки) нужно для запоминания
stage.addEventListener(MouseEvent.CLICK, letsGO); // Срабатывает при клике в любом месте сцены и запускает функцию letsGO
function letsGO(event:MouseEvent):void
{
tf1.text = "";
if(event.target==btn2) action("Волк"); // Если нажали "btn2", то запускаем функцию action и передаем в нее параметр "Волк"
if(event.target==btn3) action("Коза");
if(event.target==btn4) action("Капуста");
if(event.target==btn1) test(); // При нажатии кнопки "Переправить", проверяем правильность действий, запуская функцию test
}
function action(target):void
{
// Функция принимает в параметр target слово (Волк, Коза или Капуста)
if(arr1[target]==1) // Если target в лодке у левого берега, то перемещаем его на берег
{
arr1[target]=0;
arr2[target].x=-200;
arr2[target].y=ygrek;
kol--;
return;
}
if(arr1[target]==2) // Если target в лодке у правого берега, то перемещаем его на берег
{
arr1[target]=3;
arr2[target].x=200;
arr2[target].y=ygrek;
kol--;
return;
}
if(kol<1) // Проверка, что в лодке нет пассажиров
{
if(arr1[target]==0 && boat.x==-50) // Если цель стоит на левом берегу и лодка у левого берега, то перемещаем цель в лодку
{
ygrek=arr2[target].y;
arr1[target]=1;
arr2[target].x=-50;
arr2[target].y=50;
kol++;
return;
}
if(arr1[target]==3 && boat.x==50) // Если цель стоит на правом берегу и лодка у правого берега, то перемещаем цель в лодку
{
ygrek=arr2[target].y;
arr1[target]=2;
arr2[target].x=50;
arr2[target].y=50;
kol++;
return;
}
}
else tf1.text = "Может быть максимум 1 пассажир.";
}
function test():void
{
// Здесь идет проверка правильности действий(кто кого съест и т.п.)
if(arr1["Волк"]==arr1["Коза"])
{
tf1.text = "Волк съел козу";
return;
}
if(arr1["Коза"]==arr1["Капуста"])
{
tf1.text = "Коза съела капусту";
return;
}
if(boat.x==-50) // Если лодка на левом берегу (и никто никого не съел)
{
boat.x = 50; // перемещаем лодку вправо
kol = 0; // обнуляем кол-во человек в лодке
for(var i in arr1) // Высаживаем всех из лодки на правый берег
{
if(arr1[i]==1)
{
arr1[i]=3;
arr2[i].x=200;
arr2[i].y=ygrek;
}
}
if((arr1["Волк"]+arr1["Коза"]+arr1["Капуста"])==9) // Если все на правом берегу (победа!)
{
tf1.text = "Поздравляю! Вы справились!";
arr2["Волк"].x = -200;
arr2["Коза"].x = -200;
arr2["Капуста"].x = -200;
arr1["Волк"] = 0;
arr1["Коза"] = 0;
arr1["Капуста"] = 0;
boat.x=-50;
}
return;
}
if(boat.x==50) // Если лодка на правом берегу (и никто никого не съел)
{
boat.x = -50; // перемещаем лодку
kol = 0; // обнуляем кол-во человек в лодке
for(var j in arr1) // Высаживаем всех из лодки на левый берег
{
if(arr1[j]==2)
{
arr1[j]=0;
arr2[j].x=-200;
arr2[j].y=ygrek;
}
}
return;
}
}
Приложение к Главе 2
Рис.4.2 Расположение слоёв и поле вывода в задаче «Взвешивание монет»
На Слое 1 (см. рис.4.2) я расположил весы, на Слое 2 множество клипов и других элементов программы, на Слое 3 код программы.
import flash.events.MouseEvent;
balance.stop();
// Создаём монеты
var coins:Array = new Array();
var coinsWeight:Array = new Array();
var round:uint = 1;
var falseCoin:uint = 0;
var victory:uint = 0; // кол-во побед
var all:uint = 0; // кол-во игр
vivod3.text = String("Счёт: "+ victory + "/" + all);
stage.addEventListener(MouseEvent.CLICK, letsGO);
coinsCreation();
function coinsCreation():void
{
for(var i:uint = 0; i < 12; i++) {
coins[i] = new BronzeCoin();
addChild(coins[i]);
coins[i].x = 170 + i*40;
coins[i].y = 80;
coins[i].stop();
coins[i].buttonMode = true;
coins[i].name = i+1;
coinsWeight[i] = 2;
}
var rnd1:uint = Math.random()*12;
var rnd2:uint = Math.random()*2;
if(rnd2 == 0) {
coinsWeight[rnd1] = 1;
} else {
coinsWeight[rnd1] = 3;
}
falseCoin = rnd1+1;
trace("coin: " + coinsWeight);
}
function letsGO(event:MouseEvent):void
{
if(event.target is BronzeCoin)
{
if(event.target.currentFrame == event.target.totalFrames)
event.target.gotoAndStop(1);
else event.target.nextFrame();
vivod2.text = "";
}
else
if(event.target == btn1)
{
if(round < 4)
{
var num1:uint = 0; // Масса монет на красной чаше
var num2:uint = 0; // Масса монет на синей чаше
for(var i in coins)
{
if(coins[i].currentFrame == 2) num1 += coinsWeight[i];
else if(coins[i].currentFrame == 3)
num2 += coinsWeight[i];
}
// наклоняем весы
if(num1 == num2) balance.gotoAndStop(1);
else if(num1 > num2) balance.gotoAndStop(2);
else balance.gotoAndStop(3);
round++;
if(round == 4) vivod1.text = String("Введите номер фальшивой монеты");
else vivod1.text = String("Взвешивание N"+round);
trace(num1 + " " + num2);
}
}
else if(event.target == btn2)
{
if(uint(vvod1.text) == falseCoin)
{
trace("Победа! Попробуйте это повторить несколько раз подряд!");
vivod2.text = "Верно!";
vvod1.text = "";
victory++;
}
else {
trace("Неправильно! Хватит угадывать, решайте!");
vivod2.text = "Мимо!";
vvod1.text = "";
}
all++;
vivod3.text = String("Счёт: "+ victory + "/" + all);
// Создаём игру заново
for(var j:uint = 0; j < 12; j++)
removeChild(coins[j]);
balance.gotoAndStop(1);
coinsCreation();
round = 1;
vivod1.text = String("Взвешивание N"+round);
}
}
Приложение к Главе 3
Рис.4.3 Расположение слоёв в задаче «Переливания»
На Слое 1 (см. рис. 4.3) расположена концовка игры. На Слое 2 лежат клипы с водой в масштабе 1 к 1 (клипы на 10 литров воды). Затем в коде я задаю начальные параметры текущего уровня воды в каждом контейнере. Исходя из этих данных, меняю размер клипа. На Слое 3 расположена вся графическая информация, на Слое 4 кнопки и радиокнопки, на Слое 5 код программы.
import flash.events.MouseEvent;
import fl.controls.RadioButtonGroup;
victory.stop();
victory.visible = false;
var num1:uint = 0; // Литров воды в 1-ом контейнере
var num2:uint = 0; // Литров воды в 2-ом контейнере
var rbg:RadioButtonGroup = new RadioButtonGroup("hello world");
rb1.group = rbg;
rb2.group = rbg;
changeWaterLevel();
stage.addEventListener(MouseEvent.CLICK, letsGO);
function letsGO(e:MouseEvent):void
{
if(e.target == btn1)
num1 = 9;
else if(e.target == btn2) num2 = 5;
else if(e.target == btn3)
{
if(rbg.selection is RadioButton)
{
if(rbg.selection.value == 1)
{
num2 += num1;
if(num2 > 5)
{
num1 = num2 - 5;
num2 = 5;
}
else num1 = 0;
}
else
{
num1 += num2;
if(num1 > 9)
{
num2 = num1 - 9;
num1 = 9;
}
else num2 = 0;
}
}
}
else if(e.target == btn4) num1 = 0;
else if(e.target == btn5) num2 = 0;
else if(e.target == victory.btn6)
{
num1 = 0;
num2 = 0;
changeWaterLevel();
victory.stop();
victory.visible = false;
}
changeWaterLevel();
}
function changeWaterLevel():void
{
conteiner1.scaleY = num1*0.1;
conteiner2.scaleY = num2*0.1;
if(num1 == 3 || num2 == 3)
{
victory.play();
victory.visible = true;
victory.addEventListener(Event.ENTER_FRAME, enterFrameFun);
}
}
function enterFrameFun(e:Event):void
{
if(e.target.currentFrame == e.target.totalFrames)
{
e.target.stop();
victory.removeEventListener(Event.ENTER_FRAME, enterFrameFun);
}
}