// Übung 10 // Johann Gysin // 16.6.2001 #include // wegen scanf/printf #include // wegen strcpy #include // wegen tolower #include // wegen Clearscreen (clrscr) // Konstanten #define LaengeOrt 30 #define LaengeKlasse 10 struct SOrt { int Postleitzahl; char Ortsname[LaengeOrt]; float Preis; }; struct STicket { char Retour[LaengeKlasse]; char Klasse[LaengeKlasse]; char Halbtax[LaengeKlasse]; char Ortsname[LaengeOrt]; int Postleitzahl; float Preismultiplikator; float Preis; }; struct SGeld { int fuenfer; int zehner; int zwanziger; int fuenfziger; int einfraenkler; int zweifraenkler; int fuenfliber; }; void OrteDefinieren(struct SOrt *Ort); char OrtschaftErmitteln(struct SOrt *Ort, struct STicket *Ticket, int Postleitzahl); float GeldEinwurf(void); void AuswurfRueckgeld(float auswurfsbetrag); void DruckeTicket(struct STicket *Ticket); void main(void) { int i; char temp_str[30]; int eing_plz; char MenuAuswahl; char gueltig; char abbrechen = 0; SOrt Ort[30]; STicket Ticket; float eingeworfen = 0.0; do { clrscr(); printf("Virtueller Billetautomat\n"); printf("------------------------\n\n"); // Ortschaftstabelle füllen OrteDefinieren(Ort); do { do { printf("\nWohin moechtest Du? (Postleitzahl oder 0 fuer Liste) "); scanf("%d", &eing_plz); if (eing_plz == 0) { for (i=0; i<5; i++) { printf("\n%30s %d", Ort[i].Ortsname, Ort[i].Postleitzahl); } printf("\n"); } } while (eing_plz < 1); Ticket.Postleitzahl = eing_plz; // Ortschaft ermitteln if (OrtschaftErmitteln(Ort, &Ticket, Ticket.Postleitzahl) == 1) gueltig = 1; else gueltig = 0; if (gueltig == 0) printf("\nUnbekannte Postleitzahl.\n"); } while(gueltig != 1); printf("\nDu faehrst nach %s.\n", Ticket.Ortsname); printf("\nTicket-Grundpreis = Fr. %6.2f", Ticket.Preis); do { gueltig = 0; abbrechen = 0; printf("\n\nBitte Klasse auswaehlen:"); printf("\na) 1."); printf("\nb) 2."); printf("\ne) Abbrechen\n"); scanf("%c%c", &MenuAuswahl, &MenuAuswahl); MenuAuswahl = tolower(MenuAuswahl); switch (MenuAuswahl) { case 'a': Ticket.Preis = Ticket.Preis * 1.5; strcpy(Ticket.Klasse, "1."); gueltig = 1; break; case 'b': gueltig = 1; strcpy(Ticket.Klasse, "2."); break; case 'e': abbrechen = 1; break; } } while ((gueltig != 1) && (abbrechen != 1)); if (abbrechen != 1) { printf("\nNeuer Ticketpreis: Fr. %6.2f\n", Ticket.Preis); do { printf("\nWillst Du ein Retourticket?"); printf("\na) Ja"); printf("\nb) Nein"); printf("\ne) Abbrechen\n"); scanf("%c%c", &MenuAuswahl, &MenuAuswahl); MenuAuswahl = tolower(MenuAuswahl); switch (MenuAuswahl) { case 'a': Ticket.Preis = Ticket.Preis * 2; strcpy(Ticket.Retour, "Ja"); gueltig = 1; break; case 'b': gueltig = 1; strcpy(Ticket.Retour, "Nein"); break; case 'e': abbrechen = 1; break; } } while ((gueltig != 1) && (abbrechen != 1)); } if (abbrechen != 1) { printf("\nNeuer Ticketpreis: Fr. %6.2f\n", Ticket.Preis); do { printf("\nHast Du ein Halbtaxabo?"); printf("\na) Ja"); printf("\nb) Nein"); printf("\ne) Abbrechen\n"); scanf("%c%c", &MenuAuswahl, &MenuAuswahl); MenuAuswahl = tolower(MenuAuswahl); switch (MenuAuswahl) { case 'a': Ticket.Preis = Ticket.Preis * 0.5; strcpy(Ticket.Halbtax, "Ja"); gueltig = 1; break; case 'b': gueltig = 1; strcpy(Ticket.Halbtax, "Nein"); break; case 'e': abbrechen = 1; break; } } while ((gueltig != 1) && (abbrechen != 1)); } if (abbrechen != 1) { printf("\nDas Ticket kostet Fr. %6.2f", Ticket.Preis); do { eingeworfen = eingeworfen + GeldEinwurf(); if (eingeworfen < Ticket.Preis) printf("\nRestbetrag = Fr. %3.2f", Ticket.Preis - eingeworfen); else printf("\nRueckgeld = Fr. %3.2f", eingeworfen - Ticket.Preis); } while (eingeworfen < Ticket.Preis); if (eingeworfen != Ticket.Preis) AuswurfRueckgeld(eingeworfen - Ticket.Preis); } if (abbrechen != 1) { DruckeTicket(&Ticket); } // Programmende printf("\n\nZum beenden Return druecken..."); gets(temp_str); gets(temp_str); } while(1); } void OrteDefinieren(struct SOrt *Ort) { Ort -> Postleitzahl = 8126; Ort -> Preis = 8.50; strcpy(Ort -> Ortsname, "Zumikon"); Ort++; Ort -> Postleitzahl = 8127; Ort -> Preis = 9.50; strcpy(Ort -> Ortsname, "Forch"); Ort++; Ort -> Postleitzahl = 8000; Ort -> Preis = 5.20; strcpy(Ort -> Ortsname, "Zuerich"); Ort++; Ort -> Postleitzahl = 7015; Ort -> Preis = 12.0; strcpy(Ort -> Ortsname, "Tamins"); Ort++; Ort -> Postleitzahl = 8400; Ort -> Preis = 8.0; strcpy(Ort -> Ortsname, "Winterthur"); } char OrtschaftErmitteln(struct SOrt *Ort, struct STicket *Ticket, int PostleitzahlEingegeben) { int i = 0; while (i<(LaengeOrt-1)) { if ((Ort -> Postleitzahl) == PostleitzahlEingegeben) { strcpy((Ticket -> Ortsname), (Ort -> Ortsname)); (Ticket -> Preis) = (Ort -> Preis); return(1); } Ort++; i++; } return(0); } float GeldEinwurf(void) { char Wahl; printf("\n\nGeldeinwurf: \n"); printf("\na) Fuenffraenkler"); printf("\nb) Zweifraenkler"); printf("\nc) Einfraenkler"); printf("\nd) Fuenftiger"); printf("\ne) Zwanziger"); printf("\nf) Zehner"); printf("\ng) Fuenfer"); scanf("%c%c", &Wahl, &Wahl); Wahl = tolower(Wahl); switch (Wahl) { case 'a': return(5); case 'b': return(2); case 'c': return(1); case 'd': return(0.5); case 'e': return(0.2); case 'f': return(0.1); case 'g': return(0.05); default : return(0.0); } } void AuswurfRueckgeld(float auswurfsbetrag) { int anz_fuenfliber; int anz_zweifraenkler; int anz_einfraenkler; int anz_fuenfziger; int anz_zwanziger; int anz_zehner; int anz_fuenfer; // Berechnungen anz_fuenfliber = auswurfsbetrag / 5; auswurfsbetrag = auswurfsbetrag - (anz_fuenfliber * 5); anz_zweifraenkler = auswurfsbetrag / 2; auswurfsbetrag = auswurfsbetrag - (anz_zweifraenkler * 2); anz_einfraenkler = auswurfsbetrag / 1.0; auswurfsbetrag = auswurfsbetrag - anz_einfraenkler; anz_fuenfziger = auswurfsbetrag / 0.5; auswurfsbetrag = auswurfsbetrag - (anz_fuenfziger * 0.5); anz_zwanziger = auswurfsbetrag / 0.2; auswurfsbetrag = auswurfsbetrag - (anz_zwanziger * 0.2); anz_zehner = auswurfsbetrag / 0.1; auswurfsbetrag = auswurfsbetrag - (anz_zehner * 0.1); anz_fuenfer = auswurfsbetrag / 0.05; auswurfsbetrag = auswurfsbetrag - (anz_fuenfer * 0.05); // Ergebnisse anzeigen printf("\n\nRueckgeld\n---------\n"); printf("Fuenfliber: %5d\n", anz_fuenfliber); printf("Zweifraenkler: %5d\n", anz_zweifraenkler); printf("Einfraenkler: %5d\n", anz_einfraenkler); printf("Fuenfziger: %5d\n", anz_fuenfziger); printf("Zwanziger: %5d\n", anz_zwanziger); printf("Zehner: %5d\n", anz_zehner); printf("Fuenfer: %5d\n", anz_fuenfer); } void DruckeTicket(struct STicket *Ticket) { printf("\n -------------------------------------------------------"); printf("\n | JVV => Jogy's Verkehrsbetriebe |"); printf("\n | |"); printf("\n | TICKET nach %30s |", (Ticket -> Ortsname)); printf("\n | Klasse: %10s |", (Ticket -> Klasse)); printf("\n | Retour: %10s |", (Ticket -> Retour)); printf("\n | Halbtax: %10s |", (Ticket -> Halbtax)); printf("\n | |"); printf("\n | Preis: Fr. %6.2f |", (Ticket -> Preis)); printf("\n | |"); printf("\n -------------------------------------------------------"); }