ślad macierzy
ślad macierzy
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?
program trzeba napisac w c++
wie ktos ja napisac taki program?
-
- 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
Ja wiem. Napisz z czym masz konkretnie problem, to postaram sie pomoc. Bo szczerze powiedziawszy, sam element liczenia macierzy wyglada tak:
I juz...
Pozdrawiam.
Kod: Zaznacz cały
int macierz[5][5];
// costam
int slad=0;
for(int i=0;i<5;++i)
slad+=macierz[i][i];
Pozdrawiam.
- Mariusz M
- 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
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();
}
-
- 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
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:
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.
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] ...
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.
- Mariusz M
- 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
Ja chciałem tylko w pewien sposób uogólnić to zadaniesoku11 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:itd.. Nie takie bylo polecenie, ale jak pisze - moze to chciales uzyskac...Kod: Zaznacz cały
WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] WYMIAR_MACIERZY ELEMENT[0][0] ... ELEMENT[n-1][n-1] ...
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.
Jak poprawić punkt 2 ?
Zwalniać mam w pętli kolejne wektory ?
-
- 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
Dlatego napisalem -
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.
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.
ślad macierzy
moze ktos napisac te program zeby dzialal poprawnie , bo bardzo mi na tym zalezy
z gory dzieki
z gory dzieki
-
- 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
No to tak z miejsca bez wiekszych testow i jakichs skomplikowanych konstrukcji:
Przeksztalca dane z pliku na macierz kwadratowa. Pozniej liczy jej slad i na koncu zapisuje do pliku wynikowego. Z zachowana obsluga bledow.
Pozdrawiam.
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.
- Mariusz M
- 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
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
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