SIP Scootershop | Vespa Tuning & Scooter Parts

Kurze Frage zu meinem C-Programm

  • Ich habe heute mal zwecks üben ein C-Programm geschrieben, dass mir mein Info-Lehrer aufgegeben hat.
    Das ist die Angabe:

    Soweit so gut. Ich habe das Programm mal runtergeschrieben und da kommt auch schon meine Frage.
    Also das Programm funktioniert und liefert die richtigen Werte.
    Hier der C-Code:

    Code
    #include <stdio.h>#include <stdlib.h>double eingabe (char text[], double min, double max){  int rueck;  char s[80];  double eingabe;  do  {    printf(text);    gets(s);    rueck=sscanf(s,"%lf",&eingabe);  }  while(rueck!=1 || eingabe<min || eingabe>max);  return eingabe;}void berechne (double anzahl,double *zahlen,double *mittel,               double *min,double *max){  int i;  double hilf=0;  for (i=0;i<anzahl;i++)  {    *zahlen=eingabe ("  Zahl : ",-100,100);    hilf=*zahlen+hilf;    if (*min>*zahlen)      *min=*zahlen;    if (*max<*zahlen)      *max=*zahlen;  }  *mittel=hilf/2;}void ausgabe (double mittel,double min,double max){  printf("Ergebnis:\n\n");  printf("  Mimimum:      %.2lf\n", min);  printf("  Mittelwert:   %.2lf\n", mittel);  printf("  Maximum:      %.2lf\n", max);}int main(){  double anzahl;  double wert;  double min,max,mittel;  printf("PLF4 (2AHME-G2, 7.6.2010)\n");  printf("--------------------------\n\n");  anzahl=eingabe ("Anzahl der Zahlen: ",2,10);  printf("\n");  berechne (anzahl,&wert,&mittel,&min,&max);  printf("\n");  ausgabe (mittel, min, max);  return 0;}

    Und hier der Abschnitt der mir fragwürdig vorkommt:

    Code
    if (*min>*zahlen)
          *min=*zahlen;
        if (*max<*zahlen)
          *max=*zahlen;

    Diese zwei if-Schleifen sollen jeweils den MIN- und MAX-Wert der eingegebenen Zahlen herausfinden. Von der Logik her versteh' ich diese if-Schleifen, aber welchen Wert hat *min bzw. *max zum Zeitpunkt der Schleife? Soweit ich weiß sind da irgendwelche Werte gespeichert. Denn ich habe denen keinen Wert zugewiesen.

    Bin mal gespannt ob ich hier im VO einen finde der mir das erklären kann. Ich zähle auch euch jubel

    -vespapop

  • Du gibst uninitialisierte Variablen rein - Zeile 59 - damit hängt es vom Compiler ab, was die Variablen beim ersten mal beinhalten und wie erfolgreich die Logik funktionier. Der vom Compiler vorgegebene Wert könnte entweder 0 oder der maximal möglich Wert für den Datentyp sein.
    Tipp: initialisiere 'min' mit dem maximal möglichen Wert (100.0) und 'max' mit dem minimal möglichen (-100.0)

    Es ist immer komisch wenn der Satz nicht so endet wie man es Kartoffel.

    Früher hieß es "Iss deinen Teller leer, dann scheint die Sonne!" - Heute kämpfen wir mit Übergewicht und Klimaerwärmung.

  • Paar kleine kritische Anmerkungen kann ich mir nicht verkneifen:

    * Das sind übrigens keine 'if-Schleifen', sondern 'if-Anweisungen'!

    * Auch einzeilige if-Anweisungen sollten einen Scope aufweisen, d.h. mit geschweifter Klammer geschrieben sein. Gerade bei größerem Code verbessert sich die Lesbarkeit:
    if (*min > * zahlen)
    {
    *min = *zahlen;
    }

    * Wenn der Benutzer eine Fehleingabe macht, gibt es kein Feedback, noch nicht mal initial kann der wissen, was genau du willst.
    Zeile 57 führt zu einen Eingabeprompt
    Anzahl der Zahlen:
    Jetzt gebe ich 17 ein und ich bekomme wieder den Prompt angeboten, Eingabe: 1 => gleicher Prompt - w.t.f.!
    Sind eh hardcoded Vorgaben, also Prompttext, z.B. "Anzahl der Zahlen [2, 10]: " oder "Anzahl der Zahlen zwischen 2 und 10: "
    Und "Zahl [-100.0, 100,0]: " oder "Zahl zwischen -100.0 und 100.0: "
    Wenn du rueck - Zeile 6 mit dem maximalen oder minimalen Wert für double initialisierst kannst du am Anfang der do-while-Schleife auch einen Fehlertext produzieren, wenn 'eingabe' außerhalb des Limits liegt und nicht deinem Initialwert entspricht. Der Initialwert muss deshalb ausserhalb des Limits liegen und es muss eher unwahrscheinlich sein, dass dieser Wert eingegeben wird.

    Es ist immer komisch wenn der Satz nicht so endet wie man es Kartoffel.

    Früher hieß es "Iss deinen Teller leer, dann scheint die Sonne!" - Heute kämpfen wir mit Übergewicht und Klimaerwärmung.

  • Das mit den uninitialisierten Variablen ist mir klar. Mittlerweile hab ich die Lösung schon gefunden (bin selbst draufgekommen), aber trotzdem DANKE :love:
    Ich initialisiere die zwei Zeiger (*min, *max) mittels eine if-Anweisung in der for-Schleife.

    Code
    if (i==0)
        {
          *min=*zahlen;
          *max=*zahlen;
        }

    * Das sind übrigens keine 'if-Schleifen', sondern 'if-Anweisungen'!


    Werde ich mir merken ;)

    * Auch einzeilige if-Anweisungen sollten einen Scope aufweisen, d.h. mit geschweifter Klammer geschrieben sein. Gerade bei größerem Code verbessert sich die Lesbarkeit:
    if (*min > * zahlen)
    {
    *min = *zahlen;
    }


    Unser Lehrer hat gemeint, wenn es nur einen Befehl gibt braucht man diese geschwungenen Klammern nicht.


    Dass mit dem Prompttext versteh' ich eh, weil der Benutzer dann weiß welche Zahlen er eingeben darf. Aber der Lehrer will halt, dass wir genau so programmieren wie er. Also gleicher Stil, gleiches Layout e.t.c
    Und die Fehlermeldungen sind in der Angabe nicht vorhanden, und so wie ich ihn kenne zieht er auch noch Punkte ab, weil das nicht der Angabe entspricht. :-3

    Find ich echt super das es im VO für alles jemanden gibt der sich auskennt 2-)

    -vespapop

  • ...Ich initialisiere die zwei Zeiger (*min, *max) mittels eine if-Anweisung in der for-Schleife.


    Auch eine feine Idee!

    ...Unser Lehrer hat gemeint, wenn es nur einen Befehl gibt braucht man diese geschwungenen Klammern nicht.


    Da hat er recht, ist halt Programmierstil.
    Du kannst, abgesehen von den 'include's am Anfang auch alles in eine Zeile schreiben - das ist zwar krass, aber es ist halt nicht mehr übersichtlich.

    Es ist immer komisch wenn der Satz nicht so endet wie man es Kartoffel.

    Früher hieß es "Iss deinen Teller leer, dann scheint die Sonne!" - Heute kämpfen wir mit Übergewicht und Klimaerwärmung.