Merge branch 'master' of mojotrollz.eu:college
This commit is contained in:
commit
cd31d44de5
32
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.aux
Normal file
32
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.aux
Normal file
@ -0,0 +1,32 @@
|
||||
\relax
|
||||
\catcode`"\active
|
||||
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
|
||||
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
|
||||
\global\let\oldcontentsline\contentsline
|
||||
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
|
||||
\global\let\oldnewlabel\newlabel
|
||||
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
|
||||
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
|
||||
\AtEndDocument{\ifx\hyper@anchor\@undefined
|
||||
\let\contentsline\oldcontentsline
|
||||
\let\newlabel\oldnewlabel
|
||||
\fi}
|
||||
\fi}
|
||||
\global\let\hyper@last\relax
|
||||
\gdef\HyperFirstAtBeginDocument#1{#1}
|
||||
\providecommand\HyField@AuxAddToFields[1]{}
|
||||
\select@language{ngerman}
|
||||
\@writefile{toc}{\select@language{ngerman}}
|
||||
\@writefile{lof}{\select@language{ngerman}}
|
||||
\@writefile{lot}{\select@language{ngerman}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1}Animal}{1}{section.1}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2}AnimalScript}{1}{section.2}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3}Generator}{1}{section.3}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {4}Verbesserungsvorschl\"age}{1}{section.4}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {5}Fazit}{1}{section.5}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {6}was ihnen am Praktikum gut gefallen hat und was weniger gut war}{1}{section.6}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {7}ob bzw. was sie gelernt haben}{1}{section.7}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {8}was wir in Zukunft an ANIMAL, ANIMALSCRIPT, der API oder den Uebungen verbessern koennten}{2}{section.8}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {9}wie zufrieden Sie mit der Betreuung im Lernportal waren}{2}{section.9}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {10}wie sie an die Aufgaben herangegangen sind und Sie-eventuell im Team-bearbeitet haben}{2}{section.10}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {11}und was sie uns sonst noch an Anregungen geben wollen}{2}{section.11}}
|
||||
1007
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.log
Normal file
1007
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.log
Normal file
File diff suppressed because it is too large
Load Diff
11
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.out
Normal file
11
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.out
Normal file
@ -0,0 +1,11 @@
|
||||
\BOOKMARK [1][-]{section.1}{Animal}{}% 1
|
||||
\BOOKMARK [1][-]{section.2}{AnimalScript}{}% 2
|
||||
\BOOKMARK [1][-]{section.3}{Generator}{}% 3
|
||||
\BOOKMARK [1][-]{section.4}{Verbesserungsvorschl\344ge}{}% 4
|
||||
\BOOKMARK [1][-]{section.5}{Fazit}{}% 5
|
||||
\BOOKMARK [1][-]{section.6}{was ihnen am Praktikum gut gefallen hat und was weniger gut war}{}% 6
|
||||
\BOOKMARK [1][-]{section.7}{ob bzw. was sie gelernt haben}{}% 7
|
||||
\BOOKMARK [1][-]{section.8}{was wir in Zukunft an ANIMAL, ANIMALSCRIPT, der API oder den Uebungen verbessern koennten}{}% 8
|
||||
\BOOKMARK [1][-]{section.9}{wie zufrieden Sie mit der Betreuung im Lernportal waren}{}% 9
|
||||
\BOOKMARK [1][-]{section.10}{wie sie an die Aufgaben herangegangen sind und Sie-eventuell im Team-bearbeitet haben}{}% 10
|
||||
\BOOKMARK [1][-]{section.11}{und was sie uns sonst noch an Anregungen geben wollen}{}% 11
|
||||
BIN
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.pdf
Normal file
BIN
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.pdf
Normal file
Binary file not shown.
BIN
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.synctex.gz
Normal file
BIN
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.synctex.gz
Normal file
Binary file not shown.
72
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.tex
Normal file
72
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.tex
Normal file
@ -0,0 +1,72 @@
|
||||
\documentclass[article, colorback,accentcolor=tud1d]{tudreport}
|
||||
\usepackage[latin9]{inputenc} %unter Linux muss latin9 durch utf8 ersetzt werden!!
|
||||
\usepackage[ngerman]{babel}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{lineno}
|
||||
\usepackage{wasysym}
|
||||
\usepackage{latexsym}
|
||||
%reihenfolge von "hyperref" und "glossaries" ist wichtig!!!! nicht ändern!
|
||||
\usepackage[pdftitle={Abschlussbericht}]{hyperref}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\title{Praktikum AlgoAnim}
|
||||
\subtitle{Abschlussbericht Sommersemester 2012\\
|
||||
Gruppe: Ulf Gebhardt, Michael Scholz}
|
||||
\author{Ulf Gebhardt, Michael Scholz}
|
||||
\maketitle
|
||||
|
||||
|
||||
\newpage
|
||||
\section{Animal}
|
||||
Die Benutzeroberfläche von Animal ist intuitiv gestaltet. Somit hat jeder Benutzer die Möglichkeit sich einen Algorithmus schnell und einfach generieren zu lassen. In der Animation selbst sind sämtliche Steuerungsfunktionen vorhanden. Besonders gut hat uns hierbei die variabel einstellbare Abspielzeit gefallen. Wünschenswert wäre jedoch eine Suchfunktion, mit der alle vorhandenen Generatoren durchsucht werden können. \\ \\
|
||||
Leider haben wir in der Lehrveranstaltung \glqq Grundlagen der Informatik II\grqq\ keinen Hinweis auf die Existenz von Animal bekommen. Animal wäre sicherlich eine gute Unterstützung beim Lernen der verschiedenen Algorithmen und Datenstrukturen gewesen.
|
||||
|
||||
|
||||
\section{AnimalScript}
|
||||
Die Einarbeitung in AnimalScript ist uns sehr leicht gefallen. Die Sprache ist verständlich aufgebaut, so dass auch Personen ohne Programmiererfahrung ihre eigenen Animationen schreiben können. Als weiterer Grund für die schnelle Einarbeitung ist hier das englischsprachige Tutorial aufzuführen. Es leitet den Entwickler Schritt für Schritt durch die einzelnen Abschnitte. Nach dem Tutorial waren wir bereit mit unserer ersten eigenen Animation in AnimalScript zu beginnen. Bei kleineren Problemen half fast immer ein Blick in die AnimalScript-Spezifikationen. Ein wenig Verwirrung kam bei der Erstellung der Tabelle auf. In der aktuellen Version (2.3.29) von Animal führt ein \glqq refresh\grqq\ einer Tabelle zu einer falschen Formatierung derselbigen. Das Problem haben wir gelöst, indem wir die Tabelle in zwei kleinere Tabellen aufgeteilt und diese mit einer festen Breite initialisiert haben. Durch das Shortcut \glqq reload current animation\grqq\ konnten wir die erstellte Animation gut testen. Durch die aufgeführten Faktoren haben wir Übung 2 zügig absolvieren können. Wir haben während dem gesamten Praktikum Pair-Programming betrieben. Hierbei schreibt eine Person den Quelltext. Die Übrige beobachtet, gibt Tipps und schlägt in unserem Fall bei auftauchenden Problemen in der Spezifikation nach. Nach einem, bei uns nicht festgelegten, Zeitintervall werden die eingenommenen Positionen gewechselt. Diese Methode hat sich vor allem in der Einarbeitungsphase bewährt.
|
||||
|
||||
|
||||
\section{Generator}
|
||||
|
||||
|
||||
\section{Verbesserungsvorschläge}
|
||||
Nachfolgend haben wir einige wenige Verbesserungsvorschläge stichpunktartig aufgelistet. Diese sollen als konstruktive Kritik dienen.
|
||||
\begin{itemize}
|
||||
\item Suchfunktion in Animal zum Finden der einzelnen Generatoren
|
||||
\item ...
|
||||
\end{itemize}
|
||||
|
||||
|
||||
|
||||
\section{Fazit}
|
||||
Das Praktikum hat uns sehr gut gefallen. Positiv hervorzuheben ist die freie Einteilung der Arbeitszeit. Hierdurch konnten wir je nach persönlicher Auslastung während des Semesters an dem Praktikum arbeiten. Trotzdem waren die vorgeschlagenen Zeiträume auf den einzelnen Übungsblättern als Anhaltspunkte hilfreich und sinnvoll. Auch das zeitnahe Feedback auf die einzelnen Abgaben und die Möglichkeit der Verbesserung nach der erhaltenen Rückmeldung haben uns positiv überrascht. Hierdurch war es möglich Ihre Anforderungen an die einzelnen Aufgaben bestmöglich zu erfüllen. \\
|
||||
-> Muss noch ein bisschen erweitert werden
|
||||
|
||||
|
||||
|
||||
|
||||
\section{was ihnen am Praktikum gut gefallen hat und was weniger gut war}
|
||||
- Nur dürftige Betreuung im Moodle. Dieser Punkt wird später weiter ausgeführt. \\
|
||||
- Einige Bugs (refresh der grids) sind vorhanden und beanspruchen sehr viel kreativität beim finden neuer lösungsideen. Hierdurch wird das von Guido in GDI1 immer wieder betonte KISS-Prinzip (Keep it simple, stupid!) verletzt :) \\
|
||||
|
||||
\section{ob bzw. was sie gelernt haben}
|
||||
Die benötigten Java-Kentnisse sollten im 6. Semester vorhanden sein. Trotzdem lernt man nie aus. blabla. So musste man sich in die API einarbeiten. Hierfür entwickelt man im Laufe der Zeit eine gewisse Routine. Wo fängt man an? Direkt im Code? In der Dokumentation? Oder schreibt man einfach mal wild drauf los? Die Doku war hier sehr hilfreich. Eine ausführliche Dokumentation der API wäre in Zukunft für weitere Gruppen sicherlich hilfreich.
|
||||
|
||||
\section{was wir in Zukunft an ANIMAL, ANIMALSCRIPT, der API oder den Uebungen verbessern koennten}
|
||||
-> Diesen Abschnitt am besten mit der letzten Section zusammenfassen und als Fazit formulieren.!
|
||||
|
||||
\section{wie zufrieden Sie mit der Betreuung im Lernportal waren}
|
||||
- Nicht zufrieden! Fakten: Keine Antwort auf highlightGridElement(...), keine Antwort auf der \glqq refresh-problem\grqq. Hier hat sich scheinbar niemand wirklich verantwortlich gefühlt.\\
|
||||
Vergleich zu vergangenen Verantstaltungen von Guido ziehen (Beispiel GDI1). \\ \\
|
||||
+ Schnelles Feedback zu den abgegebenen Übungen erhalten. Somit konnte man die Verbesserungsvorschläge direkt in das Projekt einfließen lassen.
|
||||
|
||||
\section{wie sie an die Aufgaben herangegangen sind und Sie-eventuell im Team-bearbeitet haben}
|
||||
Tutorial gemacht, Dokumentation gelesen, Beispiele angeschaut, angefangen!
|
||||
|
||||
\section{und was sie uns sonst noch an Anregungen geben wollen}
|
||||
Hier am besten nochmal alle Verbesserungen Stichpunktartig zusammenfassen bzw. ein Fazit schreiben und alle Verbesserungen gekürzt wiederholen.
|
||||
|
||||
|
||||
|
||||
\end{document}
|
||||
11
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.toc
Normal file
11
ss2012/AlgoAnim/Abschlussbericht/Abschlussbericht.toc
Normal file
@ -0,0 +1,11 @@
|
||||
\select@language {ngerman}
|
||||
\contentsline {section}{\numberline {1}AnimalScript}{2}{section.1}
|
||||
\contentsline {section}{\numberline {2}Generator}{2}{section.2}
|
||||
\contentsline {section}{\numberline {3}Verbesserungsvorschl\"age}{2}{section.3}
|
||||
\contentsline {section}{\numberline {4}Fazit}{2}{section.4}
|
||||
\contentsline {section}{\numberline {5}was ihnen am Praktikum gut gefallen hat und was weniger gut war}{2}{section.5}
|
||||
\contentsline {section}{\numberline {6}ob bzw. was sie gelernt haben}{2}{section.6}
|
||||
\contentsline {section}{\numberline {7}was wir in Zukunft an ANIMAL, ANIMALSCRIPT, der API oder den Uebungen verbessern koennten}{3}{section.7}
|
||||
\contentsline {section}{\numberline {8}wie zufrieden Sie mit der Betreuung im Lernportal waren}{3}{section.8}
|
||||
\contentsline {section}{\numberline {9}wie sie an die Aufgaben herangegangen sind und Sie-eventuell im Team-bearbeitet haben}{3}{section.9}
|
||||
\contentsline {section}{\numberline {10}und was sie uns sonst noch an Anregungen geben wollen}{3}{section.10}
|
||||
@ -3,27 +3,28 @@ title "Russische Bauernmultiplikation"
|
||||
author "Michael Scholz, Ulf Gebhardt"
|
||||
{
|
||||
text "header" "Russische Bauernmultiplikation" at (20, 30) font SansSerif size 24 bold
|
||||
text "straight" "Die Funktionsweise lässt sich in die folgenden fünf Schritte gliedern:" at (20, 85) font SansSerif size 18
|
||||
text "straight" "1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander." at (20, 115) font SansSerif size 18
|
||||
text "straight" "2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt." at (20, 140) font SansSerif size 18
|
||||
text "straight" "Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben." at (43, 165) font SansSerif size 18
|
||||
text "straight" "3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht." at (20, 190) font SansSerif size 18
|
||||
text "straight" "4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist." at (20, 215) font SansSerif size 18
|
||||
text "straight" "5. Schlussendlich werden alle übrigen Zahlen der rechten Spalte addiert." at (20, 240) font SansSerif size 18
|
||||
text "straight" "Das hier vorgestellte Verfahren eignet sich für die Multiplikation zweier ganzer Zahlen." at (20, 85) font SansSerif size 18 italic
|
||||
text "straight" "Die Funktionsweise lässt sich in die folgenden fünf Schritte gliedern:" at (20, 150) font SansSerif size 18
|
||||
text "straight" "1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander." at (20, 180) font SansSerif size 18
|
||||
text "straight" "2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt." at (20, 205) font SansSerif size 18
|
||||
text "straight" "Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben." at (43, 230) font SansSerif size 18
|
||||
text "straight" "3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht." at (20, 255) font SansSerif size 18
|
||||
text "straight" "4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist." at (20, 280) font SansSerif size 18
|
||||
text "straight" "5. Schlussendlich werden alle übrigen Zahlen der rechten Spalte addiert." at (20, 305) font SansSerif size 18
|
||||
}
|
||||
{
|
||||
hideAll
|
||||
text "header" "Russische Bauernmultiplikation" at (20, 30) font SansSerif size 24 bold
|
||||
codeGroup "code" at (10, 147) color black highlightColor red
|
||||
addCodeLine "public int russe(int a, int b){" to "code"
|
||||
addCodeLine "\t if(a == 1){" to "code"
|
||||
addCodeLine "\t \t return b; " to "code"
|
||||
addCodeLine "\t }" to "code"
|
||||
addCodeLine "\tif(a % 2 == 1){" to "code"
|
||||
addCodeLine "\t \t return b + russe(a/2, b*2);" to "code"
|
||||
addCodeLine "\t }else{" to "code"
|
||||
addCodeLine "\t \t return russe(a/2, b*2);" to "code"
|
||||
addCodeLine "\t }" to "code"
|
||||
addCodeLine "\t \t if(a == 1){" to "code"
|
||||
addCodeLine "\t \t \t \t return b; " to "code"
|
||||
addCodeLine "\t \t }" to "code"
|
||||
addCodeLine "\t \t if(a % 2 == 1){" to "code"
|
||||
addCodeLine "\t \t \t \t return b + russe(a/2, b*2);" to "code"
|
||||
addCodeLine "\t \t }else{" to "code"
|
||||
addCodeLine "\t \t \t \t return russe(a/2, b*2);" to "code"
|
||||
addCodeLine "\t \t }" to "code"
|
||||
addCodeLine "}" to "code"
|
||||
}
|
||||
{
|
||||
@ -212,18 +213,20 @@ text "header" "Russische Bauernmultiplikation" at (20, 30) font SansSerif size 2
|
||||
text "straight" "Erklärung:" at (20, 85) font SansSerif size 18 bold \br
|
||||
text "straight" "Die Idee des Verfahrens kann man mit Hilfe des Dualsystems verdeutlichen." at (20, 115) font SansSerif size 18
|
||||
text "straight" "Hierbei wird eine Zahl in ihre Zweierpotenzen zerlegt." at (20, 140) font SansSerif size 18
|
||||
text "straight" "0" at (204, 153) font SansSerif size 10
|
||||
text "straight" "1" at (242, 162) font SansSerif size 10
|
||||
text "straight" "2" at (312, 162) font SansSerif size 10
|
||||
text "straight" "3" at (350, 162) font SansSerif size 10
|
||||
text "straight" "4" at (385, 162) font SansSerif size 10
|
||||
text "straight" "82 * 27 \t = 82 * (2 + 2 + 0 * 2 + 2 + 2 )" at (43, 172) font SansSerif size 18
|
||||
text "straight" "0" at (200, 180) font SansSerif size 10
|
||||
text "straight" "1" at (282, 189) font SansSerif size 10
|
||||
#text "straight" "0" at (204, 153) font SansSerif size 10
|
||||
text "test" "82 * 27 \t = 82 * (2^0 + 2^1 + 0 * 2^2 + 2^3 + 2^4 )" at (43, 172) font SansSerif size 18
|
||||
# text "straight" "0" offset (30, 0) from "test" NW font SansSerif size 10
|
||||
#text "straight" "1" at (242, 162) font SansSerif size 10
|
||||
#text "straight" "2" at (312, 162) font SansSerif size 10
|
||||
#text "straight" "3" at (350, 162) font SansSerif size 10
|
||||
#text "straight" "4" at (385, 162) font SansSerif size 10
|
||||
|
||||
text "straight" "3" at (441, 189) font SansSerif size 10
|
||||
text "straight" "4" at (520, 189) font SansSerif size 10
|
||||
text "straight" "\t \t \t \t \t \t \t \t \t = 82 * 2 + 82 * 2 + 82 * 0 + 82 * 2 + 82 * 2" at (20, 200) font SansSerif size 18
|
||||
#text "straight" "0" at (200, 180) font SansSerif size 10
|
||||
#text "straight" "1" at (282, 189) font SansSerif size 10
|
||||
|
||||
#text "straight" "3" at (441, 189) font SansSerif size 10
|
||||
#text "straight" "4" at (520, 189) font SansSerif size 10
|
||||
text "straight" "\t \t \t \t \t \t \t \t \t = 82 * 2^0 + 82 * 2^1 + 82 * 0 + 82 * 2^3 + 82 * 2^4" at (20, 200) font SansSerif size 18
|
||||
text "straight" "\t \t \t \t \t \t \t \t \t = 82 + 164 + 0 + 656 + 1312" at (20, 221) font SansSerif size 18
|
||||
text "straight" "\t \t \t \t \t \t \t \t \t = 2214" at (20, 246) font SansSerif size 18 bold
|
||||
}
|
||||
|
||||
563
ss2012/AlgoAnim/Teil 3/RussischeBauernmultiplikation.java
Normal file
563
ss2012/AlgoAnim/Teil 3/RussischeBauernmultiplikation.java
Normal file
@ -0,0 +1,563 @@
|
||||
package part2;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import de.ahrgr.animal.kohnert.asugen.Font;
|
||||
import algoanim.animalscript.AnimalScript;
|
||||
import algoanim.primitives.SourceCode;
|
||||
import algoanim.primitives.StringMatrix;
|
||||
import algoanim.primitives.generators.Language;
|
||||
import algoanim.properties.AnimationPropertiesKeys;
|
||||
import algoanim.properties.RectProperties;
|
||||
import algoanim.properties.SourceCodeProperties;
|
||||
import algoanim.properties.TextProperties;
|
||||
import algoanim.util.Coordinates;
|
||||
import algoanim.util.Offset;
|
||||
import algoanim.util.Timing;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Scholz, Ulf Gebhardt
|
||||
* @version 0.7 2012-05-15
|
||||
*
|
||||
*/
|
||||
public class RussischeBauernmultiplikation {
|
||||
|
||||
/**
|
||||
* static variables -> simple testing
|
||||
*/
|
||||
static int A = 27;
|
||||
static int B = 82;
|
||||
static int HIGHLIGHTING_TIME = 100; //in ticks
|
||||
static int UNHIGHLIGHTING_TIME = 0; //in ticks
|
||||
|
||||
//=========================================================================================================
|
||||
|
||||
/**
|
||||
* The concrete language object used for creating output
|
||||
*/
|
||||
private Language lang;
|
||||
|
||||
|
||||
/**
|
||||
* The info text as a SourceCode object (first slide)
|
||||
*/
|
||||
private SourceCode info = null;
|
||||
|
||||
/**
|
||||
* The statement text as a SourceCode object (last several slides)
|
||||
*/
|
||||
private SourceCode statement = null;
|
||||
|
||||
|
||||
/**
|
||||
* The sourceCode
|
||||
*/
|
||||
private SourceCode sc = null;
|
||||
|
||||
|
||||
/**
|
||||
* The tables
|
||||
*/
|
||||
private StringMatrix tb1 = null;
|
||||
private StringMatrix tb2 = null;
|
||||
|
||||
|
||||
/**
|
||||
* int-array with the values of b (only for animation)
|
||||
*/
|
||||
private int[] bArray = null;
|
||||
|
||||
|
||||
/**
|
||||
* recursionArray
|
||||
*/
|
||||
private int[] recursionArray = null;
|
||||
|
||||
|
||||
/**
|
||||
* unhighlightingTime
|
||||
*/
|
||||
private Timing unhighTime = new Timing(UNHIGHLIGHTING_TIME) {
|
||||
|
||||
@Override
|
||||
public String getUnit() {
|
||||
// TODO Auto-generated method stub
|
||||
return "ticks";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* highlightTime
|
||||
*/
|
||||
private Timing highTime = new Timing(HIGHLIGHTING_TIME) {
|
||||
|
||||
@Override
|
||||
public String getUnit() {
|
||||
// TODO Auto-generated method stub
|
||||
return "ticks";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* number of lines for tb1
|
||||
*/
|
||||
private int linesOfTb1 = 0;
|
||||
|
||||
private static final String DESCRIPTION =
|
||||
"Russische Bauernmultiplikation\n" +
|
||||
"Das hier vorgestellte Verfahren eignet sich fŸr die Multiplikation zweier ganzer Zahlen.\n" +
|
||||
"Die Funktionsweise lŠsst sich in die folgenden fŸnf Schritte gliedern:\n" +
|
||||
"1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander.\n" +
|
||||
"2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt.\n" +
|
||||
"Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben.\n" +
|
||||
"3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht.\n" +
|
||||
"4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist.\n" +
|
||||
"5. Schlussendlich werden alle Ÿbrigen Zahlen der rechten Spalte addiert.";
|
||||
|
||||
|
||||
private static final String SOURCE_CODE = "public int russe(int a, int b){" // 0
|
||||
+ "\n if(a == 1){" // 1
|
||||
+ "\n return b;" // 2
|
||||
+ "\n }" // 3
|
||||
+ "\n if(a % 2 == 1){" // 4
|
||||
+ "\n return b + russe(a/2, b*2);" // 5
|
||||
+ "\n }else{" // 6
|
||||
+ "\n return russe(a/2, b*2);" // 7
|
||||
+ "\n }" // 8
|
||||
+ "\n }"; // 9
|
||||
|
||||
|
||||
//=========================================================================================================
|
||||
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
* @param l the conrete language object used for creating output
|
||||
*/
|
||||
public RussischeBauernmultiplikation(Language l) {
|
||||
|
||||
// Store the language object
|
||||
lang = l;
|
||||
|
||||
// This initializes the step mode. Each pair of subsequent steps has to
|
||||
// be divdided by a call of lang.nextStep();
|
||||
lang.setStepMode(true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the information text for the first page in the animation
|
||||
*/
|
||||
public void generateInfoText(){
|
||||
|
||||
//create first page of animation (info text) as a code group
|
||||
SourceCodeProperties infoProps = new SourceCodeProperties();
|
||||
infoProps.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("SansSerif", Font.SANSSERIF, 16));
|
||||
|
||||
this.info = lang.newSourceCode(new Coordinates(10, 75), "info", null, infoProps);
|
||||
this.info.addCodeLine("Das hier vorgestellte Verfahren eignet sich fuer die Multiplikation zweier ganzer Zahlen.", null, 0, null);
|
||||
this.info.addCodeLine("Die Funktionsweise laesst sich in die folgenden fuenf Schritte gliedern:", null, 0, null);
|
||||
this.info.addCodeLine("1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander.", null, 1, null);
|
||||
this.info.addCodeLine("2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt.", null, 1, null);
|
||||
this.info.addCodeLine(" Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben.", null, 2, null);
|
||||
this.info.addCodeLine("3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht.", null, 1, null);
|
||||
this.info.addCodeLine("4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist.", null, 1, null);
|
||||
this.info.addCodeLine("5. Schlussendlich werden alle uebrigen Zahlen der rechten Spalte addiert.", null, 1, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the header which is shown during the whole animation
|
||||
*/
|
||||
public void generateHeader(){
|
||||
|
||||
//head
|
||||
TextProperties textProperties = new TextProperties();
|
||||
textProperties.set(AnimationPropertiesKeys.COLOR_PROPERTY, Color.BLACK);
|
||||
textProperties.set(AnimationPropertiesKeys.DEPTH_PROPERTY, 1);
|
||||
textProperties.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("Serif", Font.SANSSERIF, 24));
|
||||
lang.newText(new Coordinates(11, 15), "Russische Bauernmultiplikation", "header", null, textProperties);
|
||||
|
||||
//header background
|
||||
RectProperties rectProperties = new RectProperties();
|
||||
rectProperties.set(AnimationPropertiesKeys.FILL_PROPERTY, Color.GRAY);
|
||||
rectProperties.set(AnimationPropertiesKeys.FILLED_PROPERTY, true);
|
||||
rectProperties.set(AnimationPropertiesKeys.DEPTH_PROPERTY, 2);
|
||||
lang.newRect(new Offset(-5, -5, "header",
|
||||
AnimalScript.DIRECTION_NW), new Offset(5, 5, "header",
|
||||
AnimalScript.DIRECTION_SE), "headerBackground", null,
|
||||
rectProperties);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the SourceCode
|
||||
*/
|
||||
public void generateSourceCode(){
|
||||
|
||||
//set the visual properties for the source code
|
||||
SourceCodeProperties scProps = new SourceCodeProperties();
|
||||
scProps.set(AnimationPropertiesKeys.HIGHLIGHTCOLOR_PROPERTY, Color.RED);
|
||||
|
||||
//initialize source code object and add code lines
|
||||
this.sc = lang.newSourceCode(new Coordinates(10, 147), "sourceCode", null, scProps);
|
||||
this.sc.addCodeLine("public int russe(int a, int b){", null, 0, null); // 0
|
||||
this.sc.addCodeLine("if(a == 1){", null, 1, null); // 1
|
||||
this.sc.addCodeLine("return b;", null, 2, null); // 2
|
||||
this.sc.addCodeLine("}", null, 1, null); // 3
|
||||
this.sc.addCodeLine("if(a % 2 == 1){", null, 1, null); // 4
|
||||
this.sc.addCodeLine("return b + russe(a/2, b*2);", null, 2, null); // 5
|
||||
this.sc.addCodeLine("}else{", null, 1, null); // 6
|
||||
this.sc.addCodeLine("return russe(a/2, b*2);", null, 2, null); // 7
|
||||
this.sc.addCodeLine("}", null, 1, null); // 8
|
||||
this.sc.addCodeLine("}", null, 0, null); // 9
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* calculate needed lines -> animation is more dynamic
|
||||
* @param a
|
||||
* @param b
|
||||
* @return int number of needed lines
|
||||
*/
|
||||
public void calculateLines(int a, int b){
|
||||
|
||||
//calculate needed lines -> animation is more dynamic
|
||||
int aTemp = a;
|
||||
int lines = 3;
|
||||
while(aTemp != 1){
|
||||
aTemp = aTemp / 2;
|
||||
lines++;
|
||||
}
|
||||
//initialize the bArray und the recursionArray
|
||||
this.bArray = new int[lines-1];
|
||||
this.recursionArray = new int[lines-1];
|
||||
this.linesOfTb1 = lines;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the table
|
||||
* @param a
|
||||
* @param b
|
||||
* @param lines
|
||||
*/
|
||||
public void generateTableTb1(int a, int b, int lines){
|
||||
|
||||
//create String[][] data array for tb1
|
||||
String[][] tb1Data = new String[lines][4];
|
||||
|
||||
//fill all fields with ""
|
||||
for(int i = 0; i < tb1Data.length; i++){
|
||||
for(int j = 0; j < tb1Data[i].length; j++){
|
||||
tb1Data[i][j] = "";
|
||||
}
|
||||
}
|
||||
|
||||
//fill the known fields
|
||||
tb1Data[0][0] = "A-Seite";
|
||||
tb1Data[0][1] = "B-Seite";
|
||||
tb1Data[0][2] = "addieren";
|
||||
tb1Data[0][3] = "Summe";
|
||||
tb1Data[1][0] = a+"";
|
||||
tb1Data[1][1] = b+"";
|
||||
|
||||
//create table tb1
|
||||
this.tb1 = lang.newStringMatrix(new Coordinates(270, 100), tb1Data, "tb1", null);
|
||||
this.tb1.changeColor(AnimationPropertiesKeys.FILL_PROPERTY, Color.WHITE, null, null);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the statement for the last several slides
|
||||
*/
|
||||
public void generateStatement(){
|
||||
//final statement
|
||||
SourceCodeProperties statementProps = new SourceCodeProperties();
|
||||
statementProps.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("SansSerif", Font.SANSSERIF, 16));
|
||||
|
||||
this.statement = lang.newSourceCode(new Coordinates(10, 75), "statement", null, statementProps);
|
||||
this.statement.addCodeLine("Erklaerung:", null, 0, null);
|
||||
this.statement.addCodeLine("Die Idee des Verfahrens kann man mit Hilfe des Dualsystems verdeutlichen.", null, 0, null);
|
||||
this.statement.addCodeLine("Hierbei wird eine Zahl in ihre Zweierpotenzen zerlegt.", null, 0, null);
|
||||
this.statement.addCodeLine("", null, 0, null); //empty line for vertical space
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("82 * 27 = 82 * (2^0 + 2^1 + 0 * 2^2 + 2^3 + 2^4 )", null, 0, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 82 * 2^0 + 82 * 2^1 + 82 * 0 + 82 * 2^3 + 82 * 2^4", null, 4, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 82 + 164 + 0 + 656 + 1312", null, 4, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 2214", null, 4, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw the table tb2
|
||||
* @param bArrayLength
|
||||
*/
|
||||
public void drawTb2(int bArrayLength){
|
||||
|
||||
//create String[][] data array for tb2
|
||||
String[][] tb2Data = new String[2][1];
|
||||
tb2Data[0][0] = "Rekursion aufloesen:";
|
||||
|
||||
String tmp = "";
|
||||
for(int i = 1; i < bArrayLength; i++){
|
||||
if(this.bArray[i] != 0){
|
||||
tmp = tmp+this.bArray[i];
|
||||
if(i+1 != bArrayLength){
|
||||
tmp = tmp+"+";
|
||||
}
|
||||
}
|
||||
}
|
||||
tb2Data[1][0] = tmp;
|
||||
|
||||
|
||||
//create table tb2
|
||||
if(this.tb2 != null){
|
||||
this.tb2.put(1, 0, tmp, this.highTime, this.highTime);
|
||||
}else{
|
||||
this.tb2 = lang.newStringMatrix(new Offset(0, 10, this.tb1, AnimalScript.DIRECTION_SW), tb2Data, "tb2", null);
|
||||
this.tb2.changeColor(AnimationPropertiesKeys.FILL_PROPERTY, Color.WHITE, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates the animation of the recursion flow
|
||||
*/
|
||||
public void generateRecursion(){
|
||||
|
||||
//draw tb2
|
||||
drawTb2(this.bArray.length);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
int newLineNumber = 0;
|
||||
int oldLineNumber = 0;
|
||||
this.sc.unhighlight(2); //"return b"
|
||||
for(int i = this.bArray.length-1; i > 1; i--){
|
||||
oldLineNumber = newLineNumber;
|
||||
if(this.recursionArray[i-1] == 0){
|
||||
newLineNumber = 5;
|
||||
}else{
|
||||
newLineNumber = 7;
|
||||
}
|
||||
if(oldLineNumber == 5){
|
||||
this.tb2.unhighlightCell(1, 0, this.unhighTime, this.unhighTime);
|
||||
}
|
||||
this.sc.unhighlight(oldLineNumber);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.sc.highlight(newLineNumber);
|
||||
if(newLineNumber == 5){
|
||||
this.tb2.highlightCell(1, 0, this.highTime, this.highTime);
|
||||
}
|
||||
//update tb2
|
||||
this.bArray[i-1] = this.bArray[i-1] + this.bArray[i];
|
||||
drawTb2(i);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
}
|
||||
this.sc.unhighlight(oldLineNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* logical method: calls the needed methods for generating the animation
|
||||
* @param a
|
||||
* @param b
|
||||
*/
|
||||
public void multiply(int a, int b){
|
||||
|
||||
//generate information text and the header
|
||||
generateInfoText();
|
||||
generateHeader();
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.info.hide();
|
||||
|
||||
//generate SourceCode
|
||||
generateSourceCode();
|
||||
|
||||
//calculate needed lines and generate table
|
||||
calculateLines(a, b);
|
||||
generateTableTb1(a, b, this.linesOfTb1);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
//higlight line 0
|
||||
this.sc.highlight(0);
|
||||
|
||||
russe(a, b, sc, tb1, 1, "");
|
||||
|
||||
//unhighlight last line of tb1
|
||||
this.tb1.unhighlightCellColumnRange(this.linesOfTb1-2, 2, 3, this.unhighTime, this.unhighTime);
|
||||
|
||||
//generate recursion animation
|
||||
generateRecursion();
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.tb1.hide();
|
||||
this.tb2.hide();
|
||||
this.sc.hide();
|
||||
|
||||
//generate statement
|
||||
generateStatement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* the algorithm which is used in the animation
|
||||
* @param a
|
||||
* @param b
|
||||
* @param code
|
||||
* @param tb1
|
||||
* @param line
|
||||
* @param sum
|
||||
* @return the product of a and b (a*b)
|
||||
*/
|
||||
public int russe(int a, int b, SourceCode code, StringMatrix tb1, int line, String sum){
|
||||
|
||||
int aTb = a;
|
||||
int bTb = b;
|
||||
|
||||
this.tb1.unhighlightCellColumnRange(line-1, 2, 3, this.unhighTime, this.unhighTime);
|
||||
this.tb1.highlightCellColumnRange(line, 0, 1, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 0, a+"", null, null); //update column 0 (a)
|
||||
this.tb1.put(line, 1, b+"", null, null); //update column 1 (b)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.tb1.unhighlightCellColumnRange(line, 0, 1, this.unhighTime, this.unhighTime);
|
||||
code.unhighlight(0);
|
||||
code.highlight(1);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
if(a == 1){
|
||||
code.toggleHighlight(1, 2);
|
||||
|
||||
//write last line
|
||||
sum = sum+"+"+b;
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Ja", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
this.bArray[line] = b;
|
||||
return b;
|
||||
}
|
||||
if(line != 1){ // first line
|
||||
aTb = aTb/2;
|
||||
bTb = bTb*2;
|
||||
}
|
||||
code.toggleHighlight(1, 4);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.unhighlight(1);
|
||||
|
||||
if(a % 2 == 1){
|
||||
code.toggleHighlight(4, 5);
|
||||
|
||||
if(line == 1){
|
||||
sum = b+"";
|
||||
}else{
|
||||
if(sum.equals("")){
|
||||
sum = b+"";}
|
||||
else{
|
||||
sum = sum+"+"+b;
|
||||
}
|
||||
}
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Ja", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.unhighlight(5);
|
||||
code.highlight(0);
|
||||
//safe actual value of b in bArray
|
||||
this.bArray[line] = b;
|
||||
this.recursionArray[line] = 0;
|
||||
return b + russe(a/2, b*2, code, tb1, line+1, sum);
|
||||
}
|
||||
else{
|
||||
code.toggleHighlight(4, 7);
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Nein", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.highlight(0);
|
||||
code.unhighlight(7);
|
||||
//safe 0 in bArray
|
||||
this.bArray[line] = 0;
|
||||
this.recursionArray[line] = 1;
|
||||
return russe(a/2, b*2, code, tb1, line+1, sum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected String getAlgorithmDescription() {
|
||||
return DESCRIPTION;
|
||||
}
|
||||
|
||||
protected String getAlgorithmCode() {
|
||||
return SOURCE_CODE;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Russische Bauernmultiplikation";
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return DESCRIPTION;
|
||||
}
|
||||
|
||||
public String getCodeExample() {
|
||||
return SOURCE_CODE;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Language l = new AnimalScript("Russische Bauenmultiplikation", "Michael Scholz, Ulf Gebhardt", 640, 480);
|
||||
RussischeBauernmultiplikation s = new RussischeBauernmultiplikation(l);
|
||||
s.multiply(A, B);
|
||||
|
||||
//konsolenausgabe direkt als asu-datei schreiben, vor Abgabe bitte wieder entfernen!!!
|
||||
boolean writeFile = false;
|
||||
writeFile = true;
|
||||
|
||||
if(writeFile){
|
||||
try {
|
||||
System.setOut(new PrintStream(
|
||||
new FileOutputStream("uebung3_2.asu")));
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
System.out.println(l);
|
||||
}
|
||||
|
||||
}
|
||||
263
ss2012/AlgoAnim/Teil 3/uebung3_2.asu
Normal file
263
ss2012/AlgoAnim/Teil 3/uebung3_2.asu
Normal file
@ -0,0 +1,263 @@
|
||||
%Animal 2 640*480
|
||||
title "Russische Bauenmultiplikation"
|
||||
author "Michael Scholz, Ulf Gebhardt"
|
||||
{
|
||||
codegroup "info" at (10, 75) color (0, 0, 0) highlightColor (0, 0, 0) contextColor (0, 0, 0) font SansSerif size 16 italic depth 1
|
||||
addCodeLine "Das hier vorgestellte Verfahren eignet sich fuer die Multiplikation zweier ganzer Zahlen." to "info"
|
||||
addCodeLine "Die Funktionsweise laesst sich in die folgenden fuenf Schritte gliedern:" to "info"
|
||||
addCodeLine "1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander." to "info" indentation 1
|
||||
addCodeLine "2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt." to "info" indentation 1
|
||||
addCodeLine " Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben." to "info" indentation 2
|
||||
addCodeLine "3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht." to "info" indentation 1
|
||||
addCodeLine "4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist." to "info" indentation 1
|
||||
addCodeLine "5. Schlussendlich werden alle uebrigen Zahlen der rechten Spalte addiert." to "info" indentation 1
|
||||
text "header" "Russische Bauernmultiplikation" (11, 15) color (0, 0, 0) depth 1 font Serif size 24 italic
|
||||
rectangle "headerBackground" offset (-5, -5) from "header" NW offset (5, 5) from "header" SE color (0, 0, 0) depth 2 filled fillColor (128, 128, 128)
|
||||
}
|
||||
{
|
||||
codegroup "sourceCode" at (10, 147) color (0, 0, 0) highlightColor (255, 0, 0) contextColor (0, 0, 0) font SansSerif size 12 depth 1
|
||||
addCodeLine "public int russe(int a, int b){" to "sourceCode"
|
||||
addCodeLine "if(a == 1){" to "sourceCode" indentation 1
|
||||
addCodeLine "return b;" to "sourceCode" indentation 2
|
||||
addCodeLine "}" to "sourceCode" indentation 1
|
||||
addCodeLine "if(a % 2 == 1){" to "sourceCode" indentation 1
|
||||
addCodeLine "return b + russe(a/2, b*2);" to "sourceCode" indentation 2
|
||||
addCodeLine "}else{" to "sourceCode" indentation 1
|
||||
addCodeLine "return russe(a/2, b*2);" to "sourceCode" indentation 2
|
||||
addCodeLine "}" to "sourceCode" indentation 1
|
||||
addCodeLine "}" to "sourceCode"
|
||||
grid "tb1" (270, 100) lines 7 columns 4 color (0, 0, 0) elementColor (0, 0, 0) fillColor (0, 0, 0) highlightTextColor (0, 0, 0) highlightBackColor (0, 0, 0) depth 1
|
||||
setGridValue "tb1[0][0]" "A-Seite"
|
||||
setGridValue "tb1[0][1]" "B-Seite"
|
||||
setGridValue "tb1[0][2]" "addieren"
|
||||
setGridValue "tb1[0][3]" "Summe"
|
||||
setGridValue "tb1[1][0]" "27"
|
||||
setGridValue "tb1[1][1]" "82"
|
||||
setGridValue "tb1[1][2]" ""
|
||||
setGridValue "tb1[1][3]" ""
|
||||
setGridValue "tb1[2][0]" ""
|
||||
setGridValue "tb1[2][1]" ""
|
||||
setGridValue "tb1[2][2]" ""
|
||||
setGridValue "tb1[2][3]" ""
|
||||
setGridValue "tb1[3][0]" ""
|
||||
setGridValue "tb1[3][1]" ""
|
||||
setGridValue "tb1[3][2]" ""
|
||||
setGridValue "tb1[3][3]" ""
|
||||
setGridValue "tb1[4][0]" ""
|
||||
setGridValue "tb1[4][1]" ""
|
||||
setGridValue "tb1[4][2]" ""
|
||||
setGridValue "tb1[4][3]" ""
|
||||
setGridValue "tb1[5][0]" ""
|
||||
setGridValue "tb1[5][1]" ""
|
||||
setGridValue "tb1[5][2]" ""
|
||||
setGridValue "tb1[5][3]" ""
|
||||
setGridValue "tb1[6][0]" ""
|
||||
setGridValue "tb1[6][1]" ""
|
||||
setGridValue "tb1[6][2]" ""
|
||||
setGridValue "tb1[6][3]" "" refresh
|
||||
color "tb1" type "fillColor" (255, 255, 255)
|
||||
hide "info"
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 0 row 0
|
||||
unhighlightGridCell "tb1[0][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[0][3]" after 0 ticks within 0 ticks
|
||||
highlightGridCell "tb1[1][0]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[1][1]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[1][0]" "27" refresh
|
||||
setGridValue "tb1[1][1]" "82" refresh
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb1[1][0]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[1][1]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
highlightCode on "sourceCode" line 1 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
highlightCode on "sourceCode" line 4 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
unhighlightCode on "sourceCode" line 4 row 0
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb1[1][2]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[1][3]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[1][2]" "Ja" refresh
|
||||
setGridValue "tb1[1][3]" "82" refresh
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
highlightCode on "sourceCode" line 0 row 0
|
||||
unhighlightGridCell "tb1[1][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[1][3]" after 0 ticks within 0 ticks
|
||||
highlightGridCell "tb1[2][0]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[2][1]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[2][0]" "13" refresh
|
||||
setGridValue "tb1[2][1]" "164" refresh
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb1[2][0]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[2][1]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
highlightCode on "sourceCode" line 1 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
highlightCode on "sourceCode" line 4 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
unhighlightCode on "sourceCode" line 4 row 0
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb1[2][2]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[2][3]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[2][2]" "Ja" refresh
|
||||
setGridValue "tb1[2][3]" "82+164" refresh
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
highlightCode on "sourceCode" line 0 row 0
|
||||
unhighlightGridCell "tb1[2][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[2][3]" after 0 ticks within 0 ticks
|
||||
highlightGridCell "tb1[3][0]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[3][1]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[3][0]" "6" refresh
|
||||
setGridValue "tb1[3][1]" "328" refresh
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb1[3][0]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[3][1]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
highlightCode on "sourceCode" line 1 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
highlightCode on "sourceCode" line 4 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
unhighlightCode on "sourceCode" line 4 row 0
|
||||
highlightCode on "sourceCode" line 7 row 0
|
||||
highlightGridCell "tb1[3][2]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[3][3]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[3][2]" "Nein" refresh
|
||||
setGridValue "tb1[3][3]" "82+164" refresh
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 0 row 0
|
||||
unhighlightCode on "sourceCode" line 7 row 0
|
||||
unhighlightGridCell "tb1[3][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[3][3]" after 0 ticks within 0 ticks
|
||||
highlightGridCell "tb1[4][0]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[4][1]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[4][0]" "3" refresh
|
||||
setGridValue "tb1[4][1]" "656" refresh
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb1[4][0]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[4][1]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
highlightCode on "sourceCode" line 1 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
highlightCode on "sourceCode" line 4 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
unhighlightCode on "sourceCode" line 4 row 0
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb1[4][2]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[4][3]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[4][2]" "Ja" refresh
|
||||
setGridValue "tb1[4][3]" "82+164+656" refresh
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
highlightCode on "sourceCode" line 0 row 0
|
||||
unhighlightGridCell "tb1[4][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[4][3]" after 0 ticks within 0 ticks
|
||||
highlightGridCell "tb1[5][0]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[5][1]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[5][0]" "1" refresh
|
||||
setGridValue "tb1[5][1]" "1312" refresh
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb1[5][0]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[5][1]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
highlightCode on "sourceCode" line 1 row 0
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 1 row 0
|
||||
highlightCode on "sourceCode" line 2 row 0
|
||||
highlightGridCell "tb1[5][2]" after 100 ticks within 100 ticks
|
||||
highlightGridCell "tb1[5][3]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb1[5][2]" "Ja" refresh
|
||||
setGridValue "tb1[5][3]" "82+164+656+1312" refresh
|
||||
unhighlightGridCell "tb1[5][2]" after 0 ticks within 0 ticks
|
||||
unhighlightGridCell "tb1[5][3]" after 0 ticks within 0 ticks
|
||||
grid "tb2" offset (0, 10) from "tb1" SW lines 2 columns 1 color (0, 0, 0) elementColor (0, 0, 0) fillColor (0, 0, 0) highlightTextColor (0, 0, 0) highlightBackColor (0, 0, 0) depth 1
|
||||
setGridValue "tb2[0][0]" "Rekursion aufloesen:"
|
||||
setGridValue "tb2[1][0]" "82+164+656+1312" refresh
|
||||
color "tb2" type "fillColor" (255, 255, 255)
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 2 row 0
|
||||
unhighlightCode on "sourceCode" line 0 row 0
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb2[1][0]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb2[1][0]" "82+164+1968" refresh after 100 ticks within 100 ticks
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb2[1][0]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 7 row 0
|
||||
setGridValue "tb2[1][0]" "82+164+1968" refresh after 100 ticks within 100 ticks
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 7 row 0
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb2[1][0]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb2[1][0]" "82+2132" refresh after 100 ticks within 100 ticks
|
||||
}
|
||||
{
|
||||
unhighlightGridCell "tb2[1][0]" after 0 ticks within 0 ticks
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
}
|
||||
{
|
||||
highlightCode on "sourceCode" line 5 row 0
|
||||
highlightGridCell "tb2[1][0]" after 100 ticks within 100 ticks
|
||||
setGridValue "tb2[1][0]" "2214" refresh after 100 ticks within 100 ticks
|
||||
}
|
||||
{
|
||||
unhighlightCode on "sourceCode" line 5 row 0
|
||||
}
|
||||
{
|
||||
codegroup "statement" at (10, 75) color (0, 0, 0) highlightColor (0, 0, 0) contextColor (0, 0, 0) font SansSerif size 16 italic depth 1
|
||||
addCodeLine "Erklaerung:" to "statement"
|
||||
addCodeLine "Die Idee des Verfahrens kann man mit Hilfe des Dualsystems verdeutlichen." to "statement"
|
||||
addCodeLine "Hierbei wird eine Zahl in ihre Zweierpotenzen zerlegt." to "statement"
|
||||
addCodeLine "" to "statement"
|
||||
hide "tb1" "tb2" "sourceCode"
|
||||
}
|
||||
{
|
||||
addCodeLine "82 * 27 = 82 * (2^0 + 2^1 + 0 * 2^2 + 2^3 + 2^4 )" to "statement"
|
||||
}
|
||||
{
|
||||
addCodeLine "= 82 * 2^0 + 82 * 2^1 + 82 * 0 + 82 * 2^3 + 82 * 2^4" to "statement" indentation 4
|
||||
}
|
||||
{
|
||||
addCodeLine "= 82 + 164 + 0 + 656 + 1312" to "statement" indentation 4
|
||||
}
|
||||
{
|
||||
addCodeLine "= 2214" to "statement" indentation 4
|
||||
}
|
||||
|
||||
577
ss2012/AlgoAnim/Teil 4/MultiGenerator.java
Normal file
577
ss2012/AlgoAnim/Teil 4/MultiGenerator.java
Normal file
@ -0,0 +1,577 @@
|
||||
package generators.maths;
|
||||
|
||||
import generators.framework.Generator;
|
||||
import generators.framework.GeneratorType;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.Locale;
|
||||
|
||||
import algoanim.primitives.SourceCode;
|
||||
import algoanim.primitives.StringMatrix;
|
||||
import algoanim.primitives.generators.Language;
|
||||
import algoanim.properties.AnimationPropertiesKeys;
|
||||
import algoanim.properties.RectProperties;
|
||||
import algoanim.properties.SourceCodeProperties;
|
||||
import algoanim.properties.TextProperties;
|
||||
import algoanim.util.Coordinates;
|
||||
import algoanim.util.Offset;
|
||||
import algoanim.util.Timing;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
import de.ahrgr.animal.kohnert.asugen.Font;
|
||||
import generators.framework.properties.AnimationPropertiesContainer;
|
||||
import algoanim.animalscript.AnimalScript;
|
||||
|
||||
public class MultiGenerator implements Generator {
|
||||
|
||||
/**
|
||||
* static variables -> simple testing
|
||||
*/
|
||||
static int A = 27;
|
||||
static int B = 82;
|
||||
static int HIGHLIGHTING_TIME = 100; //in ticks
|
||||
static int UNHIGHLIGHTING_TIME = 0; //in ticks
|
||||
|
||||
//=========================================================================================================
|
||||
|
||||
/**
|
||||
* The concrete language object used for creating output
|
||||
*/
|
||||
private Language lang;
|
||||
|
||||
|
||||
/**
|
||||
* The info text as a SourceCode object (first slide)
|
||||
*/
|
||||
private SourceCode info = null;
|
||||
|
||||
/**
|
||||
* The statement text as a SourceCode object (last several slides)
|
||||
*/
|
||||
private SourceCode statement = null;
|
||||
|
||||
|
||||
/**
|
||||
* The sourceCode
|
||||
*/
|
||||
private SourceCode sc = null;
|
||||
|
||||
|
||||
/**
|
||||
* The tables
|
||||
*/
|
||||
private StringMatrix tb1 = null;
|
||||
private StringMatrix tb2 = null;
|
||||
|
||||
|
||||
/**
|
||||
* int-array with the values of b (only for animation)
|
||||
*/
|
||||
private int[] bArray = null;
|
||||
|
||||
|
||||
/**
|
||||
* recursionArray
|
||||
*/
|
||||
private int[] recursionArray = null;
|
||||
|
||||
|
||||
/**
|
||||
* unhighlightingTime
|
||||
*/
|
||||
private Timing unhighTime = new Timing(UNHIGHLIGHTING_TIME) {
|
||||
|
||||
@Override
|
||||
public String getUnit() {
|
||||
// TODO Auto-generated method stub
|
||||
return "ticks";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* highlightTime
|
||||
*/
|
||||
private Timing highTime = new Timing(HIGHLIGHTING_TIME) {
|
||||
|
||||
@Override
|
||||
public String getUnit() {
|
||||
// TODO Auto-generated method stub
|
||||
return "ticks";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* number of lines for tb1
|
||||
*/
|
||||
private int linesOfTb1 = 0;
|
||||
|
||||
|
||||
//=========================================================================================================
|
||||
|
||||
|
||||
/**
|
||||
* Builds the information text for the first page in the animation
|
||||
*/
|
||||
public void generateInfoText(){
|
||||
|
||||
//create first page of animation (info text) as a code group
|
||||
SourceCodeProperties infoProps = new SourceCodeProperties();
|
||||
infoProps.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("SansSerif", Font.SANSSERIF, 16));
|
||||
|
||||
this.info = lang.newSourceCode(new Coordinates(10, 75), "info", null, infoProps);
|
||||
this.info.addCodeLine("Das hier vorgestellte Verfahren eignet sich fuer die Multiplikation zweier ganzer Zahlen.", null, 0, null);
|
||||
this.info.addCodeLine("Die Funktionsweise laesst sich in die folgenden fuenf Schritte gliedern:", null, 0, null);
|
||||
this.info.addCodeLine("1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander.", null, 1, null);
|
||||
this.info.addCodeLine("2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt.", null, 1, null);
|
||||
this.info.addCodeLine(" Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben.", null, 2, null);
|
||||
this.info.addCodeLine("3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht.", null, 1, null);
|
||||
this.info.addCodeLine("4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist.", null, 1, null);
|
||||
this.info.addCodeLine("5. Schlussendlich werden alle uebrigen Zahlen der rechten Spalte addiert.", null, 1, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the header which is shown during the whole animation
|
||||
*/
|
||||
public void generateHeader(){
|
||||
|
||||
//head
|
||||
TextProperties textProperties = new TextProperties();
|
||||
textProperties.set(AnimationPropertiesKeys.COLOR_PROPERTY, Color.BLACK);
|
||||
textProperties.set(AnimationPropertiesKeys.DEPTH_PROPERTY, 1);
|
||||
textProperties.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("Serif", Font.SANSSERIF, 24));
|
||||
lang.newText(new Coordinates(11, 15), "Russische Bauernmultiplikation", "header", null, textProperties);
|
||||
|
||||
//header background
|
||||
RectProperties rectProperties = new RectProperties();
|
||||
rectProperties.set(AnimationPropertiesKeys.FILL_PROPERTY, Color.GRAY);
|
||||
rectProperties.set(AnimationPropertiesKeys.FILLED_PROPERTY, true);
|
||||
rectProperties.set(AnimationPropertiesKeys.DEPTH_PROPERTY, 2);
|
||||
lang.newRect(new Offset(-5, -5, "header",
|
||||
AnimalScript.DIRECTION_NW), new Offset(5, 5, "header",
|
||||
AnimalScript.DIRECTION_SE), "headerBackground", null,
|
||||
rectProperties);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the SourceCode
|
||||
*/
|
||||
public void generateSourceCode(){
|
||||
|
||||
//set the visual properties for the source code
|
||||
SourceCodeProperties scProps = new SourceCodeProperties();
|
||||
scProps.set(AnimationPropertiesKeys.HIGHLIGHTCOLOR_PROPERTY, Color.RED);
|
||||
|
||||
//initialize source code object and add code lines
|
||||
this.sc = lang.newSourceCode(new Coordinates(10, 147), "sourceCode", null, scProps);
|
||||
this.sc.addCodeLine("public int russe(int a, int b){", null, 0, null); // 0
|
||||
this.sc.addCodeLine("if(a == 1){", null, 1, null); // 1
|
||||
this.sc.addCodeLine("return b;", null, 2, null); // 2
|
||||
this.sc.addCodeLine("}", null, 1, null); // 3
|
||||
this.sc.addCodeLine("if(a % 2 == 1){", null, 1, null); // 4
|
||||
this.sc.addCodeLine("return b + russe(a/2, b*2);", null, 2, null); // 5
|
||||
this.sc.addCodeLine("}else{", null, 1, null); // 6
|
||||
this.sc.addCodeLine("return russe(a/2, b*2);", null, 2, null); // 7
|
||||
this.sc.addCodeLine("}", null, 1, null); // 8
|
||||
this.sc.addCodeLine("}", null, 0, null); // 9
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* calculate needed lines -> animation is more dynamic
|
||||
* @param a
|
||||
* @param b
|
||||
* @return int number of needed lines
|
||||
*/
|
||||
public void calculateLines(int a, int b){
|
||||
|
||||
//calculate needed lines -> animation is more dynamic
|
||||
int aTemp = a;
|
||||
int lines = 3;
|
||||
while(aTemp != 1){
|
||||
aTemp = aTemp / 2;
|
||||
lines++;
|
||||
}
|
||||
//initialize the bArray und the recursionArray
|
||||
this.bArray = new int[lines-1];
|
||||
this.recursionArray = new int[lines-1];
|
||||
this.linesOfTb1 = lines;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Builds the table
|
||||
* @param a
|
||||
* @param b
|
||||
* @param lines
|
||||
*/
|
||||
public void generateTableTb1(int a, int b, int lines){
|
||||
|
||||
//create String[][] data array for tb1
|
||||
String[][] tb1Data = new String[lines][4];
|
||||
|
||||
//fill all fields with ""
|
||||
for(int i = 0; i < tb1Data.length; i++){
|
||||
for(int j = 0; j < tb1Data[i].length; j++){
|
||||
tb1Data[i][j] = "";
|
||||
}
|
||||
}
|
||||
|
||||
//fill the known fields
|
||||
tb1Data[0][0] = "A-Seite";
|
||||
tb1Data[0][1] = "B-Seite";
|
||||
tb1Data[0][2] = "addieren";
|
||||
tb1Data[0][3] = "Summe";
|
||||
tb1Data[1][0] = a+"";
|
||||
tb1Data[1][1] = b+"";
|
||||
|
||||
//create table tb1
|
||||
this.tb1 = lang.newStringMatrix(new Coordinates(270, 100), tb1Data, "tb1", null);
|
||||
this.tb1.changeColor(AnimationPropertiesKeys.FILL_PROPERTY, Color.WHITE, null, null);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the statement for the last several slides
|
||||
*/
|
||||
public void generateStatement(){
|
||||
//final statement
|
||||
SourceCodeProperties statementProps = new SourceCodeProperties();
|
||||
statementProps.set(AnimationPropertiesKeys.FONT_PROPERTY, new java.awt.Font("SansSerif", Font.SANSSERIF, 16));
|
||||
|
||||
this.statement = lang.newSourceCode(new Coordinates(10, 75), "statement", null, statementProps);
|
||||
this.statement.addCodeLine("Erklaerung:", null, 0, null);
|
||||
this.statement.addCodeLine("Die Idee des Verfahrens kann man mit Hilfe des Dualsystems verdeutlichen.", null, 0, null);
|
||||
this.statement.addCodeLine("Hierbei wird eine Zahl in ihre Zweierpotenzen zerlegt.", null, 0, null);
|
||||
this.statement.addCodeLine("", null, 0, null); //empty line for vertical space
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("82 * 27 = 82 * (2^0 + 2^1 + 0 * 2^2 + 2^3 + 2^4 )", null, 0, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 82 * 2^0 + 82 * 2^1 + 82 * 0 + 82 * 2^3 + 82 * 2^4", null, 4, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 82 + 164 + 0 + 656 + 1312", null, 4, null);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.statement.addCodeLine("= 2214", null, 4, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw the table tb2
|
||||
* @param bArrayLength
|
||||
*/
|
||||
public void drawTb2(int bArrayLength){
|
||||
|
||||
//create String[][] data array for tb2
|
||||
String[][] tb2Data = new String[2][1];
|
||||
tb2Data[0][0] = "Rekursion aufloesen:";
|
||||
|
||||
String tmp = "";
|
||||
for(int i = 1; i < bArrayLength; i++){
|
||||
if(this.bArray[i] != 0){
|
||||
tmp = tmp+this.bArray[i];
|
||||
if(i+1 != bArrayLength){
|
||||
tmp = tmp+"+";
|
||||
}
|
||||
}
|
||||
}
|
||||
tb2Data[1][0] = tmp;
|
||||
|
||||
|
||||
//create table tb2
|
||||
if(this.tb2 != null){
|
||||
this.tb2.put(1, 0, tmp, this.highTime, this.highTime);
|
||||
}else{
|
||||
this.tb2 = lang.newStringMatrix(new Offset(0, 10, this.tb1, AnimalScript.DIRECTION_SW), tb2Data, "tb2", null);
|
||||
this.tb2.changeColor(AnimationPropertiesKeys.FILL_PROPERTY, Color.WHITE, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates the animation of the recursion flow
|
||||
*/
|
||||
public void generateRecursion(){
|
||||
|
||||
//draw tb2
|
||||
drawTb2(this.bArray.length);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
int newLineNumber = 0;
|
||||
int oldLineNumber = 0;
|
||||
this.sc.unhighlight(2); //"return b"
|
||||
for(int i = this.bArray.length-1; i > 1; i--){
|
||||
oldLineNumber = newLineNumber;
|
||||
if(this.recursionArray[i-1] == 0){
|
||||
newLineNumber = 5;
|
||||
}else{
|
||||
newLineNumber = 7;
|
||||
}
|
||||
if(oldLineNumber == 5){
|
||||
this.tb2.unhighlightCell(1, 0, this.unhighTime, this.unhighTime);
|
||||
}
|
||||
this.sc.unhighlight(oldLineNumber);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.sc.highlight(newLineNumber);
|
||||
if(newLineNumber == 5){
|
||||
this.tb2.highlightCell(1, 0, this.highTime, this.highTime);
|
||||
}
|
||||
//update tb2
|
||||
this.bArray[i-1] = this.bArray[i-1] + this.bArray[i];
|
||||
drawTb2(i);
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
}
|
||||
this.sc.unhighlight(oldLineNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* logical method: calls the needed methods for generating the animation
|
||||
* @param a
|
||||
* @param b
|
||||
*/
|
||||
public void multiply(int a, int b){
|
||||
|
||||
//generate information text and the header
|
||||
generateInfoText();
|
||||
generateHeader();
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.info.hide();
|
||||
|
||||
//generate SourceCode
|
||||
generateSourceCode();
|
||||
|
||||
//calculate needed lines and generate table
|
||||
calculateLines(a, b);
|
||||
generateTableTb1(a, b, this.linesOfTb1);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
//higlight line 0
|
||||
this.sc.highlight(0);
|
||||
|
||||
russe(a, b, sc, tb1, 1, "");
|
||||
|
||||
//unhighlight last line of tb1
|
||||
this.tb1.unhighlightCellColumnRange(this.linesOfTb1-2, 2, 3, this.unhighTime, this.unhighTime);
|
||||
|
||||
//generate recursion animation
|
||||
generateRecursion();
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.tb1.hide();
|
||||
this.tb2.hide();
|
||||
this.sc.hide();
|
||||
|
||||
//generate statement
|
||||
generateStatement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* the algorithm which is used in the animation
|
||||
* @param a
|
||||
* @param b
|
||||
* @param code
|
||||
* @param tb1
|
||||
* @param line
|
||||
* @param sum
|
||||
* @return the product of a and b (a*b)
|
||||
*/
|
||||
public int russe(int a, int b, SourceCode code, StringMatrix tb1, int line, String sum){
|
||||
|
||||
int aTb = a;
|
||||
int bTb = b;
|
||||
|
||||
this.tb1.unhighlightCellColumnRange(line-1, 2, 3, this.unhighTime, this.unhighTime);
|
||||
this.tb1.highlightCellColumnRange(line, 0, 1, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 0, a+"", null, null); //update column 0 (a)
|
||||
this.tb1.put(line, 1, b+"", null, null); //update column 1 (b)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
this.tb1.unhighlightCellColumnRange(line, 0, 1, this.unhighTime, this.unhighTime);
|
||||
code.unhighlight(0);
|
||||
code.highlight(1);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
|
||||
if(a == 1){
|
||||
code.toggleHighlight(1, 2);
|
||||
|
||||
//write last line
|
||||
sum = sum+"+"+b;
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Ja", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
this.bArray[line] = b;
|
||||
return b;
|
||||
}
|
||||
if(line != 1){ // first line
|
||||
aTb = aTb/2;
|
||||
bTb = bTb*2;
|
||||
}
|
||||
code.toggleHighlight(1, 4);
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.unhighlight(1);
|
||||
|
||||
if(a % 2 == 1){
|
||||
code.toggleHighlight(4, 5);
|
||||
|
||||
if(line == 1){
|
||||
sum = b+"";
|
||||
}else{
|
||||
if(sum.equals("")){
|
||||
sum = b+"";}
|
||||
else{
|
||||
sum = sum+"+"+b;
|
||||
}
|
||||
}
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Ja", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.unhighlight(5);
|
||||
code.highlight(0);
|
||||
//safe actual value of b in bArray
|
||||
this.bArray[line] = b;
|
||||
this.recursionArray[line] = 0;
|
||||
return b + russe(a/2, b*2, code, tb1, line+1, sum);
|
||||
}
|
||||
else{
|
||||
code.toggleHighlight(4, 7);
|
||||
//update table
|
||||
this.tb1.highlightCellColumnRange(line, 2, 3, this.highTime, this.highTime);
|
||||
this.tb1.put(line, 2, "Nein", null, null); //update column 2 (addieren)
|
||||
this.tb1.put(line, 3, sum, null, null); //update column 3 (Summe)
|
||||
|
||||
//STEP
|
||||
lang.nextStep();
|
||||
code.highlight(0);
|
||||
code.unhighlight(7);
|
||||
//safe 0 in bArray
|
||||
this.bArray[line] = 0;
|
||||
this.recursionArray[line] = 1;
|
||||
return russe(a/2, b*2, code, tb1, line+1, sum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void init(){
|
||||
lang = new AnimalScript("Russische Bauenmultiplikation [DE]", "Ulf Gebhardt, Michael Scholz", 800, 600);
|
||||
}
|
||||
|
||||
public String generate(AnimationPropertiesContainer props,Hashtable<String, Object> primitives) {
|
||||
B = (Integer)primitives.get("b");
|
||||
A = (Integer)primitives.get("a");
|
||||
|
||||
init(); //initialize the language
|
||||
|
||||
lang.setStepMode(true);
|
||||
this.multiply(A, B);
|
||||
|
||||
return lang.toString();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Russische Bauenmultiplikation [DE]";
|
||||
}
|
||||
|
||||
public String getAlgorithmName() {
|
||||
return "Russische Bauenmultiplikation";
|
||||
}
|
||||
|
||||
public String getAnimationAuthor() {
|
||||
return "Ulf Gebhardt, Michael Scholz";
|
||||
}
|
||||
|
||||
public String getDescription(){
|
||||
return "Das hier vorgestellte Verfahren eignete sich fŸr die Multiplikation zweier ganzer Zahlen. Es ist auch unter den"
|
||||
+"\n"
|
||||
+"Namen Ägyptischen Multiplizieren, Abessinische Bauernregel oder Verdopplungs-Halbierungs-Methode"
|
||||
+"\n"
|
||||
+"bekannt. Die Geschichte des vorgestellten Rechenverfahrens führt bis auf die Ägypter zurŸck. Sie"
|
||||
+"\n"
|
||||
+"nutzten diese Methode nachweislich zur Multiplikation zweier ganzer Zahlen. Das Verfahren baut auf dem Teile und Herrsche Prinzip"
|
||||
+"\n"
|
||||
+"(Divide et impera ) auf und lŠsst sich somit leicht mittels Rekursion implementieren.\n"
|
||||
+"\n"
|
||||
+"Die Funktionsweise lässt sich in die folgenden fünf Schritte gliedern:\n"
|
||||
+"\n"
|
||||
+"1. Schreibe die beiden zu multiplizierenden Zahlen nebeneinander.\n"
|
||||
+"\n"
|
||||
+"2. Die linke Zahl wird halbiert (Reste werden abgerundet), die rechte Zahl wird verdoppelt.\n"
|
||||
+"\n"
|
||||
+"\t Die beiden berechneten Zahlen werden in die darauffolgende Zeile geschrieben.\n"
|
||||
+"\n"
|
||||
+"3. Schritt 2 wird solange wiederholt, bis in der linken Spalte eine 1 steht.\n"
|
||||
+"\n"
|
||||
+"4. Nun streicht man alle Zeilen, in denen die linke Zahl gerade ist.\n"
|
||||
+"\n"
|
||||
+"5. Schlussendlich werden alle übrigen Zahlen der rechten Spalte addiert."
|
||||
+"\n"
|
||||
+" ";
|
||||
}
|
||||
|
||||
public String getCodeExample(){
|
||||
return "public int russe(int a, int b){"
|
||||
+"\n"
|
||||
+" if(a == 1){"
|
||||
+"\n"
|
||||
+" return b;"
|
||||
+"\n"
|
||||
+" }"
|
||||
+"\n"
|
||||
+" if(a % 2 == 1){"
|
||||
+"\n"
|
||||
+" return b + russe(a/2, b*2);"
|
||||
+"\n"
|
||||
+" }else{"
|
||||
+"\n"
|
||||
+" return russe(a/2, b*2);"
|
||||
+"\n"
|
||||
+" }"
|
||||
+"\n"
|
||||
+"}"
|
||||
+"\n";
|
||||
}
|
||||
|
||||
public String getFileExtension(){
|
||||
return "asu";
|
||||
}
|
||||
|
||||
public Locale getContentLocale() {
|
||||
return Locale.GERMAN;
|
||||
}
|
||||
|
||||
public GeneratorType getGeneratorType() {
|
||||
return new GeneratorType(GeneratorType.GENERATOR_TYPE_MORE);
|
||||
}
|
||||
|
||||
public String getOutputLanguage() {
|
||||
return Generator.JAVA_OUTPUT;
|
||||
}
|
||||
|
||||
}
|
||||
13
ss2012/AlgoAnim/Teil 4/MultiGenerator.xml
Normal file
13
ss2012/AlgoAnim/Teil 4/MultiGenerator.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<PropertiesTreeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PropertiesTreeModel.xsd">
|
||||
<Folder name="Root">
|
||||
<Primitive type="int">
|
||||
<name>a</name>
|
||||
<value><int>27</int></value>
|
||||
</Primitive>
|
||||
<Primitive type="int">
|
||||
<name>b</name>
|
||||
<value><int>82</int></value>
|
||||
</Primitive>
|
||||
</Folder>
|
||||
</PropertiesTreeModel>
|
||||
Binary file not shown.
Binary file not shown.
BIN
ss2012/IT Sicherheit/Folien/5-SecurityEngineering-01.pdf
Normal file
BIN
ss2012/IT Sicherheit/Folien/5-SecurityEngineering-01.pdf
Normal file
Binary file not shown.
BIN
ss2012/IT Sicherheit/Gastvorträge/Jan_Camensich.pdf
Normal file
BIN
ss2012/IT Sicherheit/Gastvorträge/Jan_Camensich.pdf
Normal file
Binary file not shown.
BIN
ss2012/IT Sicherheit/Uebungen/1/exercise1L.pdf
Normal file
BIN
ss2012/IT Sicherheit/Uebungen/1/exercise1L.pdf
Normal file
Binary file not shown.
BIN
ss2012/IT Sicherheit/Uebungen/2/exercise2.pdf
Normal file
BIN
ss2012/IT Sicherheit/Uebungen/2/exercise2.pdf
Normal file
Binary file not shown.
BIN
ss2012/IT Sicherheit/Uebungen/2/exercise2L.pdf
Normal file
BIN
ss2012/IT Sicherheit/Uebungen/2/exercise2L.pdf
Normal file
Binary file not shown.
BIN
ss2012/IT Sicherheit/Uebungen/2/hausuebung2.odt
Normal file
BIN
ss2012/IT Sicherheit/Uebungen/2/hausuebung2.odt
Normal file
Binary file not shown.
7
ss2012/Mathe III/Klausurinfo.rtf
Normal file
7
ss2012/Mathe III/Klausurinfo.rtf
Normal file
@ -0,0 +1,7 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf320
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\f0\fs24 \cf0 50 Prozent der Klausur wird aus Statistik und Stochastik bestehen (\'dcbungen 1-3)}
|
||||
BIN
ss2012/Mathe III/Uebungen/Uebung01_LSG.pdf
Normal file
BIN
ss2012/Mathe III/Uebungen/Uebung01_LSG.pdf
Normal file
Binary file not shown.
BIN
ss2012/Mathe III/Uebungen/Uebung02_LSG.pdf
Normal file
BIN
ss2012/Mathe III/Uebungen/Uebung02_LSG.pdf
Normal file
Binary file not shown.
BIN
ss2012/Mathe III/Uebungen/Uebung03.pdf
Normal file
BIN
ss2012/Mathe III/Uebungen/Uebung03.pdf
Normal file
Binary file not shown.
BIN
ss2012/Mathe III/Uebungen/Uebung04.pdf
Normal file
BIN
ss2012/Mathe III/Uebungen/Uebung04.pdf
Normal file
Binary file not shown.
BIN
ss2012/Mathe III/Uebungen/Uebung05.pdf
Normal file
BIN
ss2012/Mathe III/Uebungen/Uebung05.pdf
Normal file
Binary file not shown.
Binary file not shown.
BIN
ss2012/Mathe III/statistischeTabellen.pdf
Normal file
BIN
ss2012/Mathe III/statistischeTabellen.pdf
Normal file
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user