Java Pseudo-Code lesen

insXicht

Lt. Commander
Registriert
Mai 2011
Beiträge
1.087
Hi,

ich hab folgendes Problem, ich hab etwas Pseudo-Code bekommen und soll das jetzt in Java-Code umwandeln.
Java bereitet mir eigentlich keine Schwierigkeiten, nur bin die totale Null im Pseudo-Code lesen.
Kann mir jemand auf die Sprünge helfen ?

Code:
INTERFACE Date[day, month, year]
QUERIES
max day(IN month, year: INTEGER):INTEGER
is valid date(IN day, month, year: INTEGER):BOOLEAN
ACTIONS
set(IN day, month, year: INTEGER)
pass()
 
Sorry aber das ist nichtmal Pseudo-Code, siehe auch http://de.wikipedia.org/wiki/Pseudocode

Ich tippe mal du sollst eine eigene Klasse Date erstellen und entsprechende Methoden implementieren. Was ACTIONS oder pass() machen soll ist mir aber nicht so ganz klar. Zumindest sind die Signaturen einigermassen angeben von den Methoden.

Oder vielleicht soll das auch Interface sein welches deine Klasse implementieren muss? Vielleicht liest du dir den gesamten Hausaufgabenzettel noch einmal durch?
 
Entwerfe und implementiere eine Klasse fur das Tagesdatum wie '22.3.2013'
in allen funf Sprachen (#, C++, EIFFEL, Component Pascal und Java).
Halte dich an die folgende Entwurfsskizze der Schnittstelle.


Mehr Infos gibts leider nicht.
 
Ist das ein Filter für unmögliche Daten ? Wie 31.2.2010 ?
 
Das ist kein Pseudocode, sondern irgendeine Form von Beschreibungssprache ... Für wasauchimmer. Eventuell sogar offiziell und es verirrt sich hierher einer, der das kennt.

Was ich daraus lesen kann:

Interface Date[day,month,year] => Class Date {private int:day,month,year}
QUERIES dürfte die abfragen darstellen, also nichtmanipulative methoden.
also ist max_day eine methode (vermutlich gibt die den höchsten tag aus. z.B. max_day(2,2011) = 28, weil der februar 2011 28 tage hatte)
und valid_date ist eine methode (gibst nen datum ein und kriegst als bool zurück, ob das passt)
danach kommt ja ACTIONS, was manipulative methoden darstellen
set(day,month,year) setzt also das datum der klasse auf einen bestimmten wert.
pass() dürfte den code einfach nur abschließen.

Was sich dabei an offenen Fragen ergeben: Die Attribute private? Dann kann man sie nicht lesen. Wäre ja sinnlos ... Aber die Attribute public? Dann wäre die set-methode Blödsinn. Bedeutet pass() wirklich nur, dass der Code abgeschlossen wird, oder ist das eventuell nen gleichtypisierter konstruktor? Fragen über Fragen ... aber vlt hilft das ja schonmal weiter.

Und sorry für die Formatierung, mir is auf die Schnelle nix übersichtlicheres eingefallen^^


Nachtrag: Eventuell könnte pass() auch einfach nur den Tag um eins erhöhen, weil ein "day" ja auch "passen" kann ... englisch und so. Stellt sich noch immer die Frage, wie man den Käse auslesen soll. Ich würd die Attribute aber nach kurzem Überlegen einfach public machen, auch wenn Setter für publics ziemlich Banane sind.
 
Zuletzt bearbeitet:
Danke schonmal, das hilft etwas.

So ein Schwachsinn :)
 
Wie mans nimmt. Die Aufgabe selbst ist irgendwo sinnvoll (in der Lehre!). Die Schnittstellenbeschreibung nur etwas ... fragwürdig. Ich hätte mich da eher an Pseudocode, oder an eine der aufgeführten Sprachen gehalten. Aber gewöhn dich schonmal dran, dass bei vielen Aufgabenstellungen die Aufgabenstellung zu verstehen das schwierigste ist :D
 
Ich verstehe auch nicht warum man nicht einfach einen Fließtext dazu erstellt, sowas wäre 100mal leichter zu verstehen als so ein pseudo scheiss.

EDIT: Wie weit verbreitet ist eigentlich Eiffel?
 
Ich hab es für Java jetzt mal folgendermaßen umgesetzt, ich denke das sollte so passen.

Code:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date {

	private int day;
	private int month;
	private int year;
	final static String DATE_FORMAT = "dd-MM-yyyy";

	public int maxDay() {

		int days = 0;
		switch (this.month) {

		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;

		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;

		case 2:

			if (!(this.year >= -45 && (this.year % 4 == 0 && (this.year % 100 != 0 || this.year % 400 == 0)))) {
				days = 28;
				break;
			}

			else {
				days = 29;
				break;
			}
		}
		return days;

	}

	public boolean validDate() {

		String date = this.day + "-" + this.month + "-" + this.year;
		try {
			DateFormat df = new SimpleDateFormat(DATE_FORMAT);
			df.setLenient(false);
			df.parse(date);
			return true;
		} catch (ParseException e) {
			return false;
		}
	}
	
	public void setDate(int day, int month, int year) {
		this.day = day;
		this.month = month;
		this.year = year;
	}

}
 
Jetzt mal unabhängig vom eigentlich Code, hast du dich nicht an das Protokoll (die Spezifikation) gehalten.

Deine Methode heißt 'public boolean validDate()' du solltest aber 'public booelan isValidDate(int day, int month, int year)' schreiben.

Auch bei maxDay() hast du keine Parameter...bist du sicher das du weisst was du tust?

P.S. Schreib dir doch (in einer anderen Klasse) eine main Methode die ein paar Tests ausführt - sprich neue Instanzen von deiner Klasse erstellt, diese mit sinnvollen (oder am besten auch mit nicht sinnvollen) Werten bestückt und vergleichst ob das Ergebnis so ist wie du es dir vorgestellt hast. Am besten du liest du dich mal in jUnit bzw. Unit Tests ein, aber eine main Methode mit ein paar System.out.print ist für den Anfang auch ganz praktisch.
 
Zuletzt bearbeitet:
Das leuchtet mir schon ein, aber es ist doch Käse mit dem Setter die Werte zu setzen und nicht mit ihnen zu arbeiten. Wozu brauch ich die Variablen day, month, year wenn die zwei Methoden nicht mit diesen arbeiten sondern selbst welche übergeben bekommen...
 
Lies dir das mal durch: http://openbook.galileocomputing.de/javainsel9/javainsel_05_003.htm
Du willst anscheinend maxDay() als statische Methode nutzen, also auf eine vorhandene Instanz von deiner Klasse, ala Date.maxDay() - was jetzt auch nicht wirklich Sinn ergibt. Du sollst der Methode laut Spezifikation einen Monat und ein Jahr übergeben und dann einen int Wert zurückbekommen, wieviele Tage dieser Monat hat.

Und es kommt halt darauf an ob du Date.isValidDate() == true machen willst oder ob du isValidDate(45,12,99) == true vergleichen willst.
 
Genau, die Methoden, die unter Queries stehen, sind klassischerweise statische Methoden, da zur Erfüllung der Aufgabe dieser Methoden keinerlei Bezug zu einer Objektinstanz gebraucht wird.

Die anderen beiden methoden sind Methoden, die die Instanzdaten manipulieren, die erste, in dem direkt die Zahlenwerte übergeben werden und die zweite würde ich vermuten, sollte einen String parsen, wobei da der Input Parameter im Pseudocode fehlt....

Gut gedacht die Aufgabe, aber bescheiden umgesetzt würde ich sagen, evtl. vom jemanden der die Materie auch nicht so ganz durchblickt?!? :)
 
Zurück
Oben