Hilfe für Schulaufgabe

derhoeppi

Grünschnabel
Hallo
Ich schilder mal folgendes Problem. In der Berufsschule sollen wir ein konsolenbasiertes Programm schreiben mit Hilfe von Visual Studio.net 2003 für ein Hotel xyz mit 9 Zimmern, wovon auf der ersten Ebene 4 Zimmer und auf der zweiten und dritten Ebene jeweils drei Zimmer sind.
Dieses Programm soll folgendes können: Der Hotelier soll nachschauen können, ob diese Zimmer belegt sind. Danach soll er buchen können, so dass das Zimmer belgt sind- klar.

Dieses Problem habe ich auch gelöst indem ich mir eine Datei anlege in der ich die Reservierung reinschreibe. Nun habe ich allerdings ein Problem, dass ich nicht gelöst bekomme. Ich soll nun das Programm so umschreiben, dass ich nicht nur für einen Tag sondern für zehn Tage buchen kann. Jedoch soll es einfachhalthabler, so sein, dass immer nur für eine Übernachtung gebucht wird.

So lasse ich die Datei erzeugen.
Code:
struct hotel
	{
		int bett;			// Zustellbett vorhanden
                  int etage;		// Geschoss
		int personen;		// Anzahl Persohnen in einem DZ
		int nummer;		// Zimmer Nummer
	}       zimmer[8];

void neudb()
{
	int i;
	
	zimmer[0].nummer = 1;
	zimmer[1].nummer = 2;
	zimmer[2].nummer = 3;
	zimmer[3].nummer = 4;
	zimmer[4].nummer = 5;
	zimmer[4].etage = 1;
	zimmer[5].nummer = 6;
	zimmer[5].etage = 1;
	zimmer[6].nummer = 7;
	zimmer[6].etage = 1;
	zimmer[7].nummer = 8;
	zimmer[7].etage = 2;
	zimmer[8].nummer = 9;
	zimmer[8].etage = 2;

	for(i=0;zimmer[i].nummer <=8;i++)
	{
		zimmer[i].bett=0;
		zimmer[i].personen=0;
	}
	
	ofstream fin("daten.dat");
	for(i=0;i<=8;i++) fin.write((char*) &zimmer[i], sizeof zimmer[i]);
	fin.close();

Und so sieht meine Funktion für die Buchung aus.

Code:
void buchungen()
{
int i,j,k,l;

cout << endl;
cout << endl;

cout <<"Im Welchen Geschoss soll sich das Zimmer befinden (Erdgeschoss=1,Obergeschoss=2,Dachgeschoss=3)"<<endl;
cin >> l;
l=l-1;
cout << "Dort sind folgende Zimmer frei"<< endl;

for(i=0;i<=8;i++)
	{
		if ((zimmer[i].personen == 0)&&(zimmer[i].etage==l)) cout << " Das Zimmer mit der Nummer: " << zimmer[i].nummer << " ist frei." << endl;
	}

cout <<"In welchem Zimmer wollen sie eine Buchung vornehmen?"<<endl;
cin>>j;

cout<<"Wieviele Personen?" << endl;
cin>>k;

for(i=0;i<=8;i++)
{
	if(zimmer[i].nummer ==j) zimmer[i].personen=k;
}

cout << endl;
cout << endl;
system ("pause");
}

Wie schaffe ich es nun, dass dieses Programm für zehn Tage funktioniert und nicht nur für einen?
 
hi, erweitere die Struktur einfach noch um eine Variable, um den Tag zu speichern (um genau zu sein, in wie vielen Tagen -> Heute = 0; Morgen = 1; .....) . Bei der Buchung bzw. dem nachschauen ob frei ist muss der dann natürlich auch überprüft werden

Code:
struct hotel
	{
		int bett;			// Zustellbett vorhanden
                  int etage;		// Geschoss
		int personen;		// Anzahl Persohnen in einem DZ
		int nummer;		// Zimmer Nummer
                int tag;
        }	        zimmer[8];


das Funktioniert dann sogar für Jahre im vorraus. Nur musst du dann noch ne Funktion schreiben, die am Ende eines Tages aufgerufen wird. Sie muss dann immer 1 vom Tag abziehen (bei jedem Zimmer)


Was mich noch verwirrt ist das mit den Zimmer. Du hast Zimmer[8], d.h 8 Zimmer, in der Aufgabe schreibst du es sind 9 und dann steht da 4 für die erste und 2*3 für die nächsten Etagen. Das wären dann 10.....
 
Ja Sorry das war mein Fehler mit der Zimmerangabe. Es sind nur 8 Zimmer, da wenn ich dort neun eintrage, trägt er auch nur acht ein und wenn man da zehn einträgt, hat er zehn Zimmer. Ist voll kompliziert und mein Lehrer wusste auch keinen Rat, deshalb darf ich es bei acht Zimmern belassen.
Das mit dem hinzufügen der Variable Tag hab ich mir auch schon überlegt nur leider, hab ich dann genau das Problem mit der Funktion die immer am Ende eines Tages einen Tag abzieht.
Hast du vielleicht eine Idee, wie diese Funktion aussehen könnte?
 
also das sollte kein Prob sein.

Eine möglichkeit wäre (dazu muss ne neue Datei angelegt werden):

1. Den ersten Eintrag laden
2. Eintrag.tag -= 1;
3. Eintrag in die neue Datei schreiben

4. das ganze mit dem 2. Eintrag nochmal
...bis alle durch sind
5. alte Datei löschen, die neue Datei so benennen wie die alte und es sollte gehen

Das ist nur eine von vielen Möglichkeiten. So wäre es auch möglich alles in den Speicher zu laden, oder auch in der Datei rumzuspringen. Die hier scheint mir aber die simpelste zu sein.
 
Ich würde sagen ich mach es erstmal so ohne das er am folgenden Tag immer eins abziehen muss, da es sich für mich zu kompliziert anhört.
In der Struktur hab ich den Tag als Variable eingefügt, aber wie schaff ich es jetzt, dass ich den Tag auch anwählen kann. Aus meiner main() Funktion lass ich den Tag via cin eingeben und über geb in dann an die Funktion buchungen();. Das Funktionier auch soweit, jedoch wie schaff ich es jetzt, dass er mir die buchung auch wirklich nur für diesen Tag ablegt und nicht an einem anderen?
Denk ich da richtig, wenn ich es mit
Code:
zimmer[i].tag=tag;
versuche. Die Variable die ich über die main() Funktion einlese heißt im übrigen auch tag. Funktioniert diese Übergabe hier richtig? Kannst du mir vielleicht an meiner Funktion buchungen() das erklären?
Bin gerade wie auf den Kopf gefallen, aber momentan raff ich es einfach nicht.
 
Ich denke mal du hast es in der art
Code:
void buchen(..., int tag,...)
{
  ....

   zimmer[i].tag = tag;

wenn ja, stimmts
 
Ja so hab ichs gemacht.
Du bist also der Meinung es müsste so funktionieren?

Es ist doch eigentlich auch egal wo
Code:
zimmer[i].tag=tag
in der Funktion steht oder - ich meine ob nun in der Schleife oder direkt nach eröffnung der Funktion. Ich hab es nämlich direkt an den Anfang der Funktion geschrieben und so mag es aber nicht funktionieren.
Problem ist er unterscheidet noch nicht nach den Tagen, sonder schriebt alles noch beim ersten mit rein.
 
Zuletzt bearbeitet:
Es ist egal, wo das in der Funktion steht, am Anfang ist wohl die beste position.

Zu deinem Problem, ich glaube du speicherst immer noch so, wie zuvor ohne das mit den Tagen.

Also in der Datei steht einfach nur zimmer[0] bis zimmer[7] hintereinander. Das geht natürlich nicht mehr, du musst wenn zB. zimmer[0] ein zweites mal gebucht wird (für einen andren Tag) einen andren speicherort haben als zimmer[0] sonst überspeicherst du das. Mir is eben ne Idee gekommen, wie du auf zimmer::tag verzichten kannst.

Wie wärs, wenn du einfach zimmer[8][10]; , so dass das erste wie gehabt die Zimmernummer is und das zweite der Tag (so kannst du int tag; aus der Struktur entfernen). Das sollte insgesammt einfacher werden. So ist auch das Laden und Speichern wieder einfacher. Und die Funktion, die am Ende vom Tag aufgerufen wird machst nichts andres als

C:
for(int i = 0; i < 8; i++)
 for(int j = 0; j < 9; j++)
   zimmer[i][j] = zimmer[i][j+1]
 
Für was steht bei dir die Variable j, weil die hab ich in der Funktion Buchung schon für die Zimmernummer verwendet.
 
derhoeppi hat gesagt.:
Für was steht bei dir die Variable j, weil die hab ich in der Funktion Buchung schon für die Zimmernummer verwendet.
Ich hab das von oben mal ausprobiert, jedoch bringt er verständlicher weise auch einen Fehler. Weil bei dem zimmer.xyz handelt es sich doch um eine Strucktur und die geht doch nicht zweidimensional zu machen oder?

Wenn du es erlaubst schick ich dir auch mal das ganze Prog, dann kannst du da mal reinsehen.
 
Zurück