#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#define MAXNOP 50 /*Max number of operations allowed */
#define MAXNMATR 20 /*Max number of matrices */
struct m{
size_t row;
size_t col;
double *data;
};
struct m multiply(struct m *A, struct m *B);
void f(double x);
void print_matrix(struct m *A);
void read_file(int maxc, FILE *fp);
void scalar_product(double scalar, struct m *B);
void calculate(struct m *matrix, int nop, int id, char *op);
int main(int argc, char *argv[]){
FILE
*file
= argc
> 1 ? fopen(argv
[1], "rb") : stdin
;
/*define max dimension of a matrix */
int maxc
= argc
>2?atoi(argv
[2])*atoi(argv
[2]):100; read_file(maxc, file);
return 0;
}
void read_file(int maxc, FILE *fp)
{
struct m *matrix;
int id = 0; /* id of a matrix */
size_t ncol,nrow; /* No of columns of a matrix*/
ncol = nrow = 0;
int nop = 0; /*No of operators*/
int off = 0;
int i;
int n;
double *d;
char buf[2*maxc]; /*to store each lines of file */
char *p = buf;
char op[MAXNOP];
for (i=0; i < MAXNOP; i++)
op[i]='?';
if (!(matrix
= malloc(maxc
*sizeof *matrix
))) { }
/*Read file line by line */
while (fgets (buf
, maxc
, fp
)){
if (nrow == 0){
/* allocate/validate max no. of matrix */
d
= matrix
[id
].
data = malloc(sizeof(double) * MAXNMATR
); }
/*check if line contains operator */
if ( (!isdigit(*buf
) && buf
[1] =='\n')) {
op[nop++] = *buf;
matrix[id].col = ncol;
matrix[id].row = nrow;
nrow = ncol = 0;
id++;
continue;
}
else /* read integers in a line into d */
{
while (sscanf (p
+ off
, "%lf%n", d
, &n
) == 1) { d++;
if(nrow == 0)
ncol++;
off += n;
}
nrow++;
off = 0;
}
} /*end of while fgets cycle */
/*Assign last matrix No of columns and rows */
matrix[id].col = ncol;
matrix[id].row = nrow;
/*Printing the matrices and operations */
for(i=0; i <= id; i++){
if (op[i] == '*' || op[i] == '-' || op[i] =='+')
{
print_matrix(&matrix[i]);
if(op[i-1] != 'i')
else
continue;
}
else if(op[i] == '?'){
print_matrix(&matrix[i]);
}
}
calculate(matrix, nop, id, op);
}
void calculate(struct m *matrix, int nop, int id, char *op)
{
int i;
for(i=0; i <= nop; i+=2)
{
if(op[i] == '*' && op[i+1] == '?'){
if (matrix[i].row == 1 && matrix[i].col == 1)
scalar_product(matrix[i].data[0], &matrix[i+1]); //Multiplication of Scalar per matrix
else{
matrix[i+1] = multiply(&matrix[i],&matrix[i+1]);
matrix[i+2] = multiply(&matrix[i+1],&matrix[i+2]);
}
break;
}
}
print_matrix(&matrix[id]); /*Print the result */
}
struct m multiply(struct m *A, struct m *B)
{
size_t i, j, k;
struct m C;
C.
data = malloc(sizeof(double) * A
->row
* B
->col
);
C.row = A->row;
C.col = B->col;
for (i=0; i< C.row; i++)
for (j=0; j < C.col; j++)
C.data[i * C.col + j] = 0;
// Multiplying matrix A and B and storing in C.
for(i = 0; i < A->row; ++i)
for(j = 0; j < B->col; ++j)
for(k=0; k < A->col; ++k)
C.data[i * C.col + j] += A->data[i * A->col + k] * B->data[k * B->col + j];
return C;
}
void f(double x)
{
if(f<.00001)
}
/*printing a Matrix*/
void print_matrix(struct m *A){
size_t i,j;
double *tmp = A->data;
for(i=0; i < A->row; i++){
for(j=0; j < A->col; j++){
f(*(tmp++));
}
}
}
void scalar_product(double scalar, struct m *B)
{
size_t i,j;
for(i=0; i < B->row; i++)
for(j=0; j < B->col; j++)
B->data[i * B->col + j] = scalar * B->data[i * B->col + j];
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYTk9QIDUwIC8qTWF4IG51bWJlciBvZiBvcGVyYXRpb25zIGFsbG93ZWQgKi8KI2RlZmluZSBNQVhOTUFUUiAyMCAvKk1heCBudW1iZXIgb2YgbWF0cmljZXMgKi8KCnN0cnVjdCBtewogICAgc2l6ZV90IHJvdzsKICAgIHNpemVfdCBjb2w7CiAgICBkb3VibGUgKmRhdGE7Cn07CgpzdHJ1Y3QgbSBtdWx0aXBseShzdHJ1Y3QgbSAqQSwgc3RydWN0IG0gKkIpOwp2b2lkIGYoZG91YmxlIHgpOwp2b2lkIHByaW50X21hdHJpeChzdHJ1Y3QgbSAqQSk7CnZvaWQgcmVhZF9maWxlKGludCBtYXhjLCBGSUxFICpmcCk7CnZvaWQgc2NhbGFyX3Byb2R1Y3QoZG91YmxlIHNjYWxhciwgc3RydWN0IG0gKkIpOwp2b2lkIGNhbGN1bGF0ZShzdHJ1Y3QgbSAqbWF0cml4LCBpbnQgbm9wLCBpbnQgaWQsIGNoYXIgKm9wKTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pewogICAgCiAgICBGSUxFICpmaWxlID0gYXJnYyA+IDEgPyBmb3Blbihhcmd2WzFdLCAicmIiKSA6IHN0ZGluOwogICAKICAgIC8qZGVmaW5lIG1heCBkaW1lbnNpb24gb2YgYSBtYXRyaXggKi8KICAgIGludCBtYXhjID0gYXJnYz4yP2F0b2koYXJndlsyXSkqYXRvaShhcmd2WzJdKToxMDA7CiAgICByZWFkX2ZpbGUobWF4YywgZmlsZSk7ICAgICAgIAogCiAgICByZXR1cm4gMDsKfQoKdm9pZCByZWFkX2ZpbGUoaW50IG1heGMsIEZJTEUgKmZwKQp7CiAgICBzdHJ1Y3QgbSAqbWF0cml4OwogICAgaW50IGlkID0gMDsgLyogaWQgb2YgYSBtYXRyaXggKi8KICAgIHNpemVfdCBuY29sLG5yb3c7IC8qIE5vIG9mIGNvbHVtbnMgb2YgYSBtYXRyaXgqLwogICAgbmNvbCA9IG5yb3cgPSAwOwogICAgaW50IG5vcCA9IDA7IC8qTm8gb2Ygb3BlcmF0b3JzKi8KICAgIGludCBvZmYgPSAwOwogICAgaW50IGk7CiAgICBpbnQgbjsKICAgIGRvdWJsZSAqZDsKICAgIGNoYXIgYnVmWzIqbWF4Y107IC8qdG8gc3RvcmUgZWFjaCBsaW5lcyBvZiBmaWxlICovCiAgICBjaGFyICpwID0gYnVmOwogICAgY2hhciBvcFtNQVhOT1BdOwogICAgCiAgICBmb3IgKGk9MDsgaSA8IE1BWE5PUDsgaSsrKQogICAgICAgICAgICBvcFtpXT0nPyc7ICAgIAogICAKICAgIGlmICghKG1hdHJpeCA9IG1hbGxvYyhtYXhjKnNpemVvZiAqbWF0cml4KSkpIHsKICAgICAgICBwZXJyb3IgKCJtYWxsb2MtbWF0cml4Iik7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICAKICAgIC8qUmVhZCBmaWxlIGxpbmUgYnkgbGluZSAqLwogICAgd2hpbGUgKGZnZXRzIChidWYsIG1heGMsIGZwKSl7CiAgICAgICAgCiAgICAgICAgaWYgKG5yb3cgPT0gMCl7CiAgICAgICAgICAgIC8qIGFsbG9jYXRlL3ZhbGlkYXRlIG1heCBuby4gb2YgbWF0cml4ICovCiAgICAgICAgICAgIGQgPSBtYXRyaXhbaWRdLmRhdGEgPSBtYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBNQVhOTUFUUik7CiAgICAgICAgfSAgICAgCiAKICAgICAgICAKICAgICAgICAvKmNoZWNrIGlmIGxpbmUgY29udGFpbnMgb3BlcmF0b3IgKi8KICAgICAgICBpZiAoICghaXNkaWdpdCgqYnVmKSAmJiBidWZbMV0gPT0nXG4nKSkKICAgICAgICB7ICAgICAgCiAgICAgICAgICAgIG9wW25vcCsrXSA9ICpidWY7CiAgICAgICAgICAgIG1hdHJpeFtpZF0uY29sID0gbmNvbDsKICAgICAgICAgICAgbWF0cml4W2lkXS5yb3cgPSBucm93OwogICAgICAgICAgICBucm93ID0gbmNvbCA9IDA7CiAgICAgICAgICAgIGlkKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbHNlIC8qIHJlYWQgaW50ZWdlcnMgaW4gYSBsaW5lIGludG8gZCAqLwogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKHNzY2FuZiAocCArIG9mZiwgIiVsZiVuIiwgZCwgJm4pID09IDEpIHsKICAgICAgICAgICAgICAgIGQrKzsKICAgICAgICAgICAgICAgIGlmKG5yb3cgPT0gMCkKICAgICAgICAgICAgICAgICAgICBuY29sKys7CiAgICAgICAgICAgICAgICBvZmYgKz0gbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBucm93Kys7CiAgICAgICAgICAgIG9mZiA9IDA7CiAgICAgICAgfQogICAgfSAvKmVuZCBvZiB3aGlsZSBmZ2V0cyBjeWNsZSAqLwogICAgICAgCiAgICAvKkFzc2lnbiBsYXN0IG1hdHJpeCBObyBvZiBjb2x1bW5zIGFuZCByb3dzICovCiAgICBtYXRyaXhbaWRdLmNvbCA9IG5jb2w7CiAgICBtYXRyaXhbaWRdLnJvdyA9IG5yb3c7CiAgICAKICAgIC8qUHJpbnRpbmcgdGhlIG1hdHJpY2VzIGFuZCBvcGVyYXRpb25zICovCiAgICBmb3IoaT0wOyBpIDw9IGlkOyBpKyspeyAgCiAgICAgICAgCiAgICAgICAgaWYgKG9wW2ldID09ICcqJyB8fCBvcFtpXSA9PSAnLScgfHwgb3BbaV0gPT0nKycpCiAgICAgICAgewogICAgICAgICAgICBwcmludF9tYXRyaXgoJm1hdHJpeFtpXSk7CiAgICAgICAgICAgIGlmKG9wW2ktMV0gIT0gJ2knKQogICAgICAgICAgICAgICAgcHJpbnRmKCIlY1xuIiwgb3BbaV0pOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9ICAgICAgICAKICAgICAgICAgIAogICAgICAgIGVsc2UgaWYob3BbaV0gPT0gJz8nKXsKICAgICAgICAgICAgIHByaW50X21hdHJpeCgmbWF0cml4W2ldKTsKICAgICAgICB9ICAgICAgICAKICAgIH0KICAgIAogICAgY2FsY3VsYXRlKG1hdHJpeCwgbm9wLCBpZCwgb3ApOwp9Cgp2b2lkIGNhbGN1bGF0ZShzdHJ1Y3QgbSAqbWF0cml4LCBpbnQgbm9wLCBpbnQgaWQsIGNoYXIgKm9wKQp7ICAgIAogICAgaW50IGk7CiAgICAKICAgIGZvcihpPTA7IGkgPD0gbm9wOyBpKz0yKQogICAgeyAgICAgICAgCiAgICAgICAgICAgCiAgICAgICAgaWYob3BbaV0gPT0gJyonICYmIG9wW2krMV0gPT0gJz8nKXsKICAgICAgICAgICAgIGlmIChtYXRyaXhbaV0ucm93ID09IDEgJiYgbWF0cml4W2ldLmNvbCA9PSAxKQogICAgICAgICAgICAgICAgIHNjYWxhcl9wcm9kdWN0KG1hdHJpeFtpXS5kYXRhWzBdLCAmbWF0cml4W2krMV0pOyAvL011bHRpcGxpY2F0aW9uIG9mIFNjYWxhciBwZXIgbWF0cml4CiAgICAgICAgICAgICBlbHNleyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgbWF0cml4W2krMV0gPSBtdWx0aXBseSgmbWF0cml4W2ldLCZtYXRyaXhbaSsxXSk7CiAgICAgICAgICAgICAgICAgbWF0cml4W2krMl0gPSBtdWx0aXBseSgmbWF0cml4W2krMV0sJm1hdHJpeFtpKzJdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9ICAgICAgIAogICAgfQogICAgCiAgICBwcmludGYoIj1cbiIpOwogICAgcHJpbnRfbWF0cml4KCZtYXRyaXhbaWRdKTsgLypQcmludCB0aGUgcmVzdWx0ICovCiAgICBmcmVlKG1hdHJpeCk7Cn0KCnN0cnVjdCBtIG11bHRpcGx5KHN0cnVjdCBtICpBLCBzdHJ1Y3QgbSAqQikgCnsgCiAgICBzaXplX3QgaSwgaiwgazsKICAgIHN0cnVjdCBtIEM7CiAgICBDLmRhdGEgPSBtYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBBLT5yb3cgKiBCLT5jb2wpOwogCiAgICBDLnJvdyA9IEEtPnJvdzsKICAgIEMuY29sID0gQi0+Y29sOwogCiAgICBmb3IgKGk9MDsgaTwgQy5yb3c7IGkrKykKICAgICAgICBmb3IgKGo9MDsgaiA8IEMuY29sOyBqKyspCiAgICAgICAgICAgIEMuZGF0YVtpICogQy5jb2wgKyBqXSA9IDA7CiAKICAgIC8vIE11bHRpcGx5aW5nIG1hdHJpeCBBIGFuZCBCIGFuZCBzdG9yaW5nIGluIEMuCiAgICBmb3IoaSA9IDA7IGkgPCBBLT5yb3c7ICsraSkKICAgICAgICBmb3IoaiA9IDA7IGogPCBCLT5jb2w7ICsraikKICAgICAgICAgICAgZm9yKGs9MDsgayA8IEEtPmNvbDsgKytrKQogICAgICAgICAgICAgIEMuZGF0YVtpICogQy5jb2wgKyBqXSArPSBBLT5kYXRhW2kgKiBBLT5jb2wgKyBrXSAqIEItPmRhdGFbayAqIEItPmNvbCArIGpdOwogICAgICAgICAgICAKICAgIHJldHVybiBDOwp9Cgp2b2lkIGYoZG91YmxlIHgpCnsKICAgIGRvdWJsZSBpLGY9IG1vZGYoeCwmaSk7CiAgICAKICAgIGlmKGY8LjAwMDAxKQogICAgICAgIHByaW50ZigiJS5mICIsaSk7CiAgICAKICAgIGVsc2UgcHJpbnRmKCIlZiAiLHgpOwp9CgovKnByaW50aW5nIGEgTWF0cml4Ki8KCnZvaWQgcHJpbnRfbWF0cml4KHN0cnVjdCBtICpBKXsKICAgIAogICAgIHNpemVfdCBpLGo7CgogICAgIGRvdWJsZSAqdG1wID0gQS0+ZGF0YTsKICAgICAKICAgICBmb3IoaT0wOyBpIDwgQS0+cm93OyBpKyspewogICAgICAgIGZvcihqPTA7IGogPCBBLT5jb2w7IGorKyl7CiAgICAgICAgICAgICAgICBmKCoodG1wKyspKTsKICAgICAgICB9CiAgICAgICAgcHV0Y2hhcignXG4nKTsKICAgIH0KfQoKdm9pZCBzY2FsYXJfcHJvZHVjdChkb3VibGUgc2NhbGFyLCBzdHJ1Y3QgbSAqQikKewogICAgIHNpemVfdCBpLGo7CiAgICAgCiAgICAgZm9yKGk9MDsgaSA8IEItPnJvdzsgaSsrKQogICAgICAgIGZvcihqPTA7IGogPCBCLT5jb2w7IGorKykKICAgICAgICAgICBCLT5kYXRhW2kgKiBCLT5jb2wgKyBqXSA9IHNjYWxhciAqIEItPmRhdGFbaSAqIEItPmNvbCArIGpdOwp9Cg==