Problemfall: Tabelle erzeugen



  • Erst ein mal ein freundliches Hallo 🙂

    Es geht um folgende Thematik / folgendes Problem:

    Ich soll eine Tabelle erzeugen (in einer einfachen Console), wobei der User zwei Werte eingibt. Daraus ergeben sich dann die Anzahl der Zeilen und Spalten.

    Aussehen soll das Ganze so:

    1 2 3
    _ _ _ _ _ _
    1 | 1 2 3 |
    2 | 2 4 6 |
    3 | 3 6 9 |
    4 | ......|

    Ich hatte gerade schon mal mit Arrays rumprobiert und wollte dann entsprechend die Werte die eingegeben wurden an die Arrays übergeben. Hat aber noch nicht ganz so geklappt wie es sollte. Hat da noch jemand eine (bessere) Idee?=)

    Wär für jede(n) Tipp / Vorschlag / Hilfe dankbar 🙂



  • Ein 2D Array bietet sich doch an.
    Warum zeighst du denn nicht mal deinen Versuch? 🙄 :p



  • Hatte den gerade wieder verworfen 😃 Aber vielleicht sowas in der Richtung:

    #include <iostream>
    using namespace std;
    
    void printarray (int arg[], int length) {
      for (int n=0; n<length; n++)
        cout << arg[n] << " ";
      cout << "\n";
    }
    
    int main ()
    {
      int firstarray[] = {5, 10, 15};
      int secondarray[] = {2, 4, 6, 8, 10};
      printarray (firstarray,3);
      printarray (secondarray,5);
      return 0;
    }
    

    Wobei ich da ja noch Werte vorgebe und das Drumherum noch ergänzt werden muss. Sprich die Striche, Eingabe des Users. Ich überlege gerade nur wie ich am besten dann die eingegebenen Werte übergeben kann -.-



  • 2Dimensionales Array:

    int breite, hoehe;
    cin >> breite;
    cin >> hoehe;
    
    int **matrix = new int[breite][hoehe];
    //dann frag in irgendeiner schleife ab welche werte wo stehen
    
    for( int h=0; h<hoehe; ++h )
    {
         for( int b=0; b<breite; ++b )
               cout << matrix[b][h] << " ";
         cout << endl;
    }
    

    sowas in der art. Gut möglich dass ich breite/hoehe verwechsle oder so 😃



  • Mh ich bekomme gerade noch zwei Fehlermeldungen 😕

    error C2540: non-constant expression as array bound

    &

    error C2440: 'initializing' : cannot convert from 'int (*)[1]' to 'int **'

    Ich weiss gerade ehrlich gesagt nicht warum er mit den "**" Probleme hat:/ Kann mir da jemand helfen?





  • Einfacher ist es wohl 2 std::vector zu schachteln.



  • Also irgendwie tue ich mich da schwer...

    Ich kriegs nicht hin so eine Ausgabe zu bekommen:

    [cpp]
    1 2 3 4 ...
    _ _ _ _ _ ...
    1|1 2 3 4 ...
    2|2 4 6 8 ...
    3|3 6 9 12 ...
    4|4 8 12 16 ....
    .
    .
    .

    Wie gesagt, Problem/Fall ist: Der user gibt 2 Werte ein (z.B. x, y) wobei er damit die Anzahl der Zeilen und Spalten eingibt (sprich bei Eingaben 1 und 1 = 1x1 Matrix usw.). Entsprechend soll diese Tabelle generiert werden. Aber auch mit dem Link von gerade komm ich irgendwie nicht weiter -.- Ich mach noch nicht so lange was mit C++ deswegen hoffe ich ihr könnt mir das noch genauer erklären, bin über jede Hilfe dankbar!


  • Administrator

    Meinst du sowas?

    //////////////////////////////////////////////////////////////////////////
    // main : Implementation file
    
    #include <string>
    #include <sstream>
    #include <iostream>
    
    void pause()
    {
    	std::cout << "PAUSE" << std::endl;
    
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();
    }
    
    std::size_t calcMaxSize(unsigned int x)
    {
    	std::ostringstream oss;
    	oss << x;
    
    	return oss.str().length();
    }
    
    int main()
    {
    	unsigned int width;
    	unsigned int height;
    
    	std::cout << "Width:  ";
    	std::cin >> width;
    	std::cout << "Height: ";
    	std::cin >> height;
    
    	std::cout << "\n\n";
    
    	std::size_t maxHeightSize = calcMaxSize(height);
    	std::size_t maxPowSize = calcMaxSize(width * height);
    
    	std::string heightGap(maxHeightSize, ' ');
    
    	std::cout << heightGap << ' ';
    
    	for(unsigned int w = 1; w <= width; ++w)
    	{
    		std::cout.width(maxPowSize);
    		std::cout << w << ' ';
    	}
    
    	std::cout << "\n\n";
    
    	std::string line(maxHeightSize + 1 + maxPowSize * width + width, '-');
    	std::cout << line << '\n';
    
    	for(unsigned int h = 1; h <= height; ++h)
    	{
    		std::cout.width(maxHeightSize);
    		std::cout << h << '|';
    
    		for(unsigned int w = 1; w <= width; ++w)
    		{
    			std::cout.width(maxPowSize);
    			std::cout << (w * h) << ' ';
    		}
    
    		std::cout << '\n';
    	}
    
    	std::cout << std::endl;
    
    	pause();
    	return 0;
    }
    

    Fehleingaben müsstest du noch selber abfangen. Vor allem auch Überläufe können dir hier einen Strich durch die Rechnung machen.
    Falls immer noch die Speicherung das Problem ist, dann arbeite am besten mit einem ein dimensionalen std::vector oder C Array. Die zweite Dimension darin kannst du durch einen Offset simulieren.

    Pseudo C++ Code mässig:

    unsigned int* array = new unsigned int[width * height];
    
    // Zugriff auf Element [x][y]:
    array[y * width + x] = x * y;
    

    Grüssli



  • Wow, erst mal danke für die schnelle Antwort! Ja das sieht schon mal sehr sehr gut aus, ich werde dann mal versuchen die von dir angesprochenen Probleme abzufangen 🙂



  • Ok, soweit funktioniert es ja, jetzt gibt es noch zwei kleine Dinge die mcih ärgern:D

    Einmal wäre es die Tatsache dass wenn ich an Werten z.B. 4 und 5 eingebe in der ersten Zeile nur bis zur 4 ausgegeben wird, statt die 5. Denn die fehlt dann noch in der obersten Zeile der Tabelle.

    Und ich wollte fragen ob man bei meiner Abfrage bzgl. des einlesens/abfangen der Eingaben das Ganze noch modifizieren kann. Halt für den Fall dass man zweistellige Werte eingeben will (10 und 10 z.B.).

    Ich poste mal den ganzen Code, ich denke das geht noch weil es ja nicht so viel ist.

    ////////////////////////////////////////////////////////////////////////// 
    // main : Implementation file 
    #include "stdafx.h"
    #include <string> 
    #include <sstream>
    #include <conio.h>
    #include <iostream> 
    
    #define MAXCHARS 4
    
    using namespace std;
    
    void freezeProg() 
    { 
    
        cout << "freeeeezed, waiting for new Input =) (Prefer Enter;) " << std::endl; 
    
    	// 
        cin.clear();
    
    	// Hier wird geprüft mit welche Taste gedrückt wurde, in dem Fall
    	// wird nur bei Enter reagiert :)
        cin.ignore(std::cin.rdbuf()->in_avail()); 
        cin.get(); 
    } 
    
    	// Berechnung der maximalen Größe des Strings
    	size_t calcMaxSize(unsigned int x) 
    	{ 
    		ostringstream oss; 
    		oss << x; 
    
    		return oss.str().length(); 
    	} 
    
    int main(void) { 
    
        //unsigned int height    = 0; 
    
        //unsigned int width     = 0; //strlen(tocheck); // tocheck undefined here..
    
        unsigned long int loop = 0;
    
        char c;
    
        do {
    
           cout << "Bitte geben Sie einen Wert fuer die Anzahl der Zeilen ein!:" << endl;
    
           c = _getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt 
    
        } while( !isdigit(c) );
    
        unsigned int width = (int) c-'0';
    
        do {
    
           cout << "Bitte geben Sie einen Wert fuer die Anzahl der Spalten ein!:" << endl;
    
           c = _getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt 
    
        } while( !isdigit(c) );
    
        unsigned int height = (int) c-'0';
    
        // Berechnung
    
        size_t maxHeightSize = calcMaxSize(height); 
    
        size_t maxWidthSize  = calcMaxSize(width * height); 
    
        string heightR(maxHeightSize, ' '); 
    
        cout << heightR << ' '; 
    
        // z = zeilen => width
    
        for(unsigned int z = 1; z <= width; ++z) { 
    
            cout.width(maxWidthSize); 
    
            cout << z << ' '; 
    
        } 
    
        cout << "\n\n"; 
    
        // Berechnung + Zeichen für obere Randmarkierung
    
        string line(maxHeightSize + 1 + maxWidthSize * width + width, '-'); 
    
        cout << line << '\n'; 
    
        // s = spalten => height
    
        for(unsigned int s = 1; s <= width; ++s)  { 
    
            cout.width(maxHeightSize);
    
                 // | Zeichen für die linke Randdarstellung
    
            cout << s << '|'; 
    
            for(unsigned int z = 1; z <= height; ++z) { 
    
                cout.width(maxWidthSize); 
    
                cout << (z * s) << ' '; 
    
            } 
    
            cout << '\n'; 
    
        } 
    
        // Erzeugt eine Leerzeile zwischen der Tabelle und der cout Angabe von freezeprog 
    
        cout << endl; 
    
        freezeProg(); 
    
        return 0; 
    
    }
    


  • Nachtrag:

    Das Anzeige Problem ist gelöst, bleibt nur noch das mit dem mehrere Zeichen einlesen 🙂


Anmelden zum Antworten