Skript zum Thema Rechnen wie Adam Ries

Diese Seite als pdf-Datei und die kompletten Dateien.

Inhaltsverzeichnis

1.1 Motivation

Im Schuljahr 2009/2010 habe ich wieder eine fünfte Klasse in Mathematik bekommen. Bisher hatte ich immer bei den Grundrechenarten selbst eine Tabelle in LATEXgesetzt. Aber das musste doch auch automatisch gehen. Wie kann man dies in ein kleines Skript setzen, dass mir alles selbstständig ausgibt? Hierzu habe ich mich mit der Theorie auseinander gesetzt, die ja nun nicht so schwer ist. Schließlich handelt es sich um die Grundrechenarten... Herausgekommen ist mal wieder ein kleines Perl-Skript, mitdem ich LATEX-Code erzeuge für meine gegebene Rechnung.

1.2 Die Theorie

1.2.1 Die schriftliche Addition

Die zu addierenden Zahlen werden so untereinander geschrieben, dass entsprechende Stellen untereinander stehen. Man ordnet die Zahlen rechtsbündig. Nun addiert man nur die letzten Ziffern der Summanden und notiert sich als Zwischenergebnis die letzte Ziffer des Endergebnisses. Ist das Zwischenergebnis mehrstellig, so notiert man sich als Übertrag die weiteren Stellen. Weiter geht es mit zweiten Stelle. Ist ein Übertrag vorhanden, so wird dieser zu den Ziffern der zweiten Stelle hinzuaddiert. Das Zwischenergebnis ist die erste Stelle des Endergebnisses und die zweite Stelle wird erneut als Übertrag notiert. Man fährt so lange bis links fort, bis die Summanden keine weiteren Stellen besitzen.

Beispiel für die schriftliche Addition

Eine Beispielrechnung ist die folgende:

 190
543
987
121 
1720

Die Rechnungen sind der Reihe nach:

I)Ergebnis 0Übertrag 1
II)Ergebnis 2Übertrag 2
III)Ergebnis 7Übertrag 1
IV)Ergebnis 1

1.2.2 Die schriftliche Subtraktion

Die zu subtrahierenden Zahlen werden so unter den Minuenden geschrieben, dass entsprechende Stellen untereinander stehen. Man ordnet die Zahlen rechtsbündig. Nun addiert man nur die letzten Ziffern der Subtrahenden und merkt sich das Zwischenergebnis die letzte Ziffer des Endergebnisses. Ist das Zwischenergebnis mehrstellig, so notiert man sich als Übertrag die weiteren Stellen. Die Differenz von dem Zwischenergebnis zur ersten Ziffer des Minuenden ist das Endergebnis. Analog verfährt man mit den weiteren Stellen, bis es keine stellen mehr gibt.

Beispiel für die schriftliche Subtraktion

Eine Beispielrechnung ist die folgende:

 4309
2956
 473
 22  
  880

Die Rechnungen sind der Reihe nach:

I)Ergänze 0
II)Ergänze 8Übertrag 2
III)Ergänze 8Übertrag 2
IV)Ergänze 0 

1.2.3 Die schriftliche Multiplikation

Die zu multiplizierenden Zahlen werden nebeneinander geschrieben. Der zweite Faktor wird in seine einzelnen Ziffern zerlegt. Man multipliziert den ersten Faktor mit der ersten Ziffer und schreibt dieses Ergebnis unter die erste Ziffer des zweiten Faktors rechtsbündig. Analog verfährt man, bis man alle Ziffern des zweiten Faktors abgearbeitet hat. Zu guter letzt werden alle Ergebnisse miteinander addiert.

Beispiel für die schriftliche Multiplikation

Eine Beispielrechnung ist die folgende:

123193
  123  Multiplikation mit 1
  1107 Multiplikation mit 9
    369Multiplikation mit 3
    1  
  23739Addition

1.2.4 Die schriftliche Division

Im Folgenden wird nur die Division mit Rest behandelt. Ich führe hier einmal ein Beispiel für den Algorithmus an:

8293276R1
6          8 geteilt durch 3 ist 6 Rest 2
22         
21         22 geteilt durch 3 ist 21 Rest 1
 19        
 18        19 geteilt durch 3 ist 18 Rest 1
  1        

1.3 Der Programmcode

Hier führe ich einmal nur die einzelnen Algorithmen auf für die Grundrechenarten. Das komplette Programm kann auf meiner Homepage http://www.rendtel.de runtergeladen werden.

1.3.1 Die Addition

 addition-pm.pm 
1 my $summe; 2 3 sub setsumme { 4 my ($ergebnis) = @_; 5 $summe = $ergebnis; 6 } 7 8 sub setaddition { 9 my ($summand) = @_; 10 $summe = $summe + $summand; 11 } 12 13 sub getsumme { return $summe; } 14 15 ## Die Summanden werden eingelesen 16 sub addiereneinlesen { 17 my ( $nummer, $summand, $summandexp ) = @_; 18 19 my $stellensummand; 20 21 if ( $summandexp >= 0 ) { 22 $stellensummand = vorkommastellen( $summand * 10**$summandexp ); 23 } 24 else { 25 $stellensummand = vorkommastellen($summand); 26 if ( $stellensummand <= abs($summandexp) ) { 27 $stellensummand = abs($summandexp) + 1; 28 } 29 } 30 setspaltenanzahl( $stellensummand + 1 ); 31 schreibezahlintabelle( $summand, $summandexp, $nummer, $stellensummand ); 32 setaddition( $summand * 10**$summandexp ); 33 setspaltenanzahl( vorkommastellen( getsumme() ) ); 34 } 35 36 ## Die Rechnungen fuer die Addtiom finden statt 37 38 sub addierenauslesen { 39 my ($anzahlzeilen) = @_; 40 my ( $j, $i, $speicherzahl ); 41 42 for ( $i = 1 ; $i <= $anzahlzeilen ; $i++ ) { 43 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 44 $speicherzahl = zusammensetzen( $i, 1, $j ); 45 } 46 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 47 schreibezelle( "", $i, $j ); 48 } 49 schreibezahlintabelle( $speicherzahl, 0, $i, getspaltenanzahl() ); 50 51 if ( $i > 1 ) { schreibezelle( "\$+\$", $i, 1 ); } 52 } 53 my $uebertrag = 0; 54 my $teilsumme = 0; 55 for ( $i = getspaltenanzahl() ; $i > 0 ; $i-- ) { 56 for ( $j = 1 ; $j <= $anzahlzeilen ; $j++ ) { 57 if ( ( $rechne[$j][$i] eq "" ) 58 || ( $rechne[$j][$i] eq "\$+\$" ) ) 59 { 60 $teilsumme = $teilsumme; 61 } 62 else { $teilsumme += $rechne[$j][$i]; } 63 $uebertrag = ( $teilsumme - ( $teilsumme % 10 ) ) / 10; 64 if ( $uebertrag == 0 ) { 65 $rechne[ $anzahlzeilen + 1 ][ $i - 1 ] = ""; 66 } 67 else { 68 $rechne[ $anzahlzeilen + 1 ][ $i - 1 ] = "\\tiny{" . $uebertrag . "}"; 69 } 70 $rechne[ $anzahlzeilen + 2 ][$i] = $teilsumme % 10; 71 } 72 $teilsumme = $uebertrag; 73 } 74 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 75 schreibezelle( "", $anzahlzeilen + 2, $j ); 76 } 77 schreibezahlintabelle( getsumme(), 0, $anzahlzeilen + 2, getspaltenanzahl() ); 78 79 for ( $i = 1 ; $i <= $anzahlzeilen + 1 ; $i++ ) { 80 lesetabellenzeile( $i, getspaltenanzahl() ); 81 } 82 83 84 ausgabe("\\hline \\hline"); 85 lesetabellenzeile( $anzahlzeilen + 2, getspaltenanzahl() ); 86 }

1.3.2 Die Subtraktion

 subtraktion-pm.pm 
1 my $differenz = 0; 2 3 sub setdifferenz { 4 my ($ergebnis) = @_; 5 $differenz = $ergebnis; 6 } 7 8 sub setsubtraktion { 9 my ($subtrahend) = @_; 10 $differenz = $differenz - $subtrahend; 11 } 12 13 sub getdifferenz { return $differenz;} 14 15 sub subtrahiereneinlesen { 16 my ( $nummer, $summand, $summandexp ) = @_; 17 18 my ($stellensummand); 19 20 if ( $summandexp >= 0 ) { 21 $stellensummand = vorkommastellen( $summand * 10**$summandexp ); 22 } 23 else { 24 $stellensummand = vorkommastellen($summand); 25 if ( $stellensummand <= abs($summandexp) ) { 26 $stellensummand = abs($summandexp) + 1; 27 } 28 } 29 setspaltenanzahl( $stellensummand + 1 ); 30 31 schreibezahlintabelle( $summand, $summandexp, $nummer, $stellensummand ); 32 if ( $nummer > 1 ) { 33 setsubtraktion( $summand * 10**$summandexp ); 34 setaddition( $summand * 10**$summandexp ); 35 36 } 37 else { 38 schreibezahlintabelle( $summand, $summandexp, 0, $stellensummand ); 39 setsumme(0); 40 setdifferenz( $summand * 10**$summandexp ); 41 } 42 setspaltenanzahl( vorkommastellen( getdifferenz() ) ); 43 44 } 45 46 sub subtrahierenauslesen { 47 my ($anzahlzeilen) = @_; 48 my ( $j, $i, $speicherzahl, $uebertrag, $teilsumme, $teildifferenz, $minuend ); 49 50 for ( $i = 0 ; $i <= $anzahlzeilen ; $i++ ) { 51 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 52 $speicherzahl = zusammensetzen( $i, 1, $j ); 53 } 54 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 55 schreibezelle( "", $i, $j ); 56 } 57 schreibezahlintabelle( $speicherzahl, 0, $i, getspaltenanzahl() ); 58 59 if ( $i > 1 ) { schreibezelle( "\$-\$", $i, 1 );} 60 } 61 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 62 schreibezelle( "", $anzahlzeilen + 2, $j ); 63 } 64 65 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 66 schreibezahlintabelle( 0, 0, $anzahlzeilen + 1, $j ); 67 schreibezahlintabelle( 0, 0, $anzahlzeilen + 3, $j ); 68 schreibezahlintabelle( 0, 0, $anzahlzeilen + 5, $j ); 69 } 70 71 schreibezahlintabelle( getsumme(), 0, $anzahlzeilen + 3, getspaltenanzahl() ); 72 73 schreibezahlintabelle( getdifferenz(), 0, $anzahlzeilen + 4, getspaltenanzahl() ); 74 75 for ( $i = 1 ; $i <= $anzahlzeilen ; $i++ ) { 76 lesetabellenzeile( $i, getspaltenanzahl() ); 77 } 78 79 $uebertrag = $teilsumme = 0; 80 for ( $i = getspaltenanzahl() ; $i > 0 ; $i-- ) { 81 for ( $j = 2 ; $j <= $anzahlzeilen ; $j++ ) { 82 if ( ( $rechne[$j][$i] eq "" ) 83 || ( $rechne[$j][$i] eq "\$-\$" ) ) 84 {$teilsumme = $teilsumme; } 85 else {$teilsumme += $rechne[$j][$i];} 86 87 $uebertrag = ( $teilsumme - ( $teilsumme % 10 ) ) / 10; 88 89 if ( $uebertrag == 0 ) { 90 $rechne[ $anzahlzeilen + 1 ][ $i - 1 ] = 0; 91 } 92 else {$rechne[ $anzahlzeilen + 1 ][ $i - 1 ] = $uebertrag;} 93 94 $rechne[ $anzahlzeilen + 2 ][$i] = $teilsumme % 10; 95 } 96 97 $teilsumme = $uebertrag; 98 } 99 100 $teildifferenz = $minuend = 0; 101 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 102 $minuend = zusammensetzen( 0, 1, $j ); 103 } 104 for ( $j = getspaltenanzahl() ; $j > getspaltenanzahl() - vorkommastellen($minuend) ; $j-- ) { 105 $teildifferenz = $rechne[0][$j] - $rechne[ $anzahlzeilen + 3 ][$j]; 106 if ( $teildifferenz >= 0 ) { 107 $rechne[ $anzahlzeilen + 5 ][ $j - 1 ] = $rechne[ $anzahlzeilen + 1 ][ $j - 1 ] + 0; 108 } 109 else { 110 $rechne[ $anzahlzeilen + 5 ][ $j - 1 ] = $rechne[ $anzahlzeilen + 1 ][ $j - 1 ] + 1; 111 } 112 } 113 114 for ( $j = 1 ; $j <= getspaltenanzahl() ; $j++ ) { 115 if ( $rechne[ $anzahlzeilen + 5 ][$j] == 0 ) { 116 $rechne[ $anzahlzeilen + 5 ][$j] = ""; 117 } 118 else { 119 $rechne[ $anzahlzeilen + 5 ][$j] = "\\tiny{" . $rechne[ $anzahlzeilen + 5 ][$j] . "}"; 120 } 121 } 122 123 lesetabellenzeile( $anzahlzeilen + 5, getspaltenanzahl() ); 124 ausgabe("\\hline \\hline"); 125 lesetabellenzeile( $anzahlzeilen + 4, getspaltenanzahl() ); 126 }

1.3.3 Die Multiplikation

 multiplikation-pm.pm 
1 sub multipliziere { 2 my ( $faktoreins, $faktoreinsexp, $faktorzwei, $faktorzweiexp ) = @_; 3 my ( $stellenfaktoreins, $stellenfaktorzwei, $stellengesamt, $ergebnis, 4 $zeilen, $vorzeichenfaktoreins, $vorzeichenfaktorzwei, 5 $stellenergebnis, $faktorzweispeicher ); 6 7 ## Haben die Zahlen ein negatives Vorzeichen? 8 if ( $faktorzwei < 0 ) {$vorzeichenfaktorzwei = 1; } 9 else { $vorzeichenfaktorzwei = 0; } 10 if ( $faktoreins < 0 ) { $vorzeichenfaktoreins = 1; } 11 else { $vorzeichenfaktoreins = 0; } 12 13 $faktoreins = abs($faktoreins); 14 $faktorzweispeicher = $faktorzwei = abs($faktorzwei); 15 16 ## Vor- oder Nachkommastellen? 17 18 if ( $faktoreinsexp >= 0 ) { 19 $stellenfaktoreins = vorkommastellen( $faktoreins * 10**$faktoreinsexp ); 20 } 21 else { 22 $stellenfaktoreins = vorkommastellen($faktoreins); 23 if ( $stellenfaktoreins <= abs($faktoreinsexp) ) { 24 $stellenfaktoreins = abs($faktoreinsexp) + 1; 25 } 26 } 27 if ( $faktorzweiexp >= 0 ) { 28 $stellenfaktorzwei = vorkommastellen( $faktorzwei * 10**$faktorzweiexp ); 29 } 30 else { 31 $stellenfaktorzwei = vorkommastellen($faktorzwei); 32 if ( $stellenfaktorzwei <= abs($faktorzweiexp) ) { 33 $stellenfaktorzwei = abs($faktorzweiexp) + 1; 34 } 35 } 36 37 if ( $faktoreinsexp + $faktorzweiexp >= 0 ) { 38 $stellenergebnis = 39 vorkommastellen( $faktorzwei * 10**$faktorzweiexp * $faktoreins * 10**$faktoreinsexp ); 40 } 41 else { $stellenergebnis = vorkommastellen( $faktorzwei * $faktoreins ); } 42 43 $stellengesamt = 44 $stellenfaktoreins + 1 + $stellenfaktorzwei + $vorzeichenfaktoreins + $vorzeichenfaktorzwei; 45 46 ## Die erste Zeile wird geschrieben 47 ## Was ist zu rechnen 48 49 tabellenkopf($stellengesamt); 50 51 if ( $vorzeichenfaktoreins == 1 ) { schreibezelle( "\$-\$", 1, 1 ); } 52 schreibezahlintabelle( $faktoreins, $faktoreinsexp, 1, 53 $stellenfaktoreins + $vorzeichenfaktoreins ); 54 schreibezelle( "\$\\cdot\$", 1, $stellenfaktoreins + 1 + $vorzeichenfaktoreins ); 55 if ( $vorzeichenfaktorzwei == 1 ) { 56 schreibezelle( "\$-\$", 1, 57 $stellenfaktoreins + 1 + $vorzeichenfaktoreins + $vorzeichenfaktorzwei ); 58 } 59 60 schreibezahlintabelle( $faktorzwei, $faktorzweiexp, 1, 61 $stellenfaktoreins + $vorzeichenfaktoreins + 1 + $stellenfaktorzwei + 62 $vorzeichenfaktorzwei ); 63 64 lesetabellenzeile( 1, $stellengesamt ); 65 ausgabe("\\hline"); 66 $zeilen = 1; 67 68 my $wieoftmultipliziere = vorkommastellen($faktorzwei); 69 70 my $i = 1; 71 my $j = 0; 72 for ( $i = 1 + $stellenfaktorzwei ; $i > 1 ; $i-- ) { 73 74 if ( $faktoreinsexp >= 0 ) { 75 $ergebnis = $faktoreins * 10**$faktoreinsexp * ( $faktorzwei % 10 ); 76 } 77 else { 78 $ergebnis = $faktoreins * ( $faktorzwei % 10 ); 79 } 80 81 schreibezahlintabelle( $ergebnis, 0, $i, $stellengesamt - $j ); 82 $faktorzwei = ( $faktorzwei - ( $faktorzwei % 10 ) ) / 10; 83 $j++; 84 $zeilen++; 85 } 86 $faktorzwei = $faktorzweispeicher; 87 88 for ( $i = 2 ; $i <= $stellenfaktorzwei + 1 ; $i++ ) { 89 lesetabellenzeile( $i, $stellengesamt ); 90 } 91 92 schreibezahlintabelle( $faktoreins * $faktorzwei, $faktoreinsexp + 93 $faktorzweiexp, $zeilen + 3, $stellengesamt ); 94 95 ## Der Uebertrag wird bestimmt 96 97 my $uebertrag = 0; 98 my $teilsumme = 0; 99 for ( $i = $stellengesamt ; $i > 0 ; $i-- ) { 100 for ( $j = 2 ; $j <= $zeilen ; $j++ ) { 101 if ( $rechne[$j][$i] eq "" ) { 102 $teilsumme = $teilsumme; 103 } 104 else { 105 $teilsumme += $rechne[$j][$i]; 106 } 107 108 $uebertrag = ( $teilsumme - ( $teilsumme % 10 ) ) / 10; 109 110 if ( $uebertrag == 0 ) { 111 $rechne[ $zeilen + 1 ][ $i - 1 ] = ""; 112 } 113 else { 114 $rechne[ $zeilen + 1 ][ $i - 1 ] = "\\tiny{" . $uebertrag . "}"; 115 } 116 $rechne[ $zeilen + 2 ][$i] = $teilsumme % 10; 117 } 118 $teilsumme = $uebertrag; 119 } 120 121 ## Das Rechenergebnis wird bestimmt 122 lesetabellenzeile( $zeilen + 1, $stellengesamt ); 123 124 schreibezahlintabelle( 125 $faktoreins * $faktorzwei, 126 $faktoreinsexp + $faktorzweiexp, 127 $zeilen + 3, 128 $stellengesamt 129 ); 130 ausgabe("\\hline \\hline"); 131 if ( ( $vorzeichenfaktoreins + $vorzeichenfaktorzwei ) == 1 ) { 132 schreibezelle( "\$-\$", $zeilen + 3, $stellengesamt - ($stellenergebnis) ); 133 } 134 lesetabellenzeile( $zeilen + 3, $stellengesamt ); 135 tabellenfuss(); 136 }

1.3.4 Die Division

 division-pm.pm 
1 sub dividiere { 2 my ( $dividend, $dividendexp, $divisor, $divisorexp ) = @_; 3 4 my ( $stellendividend, $stellendivisor, $stellengesamt, $ergebnis, 5 $zeilen, $vorzeichendividend, $vorzeichendivisor, $stellenergebnis, 6 $ende, $zwischenergebnis, $i, $merkezahl, $differenz, $starte, $rest, 7 $reststellen ); 8 9 if ( $divisorexp < 0 ) { 10 $rest = 11 ( ( $dividend * 10**$dividendexp * 10**( -$divisorexp ) ) % 12 ( $divisor * 10**$divisorexp * 10**( -$divisorexp ) ) ); 13 } 14 else { 15 $rest = ( ( $dividend * 10**$dividendexp ) % ( $divisor * 10**$divisorexp ) ); 16 } 17 if ( $rest != 0 ) { $reststellen = vorkommastellen($rest) + 1; } 18 else { $reststellen = 0; } 19 20 my @ergebnisvektor = (); 21 for ( $i = 0 ; $i <= 100 ; $i++ ) { 22 $ergebnisvektor[$i] = ""; 23 } 24 25 ## Haben die Zahlen ein negatives Vorzeichen? 26 if ( $divisor < 0 ) { $vorzeichendivisor = 1; } 27 else { $vorzeichendivisor = 0; } 28 if ( $dividend < 0 ) { $vorzeichendividend = 1; } 29 else { $vorzeichendividend = 0; } 30 31 $dividend = abs($dividend); 32 $divisor = abs($divisor); 33 34 ## Vor- oder Nachkommastellen? 35 36 if ( $dividendexp >= 0 ) { 37 $stellendividend = vorkommastellen( $dividend * 10**$dividendexp ); 38 } 39 else { 40 $stellendividend = vorkommastellen($dividend); 41 if ( $stellendividend <= abs($dividendexp) ) { 42 $stellendividend = abs($dividendexp) + 1; 43 } 44 } 45 if ( $divisorexp >= 0 ) { 46 $stellendivisor = vorkommastellen( $divisor * 10**$divisorexp ); 47 } 48 else { 49 $stellendivisor = vorkommastellen($divisor); 50 if ( $stellendivisor <= abs($divisorexp) ) { 51 $stellendivisor = abs($divisorexp) + 1; 52 } 53 } 54 55 if ( $dividendexp - $divisorexp >= 0 ) { 56 $stellenergebnis = 57 vorkommastellen( ( $dividend * 10**$dividendexp ) / ( $divisor * 10**$divisorexp ) ); 58 } 59 else { 60 $stellenergebnis = vorkommastellen( $dividend / $divisor ); 61 if ( $stellenergebnis <= abs( $dividendexp - $divisorexp ) ) { 62 $stellenergebnis = abs( $dividendexp - $divisorexp ) + 1; 63 } 64 } 65 66 $stellengesamt = 67 $stellendividend + 1 + $stellendivisor + $vorzeichendividend + $vorzeichendivisor + 1 + 68 $stellenergebnis + $reststellen; 69 70 ## Der Tabellenkopf wird geschrieben, wie viele Stellen sind vorhanden. 71 72 tabellenkopf($stellengesamt); 73 74 ## Die erste Zeile wird geschrieben 75 ## Was ist zu rechnen 76 77 if ( $vorzeichendividend == 1 ) { schreibezelle( "\$-\$", 1, 1 ); } 78 schreibezahlintabelle( $dividend, $dividendexp, 1, $stellendividend + $vorzeichendividend ); 79 ## fuer Zwischenrechnungen 80 for ( $i = 0 ; $i < 100 ; $i++ ) { 81 schreibezahlintabelle( 0, 0, 0, $i ); 82 } 83 schreibezahlintabelle( $dividend, $dividendexp, 0, $stellendividend + $vorzeichendividend ); 84 schreibezelle( "\$:\$", 1, $stellendividend + 1 + $vorzeichendividend ); 85 if ( $vorzeichendivisor == 1 ) { 86 schreibezelle( "\$-\$", 1, 87 $stellendividend + 1 + $vorzeichendividend + $vorzeichendivisor ); 88 } 89 90 schreibezahlintabelle( $divisor, $divisorexp, 1, 91 $stellendividend + $vorzeichendividend + 1 + $stellendivisor + $vorzeichendivisor ); 92 93 schreibezelle( "\$=\$", 1, 94 $stellendividend + 1 + $vorzeichendividend + $vorzeichendivisor + $stellendivisor + 1 ); 95 96 schreibezahlintabelle( 97 $dividend / $divisor, 98 $dividendexp - $divisorexp, 99 1, $stellengesamt - $reststellen 100 ); 101 102 if ( $rest != 0 ) { 103 schreibezelle( "R", 1, $stellengesamt - ( $reststellen - 1 ) ); 104 schreibezahlintabelle( $rest, 0, 1, $stellengesamt ); 105 } 106 107 $zeilen = 1; 108 109 lesetabellenzeile( 1, $stellengesamt ); 110 111 if ( $dividendexp > 0 ) { 112 $dividend = $dividend * 10**$dividendexp; 113 } 114 115 if ( $divisorexp > 0 ) { 116 $divisor = $divisor * 10**$divisorexp; 117 } 118 119 if ( $divisorexp < 0 ) { 120 $divisor = $divisor * 10**( -$divisorexp ) * 10**($divisorexp); 121 $dividend = $dividend * 10**( -$divisorexp ); 122 } 123 124 for ( $i = 0 ; $i < $stellenergebnis ; $i++ ) { 125 $ergebnisvektor[ $stellenergebnis - $i ] = zusammensetzen( 126 1, 127 $stellengesamt - $reststellen - $i, 128 $stellengesamt - $reststellen - $i 129 ); 130 } 131 $ende = $differenz = $starte = 0; 132 $zeilen++; 133 my $anfang = 1; 134 my $start = 1; 135 for ( $j = 1 ; $j <= $stellengesamt ; $j++ ) { 136 if ( teilersein( zusammensetzen( 0, $anfang, $j ), int( $ergebnisvektor[1] * $divisor ) ) == 137 1 ) 138 { 139 if ( $starte == 0 ) { 140 $merkezahl = zusammensetzen( 0, $anfang, $j ); 141 $starte = 1; 142 $ende = $j; 143 } 144 } 145 } 146 147 for ( $i = 1 ; $i <= $stellenergebnis ; $i++ ) { 148 $zwischenergebnis = int( $ergebnisvektor[$i] * $divisor ); 149 150 if ( $ergebnisvektor[$i] != 0 ) { 151 152 $differenz = $merkezahl - $zwischenergebnis; 153 154 for ( $j = 1 ; $j <= $ende ; $j++ ) { 155 schreibezahlintabelle( 0, 0, 0, $j ); 156 } 157 158 schreibezahlintabelle( $differenz, 0, 0, $ende ); 159 160 if ( $i > 1 ) { 161 schreibezahlintabelle( $merkezahl, 0, $zeilen, $ende ); 162 lesetabellenzeile( $zeilen, $stellengesamt ); 163 $zeilen++; 164 schreibezahlintabelle( $differenz, 0, 0, $ende ); 165 } 166 167 if ( $zwischenergebnis != 0 ) { 168 schreibezahlintabelle( $zwischenergebnis, 0, $zeilen, $ende ); 169 lesetabellenzeile( $zeilen, $stellengesamt ); 170 ausgabe( "\\cline{" . $start . "-" . $ende . "}" ); 171 $zeilen++; 172 schreibezahlintabelle( $differenz, 0, $zeilen, $ende ); 173 } 174 } 175 $ende++; 176 $merkezahl = zusammensetzen( 0, $anfang, $ende ); 177 $starte = 0; 178 for ( $j = 1 ; $j <= $ende ; $j++ ) { 179 180 if ( zusammensetzen( 0, $j, $j ) == 0 ) { 181 if ( $starte == 0 ) { $start = $j + 1; } 182 } 183 else { $starte = 1; } 184 } 185 } 186 $zeilen++; 187 $ende = vorkommastellen($dividend); 188 schreibezahlintabelle( $rest, 0, $zeilen, $ende ); 189 lesetabellenzeile( $zeilen, $stellengesamt ); 190 tabellenfuss(); 191 }

1.4 Anwendung des Programms

Das gesamte Skript kann man nun wie folgt nutzen. Man übergibt an adam-ries.pl eine Datei in der die folgenden Befehle enthalten sind.

div 829,0,3,0

Dabei ist eine Zahl immer in der Darstellung Zahl,Exponent.

1.5 Noch zu verbessern

Bisher funktionieren meine Programme einwandfrei mit ganzen natürlichen Zahlen. Aus Zeitmangel habe ich noch nicht Dezimalzahlen zur Genüge implementiert. Der Ansatz ist bereits vorhanden, dass man eine Zahl als Tupel angibt mit ihrem Exponenten. So ist z.B. . Aber dies wird nicht bei jeder Rechenart berücksichtigt. Bei der Addition und Subtraktion habe ich noch keine Ausrichtung an dem Komma eingebaut. Bei der Multiplikation und Division funktioniert dies bereits mit Dezimalzahlen. Als weitere Ergänzung ist noch eine Division mit Rest als Dezimalschreibweise gedacht. Bisher wird nur der Rest ausgegeben.

Literatur

[Bronštejn . Semendjaev, 1985]
Bronštejn, Il’ja . K. A. Semendjaev (1985). Taschenbuch der Mathematik. Teubner [u.a.], Leipzig [u.a.], 22 .
[Div., 2010a]
Div. (2010a). Addition. http://de.wikipedia.org/wiki/Addition.
[Div., 2010b]
Div. (2010b). Division. http://de.wikipedia.org/wiki/Division.
[Div., 2010c]
Div. (2010c). Multiplikation. http://de.wikipedia.org/wiki/Multiplikation.
[Div., 2010d]
Div. (2010d). Subtraktion. http://de.wikipedia.org/wiki/Subtraktion.
[Lergenmüller . Schmidt, 2004]
Lergenmüller, Arno . G. Schmidt (2004). Mathematik Neue Wege 5. Schülerband. Niedersachsen: Arbeitsbuch für Gymnasien. Schroedel, 1. .

Letzte Änderung: 18.03.2010: 19:19:52 von X. Rendtel