Problemfall: Tabelle erzeugen
-
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?
-
Weils falsch ist:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39489.html
-
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!
-
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 dimensionalenstd::vectoroder 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
