# Berechnung von Perioden



## Liteloo (14. Dez 2007)

Hi, 

wir sollen ein Programm schreiben, in dem man zwei Eingaben vornnehmen kann, "Zähler: " "Nenner: ", danach wird der Ganzzahlige Anteil, die Vorperiode und Periode ausgegeben. Ich habe anhand dieser Seite, versucht einen Algorithmus dafür aufzustellen:

http://www.arndt-bruenner.de/mathe/scripts/periodenlaenge.htm

Doch irgendwie scheint an meinem Code noch etwas nicht zu stimmen, bei einigen Zahlen läuft alles wunderbar, aber wenn ich z.B. 3/2 berechne, gibt er mir die Vorperiode nicht aus, ich bin schon am verzweifeln, hoffe die Veteranen unter euch, könnten mir da weiterhelfen ohne an meinem Code alles umzukrempeln, weil ich da wirklich viel Zeit für investiert habe:


```
import Prog1Tools.IOTools;

class test {
  public static void main (String[] args){
    int Zaehler,  Zaehler2, Zaehler3, Nenner, Nenner2,Potenz = 0,g = 0, b = 0, d = 0, e = 0, f = 0, x = 0, i = 0, Division , a  = 0;
    String Vorperiode = "", Periode = "";


    do{
    Zaehler = IOTools.readInteger("Bitte geben Sie den Zaehler ein: ");
    }while(Zaehler < 0);

    do{
    Nenner = IOTools.readInteger("Bitte geben Sie den Nenner ein: ");
    }while(Nenner <= 0);

    

   Division = Zaehler / Nenner;
   Nenner2 = Nenner;
   Zaehler2 = 10;
   Zaehler3 = Zaehler;
  
   for(;;){
   if (Zaehler3 % 2 != 0 || Nenner2 % 2 != 0 ){
   break;    
   }
   Zaehler3 = Zaehler3 / 2;
   Nenner2 = Nenner2 / 2;
   e++;
   }
   
   for(;;){
   if (Zaehler3 % 5 != 0 || Nenner2 % 5 != 0 ){
   break;    
   }
   Zaehler3 = Zaehler3 / 5;
   Nenner2 = Nenner2 / 5;
   f++;
   }
   
         if(e < f){
         x = f;  
         }

         else{
         x = e;
         }


         for(;;){
         Potenz++;
         if(Zaehler2%Nenner2 == 1){
         break;    
         }
         if(Zaehler2%Nenner2 == 0){
         Potenz = Potenz - Potenz;
         break;
         }
         Zaehler2 = (Zaehler2%Nenner2)*10;
         }    
    
      d = Zaehler3;  
       

      
      int[] Safe = new int[x + Potenz + 5 ];
      for(;;){
      Safe[i] = ((Zaehler3%Nenner2)*10)/Nenner2;
      Zaehler3 = (Zaehler3%Nenner2)*10;
      i++;
      if (Zaehler3 == 0 || i >= Safe.length-1){
      break;
      }
      }  

      if(x != 0){
      for(i=0; i <= x; i++){
      Vorperiode = Vorperiode + Safe[i];
      }     
      }
      
   
      if(Potenz != 0){
      for(i= x; i <= x + Potenz-1; i++){
      Periode = Periode + Safe[i];
      }
      }
    
    
     
    System.out.println("Ganzzahliger Anteil: " + (Division));


    System.out.println("Vorperiode: " + Vorperiode);


    System.out.println("Periode: " + Periode);

    System.out.println("2en: " + (e));
    System.out.println("5en: " + (f));
    System.out.println("Nenner gek: " + Nenner2);
    System.out.println("Zaehler gek: " + d);
    System.out.println("Periodenlänge: " + Potenz);
    System.out.println("Vorperiodenlänge: " + x);
    System.out.println("Safe.length: " + Safe.length);
    System.out.println("Zaehlerdurch2 " + e);
    System.out.println("Zaehlerdurch5: " + f);
}
}
```

Hier nochmal der link zum Prog1Tools.zip

http://www.grundkurs-java.de/software.htm


----------



## Marco13 (15. Dez 2007)

Hab hier gerade kein Java  :? aber eine Foresuche nach "Vorperiode" liefert einige Ergebnisse, und ich würde dir *dringend* empfehlen, die Autoren dieser Beiträge mal per PN zu kontaktieren, weil ihr euch dann (in der Uni, Schule oder sonstwo) treffen könnt, um das so lange durchzuquatschen, bis ihr es alle verstanden habt. Bis dahin nur ein Link - das dort gesagte trifft auf dich zwar weniger zu, aber ... ganz allgemein....
http://www.java-forum.org/de/viewtopic.php?t=60477&highlight=vorperiode


----------



## Liteloo (15. Dez 2007)

Danke sehr, aber es hat keiner diese Aufgabe so gemacht wie ich sie angepackt habe mit meinem Partner zusammen. Viele haben einen Array aufgestellt, in dem danach gesucht wird, ob ein Rest zweimal auftaucht oder nicht. Einige haben auch den Euklidischen Algorithmus verwendet. Hätten wir auch versuchen können, aber wir würden es doch gerne mit dem was wir jetzt haben lösen, weil wir uns nicht geschlagen geben wollen. 

Ganz Allgemein: 

Ich will hier nicht, dass mir einer einen komplett neuen Code erstellt, ich habe schon einen zu 90% funktionierenden (100% kompilierbaren und ausführbaren), mir geht es nur darum, herauszufinden, ob unser Ansatz überhaupt möglich ist und wenn ja, wo der Fehler drin liegen könnte.


----------



## Marco13 (15. Dez 2007)

Es ist vorstellbar, dass bei kommentarfreiem Code, mit so willkürlichen, nichtssagenden Variablennamen wie
int Zaehler,  Zaehler2, Zaehler3, Nenner, Nenner2,Potenz = 0,g = 0, b = 0, d = 0, e = 0, f = 0, x = 0, i = 0, Division , a  = 0; 
verschachtelten, aussagefreien Endlosschleifen, die durch arbiträr wirkende, unkommentierte if-Abfragen abgebrochen werden, niemand Lust hat (oder auch nur in der Lage ist) euren "Ansatz" nachzuvollziehen. Wenn du den Ansatz (in Worten oder Pseudocode) beschreiben würdest, und es (durch Kommentare, sprechende Variablennamen und Debug-Ausgaben(!!!)) möglich wäre, diesen Ansatz irgendwie in Zusammenhang mit dem geposteten Code zu bringen, wäre das vermutlich was anderes. Aber sich jetzt da durchzuhangeln und solche Fragen zu stellen wie "Was wird 

```
int[] Safe = new int[x + Potenz + 5 ];for(;;){Safe[i] = ((Zaehler3%Nenner2)*10)/Nenner2;
Zaehler3 = (Zaehler3%Nenner2)*10; i++; if (Zaehler3 == 0 || i >= Safe.length-1){break;}}  // HIER
```
gemacht, wäre wohl nicht zielführend. 

Ich kann dir nur den Tipp geben, bei jeder Schleife 

```
System.out.println("Fange jetzt an DIES_UND_DAS zu machen, der Wert von XXX ist "+XXX);
...
System.out.println("Mache gerade DIES_UND_DAS, der Wert von XXX ist jetzt "+XXX);
...
System.out.println("Bin Fertig mit DIES_UND_DAS, der Wert von XXX ist "+XXX+" und der Wert von YYY ist "+YYY);
```
und vor jede If-Abfrage

```
System.out.println("Prüfe, ob DIES_UND_JENES gilt, ZZZ ist "+ZZZ+" und die Abfrage ist "+(XXX+YYY%ZZZ==0));
```
zu schreiben, um rauszufinden, wo der Fehler liegt (oder das ganze in einem Debugger laufen zu lassen, was aber manchmal weniger übersichtlich ist, als ein kompletter Programm-Trace)

_Danke sehr, aber es hat keiner diese Aufgabe so gemacht wie ich sie angepackt habe _

Wenn man etwas so macht, wie es noch nie jemand gemacht hat, dann ist der eigene Ansatz meistens besonders geschickt oder besonders unklug. Und wenn man es partout nicht dazu bringt, so zu funktionieren, wie es sollte... naja  :?  Ich kann es - wie gesagt - euren Ansatz nicht beurteilen (da ich ihn nicht verstehe). Vielleicht ist er absolut genial (keine Ahnung). Aber ... manchmal gibt es für ein Problem nicht so viele verschiedene Lösungen, und die einzig richtige Lösung ist manchmal "die, die funktioniert".......


----------



## Marco13 (16. Dez 2007)

Oha - hätte wohl mal den Link genauer ansehen sollen   sorry, also .... wenn dort der Algorithmus beschrieben ist, kann man sich das mal ansehen - ist aber ziemlich viel, dafür, dass die "Fehlermeldung" nur ist "es funktioniert nicht"....


----------

