Neuling braucht Ratschläge/Hilfe
-
Hallo,
ich brauche Hilfe bei folgender Aufgabe:Erstellen sie ein C/C++-Programm, das aus einer Liste von N Ganzzahlen das Minimum und das Maximum sowie den Mittelwert der Zahlen berechnet. Gehen sie dabei wie folgt vor:
-Programmieren sie eine Funktion, die einen Vektor mit 256 Zufallszahlen in einem definierten Zahlenbereich (Datentyp int) füllt.
-Die Systemfunktion srand() initialisiert den Zufallszahlengenerator und wird im Hauptprogramm auf den Initialwert 5 gesetzt.
-Benutzen sie die Funktion irand(): int irand(int nafang, int ende){double r=ende-anfang+1;
return anfang+(int) (r*rand()/(RAND_MAX+1.0));
-Die Schnittstelle sei z.B. vector_in(int *vec, int anzahl);-erstellen sie nun mit der Funktion vector_in() zwei Vektoren, die zum einen Stromwerte (Wertebereich zwischen 1600 und 2000 mA)und Spannungswerte(zwischen 24 Volt und 48 Volt) enthalten.
-Die Vektoren für Strom und Spannung werden im Hauptprogramm definiert.
-Programmieren sie drei weitere Funktionen, die von den Strom- und Spannungswerten jeweils das Maximum, Minimum und den arithmetischen Mittelwert bilden.
-Abschließend sollen alle Messwerte und Kenndaten in einer Tabelle ausgegeben werden. Nach jeweils 25 ausgegebenen Zeilen soll die Ausgabe solange angehalten werden, bis der Anwender eine beliebige Taste drückt.
Da ich mich noch sehr weit am Anfang befinde werden nur das Können Grundfunktionen vorausgesetzt.
Die Funktion mit dem Minimum, Maximum und arithmetischen Mittelwert müssen mit Zeigervariablen funktionieren. Ich ärger mich damit jetzt schon das ganze Wochenende mit rumm und sehe allmälich ein dass ich zu doof bin mir das selbst beizubringen ^^
ich hab auch Probleme damit die srand()-Systemfunktion auf den Wert 5 zu initialisieren. Entweder wird nichts ausgegeben, es kommen immer wieder die selben Zahlen oder das Programm schließt sich im Testlauf sofort wieder.
Ich bin außerdem am überlegen wie ich den Quellcode so schreiben kann dass das Testprogramm immer nur 25 Werte ausgibt und dann bei Tastendruck weitere 25 Werte ausgibt.
Ich denke dabei an eine forschleife in einer ForSchleife.
Ich hoffe auf baldige Antwort
LG
-
Was hast du schon, wo hast du konkrete Probleme (bitte stelle auch konkrete Fragen)?
Niemand wird hier für dich die vollständige Aufgabe lösen...
-
Zeig mal deine bisherigen Ansätze. srand soll den Zufallsgenerator auf einen Anfangswert setzen. Damit sollten auch immer dieselben Zufallszahlen kommen. Außerdem ist es normal, dass sich Programme schließen nachdem sie fertig sind.
-
vector_in(int *vec, int anzahl);Ist ja nur ein Beispiel.
Mit Hinblick auf die weitere Aufgabenstellung würde ich stattdessen folgendes vorschlagen:// erstellt "anzahl" zufällige integer Werte zwischen "anfang" und "ende" // ab Speicherbereich "vec" void vector_in(int *vec, int anzahl, int anfang, int ende);
-
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 Funktionirand()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 Funktionirand()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.