Menürealisierung

Status
Nicht offen für weitere Antworten.

Ollsen

Mitglied
Hallo,

habe eine kleine frage, die mich nun schon einige tage beschäftigt.
also ich habe ein programm geschrieben, welches per menü auf einzelne unterprogramme zugreift und dort mathematische aufgaben berechnet. nun möchte ich per benutzereingabe wieder ins menü zurückspringen. doch wie realisiere ich diesen sprung? ich kann mich dunkel in pascal an die goto-fkt erinnern, exestiert in java so was ähnliches?
das menü habe ich mit einer switch/case anweisung realisiert, is der sprung zu dieser (zurück) möglich (?) und wenn ja, bitte nicht all zu umständlich...bin gerade in der zweiten woche des java-erlernens...! Thx!

Bye
Ollsen
 

P3AC3MAK3R

Top Contributor
Sprichst Du von einer Konsolenanwendung?

Mein erster Gedanke besteht darin, eine Schleife um den Programmteil zu legen, der sich wiederholen soll.
 

Wildcard

Top Contributor
Ollsen hat gesagt.:
also ich habe ein programm geschrieben, welches per menü auf einzelne unterprogramme zugreift und dort mathematische aufgaben berechnet. nun möchte ich per benutzereingabe wieder ins menü zurückspringen. doch wie realisiere ich diesen sprung? ich kann mich dunkel in pascal an die goto-fkt erinnern, exestiert in java so was ähnliches?
Sprung in einer Konsolenanwendung? Vergiss es :wink:
 

bambi

Bekanntes Mitglied
Was ist denn das fuer ein "Menue"??? Ich kann mir jetzt net so recht vorstellen, was Du willst - am Besten mal den
entsprechenden Code posten und genau sagen, was Du tun willst...
Also sowas wie eine goto-Funktion gibt's in Java nicht - und das ist auch gut so. Die sollte man naemlich eh lieber
vermeiden... :wink:
 

Ollsen

Mitglied
ja, wir reden von konsolenanwendungen.
das mit der schleife is schon klar, aber wie sage ich dem programm...springe zurück ins menü, wenn die mathematische berechnung beendet ist, das ergebnis ausgegeben und der benutzer das bestätigt hat???!!!!
 

Wildcard

Top Contributor
Du kommst in der Konsole nicht mehr zurück! Alles neu ausgeben, anders gehts nicht.
Java ist nicht unbedingt für Konsolenanwendungen gemacht :wink:
 

Ollsen

Mitglied
Code:
import java.io.*;

class Fak {			//Hauptklasse
	String input;
	int n, m;
//	char c;

	public class SimpleInput {		//Inputklasse
  	
  	BufferedReader in;
  
  public SimpleInput() {
    in = new BufferedReader(new InputStreamReader(System.in));
  }

 		public String readString(String text) {
    String s;

    s = null;
    System.out.print(text);
    try {
      s = in.readLine();
    }
    catch (Exception e) {
      System.out.println("Eingabefehler: "+e.getMessage());
      System.exit(1);
    	}
   	 return s;
  	}
 
 		public int readInt(String text) {
    int i;
    String s;

    i = 0;
    s = readString(text);
    try {
      i = Integer.parseInt(s);
    }
    catch (Exception e) {
      System.out.println("Eingabefehler: "+e.getMessage());
      System.exit(1);
    	}
    return i;
  	} 
 
 		public char readChar(String text) {
    String s;
    char c;

    s = readString(text);
    if (s == null)
      c = '\0';
    else
      c = s.charAt(0);
    return c;
  	}
 }
	/* Einfache Eingaberoutinen
 * Verwendung:
 * SimpleInput in = new SimpleInput();
 * String s = in.readString(string);
 * int i    = in.readInt(string);
 * double r = in.readDouble(string);
 * char c   = in.readChar(string);
 */

	
	public void go(){
	int i, fak=1;
	char c;
	SimpleInput in = new SimpleInput();
		
		System.out.println("   Auswahlmenue");
    	System.out.println("==================");
    	System.out.println("a - Fakultaet von n");
    	System.out.println("b - Schaltjahr");
    	System.out.println("c - Groesser/Kleiner");
    	System.out.println("q - Quit");
    	c = in.readChar("Auswahl: ");
    		switch (c) {
      	case 'a':
      	case 'A':{
        			n = in.readInt("Geben sie n zur Fakultaetsberechnung an: ");
					//n = Integer.parseInt(input);
		
				for (i = 1; i<=n; ++i){
				fak = fak * i;
				//System.out.println(fak);
									}
				System.out.println(n+"! = "+fak);
		break;}
		case 'b':
		case 'B':{
			n = in.readInt("Bitte geben sie die Jahreszahl an: ");
			if (n%4==0)
			System.out.println(n+" ist ein Schaltjahr");
			else
			System.out.println(n+" ist kein Schaltjahr");
			break;}
			
		case 'c':
		case 'C':{
			n = in.readInt("Bitte geben Sie A ein: ");
			m = in.readInt("Bitte geben Sie B ein: ");
			if (n < m)
			System.out.println("B ist groesser als A");
			else
			System.out.println("A ist groesser als B");
			break;}
		default:
        System.out.println("Falsche Auswahl!");
	}
}
		
		public static void main (String[] args){			//MAIN
		Fak f = new Fak();
		f.go();
		}
}

So sieht das bis jetzt aus. recht einfach berechnungen. aber ich will das er nach beendigung einer berechnung wieder ins menü springt. ich denke mir, da muss ich die switch/case anweisung entfernen und durch eine bessere variante ersetzen.
 

bambi

Bekanntes Mitglied
Um immer wieder ins Menue zurueckzuspringen wuerde ich an Deiner Stelle in der main einfach eine if- oder while-
Schleife einbauen. Wenn's Menue einmal durchgelaufen ist, dann fragst Du den user einfach, ob er neu starten will -
oder Du macht's eben immer automatisch... Wenn's weitergehen soll, dann rufst Du go() eben noch einmal auf...
 

Ollsen

Mitglied
naja, der gedanke (go()) ist mir auch schon gekommen, aber das ist doch nicht wirklich die sauberste art der programmierung... :autsch:
 

Ollsen

Mitglied
na das mit dem go() nochmal aufrufen...
gibt es denn nichts womit ich sage...du bist jetzt in zeile 100(bsp) und springst zu anweisung in zeile 50...?
wie würdet ihr go() unendlich bis zb tatstaureingabe wiederholen?

mom, hab gerade ne idee.... :idea:
 

bambi

Bekanntes Mitglied
Also da gibt's auch nix besseres als eine while-Schleife, die Du dann eben abbrichst, wenn Du Dein Menue beenden
willst. Also ein goto gibt's wie gesagt in Java nicht.
 

Wildcard

Top Contributor
bambi hat gesagt.:
Also da gibt's auch nix besseres als eine while-Schleife, die Du dann eben abbrichst, wenn Du Dein Menue beenden
willst. Also ein goto gibt's wie gesagt in Java nicht.
Es gibt kein Pascal-springe-zu-KonsolenzeichenXY goto,
Sprungmarken gibts aber sehr wohl! Ist allerdings keine Verbesserung, sonder so ziemlich der schlechtest denkbare Stil :wink:
 

Ollsen

Mitglied
Code:
	public void go(){
	int i, fak=1, init;
	char c;
	SimpleInput in = new SimpleInput();
		one:
		while (true) {
		System.out.println("   Auswahlmenue");
    	System.out.println("==================");
    	System.out.println("1 - Fakultaet von n");
    	System.out.println("2 - Schaltjahr");
    	System.out.println("3 - Groesser/Kleiner");
    	System.out.println("0 - Quit");
    	init = in.readInt("Auswahl: ");

    	switch (init) {
      	
      	case 1:{  	while (true){
        			n = in.readInt("Geben sie n zur Fakultaetsberechnung an: ");
					//n = Integer.parseInt(input);
		
				for (i = 1; i<=n; ++i){
				fak = fak * i;
				//System.out.println(fak);
									}
				System.out.println(n+"! = "+fak);
				c = in.readChar("Nochmal J/N? :");
				if (c == 'n') continue one;
				else continue;}
		}
so funzt es. aber ich verstehe nicht, warum das so falsch sein soll bzw warum man das schnellstmöglich vergessen sollte. ist doch eine nette option, gerade um die ganze konsolengeschichte etwas aufzupeppen.... :bae:

na los...erklärt ma!
und kommt nun bloß nicht mit dem argument, dass die struktur unübersichtlicher wird....die sprungmarken sind doch einfach zu verstehen und auch nachzuvollziehen..... :p

Ollsen
 

Wildcard

Top Contributor
Zunächst mal haben Sprungmarken nichts mit der Konsole zu tun, sondern dienen der Programmsteuerung.
'Aufpeppen' muss man die 'Konsolengeschichte' auch nicht, weil man sobald man die ersten Schritte hinter sich gelassen hat keine Konsolenanwendungen mehr macht.
Ollsen hat gesagt.:
na los...erklärt ma!
und kommt nun bloß nicht mit dem argument, dass die struktur unübersichtlicher wird....die sprungmarken sind doch einfach zu verstehen und auch nachzuvollziehen..... :p
Sprungmarken sind Kennzeichen der prozeduralen Programmierung und haben IMHO nichts in OOP zu suchen.
Es verbietet dir niemand diesen 'Missgriff' :wink: zu verwenden, aber es absolut unüblich.
Die meisten Java-Programmierer wissen gar nicht das es diese Möglichkeit in Java überhaupt gibt.
 

Ollsen

Mitglied
hmm, dass dies nix mit oop zu tun hat is schon klar, aber wie soll ich mein problem bitte sonst lösen?
ihr habt vohin gemeint, einfach die go()-methode wiederholen....aber wie?

na ich werde mir das ganze merken, is schon nett, dass sowas doch noch möglich ist.
Bye
 

Wildcard

Top Contributor
Code:
...
      case 'C':{ 
         n = in.readInt("Bitte geben Sie A ein: "); 
         m = in.readInt("Bitte geben Sie B ein: "); 
         if (n < m) 
         System.out.println("B ist groesser als A"); 
         else 
         System.out.println("A ist groesser als B"); 
         break;} 
      default: 
        System.out.println("Falsche Auswahl!"); 
   } 
    go();
}
Na so! Ist doch besser als ne Sprungmarke :wink:
Wie gesagt! Vergiss das wieder! Besonders wenn du nicht mit OOP angefangen hast, sondern aus dem prozeduralen Pascal kommst.
 

mic_checker

Top Contributor
Es ist kein schöner Programmierstil, Stichwort: Spaghetti Code ;)

Hin und wieder können Sprungmarken zwar ganz brauchbar sein, aber du solltest versuchen es zu vermeiden.

In deinem Fall würde ich das ganze in ne do..while Schleife packen, in der Bedingung überprüfen ob der User "0" eingegeben hat (zum Beenden) und gut is.
 

Ollsen

Mitglied
Wildcard hat gesagt.:
Code:
...
      case 'C':{ 
         n = in.readInt("Bitte geben Sie A ein: "); 
         m = in.readInt("Bitte geben Sie B ein: "); 
         if (n < m) 
         System.out.println("B ist groesser als A"); 
         else 
         System.out.println("A ist groesser als B"); 
         break;} 
      default: 
        System.out.println("Falsche Auswahl!"); 
   } 
    go();
}
Na so! Ist doch besser als ne Sprungmarke :wink:
Wie gesagt! Vergiss das wieder! Besonders wenn du nicht mit OOP angefangen hast, sondern aus dem prozeduralen Pascal kommst.

wenn ich das so compiliere, dann nimmt er nachdem er eine case-anweisung abgearbeitet hat, das default immer mit durch und ich bekomme eine "Falsche Ausgabe!".
also auch nicht so schick.

Code:
case 1:{  	while (true){
        			n = in.readInt("Geben sie n zur Fakultaetsberechnung an: ");
					//n = Integer.parseInt(input);
		
				for (i = 1; i<=n; ++i){
				fak = fak * i;
				//System.out.println(fak);
									}
				System.out.println(n+"! = "+fak);
				c = in.readChar("Nochmal J/N? :");
				if (c == 'n') go();
				else continue;}
}
da is das mit der if-abfrage am ende eines case schon besser, aber ob das so dolle is weiß ich auch nicht.
aber das funzt ohne probleme und ioch habe keine "fiesen" sprungmarken verwendet. :bae:

Ollsen
 
Status
Nicht offen für weitere Antworten.

Oben