1. Vespa Forum
    1. Unerledigte Themen
  2. Dashboard
  3. Galerie
    1. Alben
    2. Karte
  4. Lexikon
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Forum
  • Galerie
  • Lexikon
  • Seiten
  • Erweiterte Suche
  1. VespaOnline Forum: Entdecke die Welt der klassischen Vespa-Roller und teile deine Leidenschaft
  2. Klatsch und Tratsch
  3. Offtopic

Kurze Frage zu meinem C-Programm

  • vespapop
  • June 7, 2011 at 18:19
  • vespapop
    Fortgeschrittener
    Punkte
    1,620
    Trophäen
    1
    Beiträge
    305
    Vespa Typ
    Vespa PK 50 XL2 Kat. '94
    • June 7, 2011 at 18:19
    • #1

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

    Zitat

    Es ist ein C-Programm zu erstellen, welches den Mittelwert, das Minimum und das
    Maximum einer Zahlenfolge bestimmen soll. Der Benutzer gibt zunächst die Anzahl der
    Zahlen ein. Diese Anzahl muss ein Wert zwischen 2 und 10 sein. Anschließend werden die
    Zahlen eingegeben, wobei die Zahlenwerte zwischen -100.0 und +100.0 (100.0 und -100.0
    sind auch noch zulässig) liegen dürfen.

    Anschließend berechnet das Programm den Mittelwert, das Minimum und das Maximum
    und gibt diese Zahlen am Bildschirm aus.

    Die Anzahl der Zahlen ist natürlich eine Ganzzahl, alle restlichen Zahlen sind Gleitkommazahlen.
    Die Eingaben sind auf Plausibilität zu prüfen. Fehlerhafte Eingaben sind zu
    wiederholen. Die Zahlenreihe ist als Feld zu definieren.

    Die Hauptfunktion main() ruft folgende Funktionen auf: eingabe(), berechne(), ausgabe()

    Die erste Funktion eingabe() ist für die Eingabe einer Gleitkommazahl zuständig. Sie hat
    drei Wertparameter text, min und max, sowie einen Rückgabewert. Der Wertparameter text
    enthält den Ausgabetext für den Anwender. Der Anwender gibt eine Zahl ein. Wenn diese
    Zahl kleiner als min oder größer als max ist, dann wird die Eingabe (inklusive Ausgabe des
    Textes) wiederholt. Sobald der Benutzer eine gültige Zahl eingegeben hat, wird die Funktion
    beendet und die eingegebene Zahl im Rückgabewert dem Aufrufer übermittelt.

    Die Funktion berechne() ist für die Berechnung des Mittelwertes, des Minimal und des
    Maximalwertes zuständig. Sie hat einen Wertparameter anzahl und vier Zeigerparameter
    zahlen, mittel, min und max. Diese Funktion gibt direkt keinen Wert zurück, sondern
    übermittelt die Berechnungsergebnisse mit Hilfe der Zeigerparameter (Referenzparameter).

    Die Funktion ausgabe() ist für die Ausgabe des Mittelwerts, des Minimalwertes und des
    Maximalwertes zuständig. Sie bekommt diese Werte als Wertparameter und gibt diese
    Informationen mit Hilfe eines geeigneten Textes am Bildschirm aus.

    Alles anzeigen

    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

  • bingele28
    Seifenterrorist
    Reaktionen
    3,209
    Punkte
    11,034
    Trophäen
    2
    Beiträge
    1,471
    Bilder
    19
    Einträge
    4
    • June 7, 2011 at 18:26
    • #2

    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.

  • bingele28
    Seifenterrorist
    Reaktionen
    3,209
    Punkte
    11,034
    Trophäen
    2
    Beiträge
    1,471
    Bilder
    19
    Einträge
    4
    • June 7, 2011 at 18:38
    • #3

    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.

  • vespapop
    Fortgeschrittener
    Punkte
    1,620
    Trophäen
    1
    Beiträge
    305
    Vespa Typ
    Vespa PK 50 XL2 Kat. '94
    • June 7, 2011 at 18:53
    • #4

    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;
        }
    Zitat von bingele28

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


    Werde ich mir merken ;)

    Zitat von bingele28

    * 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.

    Zitat von bingele28

    * 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.

    Alles anzeigen


    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

  • bingele28
    Seifenterrorist
    Reaktionen
    3,209
    Punkte
    11,034
    Trophäen
    2
    Beiträge
    1,471
    Bilder
    19
    Einträge
    4
    • June 7, 2011 at 19:01
    • #5
    Zitat von vespa.pop

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


    Auch eine feine Idee!

    Zitat von vespa.pop

    ...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.

  1. Datenschutzerklärung
  2. Impressum
  3. Kontakt
  4. Geschichte der Vespa bei Wikipedia
  5. Nutzungsbedingungen
Made with ♥ in Bavaria
Community-Software: WoltLab Suite™