Strona 1 z 1
ślad macierzy
: 11 kwie 2009, o 01:17
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?
ślad macierzy
: 11 kwie 2009, o 02:14
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.
ślad macierzy
: 11 kwie 2009, o 02:30
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();
}
ślad macierzy
: 11 kwie 2009, o 03:20
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.
ślad macierzy
: 11 kwie 2009, o 09:56
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 ?
ślad macierzy
: 11 kwie 2009, o 12:33
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.
ślad macierzy
: 12 kwie 2009, o 00:30
autor: anapolon3
moze ktos napisac te program zeby dzialal poprawnie , bo bardzo mi na tym zalezy
z gory dzieki
ślad macierzy
: 12 kwie 2009, o 02:20
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.
ślad macierzy
: 19 maja 2009, o 17:40
autor: anka09
wyjaśnij mi o co chodzi w tworzeniu macierzy w programie c++ macierz ma być 5x5
ślad macierzy
: 19 maja 2009, o 18:53
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