Proszę o pomoc z liczbami ujemnymi i wielocyfrowymi oraz z dynamicznym wczytywaniem z .txt do bufora i dynamicznym określaniem wielkości tab. dwuwymiarowej.
Pliki txt powinny wyglądać w ten sposób-
macierz1.txt:
Kod: Zaznacz cały
1 2 3
4 5 6
1 2 3
Kod: Zaznacz cały
6 5 3
2 3 6
1 4 9
Kod: Zaznacz cały
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
void zczytaj(char bufor[]) //Wczytuje macierz i wrzuca ja do bufora //Wczytuje macierz i wrzuca ja do bufora
{
char nazwa1[70];
cout<<"Podaj nazwe 1 pliku ktory chcesz wczytac: ";
cin.getline(nazwa1,70,'\n');
fstream plik;
plik.open( nazwa1, ios::in | ios::binary );
while(plik.is_open() != true)
{
cout<<"Plik "<<nazwa1<< " nie istnieje! Podaj prawidlowa nazwe!" <<endl<<endl;
cout<<"Podaj prawidlowa nazwe 1 pliku ktory chcesz wczytac: ";
cin.getline(nazwa1,70,'\n');
plik.open(nazwa1, ios::in | ios::binary);
}
if(plik.is_open() == true)
{
plik.read( bufor, 1024 );
cout<<"Wczytano " << plik.gcount() <<" bajtow do bufora 1."<<endl<<endl;
cout<<"Wczytana macierz 1: "<<endl<<bufor<<endl<<endl;
}
}
void zczytaj2(char bufor[]) //Wczytuje macierz i wrzuca ja do bufora
{
char nazwa2[70];
cout<<"Podaj nazwe 2 pliku ktory chcesz wczytac: ";
cin.getline(nazwa2,70,'\n');
fstream plik;
plik.open( nazwa2, ios::in | ios::binary );
if(plik.good() == true)
{
plik.read( bufor, 1024 );
cout<< "Wczytano " << plik.gcount() << " bajtow do bufora 2." <<endl<<endl;
cout<<"wczytana macierz 2: "<<endl<<bufor<<endl<<endl;
}
else
{
cout<<"Plik "<<nazwa2<<" nie istnieje! Podaj prawidlowa nazwe!" <<endl<<endl;
cout<<"Podaj prawidlowa nazwe 2 pliku ktory chcesz wczytac: ";
cin.getline(nazwa2,70,'\n');
}
}
void licz_w_i_k(char bufor[], int &w, int &k) //Liczy wiersze i kolumny
{
int K=1, liczby;
k=0, w=1;
for (int j=0; j<100; j++) // 100- ma byc okreslone dynamicznie
{
if(static_cast<int>(bufor[j])==32 || static_cast<int>(bufor[j])==10)
{
K=K+1;
}
if(static_cast<int>(bufor[j])==10)
{
w=w+1;
}
}
k=K/w;
}
void licz_liczby(char bufor[], int &liczby) //Liczy liczbe liczb w macierzy
{
int w, k;
licz_w_i_k(bufor, w, k);
liczby=w*k;
}
void tworz_tab_liczb(char bufor[], float tab_liczb[]) //tworzy tablice jednowymairowa samych liczb
{
int liczby, z=0, i=1;
licz_liczby(bufor, liczby);
for (int j=0; j<100; j++) //100-okreslone dynamicznie
{
if(static_cast<int>(bufor[j])>=48 && static_cast<int>(bufor[j])<=57)
{
tab_liczb[z]=static_cast<int>(bufor[j]-'0');
z=z+1;
}
}
}
void tworz_tab_dwuwym(char bufor[], float tab_dwuwym[][1024]) //tworzy tablice dwuwymiarowa liczb
{ //^^^ nie moze byc 1024 tylko jakos trzeba to okreslic dynamicznie ;/...
int k, w, liczby, i=0;
licz_w_i_k(bufor, w, k);
licz_liczby(bufor, liczby);
float tab_liczb[liczby];
tworz_tab_liczb(bufor, tab_liczb);
for(int g=0; g<w; g++)
{
for(int f=0; f<k; f++)
{
tab_dwuwym[g][f]=tab_liczb[i];
i=i+1;
}
}
}
void suma12(char bufor[], char bufor2[], float suma[][1024]) //suma
{
int k, w, liczby;
licz_w_i_k(bufor, w, k);
float tab_dwuwym[w][1024], tab_dwuwym2[w][1024];
tworz_tab_dwuwym(bufor, tab_dwuwym);
tworz_tab_dwuwym(bufor2, tab_dwuwym2);
cout<<endl<<endl<<"Suma macierzy 1 i 2: "<<endl<<endl;
cout<<setw(4);
for(int g=0; g<w; g++)
{
for(int f=0; f<k; f++)
{
suma[g][f]=(tab_dwuwym2[g][f]+tab_dwuwym[g][f]);
cout<<suma[g][f]<<setw(4);
}
cout<<endl;
}
}
void roznica12(char bufor[], char bufor2[], float roznica[][1024]) //roznica
{
int k, w, liczby;
licz_w_i_k(bufor, w, k);
float tab_dwuwym[w][1024], tab_dwuwym2[w][1024];
tworz_tab_dwuwym(bufor, tab_dwuwym);
tworz_tab_dwuwym(bufor2, tab_dwuwym2);
cout<<endl<<endl<<"Roznica macierzy 1 i 2: "<<endl<<endl;
cout<<setw(4);
for(int g=0; g<w; g++)
{
for(int f=0; f<k; f++)
{
roznica[g][f]=(tab_dwuwym[g][f]-tab_dwuwym2[g][f]);
cout<<roznica[g][f]<<setw(4);
}
cout<<endl;
}
}
void mnozenie12(char bufor[], char bufor2[], float mnozenie[][1024]) //mnozenie
{
int k, w, liczby;
licz_w_i_k(bufor, w, k);
float tab_dwuwym[w][1024], tab_dwuwym2[w][1024];
tworz_tab_dwuwym(bufor, tab_dwuwym);
tworz_tab_dwuwym(bufor2, tab_dwuwym2);
cout<<endl<<endl<<"Iloczyn macierzy 1 i 2: "<<endl<<endl;
cout<<setw(4);
for(int i = 0; i<w; i++)
{
for(int j = 0; j<w; j++)
{
for(int g = 0; g<k; g++)
{
mnozenie[i][j] = mnozenie[i][j] + tab_dwuwym[i][g] * tab_dwuwym2[g][j];
}
cout<<mnozenie[i][j]<<setw(4);
}
cout<<endl;
}
}
void wyznacznik(char bufor[], float det) //liczenie wyznacznika
{
int k, w;
licz_w_i_k(bufor, w, k);
float tab_dwuwym[w][1024];
tworz_tab_dwuwym(bufor, tab_dwuwym);
for(int i=0;i<w;i++)
{
for(int j=i+1;j<w;j++)
{
for(int g=i+1;g<=w;g++)
{
tab_dwuwym[j][g]=tab_dwuwym[j][g] - (tab_dwuwym[j][i]/tab_dwuwym[i][i]) * tab_dwuwym[i][g];
}
}
}cout<<endl;
det=1;
for(int i=0;i<w;i++)
{
det = det * tab_dwuwym[i][i];
}
cout<<"Wyznacznik: "<<det<<endl;
}
void transp(char bufor[], float trans[][1024]) //transponowanie macierzy
{
int w, k;
licz_w_i_k(bufor, w, k);
float tab_dwuwym[w][1024];
tworz_tab_dwuwym(bufor, tab_dwuwym);
for(int i = 0; i <w; i++)
{
for(int j = 0;j <k; j++)
trans[j][i]=tab_dwuwym[i][j];
}
cout<<endl<<"Macierz transponowana:"<<endl<<endl;
cout<<setw(4);
for(int i=0; i<w; i++)
{
for(int j=0; j<k; j++)
{
cout<<trans[i][j]<<setw(4);
}
cout<<endl;
}
}
int main()
{
int k, w, liczby, det, me;
char bufor[1024], bufor2[1024];
fstream plik;
zczytaj(bufor);
licz_liczby(bufor, liczby);
licz_w_i_k(bufor, w, k);
float tab_liczb[liczby], tab_dwuwym[w][1024], suma[w][1024], mnozenie[w][1024], roznica[w][1024],
trans[w][1024]; //trzeba okreslic wymiary tablicy dwuwym. dynamicznie...
tworz_tab_liczb(bufor, tab_liczb);
tworz_tab_dwuwym(bufor, tab_dwuwym);
zczytaj2(bufor2);
licz_liczby(bufor2, liczby);
licz_w_i_k(bufor2, w, k);
tworz_tab_liczb(bufor2, tab_liczb);
tworz_tab_dwuwym(bufor2, tab_dwuwym);
suma12(bufor, bufor2, suma);
roznica12(bufor, bufor2, roznica);
mnozenie12(bufor, bufor2, mnozenie);
wyznacznik(bufor, det);
transp(bufor, trans);
system("pause");
return( 0 );
}