Randomisiertes mehrdimensionales Array



  • Guten Tag zusammen,

    Ich habe mich schon ein wenig mit Arrays in C beschäftigt, ich habe nun vor ein randomisiertes Array 10x10 zu erstellen. Ich stelle mir das in etwa so vor:
    0 1 2 3 4 5 6 7 8 9
    Nun sollen durch die Funktion rand() in jede Zeile Werte eingetragen werden.

    Leider ist mir nicht geläufig, wie man dies hinbekommen kann. Ich hoffe auf eure Hilfe, vielen Dank !

    Code bis jetzt:

    #include <stdio.h>
    
    int main() {
    	srand(time(NULL));
    	int i;
    	int a;
    	int tabelle[10][10];
    	for (i = 0; i < 10; i++) {
    		printf("%4d", i);
    	}
    	printf("\n");
    	system("PAUSE");
    	return 0;
    }
    


  • C-32-Programm schrieb:

    Leider ist mir nicht geläufig, wie man dies hinbekommen kann.

    Da du (außer der Definition) nichts mit dem Array machst, weiß ich leider nicht, wo genau dein Problem liegt. Daher kann ich nur raten.

    Du hast ein 2D-Array. Da wären zwei ineinander verschachtelte Schleifen nicht schlecht.

    Und da du schon srand gefunden hast, sollte rand ja gleich mit Beispielen dabei sein. Wie z.B. bei http://www.cplusplus.com/reference/cstdlib/rand/



  • Ich möchte in dem 2D Array randomisierte Werte einbauen, ich weiß jedoch nicht, wie ich rand() implementieren soll (zwischen die for Schleifen ?):

    int main() {
    	//srand(time(NULL));
    	//int i;
    	//int a;
    	//int tabelle[10][10];
    	//for (i = 0; i < 10; i++) {
    	//	printf("%4d", i);
    	//}
    
    	// [Y][X]
    	// Inhalt {0} ist Null
    	int tabelle[10][10] = { 0 };
    	int i, j;
    
    	// Schleife fuer Zeilen, Y-Achse
    	for (i = 0; i<10; i++) {
    		// Schleife fuer Spalten, X-Achse
    		for (j = 0; j<10; j++) {
    
    			printf("%4d ", tabelle[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("PAUSE");
    	return 0;
    }
    


  • 1. Kompiliert dein Beispiel mit einem Haufen Fehlermeldungen:

    In Funktion »main«:
    20:13: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]
    22:9: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]
    26:5: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]
    

    Da fehlt ein '#include <stdio.h>'.

    2. Wieso sehe ich in mehr als jedem zweiten Code int main() ? Wir sind hier nicht bei C++, Leute. Das soll int main(void) sein, oder int main(int argc,char*argv[]) ;

    3. "PAUSE" kenne ich hier nicht. system ist verpönt. An jedem, der system verwendet, darf man Rache ausüben. system ist die Unterschrift von Jürgen Wolf.

    4. Du kannst auch direkt ein eindimensionales Array machen. Das hilft dir, ein anderes Bild im Kopf zu entwickeln:

    #include <stdio.h>
    
    #define MY_ROWS         (10)
    #define MY_COLUMNS      (20)
    
    int main(void)
    {
            int i,j;
            int tabelle[MY_ROWS*MY_COLUMNS]={0};
    
            for(i=0;i<MY_ROWS;i++)
            {
                    for (j=0;j<MY_COLUMNS;j++)
                            printf("%4d ",tabelle[i*MY_COLUMNS+j]);
                    printf("\n");
            }
    
            printf("\n");
            return 0;
    }
    

    Und schlussendlich:
    5. Das ist nicht dein Ernst, oder?
    Erstens willst du rand() nicht implementieren, du willst es aufrufen. Und zweitens hast du bereits srand() gefunden - das bedeutet, du solltest ebenfalls wissen, wie rand() funktioniert. Zu Anfang hätte man das noch als "Naja, auf 'ner beschissenen Seite nachgelesen" wegtun können, weil die das halt nicht behandelt haben (wobei du bereits von rand() wusstest ... egal.). Aber jetzt hält dich nichts mehr davon ab, selbstständig nachzuschauen, wie andere Leute rand() verwenden.



  • Ich versuche das mal ein wenig zu erklären, zu #include <stdio.h>
    genau das habe ich hier im Codebeispiel vergessen herein zu kopieren, in meiner Implementierung ist das drin, sonst führt das, genau wie du sagst zu Fehlern.

    Zu system("PAUSE"), was ist denn daran falsch ? Ich arbeite mit Visual Studio und dort ist es leider so, dass dieses system("PAUSE") eingebaut werden muss, da das Programm sonst zu schnell beendet wird. Dann würde mich interessieren, was es gegen Jürgen Wolf einzuwenden gibt ?

    Dann interessiert mich noch warum du meinst es müsse int main(void) heißen ?
    Bis dato haben wir an der UNI immer mit int main() angefangen, da ich mich jedoch nicht vor einer "besseren" Lösung verschließen möchte, erklär mir diesen Sachverhalt doch bitte.



  • Zunächst mal zu deinem Problem:
    rand() ist eine Funktion, dei einen Wert zurückgibt.
    Darum kannst du diesen Wert einer Variablen zuweisen.

    tabelle[i][j] = rand();
    

    In VisualStudio kann man das Programm auch so starten, dass die Konsole offen bleibt. (Ctrl+F9 oder so)
    Das Beste ist aber, du öffnest gleich eine Konsole (wechselst in das Verzeichnis mit dem Programm) und startest das Programm (durch eintippen vom Namen) darin.

    Zu der main-Definition: https://www.c-plusplus.net/forum/viewtopic.php?t=39346

    Zu Jürgen Wolf: Nutze die Foren-Google-Suche "Suchabfrage powered by Google" (die normale geht nicht) https://www.c-plusplus.net/forum/search



  • Danke DirkB, ich verstehe jetzt, wie das zu lösen ist, mir ist nur ein wenig schleierhaft, warum dachschaden eine solchen"Aufstand" gemacht hat ?! 😞 😕



  • C-32-Programm schrieb:

    Zu system("PAUSE"), was ist denn daran falsch ?

    Ich bin hier auf einem Linux-System, das kennt "PAUSE" nicht.

    sh: PAUSE: Kommando nicht gefunden.
    

    system ist ein Befehl, mit dem du Anweisungen an die Konsole senden kannst. Wenn die Konsole den Befehl nicht kennt, funzt das Programm nicht so, wie du willst.

    C wurde immer so entwickelt, dass die Sprache klein ist und das OS/Laufzeitumgebung einen gewissen Teil der Funktionalität bereitstellt. Wenn du später willst, dass deine Programme funktionieren, sollten sie so geschrieben sein, dass der erwähnte OS/Laufzeitumgebungscode vom OS/der Laufzeitumgebung kommt.

    Akutes Beispiel bei einer Codereview, die ich durchführe:
    die Leute, die das Modul geschrieben haben, haben WIN32-Checks gemacht, aber geben, um Zeilenumbrüche zu prüfen, nur '\n' an (auf Windows ist aber "\r\n" ein Zeilenumbruch). Auf Windows kompiliert das dann zwar, aber zur Laufzeit fliegt dir alles um die Ohren.

    Noch ein Beispiel: eine Datei wurde nicht im Binary-Mode gelesen ( fopen("bla","rb") ), aber die Startposition, von der gelesen sollte, behandelte den Zeilenumbruch dann doch wie zwei Zeichen. Beim Einlesen hat dann am Anfang ein Byte gefehlt (weil sie wegen dem fehlenden Zeichen drübergerutscht sind).

    Lass sowas einfach und verwende besser direkt getchar() . Oder mach's so, wie DirkB es vorschlägt. OK? 😉

    C-32-Programm schrieb:

    Dann würde mich interessieren, was es gegen Jürgen Wolf einzuwenden gibt ?

    Neustes Beispiel, wie man's NICHT macht.

    C-32-Programm schrieb:

    Dann interessiert mich noch warum du meinst es müsse int main(void) heißen ?
    Bis dato haben wir an der UNI immer mit int main() angefangen, da ich mich jedoch nicht vor einer "besseren" Lösung verschließen möchte, erklär mir diesen Sachverhalt doch bitte.

    Mit einer leeren Parameterliste signalisierst du, dass deine Funktion beliebig viele Parameter erwartet. In C++ hat man das so geändert, dass drei Punkte (...) eine variable Argumentenliste erwarten, und eine leere Liste signalisiert, dass keine Parameter erwartet werden.

    In C wird die leere Liste durch (void) angegeben. Wen du das machst, schützt der Compiler dich direkt vor Fehlern, in denen deine Funktionen mit Parametern aufgerufen werden, obwohl diese nicht erwartet werden.



  • Mir auch.

    Du musst noch stdlib.h einbinden. Darin sind u.a. rand und [c]srand deklariert.



  • C-32-Programm schrieb:

    Danke DirkB, ich verstehe jetzt, wie das zu lösen ist, mir ist nur ein wenig schleierhaft, warum dachschaden eine solchen"Aufstand" gemacht hat ?! 😞 😕

    Ich halb halt 'ne Zwangsneurose. 😉
    Und wenn man jemanden direkt erklärt, wie man bestimmte Fehler nicht macht, eignet man sich das auch gar nicht erst an.



  • Ich habs mir schon fast gedacht, dass der besagte Autor etwas mit den "netten" Programmierbüchern zu tun hat. Aber wie kann es denn bitte sein, dass ein Autor ein Buch veröffentlichen kann, in welchem so viele Fehler sind ?

    Ansonsten habe och keine weiteren fragen mehr, danke an dachschaden und DirkB, immer zur stelle bei Fragen danke 😉



  • Freie Wirtschaft. Wer kann, der kann. Und wenn er auch nur vorgeben kann, etwas zu können.
    Sollte mir aber eigentlich (vernünftigerweise) nichts ausmachen. Ich bestreite meinen Lebensunterhalt damit, die Fehler von anderen rauszusuchen und zu korrigieren. Unter anderem. 😃



  • Sooo ein klein wenig gebastelt und nun funktioniert es wunderbar !

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> 
    
    int main() {
    	srand(time(0));
    	// [Y][X]
    	// Inhalt {0} ist Null
    	int i, j;
    	int tabelle[10][10] = { rand() };
    	// Schleife fuer Zeilen, Y-Achse
    	for (i = 0; i<10; i++) {
    		// Schleife fuer Spalten, X-Achse
    		for (j = 0; j<10; j++) {
    			tabelle[i][j] = rand();
    			printf("%6d ", tabelle[i][j]);
    		}
    		printf("\n");
    	}
    	printf("\n");
    	system("PAUSE");
    	return 0;
    }
    

    int tabelle[10][10] = { rand() }; funktioniert
    int tabelle[10][10] = { 0 }; funktioniert auch, warum ?

    Dann würde mich noch interessieren, wie kann man diese Werte denn jetzt Ordnen und darüber hinaus wie kann ich 0 1 2 3 4 5 6 7 8 9 über das Array schreiben, dass die zufälligen Elemente unter den Zahlen 0 1 2... stehen ?



  • C-32-Programm schrieb:

    int tabelle[10][10] = { rand() }; funktioniert
    int tabelle[10][10] = { 0 }; funktioniert auch, warum ?

    Das ist in beiden Fällen eien Definition mit gleichzeitiger Initialisierung.
    Dabei wird den Elementen, die nicht durch Werte auf der rechten Seite besetzt werden, 0 zugewiesen.
    Es bekommt also nur das Element tabelle[0][0] den Wert von rand() Der Rest ist 0.

    C-32-Programm schrieb:

    Dann würde mich noch interessieren, wie kann man diese Werte denn jetzt Ordnen und darüber hinaus wie kann ich 0 1 2 3 4 5 6 7 8 9 über das Array schreiben, dass die zufälligen Elemente unter den Zahlen 0 1 2... stehen ?

    Eine Schleife vor der Ausgabe, die von 0 bis 9 läuft und dann die Schleifenvariable (im gleichen Format wie die Tabelle) ausgibt.

    Wenn du statt i und j gleich x und y nimmst, sparst du dir auch den Kommentar. 😃



  • Genau hat auch funktioniert, gibt es eigentlich eine Möglichkeit diese randomisierten Zahlen jeweils unter die 0 1 2 3 .... geordnet zu setzen, soll heißen: Es gibt ja eine Wahrscheinlichkeitshäufung von bestimmten Werten also der letzten Zahl, die mit 0,1,2,3... enden. Kann man diese geordnet unter die 0 1 2 ... Zeile setzen ?



  • Häufigkeit berechnen und in einem Array sortiert ablegen.

    Dafür gibt es keine fertige Funktion.



  • Hallo, ich habe das ganze mal umgeschrieben in ein normales eindimensionales Array, kann mir jemand erklären, wie ich da die Werte auflisten kann, also sortiert ? das Array ist immer noch randomisiert, könnte man da einen Mergesort drüber laufen lassen ? Oder geht das einfacher ?

    Dann würde mich noch interessieren:
    int tabelle[100] = { 0 };
    int tabelle[10] = { 0 };
    int tabelle[100] = { 0 };

    warum macht es keinen unterschied wie groß das Array ist, ich meine ich habe 10x10 ergibt 100 aber warum wird mir mein Array auch angezeigt, wenn es unter [100] groß ist ?
    Danke



  • C-32-Programm 2 schrieb:

    warum macht es keinen unterschied wie groß das Array ist, ich meine ich habe 10x10 ergibt 100 aber warum wird mir mein Array auch angezeigt, wenn es unter [100] groß ist ?

    Weil in C die Arraygrenzen nicht überprüft werden. Du greifst da halt auf irgendeinen Speicher (evtl. von anderen Variablen) zu.


Log in to reply