PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Zeiger, Arrays, Funktionen und Höchste Zahl im Array



Amarillo
14.04.2013, 08:55
Hallo §wink

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


# 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


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


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


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


# 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! :gratz

ojas
14.04.2013, 10:45
Ich bekomme immer falsche Monate als Ergebnis.

Kannst du das etwas genauer erklähren?

Amarillo
14.04.2013, 10:51
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).

Thoronador
14.04.2013, 14:16
Ein paar Tipps:
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.
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.
Einige deiner Variablen scheinen mir nicht richtig initialisiert zu werden, bevor sie das erste Mal genutzt werden.

Amarillo
14.04.2013, 14:22
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? :dnuhr:

aleator
14.04.2013, 18:38
Also:

1. Wenn man Zeiger initialisiert sollte man denen erst mal den nullptr zuweisen. (Sofern man keine andere Variable/Objekt usw hat)

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.

monate(&anzahlmonate);


3. In der "anzsonnenblumen" Funktion:

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

sonnenzeiger++;


4. for schleife


int i;
i=0;
for (i; i < *monatezeiger;i++)
Das ist doch wohl nicht dein Ernst? §ugly
Mach es so:

for(int i = 0; i < *monatezeiger; i++)
und ganz Pro like

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:

maxausgabe = i;
Wenn du das machst solltest du maxausgabe mit 1 intialisieren und i schließlich hinzu addieren:

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:

maxausgabe = i+1;
oder bei der Ausgabe:

cout<<maxausgabe+1;


Das war jetzt mal alles was mir so spontan einfiel.

Amarillo
16.04.2013, 15:33
Also:

1. Wenn man Zeiger initialisiert sollte man denen erst mal den nullptr zuweisen. (Sofern man keine andere Variable/Objekt usw hat)

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.

monate(&anzahlmonate);


3. In der "anzsonnenblumen" Funktion:

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

sonnenzeiger++;


4. for schleife


int i;
i=0;
for (i; i < *monatezeiger;i++)
Das ist doch wohl nicht dein Ernst? §ugly
Mach es so:

for(int i = 0; i < *monatezeiger; i++)
und ganz Pro like

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:

maxausgabe = i;
Wenn du das machst solltest du maxausgabe mit 1 intialisieren und i schließlich hinzu addieren:

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:

maxausgabe = i+1;
oder bei der Ausgabe:

cout<<maxausgabe+1;


Das war jetzt mal alles was mir so spontan einfiel.

Danke! :gratz 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 ;)

aleator
18.04.2013, 22:51
Danke! :gratz 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


int i = 0;
while(i<100)
{
//machwas

i++;
}

schreiben.

Um nochmal zu verdeutlichen:


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


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

ojas
23.04.2013, 02:25
Außerdem solltest du imo soetwas wie


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
int* var1, var2, var3; macht nicht das, was ein normal denkender Mensch vermutet.