GOOGLE ADS

Donnerstag, 28. April 2022

Gibt es eine einfachere Möglichkeit, diese 7 Arrays zu einem Array zu machen, das einfacher zu lesen und zu schreiben ist

Ich bin ziemlich neu in C++ und wurde beauftragt, ein Buchungssystem als Miniprojekt für die Schule zu erstellen. Es wäre großartig, wenn mir jemand helfen könnte, dieses Durcheinander zu beheben, das viel zu viele for-Schleifen für ein einfaches Buchungssystem ist, und mir sagen könnte, wie ich es irgendwie tun könnte Lassen Sie diese Arrays aus einer Textdatei lesen, damit sie die Zeiten ersetzen, wenn jemand bereits gebucht hat. vielen Dank im Voraus

void Booking()
{
string booked;
string timeBooked;
//Sets the week and time array
string Monday[11] = { "Monday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Tuesday[11] = { "Tuesday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Wednesday[11] = { "Wednesday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Thursday[11] = { "Thursday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Friday[11] = { "Friday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Saturday[11] = { "Saturday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
string Sunday[11] = { "Sunday:","8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
// Create and open a text file
ofstream MyFile("Booking.txt");
//Outputs a statment line for the day and time
cout << "Available Times for next weeks driving lessons:" << endl;
//runs through both day and time array to create a timetable of dates
for (int i = 0; i < 11; i++)
{
cout << Monday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Tuesday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Wednesday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Thursday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Friday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Saturday[i] << " ";
}
cout << endl;
for (int i = 0; i < 11; i++)
{
cout << Sunday[i] << " ";
}
cout << endl << endl;
bool valid = false;
while (valid == false)
{
//Asks the user to input their wanted day
cout << "Please select an available day you wish to book: ";
cin >> booked;
if (booked!= "Monday")
{
if (booked!= "Tuesday")
{
if (booked!= "Wednesday")
{
if (booked!= "Thursday")
{
if (booked!= "Friday")
{
if (booked!= "Saturday")
{
if (booked!= "Sunday")
{
cout << "Please enter a valid day" << endl;
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
else
{
valid = true;
}
}
valid = false;
while (valid == false)
{
cout << "Please enter the time you wish to book (Time am/pm E.g 2pm): ";
cin >> timeBooked;
for (int i = 0; i < 11; i++)
{
if (timeBooked == Monday[i])
{
valid = true;
if (booked == "Monday")
{
Monday[i] = "Unavailable";
}
else
{
if (booked == "Tuesday")
{
Tuesday[i] = "Unavailable";
}
else
{
if (booked == "Wednesday")
{
Wednesday[i] = "Unavailable";
}
else
{
if (booked == "Thursday")
{
Thursday[i] = "Unavailable";
}
else
{
if (booked == "Friday")
{
Friday[i] = "Unavailable";
}
else
{
if (booked == "Saturday")
{
Saturday[i] = "Unavailable";
}
else
{
if (booked == "Sunday")
{
Sunday[i] = "Unavailable";
}
else
{
}
}
}
}
}
}
}
}
}
}
for (int i = 0; i < 11; i++)
{
MyFile << Monday[i];
}
for (int i = 0; i < 11; i++)
{
MyFile << Tuesday[i];
}
}


Lösung des Problems

Ein nützliches Prinzip zur Vereinfachung von Code (in jeder Programmiersprache) ist:


  • Ersetzen Sie sich wiederholenden Code durch Daten


Variablennamen, wie Ihre Monday... SundayArrays sind Code. Sie können nicht über Code iterieren, aber Sie können über Daten iterieren, also ersetzen Sie sie durch

std::vector<std::string> days { "Monday", "Tuesday",..., "Sunday" };

Anstatt 7 identische Loops zu schreiben, können Sie jetzt einen einzigen schreiben

for (const auto& day: days) {
// print day and all the time slots
}

und anstatt 7 verschachtelte ifBlöcke zu schreiben, können Sie die Eingabezeichenfolge mit jedem Tag der Reihe nach vergleichen, wiederum mit einer Schleife.

Jetzt müssen Sie noch eine Liste der verfügbaren Slots pro Tag führen. Auch dafür brauchen Sie nicht sieben verschiedene Variablen:

using Slots = std::vector<std::string>;
Slots default_slots { "8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm" };
std::map<std::string, Slots> day_slots;
for (const auto& day: days) {
day_slots[day] = default_slots;
}

Wenn Sie nun sowohl den (validierten) Tag als auch den Slot haben, brauchen Sie nur noch etwas wie:

Slots& booked_slots = day_slots[booked];
auto i = std::find(booked_slots.begin(), booked_slots.end(), timeBooked);
if (i == booked_slots.end()) {
// don't recognize this time, or it isn't available, so go round again
}
else
{
*i = "Unavailable";
break; // we're done, so exit the loop
}

Ich mag es nicht, alle Ihre Werte als Strings zu speichern, anstatt beispielsweise die Tage aufzuzählen und ganzzahlige Stunden zu speichern, aber dies ist die kleinste Änderung an Ihrem ursprünglichen Code, die ihn einigermaßen vernünftig macht.

In ähnlicher Weise könnten Sie hier ersetzen vectordurch array- Ich wollte die Array-Längen einfach nicht eingeben, weil ich mich nicht für diese magischen Zahlen interessiere. Beide sind besser als die Verwendung von rohen Arrays und vectorgeben Ihnen die Möglichkeit, nicht verfügbare Zeitfenster zu löschen, anstatt nur die Zeichenfolge in „Nicht verfügbar" zu ändern (was Ihnen dann die Möglichkeit gibt, Tage herauszufiltern, für die keine Zeitfenster verfügbar sind).

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...