C++ Tabelle mit Variable vergleichen
-
theta schrieb:
Und übrigens.. wenn nach einer if-Verzweigung nur 1 Anweisung folgt kannst du die geschweiften Klammern weglassen
Finde ich persönlich leserlicherFinde ich nicht.
Das ist ja gott sei dank jedem so überlassen wie er's mag

Ich finde in dem Fall blähen sie den Code nur unnötig auf, wären bei einer if .. else.. ja schon 4 Klammern.Aber das soll ja nicht sorge des Themas hier sein

-
EOutOfResources schrieb:
Ungetestet:
#include <cstdlib> //für std::rand #include <ctime> //für std::time #include <cstddef> //für std::size_t #include <vector> //für std::vector #include <algorithm> //für std::find static const double Range = 5.0; //Was weiss ich, maximale Grösse eines Eintrags von Matches bool DoubleCompare( int main() { std::vector Matches; //Die schöne Antwort für ein Array Matches.push_back(1.2); Matches.push_back(1.3); Matches.push_back(2.3); Matches.push_back(3.0); Matches.push_back(3.0); double RandomNumber; //Keine Initialisierung, wozu auch? std::srand(std::time(0)); //Oder statt 0 ein NULL, ist egal do { RandomNumber = static_cast<double>(std::rand()) / RAND_MAX * Range; //Vielleicht willst du noch auf eine Stelle nach dem Komma runden } while(std::find(Matches.begin(), Matches.end(), RandomNumber) != Matches.end()); //Achtung: Fliesskomma-Vergleich -> Böse //Hier sind wir wenn es keine Übereinstimmung mehr gibt. }Funktioniert bei mir nicht...
und das bei der liste sind nur frei erfundene werte
ausserdem verstehe ich nur bahnhof ↑ sowas ab ich noch nicht gemacht!
-
Neu:
#include <cstdlib> //für std::rand #include <ctime> //für std::time #include <cstddef> //für std::size_t #include <vector> //für std::vector #include <algorithm> //für std::find static const double Range = 5.0; //Was weiss ich, maximale Grösse eines Eintrags von Matches int main() { std::vector<double> Matches; //Die schöne Antwort für ein Array Matches.push_back(1.2); Matches.push_back(1.3); Matches.push_back(2.3); Matches.push_back(3.0); Matches.push_back(3.0); double RandomNumber; //Keine Initialisierung, wozu auch? std::srand(std::time(0)); //Oder statt 0 ein NULL, ist egal do { RandomNumber = static_cast<double>(std::rand()) / RAND_MAX * Range; //Vielleicht willst du noch auf eine Stelle nach dem Komma runden } while(std::find(Matches.begin(), Matches.end(), RandomNumber) != Matches.end()); //Achtung: Fliesskomma-Vergleich -> Böse //Hier sind wir wenn es keine Übereinstimmung mehr gibt. }Ja, jetzt getestet!
-
Sorex schrieb:
#include <set> #include <cstdlib> #include <iostream> #include <conio.h> #include <time.h> // muss rein using namespace std; int main() { srand( (unsigned) time(NULL) ) ; int w,r,i; int Steam=1,Steam2=2; int aTeam=3; double vergleich=0; double GesSpiele[5]={1.2,1.3,2.3,3,3}; // hier 3,3 oder 3.3 gemeint? for(i=aTeam; i<0;i-1) // erkennst du den fehler? ;) JA hat ich vorher anders da hats auch nicht funktioniert { w=0; do { do { do { do { Steam=1 + rand()%(100+1); Steam2=1 + rand()%(100+1); }while(Steam>aTeam); }while (Steam2>aTeam); }while (Steam==Steam2); if(Steam<Steam2) vergleich=Steam+(Steam2*0.1); else vergleich=Steam2+(Steam*0.1); for(r=0; r < 3; r++) { if(GesSpiele[r]==vergleich) { w=9; cout<<" "<<vergleich; } else w++; } }while (w<4); GesSpiele[i]=vergleich; } cout<<vergleich << "\n"; cout<<"\ncool "<<GesSpiele[0]<<"\ncool "<<GesSpiele[1]<<"\ncool "<<GesSpiele[2]<<"\ncool "<<GesSpiele[3]; _getch(); return 0; }Wenn du den Fehler, auf den ich dich hingewiesen hab noch korrigierst, lässt sich das Programm, zumindest bei mir unter Visual C++ 2010, fehlerfrei und ohne Warnungen kompilieren. Verstehe trotzdem nicht so ganz, welches Ziel du eigentlich verfolgst.
Und übrigens.. wenn nach einer if-Verzweigung nur 1 Anweisung folgt kannst du die geschweiften Klammern weglassen
Finde ich persönlich leserlicher
jetzt funktioiert das Programm immer noch nicht!
es soll einfach zufallswerte mit einer Tabelle vergleichen und wenn der Wert schon vorhanden ist neue werte machen bis die werte nich mehr vorkommen (und dann diese werte in die Tabelle schreiben)
-
Nehmen wir mal an es wird 1,3 gefunden. Diese 1,3 soll dann durch einen andere zufällige Zahl ausgetauscht und ausgegeben werden?
-
JA denn 1,3 ist ja schon vorhanden dann durch z.B 2,4 oder so (aber nicht in der tabelle)
-
Das Problem ist, dass du nirgends eine neue Zufallszahl erstellst, sondern deinen in "vergleich" erstellten wert einfach wieder ins array schreibst.. versuchs mal damit
for(r=0; r < 3; r++) { if(GesSpiele[r]==vergleich) { w=9; cout<<" "<<vergleich; GesSpiele[r] = (rand()%(100-0+1))*0.1; //kannst du so anpassen, wie du es gerne hättest } else w++;GesSpiele[i]=vergleich; -> die zeile kommt raus
-
ICH HABS!!!!
für alle dies interessieren (ich glaube die lösung so simple wie nur möglich) ichs
[code] for(e=1; e<kaSpiele; e++) { //----------Zufällige-Paarungen------------------------------------------------- w=4950; while (w!=0) { do { do { do { Steam=1 + rand()%(100+1); Steam2=1 + rand()%(100+1); }while(Steam>cup.aTeam); }while (Steam2>cup.aTeam); }while (Steam==Steam2); if(Steam<Steam2) { vergleich=Steam+(Steam2*10); } else { vergleich=Steam2+(Steam*10); } i=4950; for(r=0;r<=4950;r++) { vergleich2=GesSpiele[r]; if(vergleich2==vergleich) { w=3; i=i-1; } if(i==4950) { w=0; } } } }[/code]
NICHT verständlich oder
!!!!!!
-
Wenn ich richtig verstehe, was das Ganze soll, ist es eine ziemlich wackelige Angelegenheit, das mit doubles zu erschlagen - Fließkommazahlen sind keine exakten Datentypen, und 0.1 ist binär nicht exakt darstellbar. Es ist durchaus möglich, dass du da mit Rundungsfehlern Probleme kriegst und subtile, schwer auszumachende Fehler bekommst.
Etwas besser wäre es, Integer zu benutzen (meinetwegen 15 statt 1.5, 34 statt 3.4 etc.), aber so oder so kriegst du bei mehr als 10 Teams großen Ärger. Am sinnvollsten scheint mir std::pair<unsigned, unsigned>.
Außerdem: Wenn es dir darum geht, alle möglichen Kombinationen in zufälliger Reihenfolge auszulosen, ohne dich zu wiederholen, gibt es dafür einen Algorithmus in der Standardbibliothek: std::random_shuffle. Das sieht dann beispielsweise so aus:
#include <algorithm> #include <cstdlib> #include <ctime> #include <iostream> #include <utility> #include <vector> typedef std::pair<unsigned, unsigned> match_t; void print_match(match_t const &p) { std::cout << "( " << p.first << ", " << p.second << " )" << std::endl; } int main() { unsigned const num_teams = 5; std::srand(std::time(0)); std::vector<match_t> matches; // Das hier nur aus Performance-Gründen: Genug Speicher für die Spiel // anfordern, die gleich in den Vektor geschoben werden matches.reserve(num_teams * (num_teams - 1) / 2); // Das hier baut eine Liste aller möglichen Spiele auf for(unsigned i = 1; i < num_teams; ++i) { for(unsigned j = i + 1; j <= num_teams; ++j) { matches.push_back(match_t(i, j)); } } // Hier werden die möglichen Spiele wie ein Kartenspiel gemischt std::random_shuffle(matches.begin(), matches.end()); // Und das hier ist für die Ausgabe. std::for_each(matches.begin(), matches.end(), print_match); }
-
DAVON habe ich keien ahnung und da ich ja gesagt habe das ich es für die schule brauche kann ich nicht irgendetwas einbauen von dem ich keine ahnung habe
