Merge branch 'master' of mojotrollz.eu:college

This commit is contained in:
lutz 2012-05-21 11:15:08 +02:00
commit cd31d44de5
30 changed files with 2585 additions and 26 deletions

View 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}}

File diff suppressed because it is too large Load Diff

View 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

Binary file not shown.

View 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}

View 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}

View File

@ -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
}

View 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);
}
}

View 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
}

View 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 &Aumlgyptischen Multiplizieren, Abessinische Bauernregel oder Verdopplungs-Halbierungs-Methode"
+"\n"
+"bekannt. Die Geschichte des vorgestellten Rechenverfahrens f&uumlhrt bis auf die &Aumlgypter 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&aumlsst sich in die folgenden f&uumlnf 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 &uumlbrigen 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;
}
}

View 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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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)}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.