Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Násobení matic

Aktivity
Avatar
Josef Vondra
Člen
Avatar
Josef Vondra:24.11.2016 15:49

Zdravím, prosím vás, dělám program na sčítání, odčítání a násobení matic. Se sčítáním a odčítáním není problém, ale s tím násobením si vůbec nevím rady. Jakmile zadám násobení, tak mám problém dokonce zadat druhou matici a vždycky to hodí chyby na standartní chybový výstup. .

#include <stdio.h>
#include <stdlib.h>
#include "math.h"


int r1,s1,r2,s2,r3,s3 = 0; //radky a sloupce
int matice3[100][100]; //matice na scitani a odcitani a nasobeni
char znamenko; // + - *

int main (void){
printf("zadejte velikost matice:\n");
scanf("%i%i",&r1,&s1); //nacteni velikosti prvni matice

printf("matice 1 ma %i radku a %i sloupcu\n",r1,s1);
int **matice1 = (int **) malloc(sizeof(int *)*r1); //alokace prvni matice

for (int k=0; k<r1; k++){ //nacitani radku
    printf("zadejte %i cisla %i radku\n",s1,k+1);
    matice1[k] = (int*)malloc(sizeof(int)*s1);
    for (int l=0; l<s1; l++){ //nacitani sloupcu

        scanf("%i",&matice1[k][l]);
    }
}

printf("Zadejte znamenko:\n");
scanf("%c%c",&znamenko,&znamenko); //nacteni znamenka

printf("Zadejte velikost druhe matice:\n");
scanf("%i%i",&r2,&s2); //nacteni druhe matice
printf("matice 2 ma %i radku a %i sloupcu\n",r1,s1);
int **matice2 = (int **) malloc(sizeof(int *)*r2);


for (int m=0; m<r1; m++){
    printf("zadejte %i cisla %i radku\n",s2,m+1);
    matice2[m] = (int*)malloc(sizeof(int)*s2);
    for (int n=0; n<s1; n++){

        scanf("%i",&matice2[m][n]);
    }
}

if (znamenko == '+'){ //scitani matic

    if (r1 != r2 || s1 != s2){ //kdyz se nerovna pocet sloupcu, nebo radku
    fprintf(stderr,"Error: Chybny vstup!");
    return 100;
}

    printf("Vysledek scitani matic je:\n");
    for (int k=0; k<r1; k++){
        for (int l=0; l<s1; l++){

        matice3[k][l] = matice1[k][l] + matice2[k][l];

        if (l == s1 - 1){
            printf("%i",matice3[k][l]);//vypsani matice bez mezer za poslednim cislem
            break;
        }
        printf("%i ",matice3[k][l]);

    }
   printf("\n");
}

}

if (znamenko == '-'){ //odcitani matic

    if (r1 != r2 || s1 != s2){ //kdyz se nerovna pocet sloupcu, nebo radku
    fprintf(stderr,"Error: Chybny vstup!");
    return 100;
}

    printf("Vysledek odcitani matic je:\n");
    for (int k=0; k<r1; k++){
        for (int l=0; l<s1; l++){

        matice3[k][l] = matice1[k][l] - matice2[k][l];
        if (l == s2 - 1){
            printf("%i",matice3[k][l]); //na konci posledniho cisla nesmi byt mezera!!
            break;
        }
      printf("%i ",matice3[k][l]);
    }
   printf("\n");
}

}

if (znamenko == '*')//Zasrane nasobeni!!

if (r1 != s1 || r2 != s2){ //kdyz se nerovna pocet sloupcu, nebo radku
    fprintf(stderr,"Error: Chybny vstup!");
    return 100;
}

if (r1 == s2 || s1 == r2){ //kdyz se radky prvni matice rovnaji sloupci druhe matice

   for(int k=0; k<r1; k++){
      for(int l=0; l<s2; l++){
        for(int m=0; m<k; m++){
            matice3[k][l] += matice1[k][m] * matice2[m][l];
        }
        printf("%i ",matice3[k][l]);
      }

   }

   printf("\n");
}


return 0;
}
 
Odpovědět
24.11.2016 15:49
Avatar
Martin Gabriel
Tvůrce
Avatar
Martin Gabriel:24.11.2016 16:18
scanf("%c%c",&znamenko,&znamenko); //nacteni znamenka

Není problém tady? :)

Editováno 24.11.2016 16:19
Nahoru Odpovědět
24.11.2016 16:18
"Be the change you want to see in the world" - Michael Scofield
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.