Wettsystem simulieren



  • Fang so garnicht erst an. array[wirdschonreichen] ist böse. Weil nämlich irgendwer auf die dumme Idee kommt auf wirdschonreichen+1 zuzugreifen und es knallt. Außerdem ist 80000 bytes für ein array was wahrscheinlich nur 40 bytes braucht Speicherverschwendung.

    Versuche es mal mit verketteten Listen. Wiki kann das besser erklären als ich: http://de.wikipedia.org/wiki/Verkettete_Liste

    Das hat den Vorteil dass es meistens ein tausendstel des Speicherbedarfs braucht und in den seltenen Fällen dass es mal mehr als 20000 Zahlen werden, was mal passieren kann wenn du dich beim Zufallsgenerator vertippst, weiterhin funktioniert.

    Und was noch viel wichtiger ist, du gewöhnst die einen Stil an der es dir erlaubt mehr als 1000 Zeilen Code zu schreiben ohne dass du den Überblick verlierst.



  • nwp2 schrieb:

    Fang so garnicht erst an. array[wirdschonreichen] ist böse.

    Ohja, arrays pinkeln im stehen und fressen kleine Kinder;
    ich höre schon das bedrohliche Knurren aus der Ferne: grrrrrrr ... -
    ein böses Array im Anmarsch!

    nwp2 schrieb:

    Weil nämlich irgendwer auf die dumme Idee kommt auf wirdschonreichen+1
    zuzugreifen und es knallt.

    Knallen kann es schon bei array[wirdschonreichen].
    Genauso gut kann es knallen, wenn man auf ein falsch aressiertes Listenelement zugreift.
    Hier ist der Programmierer gefragt, sein Array bzw. seine Liste mit geeigneten
    Funktionen gegen solche Zugriffe zu schützen.

    nwp2 schrieb:

    Außerdem ist 80000 bytes für ein array was
    wahrscheinlich nur 40 bytes braucht Speicherverschwendung.

    Das könnte ein Argument bei Minimalsystemen sein, bei denen man wenige KBytes
    RAM hat. Für heutige PC Systeme mit einem Standard von > 256 MB RAM belanglos.

    nwp2 schrieb:

    Versuche es mal mit verketteten Listen. Wiki kann das besser erklären als ich: http://de.wikipedia.org/wiki/Verkettete_Liste

    Dies kann sicherlich nicht schaden. Am besten das Programm einmal mit einem Array und
    einmal mit einer verketteten Liste schreiben, um z.B. den Aufwand zu vergleichen und
    um neue Programmiertechniken zu lernen.

    nwp2 schrieb:

    ... und in den seltenen Fällen dass es mal mehr als 20000 Zahlen werden, was mal passieren kann wenn du dich beim Zufallsgenerator vertippst, weiterhin funktioniert.

    😕

    nwp2 schrieb:

    Und was noch viel wichtiger ist, du gewöhnst die einen Stil an der es dir erlaubt mehr als 1000 Zeilen Code zu schreiben ohne dass du den Überblick verlierst.

    Was hat das Benutzen eines Arrays bzw. einer Liste mit dem Programmierstil zu tun?
    Um mal die Antwort vorweg zu nehmen: nichts.



  • Big Brother schrieb:

    nwp2 schrieb:

    Außerdem ist 80000 bytes für ein array was
    wahrscheinlich nur 40 bytes braucht Speicherverschwendung.

    Das könnte ein Argument bei Minimalsystemen sein, bei denen man wenige KBytes
    RAM hat. Für heutige PC Systeme mit einem Standard von > 256 MB RAM belanglos.

    Solange man es bei 100 Zeilen Code belässt stimmt das. Wenn man sowas ständig macht dann geht auch modernen Rechnern irgendwann der Speicher aus. Aber das eigentlich schlimme ist dass künstliche Grenzen eingebaut werden die echt nicht sein müssen.

    Big Brother schrieb:

    nwp2 schrieb:

    ... und in den seltenen Fällen dass es mal mehr als 20000 Zahlen werden, was mal passieren kann wenn du dich beim Zufallsgenerator vertippst, weiterhin funktioniert.

    😕

    Was ist denn daran nicht zu verstehen?

    Big Brother schrieb:

    nwp2 schrieb:

    Und was noch viel wichtiger ist, du gewöhnst die einen Stil an der es dir erlaubt mehr als 1000 Zeilen Code zu schreiben ohne dass du den Überblick verlierst.

    Was hat das Benutzen eines Arrays bzw. einer Liste mit dem Programmierstil zu tun?
    Um mal die Antwort vorweg zu nehmen: nichts.

    Natürlich hat das Benutzen von Arrays und Listen mit dem Programmierstil zu tun. Benutzt man Listen mit dynamischem Speicher hat man Code der verständlich und anpassbar ist und er funktioniert. Benutzt man Arrays im array[wirdschonreichen]-Stil hat man Speicherverschwendung, das Programm wird unlesbar und ab und zu gibts nen Segfault. Macht bei 100 Zeilen Code noch nicht viel aus, aber man will ja mal über trivial hinauskommen. Nichts gegen Arrays, die haben ihren Nutzen, aber das Programm völlig zu verbuggen weil man zu faul für 3 Zeilen mehr Code ist kanns nicht sein.

    Aber ich will mich ja nicht streiten, wer solchen zusammengehackten Müll schön findet, bitte. Ich finde nur man sollte Neulingen sagen dass das auf Dauer nicht beherrschbar ist.



  • #include <stdio.h> 
    
    #define MAX 200
    
    	int array[MAX]={1,2,3,4};
    	int indx = 3;
    	int kapital = 300;
    
    int main(void){
    
    	int wetthoehe = array[0]+array[indx];
    
    	while (kapital>wetthoehe) {
    		kapital = kapital - wetthoehe;						// wetteinsatz von kapital abziehen
    		int zufallszahl = rand()%37-1;						// 0 - 36 (Roulette) :-) 
    		if (zufallszahl > 18) {								// gewettet auf zahlen "19-36" 
    			kapital = kapital + wetthoehe + wetthoehe;					// gewonnen
    			array[0]=0;										//kleinster wert wird gelöscht				
    			array[indx]=0;									//höchster wert wird gelöscht
    			indx = indx - 2;								//minus 2, da zwei werte gelöscht werden
    			sortierearray();								//array neu sortieren, sodass kleinster wert auf arr[0] und höchster auf arr[index] ist
    
    			else {
    				array[indx+1] = wetthoehe;
    				indx++;
    			}
    
    		}
    	}
    
    }
    
    void sortierearray()
    {
    	int anzahlzahlen = indx + 1;
    	int i;
    	for (i=anzahlzahlen; i=1; i--)							//da array[0] leer ist, soll hiermit um eine stelle vorgerückt werden, 1 auf 0, 2 auf 1, usw..
    	{	
    		array[anzahlzahlen-i] = array[anzahlzahlen-i+1];
    	}
    }
    
    }
    }
    

    hab mal drauf los geschrieben..
    compile meckert : 1) implicit decleration of function rand..
    2) implicit decleration of function sortierarray
    3) expected expression before "else"

    eigentlich wollte ich nur wissen, ob meine IDEE vom sortierarray funktionieren kann.. will damit jedesmal wenn "höchste und niedrigste" gelöscht werden, die übrigen zahlen vorrücken, sodass in array[0] immer die nidrigste zahl drinnen steht!

    greets



  • nwp2 schrieb:

    Natürlich hat das Benutzen von Arrays und Listen mit dem Programmierstil zu tun. Benutzt man Listen mit dynamischem Speicher hat man Code der verständlich und anpassbar ist und er funktioniert.

    Listen sind schwieriger zu programmieren, erfordern einen größeren Aufwand, sind infolge dessen anfälliger für Fehler, benötigen eine längere Test- und Debugphase.

    nwp2 schrieb:

    Benutzt man Arrays im array[wirdschonreichen]-Stil hat man Speicherverschwendung, das Programm wird unlesbar und ab und zu gibts nen Segfault.

    Ganz im Gegenteil - weniger Zeiger, besser lesbar. Ein Programmierer sollte ruhig auch ein Programm in dem Arrays vorkommen lesen können. Warum sollte es eine Speicherverletzung geben, wenn man die Arraygrenzen absichert. Nen Segfault gibt auch bei fehlerhaft programmierten Listen.

    nwp2 schrieb:

    Macht bei 100 Zeilen Code noch nicht viel aus, aber man will ja mal über trivial hinauskommen. Nichts gegen Arrays, die haben ihren Nutzen, aber das Programm völlig zu verbuggen weil man zu faul für 3 Zeilen mehr Code ist kanns nicht sein.

    Auch bei 10000 Zeilen Code, über mehrere Dateien verteilt :D, ist noch lange nix verbuggt, wenn die Arrays sinnvoll eingesetzt werden.

    nwp2 schrieb:

    Aber ich will mich ja nicht streiten, wer solchen zusammengehackten Müll schön findet, bitte. Ich finde nur man sollte Neulingen sagen dass das auf Dauer nicht beherrschbar ist.

    'Wird schon reichen Arrays' sind durchaus beherrschbar, wenn sie sinnvoll benutzt werden:

    - Wenn die Anzahl der Arrayelemente konstant ist.
    - Lokal in einer Funktion für Benutzereingaben, bei denen die
    maximale Anzahl der einzugebenen Arrayelemente feststeht. Nach
    dem Verlassen der Funktion ist der Stackspeicher wieder frei, es
    gibt keine Speicherplatzverschwendung und alle sind glücklich.
    - etc.
    💡 Sinnvoll benutzte Arrays sind kein zusammengehackter Müll und leichter beherrschbar als verkettete Listen. 💡

    Ich will mich auch nicht streiten. Bin auch kein Freund von Ressourcenverschwendung. Ganz im Gegenteil. In Falle des Threaderöffners würde ich aus Funktionalitätsgründen zu einer doppelt verketteten Liste tendieren.
    Gruß,
    B.B.



  • lordvampire schrieb:

    eigentlich wollte ich nur wissen, ob meine IDEE vom sortierarray funktionieren kann..

    Nein.
    Falls du wissen willst warum, liest du weiter:
    Die for Schleife wird solange durchlaufen, wie ihr mittlerer Teil (hier: i=1), der als ein boolscher Ausdruck ausgewertet wird, wahr ist.
    Wäre also nur in genau einem Fall zutreffend - vermutlich nicht das, was du willst.

    Gruß,
    B.B.



  • Moment, sorry, habe deinen Kommentar übersehen:

    //da array[0] leer ist, soll hiermit um eine stelle vorgerückt werden, 1 auf 0, 2 auf 1, usw..

    Ja, die Idee funzt, bloß noch die Funktion anpassen.
    Ich weiß schon, warum ich Zeile 43 nicht ausgecodet habe - in mir schlummern wahrhaft didaktische Talente^^

    P.S.
    Tust du eingetlich auch gar nicht sortieren. Ist eher ein Rutscharray.
    Ansonsten sind noch Bugs im Code, aber wird schon.
    Gruß,
    B.B.
    🙂



  • wollte dir gerade erklären, warum ich denke dass die for-schleife schon funktionieren sollte... aber du hast ja mein kommentar gelesen... 🙂

    was meinste mit funkiton anpassen?

    und erklär mir bitte die bugs?? sonst brauch ich noch jahre!

    werde dann den weiteren fortschritt posten...

    greets



  • Die Idee funzt, die for Schleife geht so nicht.
    Mit Funktion anpassen meine ich eine Arrayrutschfunktion zu schreiben, die Funktioniert.
    Die Bugs sind: Der Wert 36 wird nie erreicht.
    Die Arraygrenzen sind nicht abgesichert, d.h. dein Programm stürzt irgendwann mal 100% ab,
    wenn es denn mal läuft.
    Dann ist da noch was mit deiner Klammerung faul, aber wird schon.

    Gruß,
    B.B.



  • @BigBro: meine for-schleife (rutschfunktion) funktioniert einwandfrei...
    bin meinem ziel (a bissarl simulieren) näher...
    weiß aber immer noch nicht, wie man array absichert und so... mal schauen, ob ich LAIE das irgendwann verstehe....

    greets

    #include <stdio.h> 
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX 20
    
    int array[MAX]={1,2,3,4};
    int indx = 3;
    int startkapital = 300;
    int zufallszahl;
    int gespieltesysteme = 0;
    
    int main(){
    
    		int kapital = startkapital;
    	while (gespieltesysteme<10 && kapital>0) {
    		int wetthoehe;
    		if (array[1]>0) {
    			wetthoehe = array[0]+array[indx];
    		}
    		else {
    			wetthoehe=array[0];
    		}
    
    		kapital = kapital - wetthoehe;						// wetteinsatz von kapital abziehen
    		int zufallszahl=rand()%37;						// 0 - 36 (Roulette) :-) 
    		if (zufallszahl > 18) {								// gewettet auf zahlen "19-36" 
    			kapital = kapital + wetthoehe + wetthoehe;					// gewonnen
    			array[0]=0;										//kleinster wert wird gelöscht							array[indx]=0;									//höchster wert wird gelöscht
    			array[indx]=0;
    			indx = indx - 2;									//minus 2, da zwei werte gelöscht werden
    			if (array[1]>0) {
    				int anzahlzahlen = indx + 1;								//array neu sortieren, sodass kleinster wert auf arr[0] und höchster auf arr[index] ist
    				int i;
    				for (i=anzahlzahlen; i>0; i--)							//da array[0] leer ist, soll hiermit um eine stelle vorgerückt werden, 1 auf 0, 2 auf 1, usw..
    				{	
    					array[anzahlzahlen-i] = array[anzahlzahlen-i+1];
    				}
    				array[anzahlzahlen]=0;
    			}
    			else {
    				gespieltesysteme++;
    				array[0]=1;
    				array[1]=2;
    				array[2]=3;
    				array[3]=4;
    				indx=3;
    			}
    
    			printf ("GEWONNEN\t\t Einsatz: %d\t\t Zahl: %d\t\t Kapital: %d\n\n", wetthoehe, zufallszahl, kapital);
    		}
    		else
    			{
    				array[indx+1] = wetthoehe;
    				indx++;
    				printf ("VERLOREN\t\t Einsatz: %d\t\t Zahl: %d\t\t Kapital: %d\n\n", wetthoehe, zufallszahl, kapital);
    			}
    
    	}
    
    }
    


  • Mit absichern meinte ich dafür zu sorgen, das man nicht über Arraygrenzen hinaus zugreift.
    Was also noch zu tun wäre.



  • noch ne frage: warum bekomme ich nach dem kompilieren, jedesmal die gleichen zufallszahlen, wenn ich das programm laufen lasse??

    komisch! 🙂

    greets



  • lordvampire schrieb:

    noch ne frage: warum bekomme ich nach dem kompilieren, jedesmal die gleichen zufallszahlen, wenn ich das programm laufen lasse??

    komisch! 🙂

    Es fehlt srand, das Du am besten über einen Systemtimer aufrufst.



  • wenn ich srand verwende bekomme ich jedesmal die gleiche zufallszahl zB immer 28..
    wenn ich ohne srand mache bekomme ich immer die gleiche folge von zahlen zB. 9 dann 7 dann 4 dann 35 usw...

    mann oh mann



  • Was nimmst Du denn als seed für srand?



  • hat funktioniert, nachdem ich srand (time(NULL)); direkt unter main() gschrieben habe... hatte es vorher direkt über zufallszahl=rand()%37 hatte...

    jetzt klappts

    danke


Anmelden zum Antworten