Tabelle erstellen mithilfe von Arrays



  • Hi, ich möchte mit einem mehrdimensionalen Array eine Tabelle erstellen. In dieser Tabelle soll das kleine 1x1 dargestellt werden. Außerdem eine Kopfzeile und eine Seitenspalte mit den Zahlen 1-10
    1 2 3 4 ....


    1 | 1 2 3 4
    2 | 2 4 6 8
    3 | 3 6 9 12
    4 |

    Das Innere Der Tabelle habe ich durch Zeile 38 realisert. Aber durch diese Anweisung verschwindet mein Kopf und meine Seite. Da 0x0 natürlich 0 ergibt ( also steht Oben und links an der Spalte nur 0. Wie kann ich das ändern?
    Außerdem noch eine weitere Frage: Wie kann ich bei mehrdimensionalen Arrays nur auf eine Zeile eingehen? Soweit ich weiß ist der erste Array immer die Zeile. Aber wie formuliere ich das im cout? "Zeige nur die erste Zeile an"

    int tabelle[11][11] = { 0 };
    
    
    tabelle[0][0] = 0;
    tabelle[1][0] = 1;
    tabelle[2][0] = 2;
    tabelle[3][0] = 3;
    tabelle[4][0] = 4;
    tabelle[5][0] = 5;
    tabelle[6][0] = 6;
    tabelle[7][0] = 7;
    tabelle[8][0] = 8;
    tabelle[9][0] = 9;
    tabelle[10][0] = 10;
    
    
    tabelle[0][0] = 0;
    tabelle[0][1] = 1;
    tabelle[0][2] = 2;
    tabelle[0][3] = 3;
    tabelle[0][4] = 4;
    tabelle[0][5] = 5;
    tabelle[0][6] = 6;
    tabelle[0][7] = 7;
    tabelle[0][8] = 8;
    tabelle[0][9] = 9;
    tabelle[0][10] = 10;
    
    int i = 0, j = 0;
    // Schleife für  Zeilen, Y-Achse
    for (i = 1; i < 11; i++)
    {
    
    	// Schleife fuer Spalten, X-Achse
    	for (j = 1; j < 11 ; j++)
    	{
    
    		tabelle[i][j] = i * j;
    		cout  <<tabelle[i][j] << "\t ";
    		
    	}
    	cout << endl;
    }


  • @mmm_1482_

    durch Zeile 10

    ???



  • Wozu brauchst du überhaupt ein Array? Du berechnest das Produkt doch in der Schleife und gibst die Zahl dort aus.

    Warum sind Zeilen 4-14 und 17-27 da? Die könntest du, wenn du das Array wirklich brauchtest, auch in einer Schleife berechnen.

    Die Zeilenüberschrift oben machst du auch mit einer Schleife (vor deiner Ausgabeschleife). Die Spaltenüberschrift links machst du in deiner Schleife über die Zeilen (alsi in der i-loop), aber vor der Schleife über die Spalten (also vor der j-Loop). Ich würde übrigens vorschlagen, die Variablennamen col und row statt i und j zu verwenden, damit man sich nicht merken muss, ob i Saplte oder Zeile bezeichnet.

    Wenn du wirklich mit dem Array arbeiten willst (wie gesagt, ein Produkt kann man auch schnell on-the-fly berechnen), dann mach dir erst ein Schleifenpaar, das das Array korrekt belegt (die kann auch von 0 Starten - dann sparst du dir Zeilen 14-27 komplett). Das könntest du dann noch in eine Funktion verschieben.

    Danach machst du noch ein Schleifenpaar, das die Ausage erledigt. Ginge auch als Funktion. Wenn möglich, mische nicht unterschiedliche Aufgaben (hier: array belegen und 1x1-Feld ausgeben). Aber wie schon gesagt: das Array erscheint mir überflüssig.

    PS: Ich hoffe, dass du den Beitrag nicht wieder löscht, während ich eine Antwort schreibe.



  • @manni66 sorry meinte 38



  • @wob über die Zeilen möchte ich den Arraywert direkt festlegen
    und ja ich muss es mit einem Array machen (ist voraussetzung der Aufgabenstellung)
    Tut mir sehr lei, ich hatte das Problem beim letzten mal Falsch verfasst 😃
    danke ich versuch das mal



  • @wob Problem ist wenn ich die Kopf und Seitenspalte seperat vor der Array ausgabe mache, dann sind die berechnungen der array matrix unter der seitenspalte. Aber es soll ja wie oben genannt aussehen. Also ne richtige tabelle



  • wenn ich die Array Zugriffe nach der Schleife setze müsste der Compiler doch eigentlich die Werte, die in der Schleife entstanden sind, mit den neuen Werten initialisieren, oder nicht?
    aber in dem Fall ( erst Schleife, dann Zugriff auf einzene Arraywerte) werden einfach nur die Nullen an kopf und linker Spalte rausgenommen 😃
    das macht für mich keinen sinn



  • @mmm_1482_
    wie würdest du es mit der Hand machen?

    Erstmal die Spaltennummern ausgeben.
    Vorne Platz für die Zeilennummern lassen.

    Dann Zeilenweise die Zeilennummer und dann den Tabelleninhalt für diese Zeile ausgeben.

    wegen der Formatierung musst du mal die Modifier für cout ansehen.



  • @DirkB wie mache ich das denn in einem array? ich meine den inhalt der Tabelle habe ich. ich schaffe es aber nicht, dass kopf und seite zusammen mit dem inhalt ausgegeben wird



  • @mmm_1482_
    Der Kopf wird extra ausgegeben.

    Die Zeilennummer gibst du zwischen den Schleifen aus.

    oder wo hängt es?



  • @DirkB Wie sieht die anweisung dazu im Code aus? Es soll danach eine Benutzerfrage aufkommen, bei dem der benutzer eine beliebige Zeile aufrufen kann. Ich weiß leider nicht, wie ich die werte aus dem ersten Array ausgeben lassen kann, wenn es sich dabei um einen zweidimensionalen Array handelt. Normalerweise würde ich das über eine Schleife machen und dann den Wert i für jeden Array wert kleiner 10 ausgeben lassen. Aber bei einem array [11][11] wie geht das da?



  • @DirkB
    ich hab etwas ausprobiert und das scheint zu klappen:
    ( gibt es einen besseren Weg, oder ist dieser Code dafür gut?)

    int zeilen_auswahl = 0;
    cout << "Bitte geben Sie éine Zeile ein: " << endl;
    cin >> zeilen_auswahl;
    
    
    int row1 = 0;
    int col1 = 0;
    for (row1 = 0; row1 < 11; row1++)
    {
    	for(col1=0; col1<11; col1++)
    	{
    		if (row1 == zeilen_auswahl)
    			cout << tabelle[row1][col1] << "\t ";
    	}
    	
    
    	cout << endl;
    }


  • @mmm_1482_ Warum noch die Schleife für die Zeilen?

    int zeilen_auswahl = 0;
    cout << "Bitte geben Sie éine Zeile ein: " << endl;
    cin >> zeilen_auswahl;
    
    	for(int col1=0; col1<11; col1++)
    	{
    	  cout << tabelle[zeilen_auswahl][col1] << "\t ";
    	}
    	
    
    	cout << endl;
    


  • @DirkB ich hatter es vorher ohne probiert, aber da hat es nicht funktioniert. Erst mit der zweiten schleife.
    Ich habe übrigens deinen Tipp mit der Extra Kopf-Überschrift befolgt und es mit einer funktion realisiert 🙂 hat super geklappt. Jetzt muss ich nur noch die linke Spalte irgendwie hinbekommen. Hast du da noch einen Tipp?



  • @mmm_1482_

    for (row1 = 0; row1 < 11; row1++)
    {
            cout << row1 << "\t ";
    	for(col1=0; col1<11; col1++)
    	{
    //		if (row1 == zeilen_auswahl)
    			cout << tabelle[row1][col1] << "\t ";
    	}
    ...
    

    Edit: Zeile 6 auskommentiert



  • @DirkB Das funktioniert leider nicht. Ich hatte so eine Schleife bereits erstellt, aber das Problem ist, dass dann der Inhalt der Tabelle nur auf null ist. Das ist auch mein Hauptproblem bislang gewesen. Ich konnte entweder nur Kopf/Spalte richtig ausführen lassen, aber dann war der Inhalt auf Null gesetzt. Oder ich konnte den Inhalt korrekt setzen, aber die Spalt/Kopfzeile nicht. Den Kopf habe ich jetzt seperat über Funktionen formuliert, aber die Spalte links funktioniert bei mir nicht.



  • @DirkB So sieht mein Code bislang aus. Fehlt halt echt nur dass an der Seite nochmal die Zahlen 1-10 mit ausgegeben werden

    void printout(int i =0)
    {
    for (int p = 1; p <= 10; p++)
    {
    cout << p << "\t" ;

    }
    cout << endl;
    

    }

    void linie(int breite = 75)
    {
    for (int b = 0; b <= breite; b++)
    {
    cout << "_";
    }cout << endl;
    }

    int main()
    {

    int tabelle[10][10] = { 0 };
    int row = 0;
    int col = 0;
    int row1 = 0;
    int col1 = 0;
    int breite=75;
    int zeilen_auswahl = 0;
    
    //Funktionsaufruf von linie
    linie(breite);
    
    cout << " +++++++++ \t Das ist das kleine 1x1 \t ++++++++++" << endl;
    //Funktionsaufruf für Kopf
    printout(col);
    
    // Funktionsaufruf für linie
    linie(breite);
    
    // Schleife für  Zeilen, Y-Achse
    for (row = 0; row < 11; row++)
    {
    	// Schleife fuer Spalten, X-Achse
    	for (col = 0; col < 11 ; col++)
    	{
    		if (row != 0 && col != 0) // Überflüssig kann auch weggelassen werden 
    		{
    			tabelle[row][col] = row * col;
    			cout << tabelle[row][col] << "\t ";
    			
    		}
    		
    		
    	}
    	cout << endl;
    }
    
    
    
    
    do
    {
    	cout << "Bitte geben Sie eine Zeile ein: " << endl;
    	cin >> zeilen_auswahl;
    } while (zeilen_auswahl >= 10);
    
    
    
    for (row1 = 0; row1 < 11; row1++)
    {
    	for(col1=0; col1<11; col1++)
    	{
    		if (row1 == zeilen_auswahl)
    			cout << tabelle[row1][col1] << "\t ";
    	}
    	
    
    	cout << endl;
    }


  • Da du das Array jetzt ja auf 10x10 verkleinert hast, mußt du auch deine Schleifen entsprechend anpassen (so hast du bisher undefiniertes Verhalten, wegen Speicherzugriffsfehlern):

    for (int row = 0; row < 10; row++)
    {
    	for(int col = 0; col < 10; col++)
                // ...
    }
    

    Noch besser wäre es, du würdest Konstanten für die Array-Größen verwenden

    const int MaxRows = 10;
    const int MaxCols = 10;
    
    int tabelle[MaxRows][MaxCols] = { 0 };
    

    Und diese dann auch im weiteren Code, z.B. für die Schleifen, verwenden.



  • @Th69
    ja die größen habe ich im Laufe meiner vielen versuche immer wieder geändert 😃 muss das nochmal anpassen danke für die info 🙂

    und ich setz deine anderen tipps auch mal um. Hört sich gut an



  • @mmm_1482_

    1. Bitte nutze die Code-Tags: Code mit der Maus markieren und dann auf das </> Symbol oben (rechts neben C++ Auswahl) klicken.

    2. Willst du jetzt 0 bis 10 (11 Elemente pro Zeile/Spalte) oder 1 bis 10 (10 Elemente pro Zeile/Spalte) ausgeben.
      Bedenke, dass der Index immer bei 0 anfängt.

    3. Im Augenblick machst du die Berechnung für die Tabelle bei der Ausgabe. Ist etwas überflüssig.

    4. Was soll der Parameter (das i) bei printout?

    5. (Zeile 48ff) Warum zwei verschachtelte Schleifen, wenn du nur eine Zeile ausgeben willst. Das war doch schon gekärt wie das geht.

    @mmm_1482_ sagte in Tabelle erstellen mithilfe von Arrays:

    So sieht mein Code bislang aus. Fehlt halt echt nur dass an der Seite nochmal die Zahlen 1-10 mit ausgegeben werden

    Was hindert dich daran, die Zeile cout << row << "\t "; zwischen Zeile 24 und 25 einzubauen?


Log in to reply