Programm zur Notenkalkulation

ClarissaB

Grünschnabel
Hallo ihr lieben,

seit einiger zeit versuche ich mich in java einzuarbeiten. ich versuche hier und da ein bischen was zu programmieren um grundlegensten dinge nicht sofort wieder zu vergessen. habe allerdings keine vorkenntnisse in sachen programmierung und hoffe, etwas hilfe von euch zu bekommen.

momentan bin ich daran, ein minimales "programm" zu schreiben, welches mir eine textdatei ausließt und den inhalt berechnet. dabei handelt es sich um schulnoten. ich habe schulaufgaben(s), stegreifaufgaben(e) und mündliche noten(m). noten von 1-6. meine textdatei sieht folgendermaßen aus:

s1
m3
e5
-
s5
m6
e1

etc.

die schulaufgaben(s) sollten hier natürlich doppelt zählen hingegen die stegreifaufgaben(e) und die mündlichen noten(m) nur einfach. bisher bin ich schonmal soweit gekommen, dass mein programm zumindest die textdatei lesen und ausgeben kann:

Code:
import java.io.*;

public class TextFileReader {
	public static void main(String[] args){
	File f = new File(args[0]);
	try{
		FileReader fr = new FileReader(f);
		BufferedReader br =	new BufferedReader(fr);
		String zeile = br.readLine();
		while (zeile != null) {
			System.out.println(zeile);
  			zeile = br.readLine();}
  			
  		  
  		}catch(IOException ioe){
		System.out.println("Datei nicht vorhanden");}
}
}

klappt soweit ganz gut. nun müsste ich den ein- bzw ausgelesenen inhalt nach s, e oder m durchsuchen und die angehängten zahlen berechnen. könntet ihr mir dabei etwas helfen? am besten wären natürlich codebeispiele wenn sich jemand die mühe machen könnte. Zwar sehe ich extrem oft einzelne methoden, doch ohne anwendungsbeispiel bringen mich diese aber meist nicht weiter da ich nicht weiß, wie und wo ich sie anweden kann.

best regards
 
Hi,

mit charAt(int) kannst du ein einzelnes Zeichen aus einem String auslesen.
mit zeile.charAt(0) bekommst du beispielsweise die erste Stelle in der Zeile zurück. Diese kannst du dann auf den Buchstaben (s,m,e) überprüfen.
Mit zeile.charAt(1) kannst du dann logischerweise die Note als CHAR auslesen. Aber Vorsicht, in deinen Zwischenzeilen (-) sind keine Buchstaben an dieser Stelle und es kommt dann zu einen Fehler. Also vorher prüfen.

Damit solltest du erstmal weiterarbeiten können ;)
 
Ich hab da mal ne Frage... Wie bist du auf dein Format gekommen? Ich persönlich hätte ein anderes Format genommen, z.B. von csv-Dateien. Und wäre nicht schlecht zu wissen für welches Fach die jeweiligen Noten sind. Ich denke mal du hast da ne eigene Reihenfolge festgelegt, aber die könnte sich ja auch ändern und dann das Programm nochmal umschreiben?

Damit du weißt, was ich meine bezüglich des Formats:
Code:
Deutsch;s1;m3;e5
Mathe;s5;m6;e1
etc.

Das Semikollon ist nicht vorgeschrieben, aber das Komma oder Semikollon werden meist als Trennzeichen verwendet. Eine Zeile ist dabei genau ein Datensatz.

Das Einlesen sollte also sinnvollerweise zeilenweise geschehen, aber das ist bei dir ja bereits der Fall. Wenn du die Zeile eingelesen hast, dann kannst du mit
Java:
String[] datensatz = zeile.split(';');
die einzelnen Bestandteile des Datensatzes auseinanderbrechen. Das Ergebnis liegt dann in einem Array vor und das zu verarbeiten sollte relativ leicht sein.
 
Hallo,

schonmal danke an euch beiden für die raschen antworten.

zu matze:
genau sowas habe ich gesucht. klappt aber momentan nur bedingt. wenn ich zB zeile.charAt(1) auslese bekomme ich komischerweiße zweistellige ergebnisse. 49,53,50,54, etc. muss ich wohl noch ein wenig rumprobieren wie das genau funktionieren soll. ansonsten wäre das natürlich schonmal n guter start. kann ich die charAt methode auch für strings hernehmen? konnte den in charAt gefundenen wert bisher nur als int deklarieren.

zu akeshihiro:

danke für die anregung. natürlich ist das format noch nicht ausgereift. wollte es nur so einfach wie möglich halten.

Deutsch;s1;m3;e5
Mathe;s5;m6;e1

so wäre es natürlich super. aber mit arrays habe ich bislang noch nichts gemacht.
kannst du mir erklären was folgender code bezweckt?

Code:
 String[] datensatz = zeile.split(';');

wie kann ich mir das ergebnis vorstellen? deutschs1m3e5 und mathes5m6e1?
oder spaltet er die mit semicolon getrennten teile nachher immernoch auf?

danke :)
 
Zuletzt bearbeitet:
Ich habe vor kurzen (habe leider vergessen wo), ein ähnliches Beispiel gesehen, alleridngs wurden da die Daten in xml-Form abgelegt und mit entsprechenden Tools bearbeitet. Das XML sah übertragen etwa so aus:

Code:
<fach name="Deutsch">
	<bereich name="Schulaufgabe" wertigkeit="2">
		<zensur wert="1"></zensur>
		<zensur wert="3"></zensur> 
	</bereich>
	<bereich name="Muendlich" wertigkeit="1">
		<zensur wert="2"></zensur>
	</bereich>
</fach>

Edit: Ich denke die anderen Varianten reichen für deine Zwecke vollkommen aus. Allerdings kenne ich aus meiner Schulzeit, dass eine Schulaufgabe nicht unbedingt genauso viel Wert war, wie eine Schulaufgabe aus einem anderen Fach. Das gleiche gilt z.B. auch für mündliche Noten. In der XML-Datei wäre soetwas besser strukturiert, erweiterbar und veränderbar.

zu matze:
genau sowas habe ich gesucht. klappt aber momentan nur bedingt. wenn ich zB zeile.charAt(1) auslese bekomme ich komischwer weiße zweistellige ergebnisse. 49,53,50,54, etc. muss ich wohl noch ein wenig rumprobieren wie das genau funktionieren soll. ansonsten wäre das natürlich schonmal n guter start. kann ich die charAt methode auch für strings hernehmen? konnte den in charAt gefundenen wert bisher nur als int deklarieren.

Du bekommst so den ASCII-Index des Zeichens.
Siehe http://www.cs.utk.edu/~pham/ascii_table.jpg , da siehst du, dass 49-54 1-6 entsprechen.
Probier das Zeichen mal auf int zu casten oder ähnliches.
 
Zuletzt bearbeitet:
Wenn du den Umgang mit Arrays noch nicht beherschst, dann solltest du mal hier nachschaun. Übrigens ist Javainsel ein gutes Nachschlagewerk und zum Lernen auch gut geeignet.

Was macht folgender Code:
Java:
String[] datensatz = zeile.split(';');
Eigentlich ganz simpel... Also wie schon gesagt, du liest ja die Datei zeilenweise ein. Diese Zeile steht bei dir dann in der Variable zeile drin.

Diese Zeile wird dann gesplittet und als Kriterium hab ich halt das Semikollon genommen, weil es ja das Trennzeichen für die Datensatz-Bestandteile ist. Ich hab ja auch gesagt, dass der Datensatz quasi auseinandergebrochen wird.

Ein Array ist eine Ansammlung von Daten des selben Typs, man nennt Arrays auch oft Felder. Jedes Feld in dem Array hat natürlich einen Index, damit man das Feld identifizieren kann. Dabei beginnt der Startindex bei 0 (nicht bei 1).

Das heißt der erste Datensatz würde dann wie folgt aussehen:
Index => Wert/Inhalt
0 => Deutsch
1 => s1
2 => m3
3 => e5

Um auf das Array zuzugreifen brauchst du also den Index.
Eine Beispielausgabe könnte so aussehen:
Java:
System.out.println("Fach: " + datensatz[0]);
System.out.println("Schulaufgaben: " + datensatz[1]);
System.out.println("Mündliche Note: " + datensatz[2]);
System.out.println("Stehgreifaufgaben: " + datensatz[3]);

Wie gesagt, um mit Arrays umgehn zu können solltest du dir die Arrays in der Javainsel anschaun.
 
klappt aber momentan nur bedingt. wenn ich zB zeile.charAt(1) auslese bekomme ich komischwer weiße zweistellige ergebnisse. 49,53,50,54, etc.

Moin,

das klappt schon perfekt :p
Deine zweistelligen Werte sind die decimale ASCII-Repräsentation der Ziffern:

Ziffer dezimal
1 49
2 50
3 51
usw.

Gilt für Buchstaben entsprechend
Buchstabe dezimal
a 97
b 98
A 65
B 66
usw.

Ich weiß nun nicht genau, wie Du die Werte ausliest und was Du damit machst ....
Du könntest u. U. versuchen die Werte mit der Funktion itoa zu konvertieren oder Du ziehst als Workaround bei den Ziffern der von Dir genannten Werte immer 48 ab !!

Gruß
Klaus
 
Zuletzt bearbeitet:
das mit den arrays hört sich echt gut an. so wäre alles aufgeräumt und ich hätte keine probleme mehr darauf zuzugreifen. danke für den link, werd gleich nachlesen wie das funktioniert. nur habe ich ein kleines problem mit String[]:

\xxx\xxx\xxx\: cannot find symbol

symbol : method split(char)
location: class java.lang.String
String[] datensatz1 = zeile.split(';');


hab gelesen, dass die methode erst ab JDK 1.4 verfügbar ist -> hab die aktuellste, sollte also nicht das problem sein. hab ich einen flüchtigkeitsfehler drinnen oder muss ich dafür ein spezielles "packet" importieren?
 
Hab mal nen Beispiel gemacht...
Java:
public class Split {
	public static void main(String[] args) {
		String str = "Deutsch;s1;m3;e5";
		
		String[] arr = str.split(";");
		System.out.println("Fach: " + arr[0]);
		System.out.println("Schulaufgaben: " + arr[1]);
		System.out.println("Mündliche Note: " + arr[2]);
		System.out.println("Stehgreifaufgaben: " + arr[3]);
	}
}

Ausgabe:
Fach: Deutsch
Schulaufgaben: s1
Mündliche Note: m3
Stehgreifaufgaben: e5

Sollte also eigentlich funktionieren...

EDIT:
Achso, ja sry, mein Fehler...

Anstatt
Java:
String[] arr = str.split(';');
lieber so
Java:
String[] arr = str.split(";");
Die split()-Methode erwartet einen String und kein Char -.-
 
Zuletzt bearbeitet:
Ich muss hier mal was dazwischen werfen:
Noten sind eine ganzheitliche pädagogische Entscheidung und nicht arithmetische Berechnung.
 

Neue Beiträge

Zurück