0 Daumen
141 Aufrufe

Halloo, mein Code funktioniert irgendwie nicht! Mir wird der falsche Preis ausgegeben!
Kann mir jemand helfen? Danke im Voraus!


Aufgabenstellung:

Das Ferienzimmer kostet

am Wochenende (Sa und So) 100 Euro.
an einem Wochentag (Mo bis Fr) 80 Euro.
an einem Feiertag erhöht sich der Tagespreis um 10 Prozent.
Randbedingungen und Programmdetails
Entwerfen und implementieren Sie ein C++-Programm, das die Buchung des Ferienzimmers am PC ermöglicht. Dazu wird vom Nutzer zunächst das Datum des ersten Tages und danach das Datum des letzten Tages eingegeben. Sowohl der erste als auch der letzte Tag müssen vollständig vom Nutzer bezahlt werden. Jedes Datum ist eine 7 bzw. 8-stellige ganze Zahl.

Falls das Zimmer im angegebenen Zeitraum frei ist, soll der Gesamtpreis für den Aufenthalt angezeigt werden. Nun hat der Nutzer die Wahl, die Buchung vorzunehmen. Bestätigt er die Buchung, wird das Zimmer reserviert.
Ist das Datum nicht frei, bei Ablehnung der Buchung und nach Abarbeitung einer erfolgreichen Buchung soll der Nutzer gefragt werden, ob er ein neues Datum wählen möchte.
Das Programm soll einen Buchungszeitraum vom 01.01.2024 bis 30.06.2024 bereitstellen. Zu Beginn des Programms ist das Zimmer an keinem Tag belegt.
Um die entsprechenden Preise berechnen zu können, erhalten Sie eine Datei mit dem Namen kalender.txt. Darin enthalten sind alle Kalendertage vom 01.01.2024 bis 30.06.2024 mit dem jeweiligen Datum als 7 bzw. 8-stellige Zahl, die Information, ob ein Tag ein Feiertag ist (1: Feiertag; 0: kein Feiertag) und der Angabe zum Wochentag (Mo, Di, Mi, Do, Fr, Sa, So). Lesen Sie alle Daten der Datei ein und speichern diese in 1 Feld.
Geben Sie nach erfolgreicher Buchung alle Tage aus (Wochentag, Datum TT.MM.JJJJ), Feiertag), an denen eine Buchung für das Zimmer vorliegt.
Verwenden Sie ausschließlich die Bibliotheken iostream und fstream.

kalender.txt: ausschnitt

1012024 1 Mo
2012024 0 Di
3012024 0 Mi
4012024 0 Do
5012024 0 Fr
6012024 0 Sa
7012024 0 So
8012024 0 Mo
usw


Mein Ansatz:

#include <iostream>
#include <fstream>

using namespace std;

struct Tag {
  long Datum;
  bool Feiertag;
  char Wochentag[3];
  bool gebucht;
};

const int TageGesamt = 182;

int preis(bool Wochenende, bool Feiertag);

void printBookingDates(Tag kalender[], int ersterTag, int letzterTag);

int main() {
  Tag kalender[TageGesamt];

  ifstream datei("C:\\Users\\....\\kalender.txt");
  if (!datei) {
      cerr << "Fehler beim Oeffnen von kalender.txt" << endl;
      return 1;
  }

  // Daten aus der Datei einlesen
  for (int i = 0; i < TageGesamt; ++i) {
      datei >> kalender[i].Datum >> kalender[i].Feiertag >> kalender[i].Wochentag;
      kalender[i].gebucht = false;
  }

  datei.close();


  // Benutzereingabe für den Buchungszeitraum
  long ersterTag, letzterTag;
  char neueBuchung;

  do {
      cout << "Geben Sie den ersten Tag der Buchung (TTMMJJJJ) ein: ";
      cin >> ersterTag;
      cout << "Geben Sie den letzten Tag der Buchung (TTMMJJJJ) ein: ";
      cin >> letzterTag;

      // Buchung überprüfen und Gesamtpreis berechnen
      int gesamtPreis = 0;
      for (int i = 0; i < TageGesamt; ++i) {
          if (kalender[i].Datum >= ersterTag && kalender[i].Datum <= letzterTag) {
              bool Wochenende = (kalender[i].Wochentag[0] == 'S' && kalender[i].Wochentag[1] == 'a' || kalender[i].Wochentag[1] == 'o');
              int preisTag = preis(Wochenende, kalender[i].Feiertag);

              if (kalender[i].gebucht) {
                  cout << "Tag " << kalender[i].Datum << " ist bereits gebucht!" << endl;
              } else {
                  kalender[i].gebucht = true;
                  gesamtPreis += preisTag;
              }
          }
      }

      // Gesamtpreis ausgeben
      cout << "Gesamtpreis: " << gesamtPreis << " Euro" << endl;

// Funktion, um gebuchte Tage auszugeben
      printBookingDates(kalender, ersterTag, letzterTag);

      cout << "Möchten Sie eine neue Buchung vornehmen? (J/N): ";
      cin >> neueBuchung;

  } while (neueBuchung == 'J' || neueBuchung == 'j');

  return 0;
}

int preis(bool Wochenende, bool Feiertag) {
  const int wochenTagPreis = 80;
  const int wochenendPreis = 100;
  const double feiertagsAufschlag = 0.1;

  int grundPreis = Wochenende ? wochenendPreis : wochenTagPreis;
  if (Feiertag) {
      return static_cast<int>(grundPreis * (1 + feiertagsAufschlag));
  } else {
      return grundPreis;
  }
}

// Funktion, um die gebuchten Tage auszugeben
void printBookingDates(Tag kalender[], int ersterTag, int letzterTag) {
  cout << "Gebuchte Tage:" << endl;
  for (int i = ersterTag; i <= letzterTag; ++i) {
      if (kalender[i].gebucht) {
          cout << kalender[i].Wochentag << kalender[i].Datum << " (TT.MM.JJJJ)" << endl;
      }
  }
}

Avatar von

1 Antwort

0 Daumen
Mir wird der falsche Preis ausgegeben!

Gib an bei welcher Eingabe das passiert.

Falls das Zimmer im angegebenen Zeitraum frei ist, ...

Ich fasse das so auf, dass das Zimmer an jedem einzelnen Tag im angegebenen Zeitraum frei sein soll.

Wenn ich das Zimmer vom 1. bis zum 20. Juni haben will, dann werde ich mich nicht damit zufrieden geben, dass das Zimmer lediglich vom 1. bis zum 13. Juni und vom 15. bis zum 20. Juni verfügbar ist. Stattdessen werde ich mir für den gesamten Zeitraum eine andere Bleibe suchen.

kalender[i].Wochentag[0] == 'S' && kalender[i].Wochentag[1] == 'a' || kalender[i].Wochentag[1] == 'o'

Erkundige dich über die Vorrangregeln der Operatoren.

kalender[i].Datum >= ersterTag && kalender[i].Datum <= letzterTag

Das Format TTMMJJJJ ist nicht dazu geeignet, mittels numerischem Vergleich zu prüfen, ob ein gegebenens Datum in einem gegebenen Zeitraum liegt. Zum Beispiel ist

20012024 >= 1022024 && 20012024 <= 25022024

trotzdem liegt der 20. Januar 2024 nicht zwischen dem 1. Februar 2024 und dem 25. Februar 2024

cout << "Geben Sie den ersten Tag der Buchung (TTMMJJJJ) ein: ";
cin >> ersterTag;

Mache dir klar, wie jetzt der Inhalt der Variable ersterTag interpretiert wird.

// Funktion, um gebuchte Tage auszugeben
printBookingDates(kalender, ersterTag, letzterTag);

Erinnere dich daran, wie der Inhalt der Variable ersterTag interpretiert wird.

for (int i = ersterTag; i <= letzterTag; ++i)
{
if (kalender[i].gebucht) {
// ...
}
}

Mich wundert es ein wenig, dass du die allgemeine Schutzverletzung nicht erwähnt hast.

Avatar von 5,6 k

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

2 Antworten
0 Antworten
Gefragt 30 Jan 2022 von Susannne
0 Antworten
Gefragt 17 Dez 2021 von lisa112

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community