#include<stdio.h>
#include<stdlib.h>
// define tipo matriz com campos linha, coluna e ponteiro
typedef struct{
int m;
int n;
double *p_data;
}matriz_t;
// define tipo vetor, uma struct com campos coluna e ponteiro
typedef struct{
int n;
double *p_data;
}vetor_t;
//prototipo das fucncoes
matriz_t le_matriz();
vetor_t le_vetor();
matriz_t prod(matriz_t A,matriz_t B);
vetor_t solve(matriz_t C,vetor_t a);
void mostra_vetor(vetor_t b);
int main(){
matriz_t A,B,C;
vetor_t a,b;
A = le_matriz();
B = le_matriz();
a = le_vetor();
C = prod(A,B);
b = solve(C,a);
mostra_vetor(b);
return 0;
}
matriz_t le_matriz(){
matriz_t A;
int i,j;
// armazena n de linhas e de colunas da matriz
A.
p_data = malloc(A.
m*A.
n*sizeof(double)); // armazena elementos matriz
for(i=0;i<A.m;i++){
for(j=0;j<A.n;j++){
scanf("%lf", &A.
p_data[i
*A.
n+j
]); }
}
return A;
}
vetor_t le_vetor(){
vetor_t a;
int i;
// armazena tamanho vetor
a.
p_data = malloc(a.
n*sizeof(double)); // armazena elementos do vetor
for(i=0;i<a.n;i++){
scanf("%lf",&a.
p_data[i
*a.
n]); }
return a;
}
matriz_t prod(matriz_t A, matriz_t B){
matriz_t C;
int i,j,k;
C.
p_data = malloc(A.
m*B.
n*sizeof(double)); // condicao para o produto matriz matriz
if(A.n == B.m){
// percorre coluna matriz A
for(i=0;i<A.n;i++){
// percorre linha matriz B
for(j=0;j<B.m;j++){
// inicializa terceira matriz com 0
C.p_data[i*A.n+j] =0;
// calcula e armazena o resultado numa 3 matriz
for(k=0;k<B.n;k++){
C.p_data[i*A.n+j] = C.p_data[i*A.n+j]+(A.p_data[i*A.m+k]*B.p_data[k*B.n+j]);
}
}
}
return C;
}
}
vetor_t solve(matriz_t C, vetor_t a){
vetor_t b;
int i,j,k;
b.
p_data = malloc(C.
m*a.
n*sizeof(double)); // condicao do produto matriz vetor
if(C.m == a.n){
// percorre linha matriz
for(i=0;i<C.m;i++){
// percorre coluna vetor
for(j=0;j<a.n;j++){
// terceira matriz para receber os valores calculados
b.p_data[i*C.n+k] = 0;
for(k=0;k<a.n;k++){
b.p_data[i] = b.p_data[i]+(C.p_data[i*C.n+k]*a.p_data[k*a.n+j]);
}
}
}
return b;
}
}
void mostra_vetor(vetor_t b){
int i;
// mostra valores do vetor
for(i=0;i<b.n;i++){
}
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+Ci8vIGRlZmluZSB0aXBvIG1hdHJpeiBjb20gY2FtcG9zIGxpbmhhLCBjb2x1bmEgZSBwb250ZWlybwp0eXBlZGVmIHN0cnVjdHsKICBpbnQgbTsKICBpbnQgbjsKICBkb3VibGUgKnBfZGF0YTsKfW1hdHJpel90OwovLyBkZWZpbmUgdGlwbyB2ZXRvciwgdW1hIHN0cnVjdCBjb20gY2FtcG9zIGNvbHVuYSBlIHBvbnRlaXJvIAp0eXBlZGVmIHN0cnVjdHsKICBpbnQgbjsKICBkb3VibGUgKnBfZGF0YTsKfXZldG9yX3Q7Ci8vcHJvdG90aXBvIGRhcyBmdWNuY29lcwptYXRyaXpfdCBsZV9tYXRyaXooKTsKdmV0b3JfdCBsZV92ZXRvcigpOwptYXRyaXpfdCBwcm9kKG1hdHJpel90IEEsbWF0cml6X3QgQik7CnZldG9yX3Qgc29sdmUobWF0cml6X3QgQyx2ZXRvcl90IGEpOwp2b2lkIG1vc3RyYV92ZXRvcih2ZXRvcl90IGIpOwogCmludCBtYWluKCl7CiAgbWF0cml6X3QgQSxCLEM7CiAgdmV0b3JfdCBhLGI7CiAgQSA9IGxlX21hdHJpeigpOwogIEIgPSBsZV9tYXRyaXooKTsKICBhID0gbGVfdmV0b3IoKTsKICBDID0gcHJvZChBLEIpOwogIGIgPSBzb2x2ZShDLGEpOwogIG1vc3RyYV92ZXRvcihiKTsKICByZXR1cm4gMDsKfQoKbWF0cml6X3QgbGVfbWF0cml6KCl7CiAgbWF0cml6X3QgQTsKICBpbnQgaSxqOwogIHByaW50ZigidGFtIE0xIik7CiAgLy8gYXJtYXplbmEgbiBkZSBsaW5oYXMgZSBkZSBjb2x1bmFzIGRhIG1hdHJpegogIHNjYW5mKCIlZCIsJkEubSk7CiAgc2NhbmYoIiVkIiwmQS5uKTsKICBwcmludGYoIlxuIik7CgogIEEucF9kYXRhID0gbWFsbG9jKEEubSpBLm4qc2l6ZW9mKGRvdWJsZSkpOwogIHByaW50ZigiZWxlbSBtMTpcbiIpOyAgCiAgLy8gYXJtYXplbmEgZWxlbWVudG9zIG1hdHJpeiAKICBmb3IoaT0wO2k8QS5tO2krKyl7CiAgICAgZm9yKGo9MDtqPEEubjtqKyspewogICAgICAgIHNjYW5mKCIlbGYiLCAmQS5wX2RhdGFbaSpBLm4ral0pOwogICAgIH0KICB9CiAgcHJpbnRmKCJcbiIpOwogIHJldHVybiBBOyAKfQoKdmV0b3JfdCBsZV92ZXRvcigpewogIHZldG9yX3QgYTsKICBpbnQgaTsKICBwcmludGYoInRhbSB2MVxuIik7CiAgLy8gYXJtYXplbmEgdGFtYW5obyB2ZXRvciAKICBzY2FuZigiJWQiLCZhLm4pOwogIAogIGEucF9kYXRhID0gbWFsbG9jKGEubipzaXplb2YoZG91YmxlKSk7CiAgcHJpbnRmKCJcbiIpOwogIHByaW50ZigiZWxlbXYxOlxuIik7CiAgLy8gYXJtYXplbmEgZWxlbWVudG9zIGRvIHZldG9yCiAgZm9yKGk9MDtpPGEubjtpKyspewogICAgIHNjYW5mKCIlbGYiLCZhLnBfZGF0YVtpKmEubl0pOwogIH0KICBwcmludGYoIlxuIik7CiAgcmV0dXJuIGE7Cn0KCm1hdHJpel90IHByb2QobWF0cml6X3QgQSwgbWF0cml6X3QgQil7CiAgbWF0cml6X3QgQzsKICBpbnQgaSxqLGs7CiAgQy5wX2RhdGEgPSBtYWxsb2MoQS5tKkIubipzaXplb2YoZG91YmxlKSk7CiAgLy8gY29uZGljYW8gcGFyYSBvIHByb2R1dG8gbWF0cml6IG1hdHJpegogIGlmKEEubiA9PSBCLm0pewogICAgLy8gcGVyY29ycmUgY29sdW5hIG1hdHJpeiBBCiAgICBmb3IoaT0wO2k8QS5uO2krKyl7CiAgICAgICAvLyBwZXJjb3JyZSBsaW5oYSBtYXRyaXogQgogICAgICAgZm9yKGo9MDtqPEIubTtqKyspewogICAgICAgICAvLyBpbmljaWFsaXphIHRlcmNlaXJhIG1hdHJpeiBjb20gMAoJIEMucF9kYXRhW2kqQS5uK2pdID0wOwogICAgICAgICAgLy8gY2FsY3VsYSBlIGFybWF6ZW5hIG8gcmVzdWx0YWRvIG51bWEgMyBtYXRyaXoKICAgICAgICAgIGZvcihrPTA7azxCLm47aysrKXsKICAgICAgICAgICAgIEMucF9kYXRhW2kqQS5uK2pdID0gQy5wX2RhdGFbaSpBLm4ral0rKEEucF9kYXRhW2kqQS5tK2tdKkIucF9kYXRhW2sqQi5uK2pdKTsgCiAgICAgICAgICB9CiAgICAgICB9CiAgICB9CiAgcmV0dXJuIEM7CiAgfQp9Cgp2ZXRvcl90IHNvbHZlKG1hdHJpel90IEMsIHZldG9yX3QgYSl7CiAgdmV0b3JfdCBiOwogIGludCBpLGosazsKICBiLnBfZGF0YSA9IG1hbGxvYyhDLm0qYS5uKnNpemVvZihkb3VibGUpKTsKICAvLyBjb25kaWNhbyBkbyBwcm9kdXRvIG1hdHJpeiB2ZXRvcgogIGlmKEMubSA9PSBhLm4pewogICAvLyBwZXJjb3JyZSBsaW5oYSBtYXRyaXoKICAgZm9yKGk9MDtpPEMubTtpKyspewogICAgIC8vIHBlcmNvcnJlIGNvbHVuYSB2ZXRvcgogICAgIGZvcihqPTA7ajxhLm47aisrKXsKICAgICAgIC8vIHRlcmNlaXJhIG1hdHJpeiBwYXJhIHJlY2ViZXIgb3MgdmFsb3JlcyBjYWxjdWxhZG9zCiAgICAgICBiLnBfZGF0YVtpKkMubitrXSA9IDA7CiAgICAgICAgZm9yKGs9MDtrPGEubjtrKyspewogICAgICAgICAgIGIucF9kYXRhW2ldID0gYi5wX2RhdGFbaV0rKEMucF9kYXRhW2kqQy5uK2tdKmEucF9kYXRhW2sqYS5uK2pdKTsKICAgICAgICB9CiAgICAgfQogICB9CiAgcmV0dXJuIGI7CiAgfQp9Cgp2b2lkIG1vc3RyYV92ZXRvcih2ZXRvcl90IGIpewogIGludCBpOwogIC8vIG1vc3RyYSB2YWxvcmVzIGRvIHZldG9yCiAgZm9yKGk9MDtpPGIubjtpKyspewogICAgIHByaW50ZigiJWxmXG4iLGIucF9kYXRhW2ldKTsKICB9Cn0KCg==