Dynamiczne macierze dwuwymiarowe w C++

podbijaczserc
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 22 mar 2011, o 20:22
Płeć: Mężczyzna
Lokalizacja: Gdańsk

Dynamiczne macierze dwuwymiarowe w C++

Post autor: podbijaczserc »

Mam do napisania program, który będzie wczytywał z pliku .txt macierze, zapisywał je do tablic dwuwymiarowych, oraz będzie wykonywał na nich różne działania, takie jak mnożenie, dzielenie, odwracanie itp. Niestety mam problem z dynamicznym wczytywaniem macierzy z pliku, oraz z dynamicznym określeniem wielkości tablicy dwuwymiarowej. Nie wiem także jak napisać funkcje, aby obliczała macierze dla liczb wielocyfrowych i dla liczb ujemnych... mój program działa tylko dla dodatnich liczb jednocyfrowych.
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
macierz2.txt:

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 );
}
ODPOWIEDZ