dzialania na macierzach

0

Witam! Probuje zrobic funkcje ktora mnozy macierz przez skalar, ale niestety nie dziala ona. moze ktos moglby pokazac mi gdzie jest blad? case 1 i 2 dziala. bylbym tez wdzieczny gdyby ktos pomogl mi napisac funkcje ktora liczyla by iloczyn skalarny 2och wektorow

#include<stdio.h>

int n,k,n1,k1,p;
void wprowadz_tablice(int wym1, int wym2, double tablica[wym1][wym2]);
void wypisz_tablice(int wym1, int wym2, double tablica[wym1][wym2]);
void suma_macierzy(int wym1, int wym2, double a[wym1][wym2], double b[wym1][wym2], double suma[wym1][wym2]);
void iloczyn_macierzy(int wym1, int wym2, int wym3, double a[wym1][wym2], double b[wym2][wym3], double iloczyn[wym1][wym3]);
void skalowanie_macierzy(int wym1, int wym2, int skal, double a[wym1][wym2], double skalowana[wym1][wym2]);
int main()
{
printf("Jezeli chcesz:\ndodac macierze wcisnij 1 \nmnozyc macierze wcisnij 2\npomnozyc macierz przez skalar wcisnij 3\n");
scanf("%d", &p);
switch(p){

case 1: 
printf("Podaj liczbe wierszy pierwszej macierzy\n");
scanf("%d", &n);
printf("Podaj liczbe kolumn pierwszej macierzy\n");
scanf("%d", &k);
printf("Podaj liczbe wierszy drugiej macierzy\n");
scanf("%d", &n1);
printf("Podaj liczbe kolumn drugiej macierzy\n");
scanf("%d", &k1);
if(n!=n1 || k!=k1)
printf("\n\nNie mozna dodac macierzy!");
else{
printf("\n");
double a[n][k];
wprowadz_tablice(n,k,a);
wypisz_tablice(n,k,a);    
printf("\n\n");
double b[n1][k1];
wprowadz_tablice(n1,k1,b);
wypisz_tablice(n1,k1,b);
printf("\n\nSuma macierzy wynosi:\n");
double c[n][k];    
suma_macierzy(n,k,a,b,c);
wypisz_tablice(n,k,c);}
break;

case 2:
printf("Podaj liczbe wierszy pierwszej macierzy\n");
scanf("%d", &n);
printf("Podaj liczbe kolumn pierwszej macierzy\n");
scanf("%d", &k);
printf("Podaj liczbe wierszy drugiej macierzy\n");
scanf("%d", &n1);
printf("Podaj liczbe kolumn drugiej macierzy\n");
scanf("%d", &k1);
if(k!=n1)
printf("\n\nNie mozna mnozyc tych macierzy!");
else{
printf("\n");
double a[n][k];
wprowadz_tablice(n,k,a);
wypisz_tablice(n,k,a);
printf("\n\n");
double b[n1][k1];
wprowadz_tablice(n1,k1,b);
wypisz_tablice(n1,k1,b);
printf("\n\nIloczyn macierzy wynosi:\n");
double iloczyn[n][k1];    
iloczyn_macierzy(n,k,k1,a,b,iloczyn);
wypisz_tablice(n,k1,iloczyn);}
break;

case 3:
printf("Podaj liczbe wierszy macierzy\n");
scanf("%d", &n);
printf("Podaj liczbe kolumn macierzy\n");
scanf("%d", &k);
double a[n][k];
wprowadz_tablice(n,k,a);
wypisz_tablice(n,k,a);
printf("\n\nPodaj skalar\n");
scanf("%lf", &k1);
printf("\nPrzeskalowana macierz wynosi:\n");
double skalowana[n][k];    
skalowanie_macierzy(n,k,k1,a,skalowana);
wypisz_tablice(n,k,skalowana);

default: printf("Blad");}

getch();
       }
      
void wprowadz_tablice(int wym1, int wym2, double tablica[wym1][wym2])
       {int i,j;
       for(i=0; i<wym1; i++)
       {for(j=0; j<wym2; j++)
       {printf("Podaj wyraz a%d,%d \n", i+1, j+1);
       scanf("%lf", &tablica[i][j]);}}}
      
void wypisz_tablice(int wym1, int wym2, double tablica[wym1][wym2])
       {int i,j;
             for(i=0; i<wym1; i++)
       {printf("\n");   
       printf("|");
       for(j=0; j<wym2; j++)
       {printf("%lf ", tablica[i][j]);}printf("|");}}
      
void suma_macierzy(int wym1, int wym2,double a[wym1][wym2], double b[wym1][wym2], double suma[wym1][wym2])
       {int i,j;
       for(i=0; i<wym1; i++)
       {for(j=0; j<wym2; j++)
       {suma[i][j]=a[i][j]+b[i][j];}}}

void iloczyn_macierzy(int wym1, int wym2, int wym3, double a[wym1][wym2], double b[wym2][wym3], double iloczyn[wym1][wym3])
       {int i,j,t,s;
       for(i=0; i<wym1; i++)
       {for(j=0; j<wym3; j++)
       {t=0;
       for(s=0; s<wym2; s++)
       {t=t+a[i][s]*b[s][j];}
       iloczyn[i][j]=t;}}}

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[wym1][wym2], double skalowana[wym1][wym2])
       {int i,j;
       for(i=0; i<wym1; i++)
       {for(j=0; j<wym2; j++)
       {skalowana[i][j]=a[i][j]*skal;}}}
0

po pierwsze mi się ten kod nie chce skompilować, a próbowałem w dev-cpp oraz visual studio 2008...
Domyślam się, że programowałeś wcześniej w pascalu :P

próbuj stosować ładne wcięcia bo wtedy się go lepiej czyta tzn jak masz procedurę

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[wym1][wym2], double skalowana[wym1][wym2])
       {int i,j;
       for(i=0; i<wym1; i++)
       {for(j=0; j<wym2; j++)
       {skalowana[i][j]=a[i][j]*skal;}}}

to chyba ładniej (a to jest moje zdanie) wyglądałoby to tak:

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[wym1][wym2], double skalowana[wym1][wym2])
{
     int i,j;
     for (i=0; i<wym1; i++)
     {
          for (j=0; j<wym2; j++)
          {
              skalowana[i][j]=a[i][j]*skal;
          }
     }
}

albo nawet tak:

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[wym1][wym2], double skalowana[wym1][wym2])
{
     int i,j;
     for (i=0; i<wym1; i++)
          for (j=0; j<wym2; j++)
              skalowana[i][j]=a[i][j]*skal;
}

dev mi podczas kompilacji zwraca błąd, że nie wie co to jest wym1 i wym2 w deklaracji funkcji u samej góry, w Twoim programie, czyli np w tej linijce:

void wprowadz_tablice(int wym1, int wym2, double tablica[wym1][wym2]);

ja bym to zrobił na wskaźnikach ale domyślam się, że dopiero zaczynasz...

u mnie kod wygląda np tak i chyba działa:

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[3][3]);
double tab[3][3];
int main()
{
    
    tab[2][2] = 5;
    
    skalowanie_macierzy(3, 3, 5, tab);
    
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)  
            cout<<tab[i][j]<<" ";
        
        cout<<endl;
    }
    
    cin.get();
    return 0;
}

void skalowanie_macierzy(int wym1, int wym2, int skal, double a[3][3])
{
     int i,j;
     for (i=0; i<wym1; i++)
          for (j=0; j<wym2; j++)
              a[i][j]=a[i][j]*skal;
} 
0
double a[n][k];

Nie możesz zrobić czegoś takiego. Rozmiar statycznie zadeklarowanych zmiennych musi być znany już przed uruchomieniem programu. Najlepiej po prostu zadeklaruj taką tablicę, która pomieści maksymalny rozmiar macierzy. Jeśli już koniecznie chcesz zadeklarować tylko tyle pamięci, ile wymaga macierz, musisz zrobić to dynamicznie (operator new lub funkcja malloc() w czystym c.

0

mnie nie wywala zadnych bledow ani w case 1 ani w 2. tam wszystko dziala poprawnie i moge wpisac kazdy wymiar macierzy. Problem jest wlasnie w 3 case. Wczesniej pisalem w c++ a nie w pascalu, a uzywam kompilatora dev-c++.

ps. Zapomnialem napisac ze ten program jest pisany w c a nie c++

//quetz: true, w C fragment Hrypy jest poprawny. patrz rozszerzenia dodane w C99

1 użytkowników online, w tym zalogowanych: 0, gości: 1