int main(int argc, char ** argv) { char op; char mStr[1024]; matrix ans, m1, m2; int sc = 0; if(argc > 1){ op = getOp(argv[1]); } else { printf("Which operation: "); op = getOp(NULL); } printf("First matrix:\n"); scanf("%s", mStr); m1 = MatrixInit(mStr); if(op == 'a' || op == 's' || op == 'm'){ printf("Second matrix:\n"); scanf("%s", mStr); m2 = MatrixInit(mStr); } else if(op == 'c') { printf("Scalar multiple:\n"); scanf("%d", &sc); } switch(op){ case 'a': ans = MatrixAdd(m1, m2); break; case 's': ans = MatrixSub(m1, m2); break; case 'm': ans = MatrixMul(m1, m2); break; case 'i': ans = MatrixInv(m1); break; case 'c': ans = MatrixSMul(m1, i2f(sc)); break; default: printf("Something went very wrong.\n"); return 1; } printf("Answer:\n"); MatrixPrint(ans); MatrixFree(m1); MatrixFree(ans); if(op == 'a' || op == 's' || op == 'm'){ MatrixFree(m2); } return 0; }
/** Inverses mx. * Returns materr(2) if mx isn't a square, 2x2 matrix, * or materr(1) if the initialization didn't go right. */ matrix MatrixInv(matrix mx) { if (!isValidOp(mx,mx,'i')) { return materr(2); } if(mx.rows == 2) { matrix inv = initialize(mx.rows, mx.columns); if(inv.mx == NULL) { return materr(1); } frac tmp; frac det = fdiv(i2f(1), fsub(fmul(mx.mx[0][0], mx.mx[1][1]), fmul(mx.mx[0][1], mx.mx[1][0]))); tmp = mx.mx[0][0]; inv.mx[0][0] = mx.mx[1][1]; inv.mx[1][1] = tmp; inv.mx[0][1] = fmul(mx.mx[0][1], i2f(-1)); inv.mx[1][0] = fmul(mx.mx[1][0], i2f(-1)); return MatrixSMul(mx, det); } else { return materr(2); } }
int main(void) { char mStr[1024]; matrix *ans, *m1, *m2; int sc = 0; printf("Which operation: "); char op = tolower(getchar()); while(op != '+' || op != '-' || op != '*' || op != '/' || op != 'i') { puts(opErr); op = tolower(getchar()); } printf("First matrix:\n"); scanf("%s", mStr); m1 = MatrixInit(mStr); MatrixPrint(m1); if(op == 'a' || op == 's' || op == 'm') { printf("Second matrix:\n"); scanf("%s", mStr); m2 = MatrixInit(mStr); MatrixPrint(m2); } else if(op == 'c') { printf("Scalar multiple:\n"); scanf("%d", &sc); } switch(op) { case 'a': ans = MatrixAdd(m1, m2); break; case 's': ans = MatrixSub(m1, m2); break; case 'm': ans = MatrixMul(m1, m2); break; case 'i': ans = MatrixInv(m1); break; case 'c': ans = MatrixSMul(m1, sc); break; default: printf("Something went very wrong.\n"); return 1; } printf("Answer:\n"); MatrixPrint(ans); MatrixFree(m1); MatrixFree(ans); if(op == 'a' || op == 's' || op == 'm') { MatrixFree(m2); } return 0; }