Ein einfacher Rahmen mit Hilfe eines Arrays



  • Hallo!
    Erstmal Vielen Dank für deine Hilfe!
    Ich muss dir aber leider gestehen, dass ich nicht ganz verstehe, wie du das meinst...
    Das mit dem kompletten Array erstmal löschen ist schonmal gut, denn mein Lehrer hat aowas auch gesagt aber ich wusste nicht genau, wie man das macht.
    Dein Codebeispiel verstehe ich aber überhaupt nicht...

    1. Sind das doch 2 Schleifen oder?
    2. Wofür ist das endl?


    Dann müssten doch zufällige Zeichen ausgegeben werden oder sehe ich das falsch??

    Wäre nett, wenn du mir noch etwas genauer erklären könntest, wie du das meinst...

    Danke, Alex™



  • Das, was ich geschrieben habe, ist die Ausgabe.
    Das Füllen musst du noch vorher machen.
    Die Ausgabe ist zeichenweise, deshalb nehme ich dafür 2 Schleifen.
    Das cout << endl; ist quasi ein "Enter".

    for(int y = 0; y < 40; y++) //Für jede Zeile tue...
    {    
     for(int x = 0; x < 40; x++) //Für jedes Zeichen (aus dem Array) tue...
      cout << rahmen[y][x]; // das Zeichen ausgeben, dass sich im Array an der Stelle befindet
    
     cout << endl; //wenn eine Zeile fertig ist, Cursor zum neuen Zeilenanfang
    }
    


  • 1. Sind das doch 2 Schleifen oder?
    2. Wofür ist das endl?

    1. ja
    2. um jeweils in die nächste zeile zu gehen
    3. das, was du vorher reingeschrieben hast

    😃



  • Danke für eure zahlreichen Antworten!
    Mir ist schon klar, dass das endl eine neue Zeile bedeutet, nur hatte das in der Schule eine Klassenkamerad von mir auch so gemacht und hatte dann nur 1 Zeichen, das in 1000 verschiedenen Zeilen vorkam...

    Ich habe jetzt deine Lösung so gut ich es verstanden habe geschrieben aber irgendwie will es nicht.
    Ich habe zwar einen deutlich erkennbaren Rahmen aber man sieht ihn nicht 😉

    char rahmen[40][40]={0};
    
    	for(int x = 0;x < 40; x++)
    	{
    		for(int y = 0;y < 40; y++)
    		{
    			cout << rahmen[x][y];
    			cout << endl;
    		}
    	}
    

    Ich kann mir zwar denken, woran es liegt...
    Nämlich, dass ich das Array jetzt zwar gelöscht habe aber nicht wieder gefüllt...
    Hab leider keine Ahnung, wie das gehen soll 😞
    Mein Lehrer hat zu Arrays so gut wie gar nix erklärt 😞

    MfG, Alex™



  • @Alex

    Alex schrieb:

    Mir ist schon klar, dass das endl eine neue Zeile bedeutet, nur hatte das in der Schule eine Klassenkamerad von mir auch so gemacht und hatte dann nur 1 Zeichen, das in 1000 verschiedenen Zeilen vorkam...

    Das liegt daran, dass das bei dir endl in der inneren For-Schleife steht, weswegen nach jeder einzelnen Ausgabe in eine neue Zeile gesprungen wird.

    Alex schrieb:

    Ich kann mir zwar denken, woran es liegt...
    Nämlich, dass ich das Array jetzt zwar gelöscht habe aber nicht wieder gefüllt...

    Wiso füllst du dein Array dann nicht einfach bevor du es ausgibst?

    const unsigned int y = 10, x = 10;
            char frame[y][x] = { '\0' };
            for(unsigned int i = 0; i < y; ++i)
            {
                    for(unsigned int j = 0; j < x; ++j)
                    {
                            frame[i][j] = '#'; // Einfach füllen
                            std::cout << frame[i][j];
                    }
                    std::cout << std::endl;                        
    
            }
    

    Caipi



  • Hallo Caipi!

    Danke für deine Hilfe!

    Mein Rahmen ist jetzt aber leider kein Rahmen sondern ein ganzes Feld... 😕

    Vllt habe ich ja immer noch was falsch gemacht:

    const unsigned int x = 40, y = 40;
    
    	char rahmen[x][y]={'\0'};
    
    	for(unsigned int i = 0;i < x; i++)
    	{
    		for(unsigned int j = 0;j < y; j++)
    		{
    			rahmen[i][j] = '#';
    			std::cout << rahmen[i][j];
    		}
    
    		std::cout << std::endl;
    	}
    

    Habe auch noch ein paar Fragen:
    1. Warum brauche ich const unsigned? Und was bedeutet es?
    2. Was bewirkt das std:: und ist es notwendig?

    Danke schonmal!

    MfG, Alex™



  • @Alex

    Alex schrieb:

    Danke für deine Hilfe!

    Mein Rahmen ist jetzt aber leider kein Rahmen sondern ein ganzes Feld... 😕
    Vllt habe ich ja immer noch was falsch gemacht:

    Nein, du hast nichts falsch gemacht, mein Fehler, sorry. (Habe irgendwie an Feld gedacht und nicht an Rahmen 🙂 )

    So müsste es aber funktionieren:

    const unsigned int y = 9, x = 99;
            char frame[y][x] = { '\0' };
            for(unsigned int i = 0; i < y; ++i)
            {
                    frame[i][0] = '#';
                    frame[i][x - 1] = '#';
                    for(unsigned int j = 0; j < x; ++j)
                    {
                            frame[0][j] = '#';
                            frame[y - 1][j] = '#';
                    }                                             
            }
    

    Alex schrieb:

    Habe auch noch ein paar Fragen:
    1. Warum brauche ich const unsigned? Und was bedeutet es?
    2. Was bewirkt das std:: und ist es notwendig?

    1. Das kommt darauf an, ob du es brauchst. Ich habe es genommen, um flexibler zu sein (und weil ich faul bin 🙂 ), so musst du nämlich nur den Wert für x oder y ändern und bekommmst sofort ein neues Rechteck.
    2. Du brauchst das ganze std:: nur, wenn du auf Funktionen oder Klassen der Standardbibiothek zugreifen willst (cin, cout, etc) und nicht using namespace std; schreibst

    //edit:
    Obiger Code setzt nur den Rahmen im Array. Das Array ausgeben, musst du selber machen 😉 (Oder hat es Seppschrott schon für dich gemacht...)

    Caipi



  • Funktioniert leider immer noch nicht 😞

    Könntest du mir bitte noch etwas genauer erklären, was das alles bedeutet, was du da geschrieben hast?
    Z.B.:
    frame[i][0] = '#';
    frame[i][x - 1] = '#';

    Sorry, wenn ich dich wegen einer so kleinen Aufgabe so lange aufhalte 🙄

    MfG, Alex™



  • Müsste aber funktionieren 🙂 (Habe es extra getestet [Compiler: Borland C++ 5.5], um nicht nochmal in ein Fettnäpfchen zu treten)

    Du meinst wahrscheinlich, dass das Programm keine Ausgabe erzeugt (siehe mein "Edit" im vorigen Post), oder? Andernfalls poste mal bitte die Fehlermeldung (sofern vorhanden) deines Compilers.

    Caipi



  • Ja, hast recht.
    Wenn ich es allerdings so ausgebe, wie Seppschrott gesagt hat, dann sieht es so aus:
    http://www.emule-filez.de/BoB/Bild2.jpg

    Oder mache ich immer noch was falsch?

    {
    	const unsigned int x = 40, y = 40; 
            char frame[x][y] = { '\0' }; 
            for(unsigned int i = 0; i < x; ++i) 
            { 
    			frame[i][0] = '#'; 
                frame[i][y - 1] = '#'; 
                for(unsigned int j = 0; j < y; ++j) 
                { 
    				frame[0][j] = '#'; 
                    frame[y - 1][j] = '#'; 
                }                                             
            }
    
    	for(int y = 0; y < 40; y++) 
    	{    
    		for(int x = 0; x < 40; x++) 
    		{
    		cout << frame[y][x]; 
    
    		}
    	}
    

    MfG, Alex™



  • Alex™ schrieb:

    Ja, hast recht.
    Wenn ich es allerdings so ausgebe, wie Seppschrott gesagt hat, dann sieht es so aus:
    http://www.emule-filez.de/BoB/Bild2.jpg

    Oder mache ich immer noch was falsch?

    {
    	const unsigned int x = 40, y = 40; 
            char frame[x][y] = { '\0' }; 
            for(unsigned int i = 0; i < x; ++i) 
            { 
    			frame[i][0] = '#'; 
                frame[i][y - 1] = '#'; 
                for(unsigned int j = 0; j < y; ++j) 
                { 
    				frame[0][j] = '#'; 
                    frame[y - 1][j] = '#'; 
                }                                             
            }
    
    	for(int i = 0; i < y; i++) 
    	{    
    		for(int j = 0; j < x; j++) 
    		{
    		      cout << frame[i][j]; 
    		
    		}
                    cout << endl; // NICHT-VERGESSEN!
    	}
    

    MfG, Alex™

    Du hast das endl vergessen. Ausserdem würde ich dir empfehlen die Zählvariablen der inneren Schleife in i und j umzuändern. Sonst kommst du nur unötig durcheinander (da doppelte Bezeichner)

    Caipi



  • OK, Danke für deine Hilfe!!!

    Jetzt funktioniert alles 🙂

    MfG, Alex™


Anmelden zum Antworten