Neuling braucht Ratschläge/Hilfe



  • Sorry ich war gestern Abend etwas in Eile und hab deswegen unüberlegt geschrieben und gepostet ^^

    größtes Problem hab ich mit der srand-funktion und den Zeigervariablen.
    Hier habe ich erstmal nur den Programmteil geschrieben in dem der Teil mit dem Minima, Maxima und dem Mittelwert bestimmt werden soll. Ich kriegs nur nicht hin dass der Compiler angibt dass mein Programm fehlerfrei ist.

    #include <iostream>
    using namespace std;
    #include <cstdlib>
    #include "Funktionen.h"
    #define anzahl 10
    int vec[anzahl]={1,2,3,4,5,6,7,8,9,10};
    int maxima,minima,middle;
    int main(void)
    {
    	maxima = max(*vec,anzahl);
    	minima = min(*vec,anzahl);
    	middle = mittelwert(vec,anzahl);
    	return 0;
    
    }
    

    und dazu noch das Modul Funktionen.cpp

    }
    int max(int *vec, int anzahl)
    {
    	int *max;
    	for(int i=0;i<=anzahl;i++)
    	{
    		if ((vec+i)>=max)
    			max = (vec + i);
    
    	}
    	cout << "Maximum:" << max << endl;
    }
    int min(int *vec, int anzahl)
    {
    	int *min;
    	for(int i=0;i<=anzahl;i++)
    	{
    		if ((vec+i)<=min)
    			min = (vec + i);
    
    	}
    	cout << "Minimum:" << min << endl;
    }
    int mittelwert(int *vec,int anzahl)
    {
    	int sum;
    	for(int i=0;i<anzahl;i++)
    	{
    		sum += *(vec+i);
    	}
    	cout << "Mittelwert:" << (sum/anzahl) << endl;
    }
    

    in einem anderen Testdurchlauf habe ich mich ausschließlich mit der rand()-Funktion beschäftigt:

    #include <iostream>
    using namespace std;
    #include <cstdlib>
    #include "Funktionen.h"
    #define anzahl 10
    #define seed 5
    int vec[anzahl]={1,2,3,4,5,6,7,8,9,10};
    int srand(seed), ende=48,anfang=24;
    int main(void)
    {
            for(int i=0;i<anzahl;i++)
            {
              vec[i]=irand(anfang, ende;)
              cout << vec[i] << endl;
             }
    	return 0;
    
    }
    

    natürlcih mit der zugehörigen irand-funktion aus dem Eingangsbereich.

    Problem ist nur dass wenn ich das so in den Quellcode eintippe kommt immer wieder die selbe Zahl,- und diese Zahl ist auch noch weit außerhalb des Definitionsbereichs. 2.7 Milliarden oder so.



  • Diandranewby schrieb:

    in einem anderen Testdurchlauf habe ich mich ausschließlich mit der rand()-Funktion beschäftigt:

    #include <iostream>
    using namespace std;
    #include <cstdlib>
    #include "Funktionen.h"
    #define anzahl 10
    #define seed 5
    int vec[anzahl]={1,2,3,4,5,6,7,8,9,10};
    int srand(seed), ende=48,anfang=24;
    int main(void)
    {
            for(int i=0;i<anzahl;i++)
            {
              vec[i]=irand(anfang, ende;)
              cout << vec[i] << endl;
             }
    	return 0;
    
    }
    

    Okay.
    Was willst Du denn hier machen? Zehnmal die Funktion irand() benutzen, oder?
    Allerdings definierst Du in Z. 8 einen integer der genauso heißt, wie die Funktion. Das kann nicht richtig sein, oder?
    Das Semikolon in Z.13 scheint auch verrückt, was?



  • Furble Wurble schrieb:

    Diandranewby schrieb:

    in einem anderen Testdurchlauf habe ich mich ausschließlich mit der rand()-Funktion beschäftigt:

    #include <iostream>
    using namespace std;
    #include <cstdlib>
    #include "Funktionen.h"
    #define anzahl 10
    #define seed 5
    int vec[anzahl]={1,2,3,4,5,6,7,8,9,10};
    int srand(seed), ende=48,anfang=24;
    int main(void)
    {
            for(int i=0;i<anzahl;i++)
            {
              vec[i]=irand(anfang, ende;)
              cout << vec[i] << endl;
             }
    	return 0;
    
    }
    

    Okay.
    Was willst Du denn hier machen? Zehnmal die Funktion irand() benutzen, oder?
    Allerdings definierst Du in Z. 8 einen integer der genauso heißt, wie die Funktion. Das kann nicht richtig sein, oder?
    Das Semikolon in Z.13 scheint auch verrückt, was?

    Oha. Ich muss mich korrigieren: Du definierst in Z.8 einen integer, der genauso heißt wie die Funktion srand() . Das ist aber immer noch nicht besser, stimmt's?

    Ohlilien-ohlilien-ohlilien,
    ohh-ohh-ohh,
    FW



  • nur mal ein paar Korrekturen zur max Funktion.

    // der Name "anzahl" ist bereits dein Makro (#define ....), also nimm einen anderen Namen --> vecanzahl
    // der Name "max" kommt in der C++ Standard Bibliothek vor, nimm auch da einen anderen Namen --> getmax
    int getmax(int *vec, int vecanzahl) 
    {
        int maxval=vec[0]; // int und nicht int*, auf Anfangswert setzen, prüfen ob vec[0] erlaubt ist überlass ich dir
        for(int i=0;i<=anzahl;i++) // < und nicht <= sonst unerlaubter Speicherzugriff
        {
            if (vec[i]>=maxval) // > und nicht >=
                maxval = vec[i]; // Index ptr[i] und nicht (ptr+i) da lesbarer
    
        }
    }
    


  • Oha. Ich muss mich korrigieren: Du definierst in Z.8 einen integer, der genauso heißt wie die Funktion srand(). Das ist aber immer noch nicht besser, stimmt's?

    hallo,
    genau das ist mein Problem. Ich weiß nicht wie man diese Systemfunktion srand() auf den Initialwert von 5 setzt. Wenn ich als Dateityp void nehme wird ein Fehler angezeigt.

    Ich habe die Probleme in meiner restlichen Funktion gefunden, der return-wert hat gefehlt ^^"" darüber hinaus weiß ich jetzt einigermaßen wie man mit Zeigern rechnet.

    Ich habe aber wie gesagt nach wie vor Probleme mit der srand()-systemfunktion



  • Diandranewby schrieb:

    Ich weiß nicht wie man diese Systemfunktion srand() auf den Initialwert von 5 setzt.

    srand(5);
    


  • Diandranewby schrieb:

    genau das ist mein Problem. Ich weiß nicht wie man diese Systemfunktion srand() auf den Initialwert von 5 setzt.

    Die Aufgabenstellung ist an der Stelle falsch bzw. falsch formuliert. Man setzt nicht srand auf einen Initialwert (das ergibt auch keinen Sinn), sondern man setzt mithilfe von srand den Initialwert des Zufallszahlengenerators.



  • Dann lass die doch erstmal weg. rand() gibt auch so erstmal Zufallszahlen raus.



  • C++:
    srand(5);

    error: Diese Deklaration hat keine Speicherklasse oder keinen Typspezifizierer

    Dann lass die doch erstmal weg. rand() gibt auch so erstmal Zufallszahlen raus.

    ich weiß nicht ob das für meinen Dozenten in Ordnung ist



  • Diandranewby schrieb:

    C++:
    srand(5);

    error: Diese Deklaration hat keine Speicherklasse oder keinen Typspezifizierer

    Ich weiß nicht, was du schreibst, aber das ist ein stinknormaler Funktionsaufruf!



  • welche Bibliothek muss ich dafür denn einbinden? ich dachte bislang dass diese Funktion in cstdlib gespeichert ist. Das Programm läuft übrigens obwohl der Compiler angibt dass srand(5) fehlerhaft sei.



  • Dies ist ein Funktionsaufruf, also muß der innerhalb der main-Funktion aufgerufen werden:

    int main()
    {
      srand(5);
    
      // ...
    }
    

    Damit du aber jedesmal beim Aufrufen des Programms unterschiedliche Zufallszahlen kriegst, sollte man den Wert anhand der aktuellen Systemzeit bestimmen:

    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
      srand((unsigned)time(0));
    
      // ...
    }
    


  • Diandranewby schrieb:

    welche Bibliothek muss ich dafür denn einbinden? ich dachte bislang dass diese Funktion in cstdlib gespeichert ist. Das Programm läuft übrigens obwohl der Compiler angibt dass srand(5) fehlerhaft sei.

    Dieselbe wie auch für rand, cstdlib.
    Einfach am Anfang der main die Funktion aufrufen.



  • ah ich habs raus, diese Funktion muss in meiner mainfunktion als lokale Variable auftauchen und sie darf keine globale Variable sein ^^ warum ist das so?

    Soweit so gut, wenn ich allerdings jetzt das Programm starte wird mir immer wieder der selbe Wert ausgegeben. Und zwar -2147482048.



  • hier nochmal die Funktionen die ich dafür benutze

    int irand(int anfang, int ende)
    {
    	double r = ende-anfang+1;
    	return anfang+(int)(r*rand()/(RAND_MAX+1,0));
    }
    
    int vector_in(int *vecname,int anfang, int ende)
    {
    	for(int i=0;i<anzahl;i++)
    	{
    		*(vecname+i) = irand(anfang, ende);
    	}
    	return 0;
    }
    


  • ist ja lustig, ich hab das Programm neu gestartet und jetzt funktionierts einwandfrei. Danke euch allen für die Hilfe und Erläuterungen.



  • Diandranewby schrieb:

    ah ich habs raus, diese Funktion muss in meiner mainfunktion als lokale Variable auftauchen und sie darf keine globale Variable sein ^^ warum ist das so?

    Ganz sicher muss das nicht so sein. Vielleicht bringst du einen Funktionsaufruf mit der Deklaration einer Variablen durcheinander. Ich weiß zwar nicht warum, weil die wirklich vollkommen anders aussehen, aber das ist die einzige Erklärung.

    int g; // <- Deklaration einer globalen Variablen
    srand(5); // Funktionsaufruf, hier nicht erlaubt
    
    int main() {
      int x;  // <-- Deklaration einer lokalen Variablen
      srand(5); // <-- Funktionsaufruf
    }
    


  • Diandranewby schrieb:

    return anfang+(int)(r*rand()/(RAND_MAX+1,0));
    

    Statt dem Komma muß da ein Punkt hin (sonst teilst du immer durch 0 - Stichwort: Sequenzoperator!), also

    return anfang+(int)(r*rand()/(RAND_MAX+1.0));
    


  • Diandranewby schrieb:

    hier nochmal die Funktionen die ich dafür benutze

    int irand(int anfang, int ende)
    {
    	double r = ende-anfang+1;
    	return anfang+(int)(r*rand()/(RAND_MAX+1,0));
    }
    
    int vector_in(int *vecname,int anfang, int ende)
    {
    	for(int i=0;i<anzahl;i++)
    	{
    		*(vecname+i) = irand(anfang, ende);
    	}
    	return 0;
    }
    

    vec_in hat gar keinen Parameter anzahl - d.h. Du hantierst da doch irgendwo mit globalen Variablen rum. Das ist nicht gut.
    Was hast Du Dir denn bei dem Rückgabewert (0) gedacht? Ist ein Rückgabewert, der immer 0 ist nicht überflüssig wie ein Loch im Knie?


Anmelden zum Antworten