ślad macierzy

anapolon3
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 13 lut 2009, o 14:44
Płeć: Kobieta
Podziękował: 3 razy

ślad macierzy

Post autor: anapolon3 »

Napisz program liczacy ślad macierzy(5x5) wczytanej z pliku i wynik zapisz do pliku.

program trzeba napisac w c++

wie ktos ja napisac taki program?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ślad macierzy

Post autor: soku11 »

Ja wiem. Napisz z czym masz konkretnie problem, to postaram sie pomoc. Bo szczerze powiedziawszy, sam element liczenia macierzy wyglada tak:

Kod: Zaznacz cały

int macierz[5][5];

// costam

int slad=0;
for(int i=0;i<5;++i)
  slad+=macierz[i][i];
I juz...

Pozdrawiam.
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

ślad macierzy

Post autor: Mariusz M »

Kod: Zaznacz cały

#include<iostream>
#include<fstream>
using namespace std;

int main(){
int i,j,n;
double **A;
double tr;
ifstream f;
ofstream g;
f.open("dane.txt",ios::in);
f.open("wynik.txt",ios::out);

while(!f.eof()){
f>>n;
A=new double*[n+1];
for(i=0;i<n+1;i++)
A[i]=new double[n+1];

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>A[i][j];

tr=0;
for(i=1;i<=n;i++)
tr+=A[i][i];
delete A;
g<<tr;
g<<endl;
}
f.close();
g.close();
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ślad macierzy

Post autor: soku11 »

Kod nie do konca poprawny:
1. Nie wiem, czy takie bylo twoje zalozenie, ale ten kod wczytuje tak jakby w pliku mialo byc wiecej macierzy w formacie:

Kod: Zaznacz cały

WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] ...
itd.. Nie takie bylo polecenie, ale jak pisze - moze to chciales uzyskac...
2. Nie sprawdzasz, czy w czasie wczytywania plik sie nie skonczy (raczej kosmetyczne zmany).
3. Czemu allokujesz za duzo pamieci? Nie latwiej korzystac z tablic tak jak standard przykazal (indeksy od 0 do n-1 dla n wymiarowego wektora)?
4. Podwojny wyciek pamieci. Nie zwalniasz kolejnych elementow z tablicy wskaznikow, ktore tworzysz na poczatku w petli. Drugie miejsce - wywolujesz operator delete, a nie delete[].
5. Main powinen zwracac 0

Pozdrawiam.
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

ślad macierzy

Post autor: Mariusz M »

soku11 pisze:Kod nie do konca poprawny:
1. Nie wiem, czy takie bylo twoje zalozenie, ale ten kod wczytuje tak jakby w pliku mialo byc wiecej macierzy w formacie:

Kod: Zaznacz cały

WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] ...
itd.. Nie takie bylo polecenie, ale jak pisze - moze to chciales uzyskac...
2. Nie sprawdzasz, czy w czasie wczytywania plik sie nie skonczy (raczej kosmetyczne zmany).
3. Czemu allokujesz za duzo pamieci? Nie latwiej korzystac z tablic tak jak standard przykazal (indeksy od 0 do n-1 dla n wymiarowego wektora)?
4. Podwojny wyciek pamieci. Nie zwalniasz kolejnych elementow z tablicy wskaznikow, ktore tworzysz na poczatku w petli. Drugie miejsce - wywolujesz operator delete, a nie delete[].
5. Main powinen zwracac 0

Pozdrawiam.
Ja chciałem tylko w pewien sposób uogólnić to zadanie
Jak poprawić punkt 2 ?
Zwalniać mam w pętli kolejne wektory ?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ślad macierzy

Post autor: soku11 »

Dlatego napisalem -
moze to chciales uzyskac...


2. Nie wczytujesz calej macierzy naraz, tylko wczytujesz po liczbie i sprawdzasz czy nie EOF.
4. Jesli wektory w pliku maja byc roznych rozmiarow (tak jak teraz), to musisz co obieg petli allokowac i deallokowac. Jesli maja jeden rozmiar, to allokujesz przed petla, deallokujesz po niej. Deallokacja polega najpierw na skasowaniu utworzonych tablic w tablicy wskaznikow(petelka), a pozniej dopiero kasujesz cala tablice wskaznikow.

Pozdrawiam.
anapolon3
Użytkownik
Użytkownik
Posty: 12
Rejestracja: 13 lut 2009, o 14:44
Płeć: Kobieta
Podziękował: 3 razy

ślad macierzy

Post autor: anapolon3 »

moze ktos napisac te program zeby dzialal poprawnie , bo bardzo mi na tym zalezy
z gory dzieki
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ślad macierzy

Post autor: soku11 »

No to tak z miejsca bez wiekszych testow i jakichs skomplikowanych konstrukcji:

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include <fstream>
using namespace std;


const int dimension=5;
const string inputFilename="data.txt";
const string outputFilename="out.txt";


int main()
{
  int** matrix=NULL;

  /// tworzenie macierzy dimension x dimension
  matrix=new int*[dimension];
  for(int i=0;i<dimension;++i)
    matrix[i]=new int[dimension];



  ifstream input(inputFilename.c_str(),ifstream::in);

  if(input.is_open())
  {
    bool ok=true;

    for(int i=0;i<dimension;++i)
      for(int j=0;j<dimension;++j)
      {
        if(input.fail() || input.eof())
          ok=false;

        input>>matrix[i][j];
      }

    if(ok)
    {
      int sum=0;
      for(int i=0;i<dimension;++i)
        sum+=matrix[i][i];
      ofstream output(outputFilename.c_str(),ofstream::out);

      if(output.is_open())
      {
        output<<"Slad macierzy z pliku "<<inputFilename<<" wynosi "<<sum<<"
";
        output.close();
      }
      else
        cout<<"Blad otwarcia pliku do pisania "<<outputFilename<<"
";
    }
    else
      cout<<"Blad podczas czytania z pliku "<<inputFilename<<"
";

    input.close();
  }
  else
    cout<<"Nie mozna otworzyc pliku "<<inputFilename<<"
";


  /// kasowanie macierzy dimension x dimension
  for(int i=0;i<dimension;++i)
    delete[] matrix[i];
  delete[] matrix;

  return 0;
}


Przeksztalca dane z pliku na macierz kwadratowa. Pozniej liczy jej slad i na koncu zapisuje do pliku wynikowego. Z zachowana obsluga bledow.
Pozdrawiam.
anka09
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 19 maja 2009, o 17:20
Płeć: Kobieta

ślad macierzy

Post autor: anka09 »

wyjaśnij mi o co chodzi w tworzeniu macierzy w programie c++ macierz ma być 5x5
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

ślad macierzy

Post autor: Mariusz M »

W C++ macierz najlepiej jest zaimplementować jako klasę
o polach

int row,col;
double** data

Można przeciążyć operatory
"+" i "*"

Trzeba też zaimplementować jakieś metody takie jak

konstruktor i destruktor

det()
inverse()
rank()
insertrows(int,int)
deleterows(int,int)
insertcols(int,int)
deletecols(int,int)
ludcmp()

przydałoby się zaimplementować jeszcze wiele innych metod

Metoda obliczająca rząd powinna się tak zaczynać

int Matrix::rank()
{
...
}

a wyznacznik

double Matrix::det()
{
...
}

Ja próbowałem napisać klasę macierzy
ale mi nie wyszło
ODPOWIEDZ