Initialisierung einer Matrix mit scanf in ner Schleife.



  • Hallo:)Ich beschäftige mich mit einem Programm zur Lösung von LGS.
    Zurzeit schreibe ich ein Unterprogramm, das dem Benutzer die erweiterte Matrix (std::vector< std::vector< int >> LGS )initialisieren lässt. Meine Idee wäre, dass der Benutzer Faktoren nicht in einer Linie, bloß nacheinander eingibt, sondern je Gleichung getrennt mit Entertaste (damit die Eingabe auch wie eine Matrix aussieht)

    Mein Problem ist, dass wenn man mehr Zahlen, als es vorher definierte Spaltenanzahl in einer Zeile eingibt, werden weitere Elemente der Matrix (Faktoren nächster Zeile) initialisiert....

    Was ich nicht verstehe ist: warum sowas passiert vor dem Moment, dass die Zeile 21 aufgerufen wird?
    Ist es überhaupt legitim das mit scanf machen?

    Ich wäre sehr dankbar für eure Hilfe..

    #include<iostream>
    #include<vector>
    #include<stdio.h>
    
    int main()
    { 
    	std::vector< std::vector< int >> LGS;
    
    	int zeilen, spalten;
    
    	std::cout<< "Geben Sie die Anzahl der Unbekannten ein: ";
    	std::cin>>zeilen;
    
    	spalten = zeilen+1;
    
    	for ( size_t i=0; i< zeilen; i++ )
    	{	
    
    		std::cout<<"\n Geben Sie Faktoren von der Gleichung N" << i+1 << " ein:";
    
    		for ( size_t k=0; k< spalten; k++ )
    		{	
    			scanf("%d", &LGS.at(i).at(k));
    
    		}		
    
    	}
    
    	/*Ausgabe der Matrix*/
    	for ( size_t i=0; i< LGS.size(); i++ )
    	{
    		for ( size_t k=0; k< LGS.at(0).size(); k++ )
    		printf("%d ", LGS.at(i).at(k));
    
    		std::cout<<std::endl;
    	}	
    }
    

    Programverlauf:

    mfortova@kain:~/linuxhome/AoP17/Vorbereitung$ ./Array

    Geben Sie Faktoren von der Gleichung N1 ein:5 5 5 5 5 5

    Geben Sie Faktoren von der Gleichung N2 ein:6 6 6 6

    Geben Sie Faktoren von der Gleichung N3 ein:7 8 9 10
    5 5 5 5
    5 5 6 6
    6 6 7 8
    mfortova@kain:~/linuxhome/AoP17/Vorbereitung$



  • Überlese, nach dem Einlesen einer Zeile, alle Werte bis zum '\n'
    Z.B.: https://www.c-plusplus.net/forum/p1146014#1146014
    (Das ist zwar C (wie scanf ), zeigt aber wie es geht).

    Für cin gibt es andere Möglichkeiten.



  • ...und in C++ kannst du scanf und printf folgendermaßen ersetzen:

    // scanf("%d", &LGS.at(i).at(k)); 
    std::cin >> LGS.at(i).at(k);
    
    // und hier benutzt du sogar printf und cout nacheinander:
    // printf("%d ", LGS.at(i).at(k));
    // std::cout<<std::endl;
    // Aber, whoops, weil du das printf nicht eingerückt hast, übersieht man das
    // "for" leicht - also besser so einrücken, wenn wir schon dabei sind:
    for ( size_t k=0; k < LGS.at(0).size(); k++ ) // ***
        std::cout << LGS.at(i).at(k) << " ";
    std::cout << std::endl; // brauchst du wirklich "endl" oder reicht nicht "\n"?
    

    Wenn du weitere Eingaben, die noch da sind, verwerfen willst, nutze vor dem cin >> variable :

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Außerdem habe ich da eine Zeile mit *** markiert. LGS.at(0) statt LGS.at(i) ? Ja, das geht so, wenn denn alle Zeilen dieselbe Spaltenanzahl haben. Ist aber dennoch fragwürdig.

    Außerdem: wo erstellst du eigentlich den vector? Der hat doch Länge 0. Ich sehe weder resize noch push_back oder ähnliches.



  • DirkB schrieb:

    Überlese, nach dem Einlesen einer Zeile, alle Werte bis zum '\n'
    Z.B.: https://www.c-plusplus.net/forum/p1146014#1146014
    (Das ist zwar C (wie scanf ), zeigt aber wie es geht).

    Für cin gibt es andere Möglichkeiten.

    oh, vielen Dank! Das erklärt alles)



  • wob schrieb:

    ...und in C++ kannst du scanf und printf folgendermaßen ersetzen:

    // scanf("%d", &LGS.at(i).at(k)); 
    std::cin >> LGS.at(i).at(k);
    
    // und hier benutzt du sogar printf und cout nacheinander:
    // printf("%d ", LGS.at(i).at(k));
    // std::cout<<std::endl;
    // Aber, whoops, weil du das printf nicht eingerückt hast, übersieht man das
    // "for" leicht - also besser so einrücken, wenn wir schon dabei sind:
    for ( size_t k=0; k < LGS.at(0).size(); k++ ) // ***
        std::cout << LGS.at(i).at(k) << " ";
    std::cout << std::endl; // brauchst du wirklich "endl" oder reicht nicht "\n"?
    

    Wenn du weitere Eingaben, die noch da sind, verwerfen willst, nutze vor dem cin >> variable :

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Außerdem habe ich da eine Zeile mit *** markiert. LGS.at(0) statt LGS.at(i) ? Ja, das geht so, wenn denn alle Zeilen dieselbe Spaltenanzahl haben. Ist aber dennoch fragwürdig.

    Außerdem: wo erstellst du eigentlich den vector? Der hat doch Länge 0. Ich sehe weder resize noch push_back oder ähnliches.

    oh, Danke sehr 😉
    Und ja, MIT ***-markierte Zeile soll wie Sie es beschrieben haben aussehen)
    Den Vektor habe ich erstellt, aber den Teil des Codes hab ich hier nicht kopiert. Sie haben natürlich recht, so wie es hier steht funktioniert es nicht, hab schon korrigiert :

    #include<iostream>
    #include<vector>
    #include<stdio.h>
    #include<limits>
    
    int main()
    { 
    	int zeilen, spalten;	
    	std::cout<< "Geben Sie die Anzahl der Unbekannten ein: ";
    	std::cin>>zeilen;	
    	spalten = zeilen+1; //erweiterte Matrix
    
    	std::vector< std::vector< int >> LGS( zeilen );
    
    	for ( int i=0; i< zeilen; i++ )
    	{	
    		LGS.at(i).resize( spalten );
    		std::cout<<std::endl<<" Geben Sie Faktoren der Gleichung N" << i+1 << " ein:";
    
    		std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    		for ( int k=0; k< spalten; k++ )
    		{	
    			std::cin>> LGS.at(i).at(k);
    		}
        }
    
        for ( size_t m=0; m<LGS.size(); m++)
    	{	
                 for (size_t n=0; n<LGS.at(m).size(); n++)
    	         std::cout<< LGS.at(m).at(n)<< "  ";		
    
                 std::cout<<std::endl;
    	} 
    
    }
    

    Noch mal vielen Dank für Ihre Hilfe)


Log in to reply