C if-Addition

Introscan

WEBSTYLE
ID: 479262
L
26 März 2008
975
78
Hallo
ich lerne gerade C und bin vor einem problem und zwar:
AUFGABE:
Schreiben Sie ein Programm, das vom Benutzer die gewünschte Entfernungsstufe und
die Anzahl der Personen abfragt und daraus den Preis einer entsprechenden Fahrkarte
berechnet und am Bildschirm anzeigt!

PROBLEM:
Erweitern Sie das Programm mit Hilfe von Feldern für bis zu 1000 Preisanfragen so, dass nach der letzten Preisanfrage am Ende des Programmlaufs eine Liste aller Preisanfragen mit laufender Nummer, entfernungsstufe, Personenzahl und Preis mit abschließender Summenzeile ausgegeben wird.

bei mir seht es bisher so aus
ich würde gerne wissen wie ich den endpreis wieder mit neuem kobinationen addieren kann
:( ich komme leider nicht mehr weiter :( kann mir bitte jemand helfen?

Code:
#include <stdio.h>
#include <math.h>

main() {
int stufe,j;
double e,ent,endpreis=0.0,;

printf("\nEntfernungsstufe 1 : 2.20 Euro");
printf("\nEntfernungsstufe 2 : 4.10 Euro");
printf("\nEntfernungsstufe 3 : 6.50 Euro");
label1:
printf("\nBitte geben Sie die entfernungsstufe an:");
scanf("%lf",&e);

if (e==1){
ent=1.50;
printf("\nBitte geben Sie Anzahl der Personen an:");
scanf("%i",&stufe);

if (stufe==1){
endpreis=ent;}
else 
if (stufe==2){
endpreis=ent*0.9*stufe;}
else 
if (stufe==3){
endpreis=ent*0.8*stufe;}
else if (stufe==4){
endpreis=ent*0.7*stufe;}
else if (stufe>=5){
endpreis=ent*0.6*stufe;}
}

else if (e==2){
ent=2.50;
printf("\nBitte geben Sie Anzahl der Personen an:");
scanf("%i",&stufe);

if (stufe==1){
endpreis=ent;}
else 
if (stufe==2){
endpreis=ent*0.9*stufe;}
else 
if (stufe==3){
endpreis=ent*0.8*stufe;}
else if (stufe==4){
endpreis=ent*0.7*stufe;}
else if (stufe>=5){
endpreis=ent*0.6*stufe;}
}
  
else if (e==3){
ent=3.50;
printf("\nBitte geben Sie Anzahl der Personen an:");
scanf("%i",&stufe);

if (stufe==1){
endpreis=ent;}
else 
if (stufe==2){
endpreis=ent*0.9*stufe;}
else 
if (stufe==3){
endpreis=ent*0.8*stufe;}
else if (stufe==4){
endpreis=ent*0.7*stufe;}
else if (stufe>=5){
endpreis=ent*0.6*stufe;}
}

else
{
goto label1;}


printf("\nDie endsumme ist: %.2f Euro",endpreis);

printf("\nMöchten Sie noch etwas hinzufeugen? Ja 1/Nein 2");
scanf("%i",&j);
if (j==1){   

    {

        
         ;
goto label1;}}

printf("\nDie endsumme ist: %.2f Euro",endpreis);

}

danke im vorraus

mfg
 
Sieht aus wie ein Programm, was vor 20 Jahren geschrieben wurde :ugly:
goto is böse, das solltest du dir schnell abgewöhnen. Du kannst dasselbe Programm immer auch ohne diese Wörtchen schreiben.

Wenn ich die Aufgabenstellung richtig verstanden hab - und so 100%ig sicher bin ich mir da nicht :mrgreen: -, sollst du 1000 Preisabfragen machen und am Ende die Summe ausrechnen.

Mit deinem bisherigen Code kommst du da nicht weit, wenn du ihn nicht in eine Funktion auslagerst. Es bietet sich an, Anzahl Personen und diese Entfernungsstufe als Parameter zu nehmen und die Fahrtkosten als Rückgabewert. Dann kannst du einfach 1000mal aufrufen und die Rückgabewerte addieren, um die Summe zu erhalten.
 
Super danke dir

hab es mal anders geschrieben :) ist besser und einfacher als gedacht :)

Code:
#include <stdio.h>
#include <conio.h>
#include <math.h>


main() {
int stufe,j,i;
double person,preis;

printf("\nEntfernungsstufe 1 : 2.20 Euro");
printf("\nEntfernungsstufe 2 : 4.10 Euro");
printf("\nEntfernungsstufe 3 : 6.50 Euro");
label1:printf("\nBitte geben Sie die entfernungsstufe an:");
scanf("%i",&stufe);

 switch(stufe) {
  case 1: preis=2.20; break;
  case 2: preis=4.10; break;
  case 3: preis=6.50; break;
  default: printf("Bitte Nochmal Auswählen");return 0; break;
  }
  
         printf("\nBitte geben Sie Anzahl der Personen an:");
         scanf("%i",&j);
                  
          switch(j) {
  case 1: person=preis*1.0; break;
  case 2: person=preis*0.9*j; break;
  case 3: person=preis*0.8*j; break;
  case 4: person=preis*0.7*j; break;
  case 5: person=preis*0.6*j; break;
  default: printf("Bitte Nochmal Auswählen");goto label1; break;
}
 

printf("\nDie endsumme lautet: %.2f Euro",person);

printf("\nMöchten Sie noch etwas hinzufeugen? Ja 1/Nein 2");
scanf("%i",&i);
          switch(i) {
                      case 1: goto label1; break;
                        default: printf("Bye");return 0; break;
                    }

 getch();

}
besser so? :ugly:

hab trozdem 2 probleme
1. wie kann ich hier
Code:
  case 5: person=preis*0.6*j; break;
angeben das alle zahlen größer und gleich 5 gewählt werden sollen

2. ich weis immer noch nicht die ich es addieren kann :(
aufgabe war
https://www8.pic-upload.de/04.07.11/iaw75fgsbh5w.png
 
Tut zumindest dasselbe und du hast schon mal 50% Code eingespart.

Mit switch kannst du nur Konstanten gegenprüfen. Ein Größergleich gibts nicht. Wenn du das brauchst, musst du wie vorher mit if arbeiten.

Dein böses goto hast du aber immer noch ned raus. Mach ne Funktion. Wenn du die hast, kannst du sie auch 1000x aufrufen ohne Probleme. Dein goto behindert dich da nur.

Du musst gemäß der Aufgabe auch mit einem Array ("Feld") arbeiten - auch wenn es auch ohne gehen würde ;).
 
OT:
Sieht aus wie ein Programm, was vor 20 Jahren geschrieben wurde :ugly:
Hackerchen, vor 20 Jahren hast Du bestimmt noch nicht programmiert.

Du könntest vor der switch-case-Abfrage mittels if überprüfen, ob der Wert grundsätzlich im richtigen Bereich liegt. Anschließend kannst Du im switch-case die besonderen Fälle (also z.B. 1 und 2) abprüfen und alles andere mit default: statt case bla: abfangen:
Code:
[...]
int i;
/* irgendwelcher code um i einen Wert zuzuweisen */
if ( (i > 0) && (i < 1000) ) /* alle Werte zwischen 1 und 999 erlaubt */
{
    switch(i)
    {
        case 1:
            /* do whatever to be done if i equals 1*/
            break;
        case 2:
            /* do whatever to be done if i equals 2*/
            break;
        default:
            /* do whatever to be done if i equals any other value than 1 or 2 */
            break;
    }
}

Und ja, Hacker hat recht: für ein goto in einem C bzw. C++ Programm braucht man wirklich gute Gründe. Der Grund warum man das vermeiden sollte ist der, daß ein Programm dadurch extrem leicht unwartbar werden kann. Ein klares don't. Ich habe in meinem Leben vielleicht einmal erlebt, daß ich der Verwendung von goto zustimmen mußte, aber das war ein extremes Beispiel. Und ich habe im Oktober 1990 mein Studium aufgenommen, das ist also eine lange Zeit...
 
19 und n paar zerquetschte sinds... du darfst aber gern auf 20 aufrunden 8)

Ja, dann sahen deine Programme wohl zu deinen Programmieranfängen ähnlich aus wie seins jetzt, was gibt es da zu kritisieren?
Ich glaube eher weniger, dass man heutzutage direkt mit sauberem OOP und allen möglichen Konzepten in C startet :D
 
Grundsätzlich kommts auch drauf an, was man auf welcher Plattform erreichen will (muss)...

Ich hab letztens erst in einem Projekt alle schönen Funktionen gecancelt und inline programmiert sowie die übersichtlichen Strukturen gegen wildes gepointer getauscht...:ugly:

Machte das Programm schlechter wartbar und unübersichtlicher, aber um mehr als den Faktor 3 schneller in den kritischen Routinen.

So kanns kommen, wenn man harte Echtzeit auf einer Microcontrollerplattform programmiert. OOP kann man da oftmals komplett vergessen.:mrgreen:
 
OT: Hackerchen, vor 20 Jahren hast Du bestimmt noch nicht programmiert.

Du könntest vor der switch-case-Abfrage mittels if überprüfen, ob der Wert grundsätzlich im richtigen Bereich liegt. Anschließend kannst Du im switch-case die besonderen Fälle (also z.B. 1 und 2) abprüfen und alles andere mit default: statt case bla: abfangen:
Code:
[...]
int i;
/* irgendwelcher code um i einen Wert zuzuweisen */
if ( (i > 0) && (i < 1000) ) /* alle Werte zwischen 1 und 999 erlaubt */
{
    switch(i)
    {
        case 1:
            /* do whatever to be done if i equals 1*/
            break;
        case 2:
            /* do whatever to be done if i equals 2*/
            break;
        default:
            /* do whatever to be done if i equals any other value than 1 or 2 */
            break;
    }
}
Ja, genau so was habe ich gesucht :) danke

Und ja, Hacker hat recht: für ein goto in einem C bzw. C++ Programm braucht man wirklich gute Gründe.
ich kenne leider keine andere alternativen außer return :) ich gewöhne mir das ab :roll:

@ theHacker
danke :) du hast mir sehr geholfen
 
Ein Beispiel für drei Entfernungsstufen mit einer Funktionen zur Preisberechnung. Sowas in der Art meinte tH:

PHP:
/* Wir definieren die Preise einmal zentral, dann lassen sie sich
    im Falle einer Fahrpreiserhöhung leicht anpassen */
double entfernungsstufenpreis[]={
    0.00, /* entfernungsstufenpreis[0] macht keinen Sinn */ 
    2.20, /* Preis für Entfernungsstufe 1 */
    4.10, /* Preis für Entfernungsstufe 2 */
    6.50
};

double berechne_preis(int entfernungsstufe)
{
    if (entfernungsstufe < 1 )
    {
        printf("Entfernungsstufe ungültig!\n");
        return -1.0;
    }

    if (entfernungsstufe > 3)
        entfernungsstufe = 3;

    return entfernungsstufenpreis[entfernungsstufe];
}

main()
{
    int entfernungsstufe;

    double summe_aller_verkauften_tickets = 0.0;

    int abbruch=0;
    while (!abbruch)
    {
        /* entfernungsstufe einlesen */

        /* nehmen wir an, daß abgebrochen werden soll, wenn eine
            Entfernungsstufe von "0" gewählt wird */
        if (entfernungsstufe == 0)
            abbruch=1;

        double ticketpreis=berechne_preis(entfernungsstufe);

        if (ticketpreis < 0)
            continue; /* fange mit der while-schleife von vorne an */

        /* ticketpreis ausgeben */
        
       summe_aller_verkauften_tickets+=ticketpreis;
    }
    
    /* summe_aller_verkauften_tickets ausgeben */
}
 
Zuletzt bearbeitet:
PHP:
if (entfernungsstufe = 0)
*döööttttt*
Leider verloren :biggrin:

== ;)

Jupp, aber sowas meinte ich.
 
ich perönlich nutze es nicht, aber es gibt die Empfehlungen die Reihenfolge umzudrehen, denn dann würde solch ein Fehler zu Compile Errors führen:
PHP:
if(0 = entfernungsstufe) // Compile Error

if(0 == entfernungsstufe) // funktioniert wunderbar
 
Moderne IDEs (also schon vor x Jahren) und Compiler (ok, weiß ich ned) zeigen doch eh alle n Warning an, oder?

Die Chance, dass einer
Code:
if(foo = 0)
wirklich meint, geht wohl gegen null. Beim Debuggen vielleicht, um mal eben schnell n Codeblock nicht zu durchlaufen, der zufällig vorher
Code:
if(foo == 0)
war... und dann hörts auch schon auf mit "sinnigen" Einsätzen dieser Codezeile :mrgreen: