Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytanie z pliku tekstowego macierzy, następnie mnożenie ich i zapisanie wyniku do innego pliku tekstowego.

Ostatnio zmodyfikowano 2016-06-03 16:11
Autor Wiadomość
SeweXIN
Temat założony przez niniejszego użytkownika
Wczytanie z pliku tekstowego macierzy, następnie mnożenie ich i zapisanie wyniku do innego pliku tekstowego.
» 2016-05-26 19:41:25
Witam wszystkich bardzo serdecznie. Pisze tutaj ponieważ zaczynam dopiero programować w c# i c++. Dawniej tylko pascal.
Mam problem ponieważ nie wiem jak wczytać macierze z pliku tekstowego które zostały wygenerowane przez użytkownika w innym osobnym programie.

Następnie musze je także pomnożyć i zapisać w innym pliku. (w senise wynik mnożenia)

tu zamieszczam program w którym generuje macierze i zapisuje je do pliku.

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <conio.h>
#include <stdio.h>
using namespace std;

ifstream plik;
int main()
{
int tab1[10][10], tab2[10][10], wysokosc1, wysokosc2, szerokosc1, szerokosc2;
ofstream plik;
plik.open("C:\\Users\\a\\macierz.txt");


printf("Podaj szerokosc dla macierzy 1 \n");
scanf_s("%d", &szerokosc1);
printf("Podaj wysokosc dla macierzy 1 \n");
scanf_s("%d", &wysokosc1);
printf("Podaj szerokosc dla macierzy 2 \n");
scanf_s("%d", &szerokosc2);
printf("Podaj wysokosc dla macierzy 2 \n");
scanf_s("%d", &wysokosc2);

if (szerokosc1 != wysokosc2)
{
printf("Nie mozna pomnozyc macierzy \n");
_getch();
plik.close();
return EXIT_FAILURE;
}

printf("Podaj wartosci dla macierzy 1 \n");
for (int i = 0; i < wysokosc1; i++)
{
if (i != 0)
plik << "\n";
for (int j = 0; j < szerokosc1; j++)
{
scanf_s("%d", &tab1[j]);
plik << tab1[j] << " ";
}
}
plik << "\ndruga";
printf("Podaj wartosci dla macierzy 2 \n");
for (int i = 0; i < wysokosc2; i++)
{
plik << "\n";
for (int j = 0; j < szerokosc2; j++)
{
scanf_s("%d", &tab2[j]);
plik << tab2[j] << " ";
}
}
plik.close();
return EXIT_SUCCESS;
}




Czy mógłby mi ktoś pomóc? Z góry dziękuje.
P-148597
mateczek
» 2016-05-26 19:59:55
kod wstawiaj w znaczniki

[cpp]
 tutaj kod c++
[/cpp]
P-148598
carlosmay
» 2016-05-26 20:32:47
Zdecyduj się na jeden język.
P-148599
mateczek
» 2016-05-26 21:03:09
ponieważ douczając się na temat konstruktorów przenoszących i przenoszących operatorów przypisania. Akurat bawiłem się w mnożenie macierzy. Więc mogę wrzucić kod.
kod jest trochę na wyrost ale jeśli chcesz przeglądnąć, potestować.
C/C++
#include <iostream>
#include<fstream>
using namespace std;
class matrix {
    int * tab = nullptr;
    int wiersze = 0, kolumny = 0;
public:
    friend ostream & operator <<( ostream & s, matrix & m );
   
    matrix( int w, int k )
        : wiersze( w )
         , kolumny( k )
    { //konstruktor
        cout << "jestem konstruktor" << endl;
        int rozmiar = w * k;
        tab = new int[ rozmiar ];
    }
   
    matrix() { } //konstruktor domyślny nic nie robi
    ~matrix() {
        if( tab ) {
            delete[] tab;
            tab = nullptr;
        }
    }
   
   
    int & operator ()( int w, int k ) {
        return tab[( w - 1 ) * kolumny + k - 1 ];
    }
   
    int row() { return wiersze; }
    int column() { return kolumny; }
    matrix & operator =( matrix && wzor ); //operator przenoszenia
    matrix( matrix && wzor ); //konstruktor przenoszący
    matrix( const matrix & wzor ); //konstruktor kopiujący
    matrix operator *( matrix & m ); //operator mnożenia macierzy
    matrix & operator =( const matrix & wzor ); //operator przypisania. Ten nie powinien się odpalić w c++11
};



matrix & matrix::operator =( matrix && wzor )
{
    //operator przenoszenia
    cout << "jestem operator przenoszenia" << endl;
    std::swap( wzor.tab, tab ); //przepisanie tylko wskaźnika na macierz bez kopiowania danych
    std::swap( wiersze, wzor.wiersze ); //przepisanie zmiennych "wiersz" oraz "kolumna"
    std::swap( kolumny, wzor.kolumny );
    return * this;
}
matrix::matrix( matrix && wzor )
{
    //konstruktor przenoszący
    cout << "jestem konstruktor przenoszący" << endl;
    tab = wzor.tab; //przepisanie tylko wskaźnika na macierz bez kopiowania danych
    wiersze = wzor.wiersze; //przepisanie zmiennych "wiersz" oraz "kolumna"
    kolumny = wzor.kolumny;
    wzor.tab = nullptr;
}

matrix::matrix( const matrix & wzor ) {
    cout << "jestem konstruktor kopiujący" << endl;
    wiersze = wzor.wiersze;
    kolumny = wzor.kolumny;
    int rozmiar = wiersze * kolumny;
    tab = new int[ rozmiar ];
    for( int i = 0; i < rozmiar; i++ ) { //kopiowanie bufora
        tab[ i ] = wzor.tab[ i ];
    }
}

matrix & matrix::operator =( const matrix & wzor ) {
    cout << "jestem operator przypisania" << endl;
    wiersze = wzor.wiersze;
    kolumny = wzor.kolumny;
    int rozmiar = wiersze * kolumny;
    if( tab ) delete[] tab; // zwalnianie pamięci ze starej tablicy
   
    tab = new int[ rozmiar ]; // alokacja nowej
    for( int i = 0; i < rozmiar; i++ ) { //kopiowanie bufora
        tab[ i ] = wzor.tab[ i ];
    }
    return * this;
}

matrix matrix::operator *( matrix & m ) {
    if( kolumny != m.wiersze ) throw "nie pomnozysz takich macierzy";
   
    matrix temp( wiersze, m.kolumny ); //obiekt tymczasowy tworzenie
    // dalej mnożenie czyli wypełnianie wyżej stworzonego obiektu tymczasowego
    for( int w = 1; w <= temp.wiersze; w++ ) {
        for( int k = 1; k <= temp.kolumny; k++ ) {
            int element = 0;
            for( int i = 1; i <= kolumny; i++ ) element += operator ()( w, i ) * m( i, k );
           
            temp( w, k ) = element;
        }
    }
    //koniec mnożenia zwracam obiekt tymczasowy
    return temp;
}

ostream & operator <<( ostream & s, matrix & m ) {
    for( int w = 1; w <= m.wiersze; w++ ) {
        for( int k = 1; k <= m.kolumny; k++ ) {
            s << m( w, k ) << " ";
        }
        s << endl;
    }
    return s;
}
int main() {
    matrix m1( 5, 5 ); //macierz 5 na 5
    matrix m2( 5, 4 ); //macierz 5 na 4
   
    //wypełniam jedynkami
    for( int w = 1; w <= m1.row(); w++ ) {
        for( int k = 1; k <= m1.column(); k++ ) {
            m1( w, k ) = 1;
        }
    }
    cout << m1 << endl;
   
    //wypełniam dwójkami
    for( int w = 1; w <= m2.row(); w++ ) {
        for( int k = 1; k <= m2.column(); k++ ) {
            m2( w, k ) = 2;
        }
    }
    cout << m2 << endl;
    matrix m3;
    try {
        m3 = m1 * m2;
    }
    catch( char const * p ) {
        cout << p << endl;
        return 0;
    }
    cout << m3 << endl;
    ofstream plik( "wynik.txt" ); //zapis do pliku
    plik << m3;
    //koniec
    return 0;
}
P-148600
SeweXIN
Temat założony przez niniejszego użytkownika
» 2016-05-26 22:35:17
Kod ten napisałem w Visual Studio 2013, najlepiej gdyby ktoś podpowiedział jak to zrobić w C#
P-148601
carlosmay
» 2016-05-26 23:29:54
C# jest językiem obiektowym. Czy na pewno chodzi o C#, czy czysty język C?
To co napisał @mateczek jest dobrym punktem wyjścia w kierunku programowanie oo.
P-148602
mateczek
» 2016-05-27 00:04:34
c# - https://pl.wikipedia.org/wiki/C_Sharp
C++ - https://pl.wikipedia.org/wiki/C%2B%2B
C - https://pl.wikipedia.org/wiki/C_%28j%C4%99zyk_programowania%29

1. Tą klasę do mnożenia macierzy 2D napisałem w c++ (w celach auto-edukacyjnych).

2. Twój fragment kodu wygląda na surowe C!!! nie zaś C#

3. C# nie znam gdyż. Ja większość czasu spędzam na LINUX a "c#" jest pomysłem Microsoftu. A co za tym idzie  na Linux miał bym z tego kiepski pożytek. 

4. C# bardziej przypomina Javę (Bo kod kompilowany do kodu pośredniego i jest odpalany na wirtualnej maszynie) Języki "c++" oraz "c" są kompilowane do kodu maszynowego.



Reasumując Twój post wygląda tak:
Dajesz przykład kodu w czystym C. A pytasz o c# i c++. Stąd podejrzenie, że nie bardzo się jeszcze orientujesz w tym co chcesz osiągnąć (znaczy mylą Ci się języki programowania)
P-148603
SeweXIN
Temat założony przez niniejszego użytkownika
» 2016-05-27 10:46:38
mateczek masz racje, jest to surowe C. sorry ale jak pisałem dopiero zaczynam programować więc wybaczcie za błędy.
P-148605
« 1 » 2 3
  Strona 1 z 3 Następna strona