Matrix



  • Ich soll eine methode schreiben die aus einer textdatei eine matrix einliest , die sieht ungefähr so aus:

    3
    324
    123
    256

    die erste zahl gibt dabei(3) , die zeile und spaltengröße an.

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    
    ifstream file( "Dateieinlesen.txt") ;
    
    if (!file)
        {
            cerr << "Datei existiert nicht\n" << endl;
            exit(-1);
        }
    
    // wie lese ich die datei so ein , dass ich die Matrix ins Array bekomme?
    
    double matrix [n][n];
    
     return 0;
    
    }
    

    wie lese ich die datei so ein , dass ich die Matrix ins Array bekomme?



  • #include <iostream>
    #include <string>
    #include <vector>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
      ifstream file("Dateieinlesen.txt");
      if (!file) {
        cerr << "Datei existiert nicht\n" << endl;
        return -1; // Wo hast du denn exit(-1) her?    
      }
    
      int size;
      file >> size; // Matrixgröße einlesen
      // Matrix vorbereiten
      vector< vector<int> > matrix(3, vector<int>(3));
    
      // Einlesen
      int row = 0, col = 0;
      while (col != size) {
        while (row != size) {
          file >> matrix[col][row];
          ++row;
        }
        row = 0;
        ++col;
      }
    }
    

    Das sollte funktionieren.

    bnz



  • Ach komm, etwas Grundlagen solltest du doch schon mal gelernt haben.

    #include <fstream>
    #include <stdexcept>
    
    int main() {
       std::ifstream ifs("Dateieinlesen.txt", ios_base::binary);
       if(!ifs)
          throw std::runtime_error("Konnte die Datei nicht öffnen!");
       std::string line;
       std::size_t size = ifs.get() - 0x30; // Zahlenwert = ASCII-Code - ASCII-Code von 0
       int** matrix;
       std::size_t n;
       try { // Matrix erstellen
          matrix = new int*[size];
          for(n = 0; n < size; n++) {
             matrix[n] = new int;
          }
       }
       catch(const std::bad_alloc& e) { // Nicht genug Speicher vorhanden
          std::cerr << e.what() << '\n';
          for(std::size_t i = 0; i < n; i++)
             delete [] matrix[i]; // Bis jetzt erzeugte Array löschen
          delete [] matrix; // Matrix löschen
       }
       unsigned count = 0;
       while(std::getline(ifs, line)) {
          for(n = 0; n < line.length(); n++)
             matrix[count][n] = line[n] - 0x30;
          ++count;
       }
       for(n = 0; n < size; n++)
          delete [] matrix[n];
       delete [] matrix;
    }
    

    Hier würde sich auch viel bequemer mit der Standardlibrary arbeiten. (vector etc.)



  • danke ich werds mal ausprobieren 🙂



  • ich hätte noch eine Frage. die nächste aufgabe ist die determinate nach dem
    emtwicklungsatz von Laplace zu erreichenen. Die Matrix ist eine R n*n matrix

    3
    123
    145
    555

    #include <fstream>
    #include <iostream>
    using namespace std; 
    
    int main(void)
    {
    int s;
    cout <<"Wir lesen jetzt dein Matrix ein" << endl;// endl = Zeilenumbruch
    
    ifstream datei("Dateieinlesen.txt");
    
    datei >> s; // nur das erste Int in datei 
                // springt in die nächste Zeile 
    int m[s][s];
                // liest Matrix ein
    for( int i=0; i<s; i++)
    {
    for(int j=0; j<s; j++){
    datei >> m[i][j];} 
    }
    datei.close(); 
                   // gibt Matrix aus
    for( int i=0; i<s; i++){ 
    for(int j=0; j<s; j++){
    cout << m[i][j] << " ";    // << wie + in Java
    } 
    cout << endl; // damit die Ausgabe stimmt
    
    } 
    ofstream dateiausgeben("Datei");// gibt datei aus
    for(int i=0 ; i<s; i++){
    for( int j=0; j<s; j++){
    dateiausgeben << m[i][j]<< " " ;// ausgabe schön
    }
    dateiausgeben << endl; // ausgabe schön
    } 
    
    }
    

    ich habe mir Überlegt das ich mir die Werte der 1. >Spalte in der Matix in ein extra array zu schreiben.

    jetzt muss ich für die brechenung immer verschiebenden zeilen der matrix verwenden. wie kann ich das umsetzen?
    und wie beachte ich die passenden vorzeichen? 😞



  • also soweit bin ich

    ich hab den Fall spalten und zeilen = 2 extra gemacht

    int det(int m[][]){ // rekursiv berechnen????
    int antwort;
    
    if(s==2)
    {
       antwort=m[0][0]*m[1][1]-m[0][1]*m[1][0]; //deterimate berechenen
            for(int i=0; i<s; i++)
    
            m[i][0]     // rekursiv berechnen?????
            }
    
    return det(m[][]) ; // rekursiv
    }
    
    return antwort;
    }
    
    }
    

    hier fehlt jez noch das den werte der 1. spalte mal die determinate und das vorzeichen. außerdem ist mir der rekurive weg nicht ganz klar


  • Mod

    Das hier macht dein Compiler vielleicht mit, aber das ist kein gültiges C++:

    int m[s][s];
    

    Mach das lieber so wie Ad aCTa es vormacht, dann bist du auf der ganz sicheren Seite.

    Außerdem hilft es, etwas Eigeninitiative zu zeigen, dann bekommt man auch nützliche Antworten.



  • Nimm diesen Code:

    #include <fstream>
    #include <stdexcept>
    #include <vector>
    #include <sstream>
    
    int main() {
    	std::ifstream ifs("Dateieinlesen.txt", std::ios_base::binary);
    	if(!ifs)
    		throw std::runtime_error("Fehler: Konnte Dateieinlesen.txt nicht oeffnen!");
    	std::size_t size = 0, count = 0;
    	ifs >> size;
    	ifs.ignore(2);
    	std::vector<std::vector<int> > matrix(size, std::vector<int>(size));
    	std::string temp;
    	while(std::getline(ifs, temp)) {
    		std::stringstream ss(temp);
    		for(std::size_t n = 0; n < size; n++)
    			ss >> matrix[count][n];
    		++count;
    	}
    }
    

    Damit hast du dann die Zahlen bequem in deinem vector und kannst wie auf ein Array darauf zugreifen.


Anmelden zum Antworten