# Prozeduren



## Thoomse (12. November 2005)

Hallo... 
Also mein Programm is so wie es ist richtig (nach Aufgabenstellung). Ich wollte es nur damit es relativ ordentlich ist, in Prozeduren schreiben. Wenn ich das Programm aber compiliere, sagt mir der Rechner :
"KopievonNewPrim.java:64: missing return statement
	}//end prim
        ^
KopievonNewPrim.java:93: missing return statement
    } // end mirp
    ^
2 errors"

ich versteh das nicht, weil in beiden Prozeduren doch ein return dabei ist. Ich denke mal es ist nur ein kleiner Fehler. Wäre euch dankbar wenn ihr mir helft ihn zu finden weil ich sitz da schon ein weilchen und komm nicht drauf.
Danke im Vorraus

hier mein Quellcode:

```
import dssz.io.*;

public class KopievonNewPrim{
  public static void main(String[] args){
    
    stdin in =new stdin();
    // Variablen werden deklariert
    int u,o;	
	
    // Variable u und o werden eingelesen 
    u=in.getInt("Geben Sie die Untergrenze ein: ");
    o=in.getInt("Geben Sie die Obergrenze ein: ");
	
	
    // Ausgabe der Prim und Mirpzahlen

    System.out.println(prim(o,u)+" ist eine Primzahl");
    System.out.println(mirp(u,o)+"!");
        
    }//end main


    public static int prim(int o,int u){
	  
	boolean[] prim = new boolean[o];

    prim[0] = true;
    prim[1] = true;
	  //Berechnung der Primzahlen
    for(int i=2; i < prim.length; i++){
          if(prim[i] == true){
	      continue;
	   }//end if
          for(int a=2*i; a < prim.length; a+=i){
            if(prim[a] == false){
           prim[a] = true;
	      }//end if
          }//end for
        }// end for
    for(int i=u; i < prim.length; i++){
          if(prim[i] == false)
	      return i;{
	      }//end if
        }//end for
	}//end prim
	

  
    public static int mirp(int u,int o){
      for(int i=u; i < o; i++){ 
	// Initialisierung der Variable Zahl2
	String Zahl2="";
	// Integerwert wird in String umgewandelt und als Zahl1 deklariert
	String Zahl1=String.valueOf(i);
	//Laenge des Strings wird ermittelt
	int laenge= Zahl1.length();
        // Variable p wird initialisiert
        char p=0; 
        // Schleife geht den String Charakterweise von hinten nach vorn durch und speichert die Charakter "verdreht" in der Variable Zahl2 ab
	for(int j=(laenge-1);j>-1;j--){
           p=Zahl1.charAt(j); 
           Zahl2=Zahl2+p; 
	   } // end for
    
    //Zahl2 des Typs String wird in einen Integerwert mit dem Namen Zahl3 umgewandelt
    int Zahl3=Integer.parseInt(Zahl2);		
    //Zahl1 des Typs String wird in einen Integerwert mit dem Namen Zahl4 umgewandelt 
    int Zahl4=Integer.parseInt(Zahl1);		
    // die beiden neuen Int.-Zahlen werden auf Primzahlen getestet. Sind es beide Primzahlen, handelt sich um eine Mirpzahl welche anschließend ausgegeben wird 
    if((Zahl3 % 2)!=0 && ((Zahl3 % 3)!=0) && ((Zahl3 % 5)!=0) && ((Zahl3 % 7)!=0) && (Zahl4 % 2)!=0 && ((Zahl4 % 3)!=0) && ((Zahl4 % 5)!=0) && ((Zahl4 % 7)!=0)){
	    return Zahl4;
        }// end if
      }//end for
    } // end mirp

}//end class
```


----------



## hpvw (12. November 2005)

Thoomse hat gesagt.:
			
		

> ... relativ ordentlich ...


Verwende bitte die Code-Tags des Forums und rücke Deinen Code ein.

Statische Methoden sind in Java auch nicht unbedingt ordentlich.

Gruß hpvw


----------



## MasterHimself (12. November 2005)

Das Problem ist, das du die return nur im if Zweig stehen hast, der Compiler denkt nun, dass auch ein else Zweig auftreten könnte, und in dem Falle fehlt natürlich das return Statement. Lösen kannst du dieses Problem indem du am Ende deiner Methode einfach ein return -1; verwendenst, auch wenn dies niemalös ausgelöst wird. Trotzdem kannst du mit dem return -1; Fehler abfangen, die dir am Anfang nicht auffallen. ZB kannst du mit

if (methode() == -1)
   System.out.println("Fehler");
else
  System.out.println(methode());

die Fehler abfangen. Hoffe das war jetzt verständlich für dich, 

Grüße Master


----------



## Thoomse (12. November 2005)

ja ich weiß das, dass nich so ordentlich ist, aber ich bin am Anfang meiner Programmier-karriere ... jeder fängt mal klein an... so haben wir es bis jetzt gelernt und so sollen wir das jetzt auch erstmal machen...
mein Quelltext

```
import dssz.io.*;

 

public class KopievonNewPrim{
  public static void main(String[] args){
    
    stdin in =new stdin();
    // Variablen werden deklariert
    int u,o;	
	
    // Variable u und o werden eingelesen 
    u=in.getInt("Geben Sie die Untergrenze ein: ");
    o=in.getInt("Geben Sie die Obergrenze ein: ");
	
	
    // Ausgabe der Prim und Mirpzahlen

    System.out.println(prim(o,u)+" ist eine Primzahl");
    System.out.println(mirp(u,o)+"!");
        
    }//end main


    public static int prim(int o,int u){
	  
	boolean[] prim = new boolean[o];

    prim[0] = true;
    prim[1] = true;
	  //Berechnung der Primzahlen
    for(int i=2; i < prim.length; i++){
          if(prim[i] == true){
	      continue;
	   }//end if
          for(int a=2*i; a < prim.length; a+=i){
            if(prim[a] == false){
           prim[a] = true;
	      }//end if
          }//end for
        }// end for
    for(int i=u; i < prim.length; i++){
          if(prim[i] == false)
	      return i;{
	      }//end if
        }//end for
	}//end prim
	

  
    public static int mirp(int u,int o){
      for(int i=u; i < o; i++){ 
	// Initialisierung der Variable Zahl2
	String Zahl2="";
	// Integerwert wird in String umgewandelt und als Zahl1 deklariert
	String Zahl1=String.valueOf(i);
	//Laenge des Strings wird ermittelt
	int laenge= Zahl1.length();
        // Variable p wird initialisiert
        char p=0; 
        // Schleife geht den String Charakterweise von hinten nach vorn durch und speichert die Charakter "verdreht" in der Variable Zahl2 ab
	for(int j=(laenge-1);j>-1;j--){
           p=Zahl1.charAt(j); 
           Zahl2=Zahl2+p; 
	   } // end for
    
    //Zahl2 des Typs String wird in einen Integerwert mit dem Namen Zahl3 umgewandelt
    int Zahl3=Integer.parseInt(Zahl2);		
    //Zahl1 des Typs String wird in einen Integerwert mit dem Namen Zahl4 umgewandelt 
    int Zahl4=Integer.parseInt(Zahl1);		
    // die beiden neuen Int.-Zahlen werden auf Primzahlen getestet. Sind es beide Primzahlen, handelt sich um eine Mirpzahl welche anschließend ausgegeben wird 
    if((Zahl3 % 2)!=0 && ((Zahl3 % 3)!=0) && ((Zahl3 % 5)!=0) && ((Zahl3 % 7)!=0) && (Zahl4 % 2)!=0 && ((Zahl4 % 3)!=0) && ((Zahl4 % 5)!=0) && ((Zahl4 % 7)!=0)){
	    return Zahl4;
        }// end if
      }//end for
    } // end mirp

}//end class
```


----------



## hpvw (12. November 2005)

Ich habe das mal durch den Codeformatter von Eclipse gejagt und die Hinweise von MasterHimself an den entsprechenden Stellen als Kommentar hervorgehoben:
	
	
	



```
import dssz.io.*;

public class KopievonNewPrim {
    public static void main(String[] args) {

        stdin in = new stdin();
        // Variablen werden deklariert
        int u, o;

        // Variable u und o werden eingelesen
        u = in.getInt("Geben Sie die Untergrenze ein: ");
        o = in.getInt("Geben Sie die Obergrenze ein: ");

        // Ausgabe der Prim und Mirpzahlen

        System.out.println(prim(o, u) + " ist eine Primzahl");
        System.out.println(mirp(u, o) + "!");

    }//end main

    public static int prim(int o, int u) {

        boolean[] prim = new boolean[o];

        prim[0] = true;
        prim[1] = true;
        //Berechnung der Primzahlen
        for (int i = 2; i < prim.length; i++) {
            if (prim[i] == true) {
                continue;
            }//end if
            for (int a = 2 * i; a < prim.length; a += i) {
                if (prim[a] == false) {
                    prim[a] = true;
                }//end if
            }//end for
        }// end for
        for (int i = u; i < prim.length; i++) {
            if (prim[i] == false) // hier siehts
                return i;         // merkwürdig aus
            {
            }//end if
        }//end for
        // Hier fehlt ein return
    }//end prim

    public static int mirp(int u, int o) {
        for (int i = u; i < o; i++) {
            // Initialisierung der Variable Zahl2
            String Zahl2 = "";
            // Integerwert wird in String umgewandelt und als Zahl1 deklariert
            String Zahl1 = String.valueOf(i);
            //Laenge des Strings wird ermittelt
            int laenge = Zahl1.length();
            // Variable p wird initialisiert
            char p = 0;
            // Schleife geht den String Charakterweise von hinten nach vorn
            // durch und speichert die Charakter "verdreht" in der Variable
            // Zahl2 ab
            for (int j = (laenge - 1); j > -1; j--) {
                p = Zahl1.charAt(j);
                Zahl2 = Zahl2 + p;
            } // end for

            //Zahl2 des Typs String wird in einen Integerwert mit dem Namen
            // Zahl3 umgewandelt
            int Zahl3 = Integer.parseInt(Zahl2);
            //Zahl1 des Typs String wird in einen Integerwert mit dem Namen
            // Zahl4 umgewandelt
            int Zahl4 = Integer.parseInt(Zahl1);
            // die beiden neuen Int.-Zahlen werden auf Primzahlen getestet. Sind
            // es beide Primzahlen, handelt sich um eine Mirpzahl welche
            // anschließend ausgegeben wird
            if ((Zahl3 % 2) != 0 && ((Zahl3 % 3) != 0) && ((Zahl3 % 5) != 0)
                    && ((Zahl3 % 7) != 0) && (Zahl4 % 2) != 0
                    && ((Zahl4 % 3) != 0) && ((Zahl4 % 5) != 0)
                    && ((Zahl4 % 7) != 0)) {
                return Zahl4;
            }// end if
        }//end for
        // Hier fehlt ein return        
    } // end mirp

}//end class
```


----------



## Thoomse (12. November 2005)

Die Returns hatte ich ja auch so gesetzt wie du mir vorgeschlagen hast, nur gibt er mir dann nur ein Ergebnis in diesem Intervall aus und nich alle ...
Ich möchte ja alle Primzahlen sowie Mirpzahlen im Intervall von a bis b.
Es geht zwar zuu comilieren aber die Ausgabe is dann falsch. 
beispiel:
Intervall 10 - 20 
Primzahlen 11,13,17,19
Mirpzahlen 11,13,17

mit den Returns gibt er nur 11 für Prim und mirp aus.


----------



## deepthroat (12. November 2005)

Hi.

Das liegt aber daran, das deine Funktion nur einen Wert zurückgibt. Um mehrere Werte zurückzugeben solltest du ein Array oder einen anderen Kontainer zurückgeben und dessen Werte dann einzeln ausgeben.

Übrigens kann man die Berechnung der Primzahlen noch etwas optimieren. Als erstes braucht man die geraden Zahlen nicht betrachten (und auch nicht im Array speichern) da die 2 die einzige natürliche, gerade Zahl ist. Zweitens brauchst du die Schleife nur solange durchlaufen wie i² <= Obergrenze ist.

Gruß


----------

