Ergebnis 1 bis 9 von 9

[C++] Zeiger, Arrays, Funktionen und Höchste Zahl im Array

  1. #1 Zitieren
    Ritter Avatar von Amarillo
    Registriert seit
    Jan 2009
    Ort
    Hessen
    Beiträge
    1.978
    Hallo

    Ich bräuchte mal (wieder) eure hilfe. Ich muss in meinem Programm 3 Funktionen haben und alle Variablen die an die Funktionen übergeben werden müssen Zeiger sein. Von Main aus werden die Funktionen aufgerufen und die Wiederholungsschleife laufen gelassen.

    In monate werden die Monate eingegeben. In anzsonnenblumen das Arrays gefüllt und in ausgabe die Höchste Zahl im Array berechnet und der Monat in dem die Höchste zahl vorkommt ausgegeben.

    Und da liegt das Problem, ich weiß nicht wie ich letzteres machen soll. Ich bekomme immer falsche Monate als Ergebnis. Es wäre toll wenn mir jemand helfen könnte diese MAX ausgabe richtig zu machen.

    Das Programm setzte ich mal in Spoiler
    Main
    Code:
    # include <iostream.h>
    # include <conio.h>
    # include <math.h>
    void monate (int *monatezeiger);
    void anzsonnenblumen (int *monatezeiger,int *sonnenzeiger);
    void ausgabe (int *sonnenzeiger, int *monatezeiger);
    
    int main()
    {
     int *monatezeiger,*sonnenzeiger,max,anzahlmonate, sonnenblumensamen[10];
     char auswahl;
      sonnenzeiger = &sonnenblumensamen[0];
      monatezeiger = &anzahlmonate;
     
    do
    {  
      monate (monatezeiger);
      anzsonnenblumen (monatezeiger, sonnenzeiger);
      ausgabe (sonnenzeiger, monatezeiger);
      
      cout << "Wenn Sie das Programm nochmals ausfuehren moechten druecken Sie W" << endl;
      cin >> auswahl;
    }
    while ((auswahl == 'w')||(auswahl == 'W')); 
      
     getch();   
     return 0;   
    }
    Monate
    Code:
    void monate (int *monatezeiger)
    {
      
     do
     {
     cout << "Geben Sie die anzahl der Monate ein (min. 1 - max. 10 Monate):" << endl;
     cin >> *monatezeiger;
     }
     while ((*monatezeiger < 1)||(*monatezeiger > 10));
    }
    anzsonnenblumen
    Code:
    void anzsonnenblumen (int *monatezeiger,int *sonnenzeiger)
    {
     int i;
      i=0;  
         
     for (i; i < *monatezeiger;i++)
     {
      do
      {
      cout << "Geben Sie die Gesamtproduktion von Sonnenblumensamen im " << (i+1) << " Monat ein:" << endl;
      cin >> *sonnenzeiger;
      }
      while (*sonnenzeiger < 1);
      *sonnenzeiger++;  
     }    
    }
    ausgabe
    Code:
    void ausgabe (int *monatezeiger, int *sonnenzeiger)
    {
    int i,max,maxausgabe;
    i=0;
    
      max = *sonnenzeiger;
      
      for (i; i < *monatezeiger; i++)
      {
       if ( max <= *sonnenzeiger)
       {
        maxausgabe = i; 
        max = *sonnenzeiger;           
       }    
       sonnenzeiger++;
      }
         
    
     cout << "Im " << maxausgabe << " Monat haben Sie die meisten Sonnenblumensamen produziert" << endl;    
    }
    Das gesamte Programm
    Code:
    # include <iostream.h>
    # include <conio.h>
    # include <math.h>
    void monate (int *monatezeiger);
    void anzsonnenblumen (int *monatezeiger,int *sonnenzeiger);
    void ausgabe (int *sonnenzeiger, int *monatezeiger);
    
    int main()
    {
     int *monatezeiger,*sonnenzeiger,max,anzahlmonate, sonnenblumensamen[10];
     char auswahl;
      sonnenzeiger = &sonnenblumensamen[0];
      monatezeiger = &anzahlmonate;
     
    do
    {  
      monate (monatezeiger);
      anzsonnenblumen (monatezeiger, sonnenzeiger);
      ausgabe (sonnenzeiger, monatezeiger);
      
      cout << "Wenn Sie das Programm nochmals ausfuehren moechten druecken Sie W" << endl;
      cin >> auswahl;
    }
    while ((auswahl == 'w')||(auswahl == 'W')); 
      
     getch();   
     return 0;   
    }
    
    void monate (int *monatezeiger)
    {
      
     do
     {
     cout << "Geben Sie die anzahl der Monate ein (min. 1 - max. 10 Monate):" << endl;
     cin >> *monatezeiger;
     }
     while ((*monatezeiger < 1)||(*monatezeiger > 10));
    }
    
    void anzsonnenblumen (int *monatezeiger,int *sonnenzeiger)
    {
     int i;
      i=0;  
         
     for (i; i < *monatezeiger;i++)
     {
      do
      {
      cout << "Geben Sie die Gesamtproduktion von Sonnenblumensamen im " << (i+1) << " Monat ein:" << endl;
      cin >> *sonnenzeiger;
      }
      while (*sonnenzeiger < 1);
      *sonnenzeiger++;  
     }    
    }
    
    void ausgabe (int *monatezeiger, int *sonnenzeiger)
    {
    int i,max,maxausgabe;
    i=0;
    
      max = *sonnenzeiger;
      
      for (i; i < *monatezeiger; i++)
      {
       if ( max <= *sonnenzeiger)
       {
        maxausgabe = i; 
        max = *sonnenzeiger;           
       }    
       sonnenzeiger++;
      }
         
    
     cout << "Im " << maxausgabe << " Monat haben Sie die meisten Sonnenblumensamen produziert" << endl;    
    }
    Danke schon mal!
    Amarillo ist offline Geändert von Amarillo (14.04.2013 um 14:20 Uhr)

  2. #2 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von Amarillo Beitrag anzeigen
    Ich bekomme immer falsche Monate als Ergebnis.
    Kannst du das etwas genauer erklähren?
    ojas ist offline

  3. #3 Zitieren
    Ritter Avatar von Amarillo
    Registriert seit
    Jan 2009
    Ort
    Hessen
    Beiträge
    1.978
    Zitat Zitat von ojas Beitrag anzeigen
    Kannst du das etwas genauer erklähren?
    Also wenn ich z.B. im 1. Monat die höchste Zahl eingebe steht in der ausgabe dann das im 50. Monat das meiste produziert wurde. Ansonsten ist es wenn ich z.B. 10 Monate eingebe immer der 6. Monat an dem am meisten Produziert wurde egal welcher Monat es eigentlich war (außer eben beim 1. der dann als 50. ausgegeben wird).
    Amarillo ist offline

  4. #4 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.426
    Ein paar Tipps:
    1. Es gibt hier im Forum Code-Tags, die speziell für die Darstellung von Programmcode gemacht sind. Nutze die anstelle der Spoiler, das ist übersichtlicher und angenehmer zu lesen.
    2. Wenn du in C++ (und nicht C) programmieren willst, vermeide Zeiger. Zeiger sorgen gerade am Anfang meist für mehr Probleme als Nutzen. Wenn du Änderungen, die innerhalb von Funktionen an bestimmte Variablen vorgenommen werden, übernehmen willst, nutze lieber Referenzen anstelle der Zeiger.
    3. Einige deiner Variablen scheinen mir nicht richtig initialisiert zu werden, bevor sie das erste Mal genutzt werden.
    Thoronador ist offline

  5. #5 Zitieren
    Ritter Avatar von Amarillo
    Registriert seit
    Jan 2009
    Ort
    Hessen
    Beiträge
    1.978
    So die Spoiler wurden umgeändert .

    Das Problem ist, ich würde auch lieber Referenzen benutzen aber die Aufgabe gibt vor für alle Variablen Zeiger zu benutzen daher kann ich das nicht umändern..

    Was meinst du damit das einige Variablen nicht richtig initialisiert werden?
    Amarillo ist offline

  6. #6 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Also:

    1. Wenn man Zeiger initialisiert sollte man denen erst mal den nullptr zuweisen. (Sofern man keine andere Variable/Objekt usw hat)
    Code:
    int* zeiger = nullptr;
    (Damit man nicht unfreiwillig auf fremden Speicher zugreift und evtl das System damit instabil macht. So stürzt einfach nur das Programm ab.)


    2. Du kannst die Adressen auch direkt in der Parameterliste der Funktion übergeben. So sparst du dir die Zeiger im Hauptprogramm.
    Code:
    monate(&anzahlmonate);

    3. In der "anzsonnenblumen" Funktion:
    Code:
    *sonnenzeiger++;
    Hier wird der Inhalt der vom Zeiger referenzierten Variable, also sonnenblumensamen[0] inkrementiert.
    Du willst aber den Zeiger (also die Adresse) selbst inkrementieren d.h.:
    Code:
    sonnenzeiger++;

    4. for schleife
    Code:
    int i;   
    i=0;          
    for (i; i < *monatezeiger;i++)
    Das ist doch wohl nicht dein Ernst?
    Mach es so:
    Code:
    for(int i = 0; i < *monatezeiger; i++)
    und ganz Pro like
    Code:
    for(int i = 0; i < *monatezeiger; i++, sonnenzeiger++)
    in der "anzsonnenblumen" Funktion


    5. Die Definition von int max in main ist relativ sinnlos.


    6. Ausgabe:
    Code:
    maxausgabe = i;
    Wenn du das machst solltest du maxausgabe mit 1 intialisieren und i schließlich hinzu addieren:
    Code:
    maxausgabe += i;
    Ansonsten bekommst du evtl etwas Falsches min. aber ein Ergebniss das um 1 verschoben ist. (i ist ja im ersten Monat = 0 usw.)
    EDIT: Blödsinn, in dem Fall müsstest du dann immer maxausgabe wieder auf 1 setzen. Mach am besten gleich:
    Code:
    maxausgabe = i+1;
    oder bei der Ausgabe:
    Code:
    cout<<maxausgabe+1;

    Das war jetzt mal alles was mir so spontan einfiel.
    aleator ist offline Geändert von aleator (14.04.2013 um 18:46 Uhr)

  7. #7 Zitieren
    Ritter Avatar von Amarillo
    Registriert seit
    Jan 2009
    Ort
    Hessen
    Beiträge
    1.978
    Zitat Zitat von aleator Beitrag anzeigen
    Also:

    1. Wenn man Zeiger initialisiert sollte man denen erst mal den nullptr zuweisen. (Sofern man keine andere Variable/Objekt usw hat)
    Code:
    int* zeiger = nullptr;
    (Damit man nicht unfreiwillig auf fremden Speicher zugreift und evtl das System damit instabil macht. So stürzt einfach nur das Programm ab.)


    2. Du kannst die Adressen auch direkt in der Parameterliste der Funktion übergeben. So sparst du dir die Zeiger im Hauptprogramm.
    Code:
    monate(&anzahlmonate);

    3. In der "anzsonnenblumen" Funktion:
    Code:
    *sonnenzeiger++;
    Hier wird der Inhalt der vom Zeiger referenzierten Variable, also sonnenblumensamen[0] inkrementiert.
    Du willst aber den Zeiger (also die Adresse) selbst inkrementieren d.h.:
    Code:
    sonnenzeiger++;

    4. for schleife
    Code:
    int i;   
    i=0;          
    for (i; i < *monatezeiger;i++)
    Das ist doch wohl nicht dein Ernst?
    Mach es so:
    Code:
    for(int i = 0; i < *monatezeiger; i++)
    und ganz Pro like
    Code:
    for(int i = 0; i < *monatezeiger; i++, sonnenzeiger++)
    in der "anzsonnenblumen" Funktion


    5. Die Definition von int max in main ist relativ sinnlos.


    6. Ausgabe:
    Code:
    maxausgabe = i;
    Wenn du das machst solltest du maxausgabe mit 1 intialisieren und i schließlich hinzu addieren:
    Code:
    maxausgabe += i;
    Ansonsten bekommst du evtl etwas Falsches min. aber ein Ergebniss das um 1 verschoben ist. (i ist ja im ersten Monat = 0 usw.)
    EDIT: Blödsinn, in dem Fall müsstest du dann immer maxausgabe wieder auf 1 setzen. Mach am besten gleich:
    Code:
    maxausgabe = i+1;
    oder bei der Ausgabe:
    Code:
    cout<<maxausgabe+1;

    Das war jetzt mal alles was mir so spontan einfiel.
    Danke! Allerdings war der Fehler ein anderer, ich hab beim Anlegen und beim Aufrufen der Funktion ausgabe die Zeiger verdreht. Darum wurden die Monate mit dann mit der 1. stelle im Array überschrieben. Aber trotzdem danke, das "richtige" anlegen der Zeiger hab ich so nicht gekannt und das mit i hab ich zwar so schon mal gesehen aber ich hab das sonst immer so geschrieben wie auch hier in meinem Programm weil mir gesagt wurde dass das so richtig wäre
    Amarillo ist offline

  8. #8 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Amarillo Beitrag anzeigen
    Danke! Allerdings war der Fehler ein anderer, ich hab beim Anlegen und beim Aufrufen der Funktion ausgabe die Zeiger verdreht. Darum wurden die Monate mit dann mit der 1. stelle im Array überschrieben. Aber trotzdem danke, das "richtige" anlegen der Zeiger hab ich so nicht gekannt und das mit i hab ich zwar so schon mal gesehen aber ich hab das sonst immer so geschrieben wie auch hier in meinem Programm weil mir gesagt wurde dass das so richtig wäre
    Hab mich schon gewundert wieso die Parameter so überkreuzt waren.^^

    Was heißt richtig? Es funktioniert aber es macht recht wenig Sinn, schließlich ist die for schleife ja extra dafür gedacht ansonsten könntest du ja auch einfach
    Code:
    int i = 0;
    while(i<100)
    {
       //machwas
    
       i++;
    }
    schreiben.

    Um nochmal zu verdeutlichen:
    Code:
    for(wird einmalig am Anfang ausgeführt; ist diese Aussage true wird der for block ausgeführt; wird nach jedem durchgang ausgeführt)
    Daher liegt es natürlich Nahe die Definition in die for Schleife zu setzen zudem die variable dann auch nur in der Schleife gültig ist.

    Außerdem solltest du imo soetwas wie
    Code:
    int var1, var2, var3;
    vermeiden. Wenn du später mal ein größeres Programm hast ist soetwas für die Übersichtlichkeit nicht sonderlich förderlich. Außerdem kannst du so nur schlecht den Sinn der einzelnen Variablen Kommentieren...
    aleator ist offline Geändert von aleator (19.04.2013 um 11:28 Uhr)

  9. #9 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von aleator Beitrag anzeigen
    Außerdem solltest du imo soetwas wie
    Code:
    int var1, var2, var3;
    vermeiden. Wenn du später mal ein größeres Programm hast ist soetwas für die Übersichtlichkeit nicht sonderlich förderlich.
    Insbesondere
    Code:
    int* var1, var2, var3;
    macht nicht das, was ein normal denkender Mensch vermutet.
    ojas ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •