Limitierung des Input

Zön

Grünschnabel
Tach erst mal!

Ich habe folgendes Problem: Ich soll ein Programm zur Berechnung der Determinante einer 2x2 bzw 3x3 Matrix schreiben. Die Spezifikationen für Eingabe, Ausgabe und Fehlerbehandlung sind dabei folgende:

Eingabedaten:
Lesen Sie zuerst die Dimension der Matrix ein; diese darf nur 2 oder 3 sein.
Danach werden die Elemente der Matrizen eingelesen, und zwar in der Reihenfolge a11, ... , a1n, a21, ... , .... , ann.
Die einzelnen Elemente der Matrix sind vom Typ INTEGER.

Ausgabedaten:
Bei korrekten Eingabedaten geben Sie die Determinante der Matrix, gefolgt von einem Zeilenvorschub, aus.

Fehlerbehandlung:
Sämtliche Eingabedatensätze sind immer vollständig einzulesen. Generell wird bei fehlerhaften Eingabedatensätzen nur eine einzige Fehlermeldung erzeugt, weitere Berechnungen werden nicht mehr durchgeführt.

Enthält der Eingabedatensatz einen ungültigen Datentyp, so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub, ausgegeben werden.

Sind die Datentypen bei allen Eingaben richtig, die eingegebenen Daten aber inhaltlich nicht korrekt oder erfüllen nicht die Bedingungen (z.B. Dimension>3 oder zuwenige, bzw. zuviele Datensätze für die Matrix), so soll Ihr Programm "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.


Nun habe ich kein Problem damit das Programm an sich zu schreiben. D.h. es rechnet die Determinanten richtig aus, unterscheidet zwischen Rang 2 und Rang 3 und gibt alle Fehlermeldungen aus....bis auf eine:

Gebe ich die Elemente der Matrizen (im bereits ausführenden Programm selbstverständlich) in einer Zeile ein (d.h. getrennt durch ein Leerzeichen und nicht durch Betätitgen der ENTER-Taste), so gibt mir mein Programm keine Fehlermeldung, wie es sollte, sondern rechnet einfach mit den ersten Elementen und ignoriert die nicht benötigten schlicht.
Ich muss es also irgendwie bewerkstelligen die Anzahl der Input-Variablen zu limitieren bzw. bei zu vielen eine Fehlermeldung erzeugen und habe keine Ahnung wie ich das anstellen soll.

Wäre mehr als froh wenn mir da jemand weiterhelfen könnte, sitze nämlich schon eine ganze Weile daran und komme nicht weiter.

Danke!

P.S.: Ich hoffe doch die Infos waren ausreichend um das Problem zu erkennen.
 
Hallo!

Von welchem Datentyp sollen die Elemente der Matrix sein?
Integer oder int ?
Wie genau willst du die Matrix einlesen ...
Sollen alle Daten in einer Zeile stehen?

für eine 3x3 Matrix also ...
1 2 3 4 5 6 7 8 9

soll ergeben:

123
456
789

?

Wie soll eine typische "Session" aussehen?

So?

Code:
Geben  Sie den rang der Matrix ein: 3
Geben sie die Matrixelemente an: 1 2 3 4 5 6 7 8 9
Determinante: 0 

//Rechnung:
    A       B      C
1: 1	   2	   3		
2: 4	   5	   6
3: 7	   8	   9		

0 = A1*B2*C3-A1*C2*B3+B1*C2*A3-B1*A2*C3+C1*A2*B3-C1*B2*A3

Gruß Tom
 
Tach!

Die Daten sollen vom Typ int sein.
Bzgl. Einlesen: Es soll lediglich zuerst der Rang der Matrix (sprich 2 oder 3) und dann die einzelnen Elemente eingelesen werden, wobei alles in einer Zeile stehen bzw. eingegeben werden soll.
Sind die Elemente eingegeben und übersteigen in ihrer Zahl nicht die zugelassene Anzahl, so soll die Berechnung durchgeführt werden (was ja nicht das Problem ist), andernfalls soll eine Fehlermeldung erzeugt werden.

Korrekte Eingabe: 3 1 2 3 3 1 2 2 3 1 --> Ausgabe: 18
Inkorrekte Eingabe (zuviele Elemente): 3 1 2 3 4 5 6 7 8 9 10 -->Ausgabe: "Falsche Eingabe!"

Klingt recht simpel, habe aber keine Ahnung wie ich es bewerkstelligen soll eine beliebige Anzahl von Elementen einzugeben und diese abzuzählen.

Zön
 
Hallo!

Meinst du sowas?
Verwende einfach eine ArrayList als "dynamischen" Speicher...

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

/*
 * Created on 08.04.2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class CalDeterminant {

	public static void main(String[] args) {
		new CalDeterminant().doIt(args);
	}

	/**
	 * @param args
	 */
	private void doIt(String[] args) {
		// TODO Auto-generated method stub
		ArrayList list = new ArrayList();
		String line = null;
		BufferedReader br =
			new BufferedReader(new InputStreamReader(System.in));
		System.out.print("Eingabe: ");
		try {
			line = br.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		StringTokenizer st = new StringTokenizer(line, " ");
		while (st.hasMoreElements()) {
			list.add(st.nextElement());
		}

		int size = list.size();
		int detRang = Integer.parseInt((String) list.get(0));
		if (!(size - 1 == detRang * detRang)) {
			System.out.println("Falsche Eingabe");
		} else {
			System.out.println("Ergebnis: ");
			calcDeterminant(list, detRang);
		}

	}

	/**
	 * @param list
	 * @return
	 */
	private void calcDeterminant(ArrayList list, int rang) {
		// TODO Auto-generated method stub
		int size = list.size();
		int result = 0;
		int[][] tmp = new int[rang][rang];

		for (int i = rang - 1; i >= 0; i--)
			for (int j = rang - 1; j >= 0; j--)
				try {
					tmp[i][j] = Integer.parseInt((String) list.get(--size));
				} catch (NumberFormatException nfe) {
					System.out.println('?');
					return;
				}

		if (rang == 2)
			result = tmp[0][0] * tmp[1][1] - tmp[1][0] * tmp[0][1];
		if (rang == 3)
			result =
				tmp[0][0] * tmp[1][1] * tmp[2][2]
					- tmp[0][0] * tmp[1][2] * tmp[2][1]
					+ tmp[0][1] * tmp[1][2] * tmp[2][0]
					- tmp[0][1] * tmp[1][0] * tmp[2][2]
					+ tmp[0][2] * tmp[1][0] * tmp[2][1]
					- tmp[0][2] * tmp[1][1] * tmp[2][0];

		System.out.println(result);
	}
}

Gruß Tom
 
Hehe...das funktioniert auf jeden Fall mal.

Liegts nur noch daran, das alles zu verstehen. Mal sehen, was ein Grünschnabel wie ich da machen kann.

Danke auf jeden Fall!
 

Neue Beiträge

Zurück