源代码:

正文开始@Assassin

目录:

  • 源代码:
    • 运行结果:
    • see you next blog~~
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <stdlib.h>void Menu(void);  //菜单
int Input(void);    //输入
void Judge(void); //退出/循环判定void Add(void);             //加减
void Multiply(void);             //乘法
void Transpose(void);            //转置
void Inverse(void);               //求逆
void Determinant(void);       //求行列式
int Recursion(int** a, int n); //行列式递归//主函数
int main(void)
{//菜单Menu();//检测输入switch (Input()){case 1:Add();break; //加减case 2:Multiply();break; //乘法case 3:Transpose();break; //转置case 4:Inverse();break; //求逆case 5:Determinant();break; //求行列式default:printf("错误 自动退出");return 0;break;}//退出/循环判定Judge();return 0;
}//菜单
void Menu(void)
{printf("\n\t欢迎使用本矩阵运算程序\n");printf("\n\t输入 1 进行矩阵加减");printf("\n\t输入 2 进行矩阵乘法");printf("\n\t输入 3 进行矩阵转置");printf("\n\t输入 4 进行矩阵求逆");printf("\n\t输入 5 求矩阵的行列式\n");printf("\n\t请输入想进行的操作编号\n\t");
}//输入
int Input(void)
{int input = NULL;scanf("%d", &input); //接收inputswitch (input){ //清空缓存区case 1:fflush(stdin);return 1;break; //清空缓冲区并返回case 2:fflush(stdin);return 2;break;case 3:fflush(stdin);return 3;break;case 4:fflush(stdin);return 4;break;case 5:fflush(stdin);return 5;break;default:fflush(stdin);printf("\n\t请输入正确的编号\n\t");Input();break; //输入1到5 正常进行 否则重新输入}return -1;
}//退出/循环判定
void Judge(void)
{int input = NULL;printf("\n\t输入1回到初始菜单 输入其他退出程序\n\t");scanf("%d", &input);if (input == 1){system("cls"); //清屏main();}else{exit(0); //退出}
}//加减///
void Add(void)
{int hang = 0, lie = 0, flag = -1, input = NULL; //行和列 和符号//输入行列printf("\n\t请输入矩阵的行\n\t");scanf("%d", &hang);getchar(); //清空缓存区printf("\t请输入矩阵的列\n\t");scanf("%d", &lie);getchar();//建立 hang*lie 大小的两个二维数组int **Matrix1 = (int **)malloc(hang * sizeof(int *)); //Matrix1[hang][lie];申请动态分配内存int **Matrix2 = (int **)malloc(hang * sizeof(int *)); //jvzhen2[hang][lie];for (int a = 0; a < hang; a++){Matrix1[a] = (int *)malloc(lie * sizeof(int));Matrix2[a] = (int *)malloc(lie * sizeof(int));}//输入1printf("\n\t请输入第一个矩阵(请按行规范输入)\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){scanf("%d", &Matrix1[a][b]);}printf("\t");}//输入2printf("请输入第二个矩阵(请按行规范输入)\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){scanf("%d", &Matrix2[a][b]);}printf("\t");}//判断加减printf("输入1进行矩阵加法 输入其他进行减法\n\t");scanf("%d", &input);if (input == 1){flag = 1; //符号变正}else{flag = -1;}//运算for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){Matrix1[a][b] += (flag * Matrix2[a][b]);}}//输出结果printf("\t结果为\n\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){printf("%-5d ", Matrix1[a][b]);}printf("\n\n\t");}//free数组 jvzhen[hang][lie]for (int a = 0; a < hang; a++) //释放动态空间{free(Matrix1[a]); //释放liefree(Matrix2[a]); //hang次}free(Matrix1); //释放hangfree(Matrix2);
}//乘法///
void Multiply(void)
{int hang = 0, lie = 0, lie2 = 0, temp = 0; //行和列//输入行列printf("\n\t请输入左边矩阵的行\n\t");scanf("%d", &hang);getchar(); //清空缓存区printf("\t请输入左边矩阵的列\n\t");scanf("%d", &lie);getchar();printf("\t请输入右边矩阵的列\n\t");scanf("%d", &lie2);getchar();//建立三个二维数组int **Matrix1 = (int **)malloc(hang * sizeof(int *));int **Matrix2 = (int **)malloc(lie * sizeof(int *));int **jvzhen3 = (int **)malloc(hang * sizeof(int *));for (int a = 0; a < hang; a++){Matrix1[a] = (int *)malloc(lie * sizeof(int));  //hang * liejvzhen3[a] = (int *)malloc(lie2 * sizeof(int)); //hang * lie2}for (int a = 0; a < lie; a++){Matrix2[a] = (int *)malloc(lie2 * sizeof(int)); //lie * lie2}//输入1printf("\n\t请输入第一个矩阵(请按行规范输入)\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){scanf("%d", &Matrix1[a][b]);}printf("\t");}//输入2printf("请输入第二个矩阵(请按行规范输入)\n\t");for (int a = 0; a < lie; a++){for (int b = 0; b < lie2; b++){scanf("%d", &Matrix2[a][b]);}printf("\t");}//运算for (int a = 0; a < hang; a++){for (int b = 0; b < lie2; b++){temp = 0;for (int c = 0; c < lie; c++){temp += (Matrix1[a][c] * Matrix2[c][b]);}jvzhen3[a][b] = temp;}}//输出结果printf("结果为\n\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie2; b++){printf("%-5d ", jvzhen3[a][b]);}printf("\n\n\t");}//free数组for (int a = 0; a < hang; a++){free(Matrix1[a]);free(jvzhen3[a]);}for (int a = 0; a < lie; a++){free(Matrix2[a]);}free(Matrix1);free(Matrix2);free(jvzhen3);
}//转置///
void Transpose(void)
{int hang = 0, lie = 0; //行和列//输入行列printf("\n\t请输入矩阵的行\n\t");scanf("%d", &hang);getchar(); //清空缓存区printf("\t请输入矩阵的列\n\t");scanf("%d", &lie);getchar();//建立两个二维数组int **Matrix1 = (int **)malloc(hang * sizeof(int *)); //hang*lieint **Matrix2 = (int **)malloc(lie * sizeof(int *));  //lie*hangfor (int a = 0; a < hang; a++){Matrix1[a] = (int *)malloc(lie * sizeof(int));}for (int a = 0; a < lie; a++){Matrix2[a] = (int *)malloc(hang * sizeof(int));}//输入1printf("\n\t请输入矩阵(请按行规范输入)\n\t");for (int a = 0; a < hang; a++){for (int b = 0; b < lie; b++){scanf("%d", &Matrix1[a][b]);}printf("\t");}//运算for (int a = 0; a < lie; a++){for (int b = 0; b < hang; b++){Matrix2[a][b] = Matrix1[b][a];}}//输出结果printf("结果为\n\n\t");for (int a = 0; a < lie; a++){for (int b = 0; b < hang; b++){printf("%-5d ", Matrix2[a][b]);}printf("\n\n\t");}//free数组for (int a = 0; a < hang; a++){free(Matrix1[a]);}for (int a = 0; a < lie; a++){free(Matrix2[a]);}free(Matrix1);free(Matrix2);
}//求逆///
/*算法参考  https://www.cnblogs.com/rollenholt/articles/2050662.html*/
void Inverse(void)
{//输入int jie, jie2, i, j, k;printf("\n\t请输入矩阵的阶数\n\t");scanf("%d", &jie);jie2 = jie * 2;//新建3个矩阵  2个 jie*jie   1个 jie*(2*jie)double **Matrix1 = (double **)malloc(jie * sizeof(double *)); //输入  jie*jiedouble **Matrix2 = (double **)malloc(jie * sizeof(double *)); //结果  jie*jiedouble **jvzhen3 = (double **)malloc(jie * sizeof(double *)); //扩展for (int a = 0; a < jie; a++){Matrix1[a] = (double *)malloc(jie * sizeof(double)); //Matrix2[a] = (double *)malloc(jie * sizeof(double));jvzhen3[a] = (double *)malloc(2 * jie * sizeof(double));}//输入矩阵printf("\n\t请输入矩阵(请按行规范输入)\n\t");for (i = 0; i < jie; i++){for (j = 0; j < jie; j++){scanf("%lf", &Matrix1[i][j]);jvzhen3[i][j] = Matrix1[i][j]; //继承}printf("\t");}/*****************扩展矩阵***********************/for (i = 0; i < jie; i++){for (j = jie; j < jie2; j++){if (i == (j - jie)){jvzhen3[i][j] = 1;}else{jvzhen3[i][j] = 0;}}}/*****************扩展矩阵***********************//*****************求逆模块***********************/for (i = 0; i < jie; i++){if (jvzhen3[i][i] == 0){for (k = i; k < jie; k++){if (jvzhen3[k][i] != 0){for (int j = 0; j < jie2; j++){double temp;temp = jvzhen3[i][j];jvzhen3[i][j] = jvzhen3[k][j];jvzhen3[k][j] = temp;}break;}}if (k == jie){printf("该矩阵不可逆");Judge(); //判定break;}}for (j = jie2 - 1; j >= i; j--){jvzhen3[i][j] /= jvzhen3[i][i];}for (k = 0; k < jie; k++){if (k != i){double temp = jvzhen3[k][i];for (j = 0; j < jie2; j++){jvzhen3[k][j] -= temp * jvzhen3[i][j];}}}}/*****************求逆模块***********************//*****************导出结果***********************/for (i = 0; i < jie; i++){for (j = jie; j < jie2; j++){Matrix2[i][j - jie] = jvzhen3[i][j];}}/*****************导出结果***********************/printf("结果为\n\n\t");for (i = 0; i < jie; i++){for (j = 0; j < jie; j++){printf("%-6.2lf ", Matrix2[i][j]);}printf("\n\t");}//free数组for (int a = 0; a < jie; a++){free(Matrix1[a]);free(Matrix2[a]); //释放动态内存free(jvzhen3[a]);}free(Matrix1);free(Matrix2);free(jvzhen3);
}//求行列式 //
void Determinant(void)
{int jie = 0; //阶数//输入行列printf("\n\t请输入矩阵的阶数\n\t");scanf("%d", &jie);getchar(); //清空缓存区//建立一个二维数组int **Matrix1 = (int **)malloc(jie * sizeof(int *)); //输入for (int a = 0; a < jie; a++){Matrix1[a] = (int *)malloc(jie * sizeof(int));}//输入1printf("\n\t请输入矩阵(请按行规范输入)\n\t");for (int a = 0; a < jie; a++){for (int b = 0; b < jie; b++){scanf("%d", &Matrix1[a][b]);}printf("\t");}//输出结果printf("结果为\n\n\t");printf("%d\n", Recursion(Matrix1, jie));printf("\n\n\t");//free数组for (int a = 0; a < jie; a++){free(Matrix1[a]);}free(Matrix1);
}//行列式递归
int Recursion(int **a, int n)
{int i, j, k;int len; //子行列式的阶int s = 0;len = n - 1;//按照定义,初始化一个子行列式数组的空间int **p = (int **)malloc(sizeof(int *) * len);for (i = 0; i < len; i++){p[i] = (int *)malloc(sizeof(int) * len);}//阶为1,按照定义计算if (n == 1){return a[0][0];}for (k = 0; k < n; k++){for (i = 0; i < len; i++){for (j = 0; j < len; j++){if (i < k){p[i][j] = a[i][j + 1]; //初始化子行列式的值}if (i >= k){p[i][j] = a[i + 1][j + 1];}}}s += (int)pow(-1, k) * a[k][0] * Recursion(p, len); //递归计算}for (i = 0; i < len; i++){free(p[i]);}free(p);return s;
}

运行结果:

这里只演示加法:

以上是g++的命令行编译-----

如图~~

其他功能请自己尝试,都可以实现~

see you next blog~~

C语言实现一个简单的矩阵运算器相关推荐

  1. 使用html 语言建立一个简单的网页,如何用记事本建立简单的网页(1).doc

    第九章 网页制作 实验一 用记事本建立简单的HTML文件 [实验目的] 学会用HTML语言建立一个简单的网页. [实验内容] 建立一个网页,布局自定,包括自我介绍.图片.自己的电子信箱地址等,要求在标 ...

  2. 用C语言实现一个简单的一元线性回归算法

    今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...

  3. c语言编写一个简单的答题系统

    利用c语言编写一个简单的答题系统. 思路是先设计好题目和答案,再输入自己的答案,利用输入的答案与正确答案对比,从而得出你回答的对错. (一)捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案. ...

  4. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  5. 用C语言实现一个简单的计算器代码

    #include <stdio.h> #include <math.h> #include <stdlib.h> //预处理指令 int main(void) {d ...

  6. C语言编写一个简单的扫雷

    C语言编写一个简单的扫雷 # include <stdio.h> # include <stdlib.h> # include <math.h> # include ...

  7. 用c语言实现一个简单的输入法联想功能

    用c语言实现一个简单的输入法联想功能 手机输入法的联想功能十分常见,通过c语言同样可以实现一个简单的输入法联想功能. 首先读取一个文字量比较大的文件,通过线性表对汉字间的关系进行加权存储,再记录到总体 ...

  8. 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  9. 用C语言编写一个“简单”的程序答题系统

    上个星期我们老师给我们布置一道他认为很简单的题,其实就想考考我们,要我们写一个简单的答题系统.开始一看只有一道题我直呼:"仰天大笑出门去,我辈岂是蓬蒿人" 以为老师放我一马,结果点 ...

  10. 用c语言实现一个简单的宿舍管理系统

    今天才打开电脑对自己上个学期的东西进行了回顾,才发现上学期期末课程设计是用C语言写了一个简单的宿舍管理系统,那时候学校的要求是必须要有图形化界面的要求,所以我们小组没有选择用c语言进行这次课程设计的设 ...

最新文章

  1. BUILD 2015: Visual Studio对GitHub的支持
  2. Ubuntu 安装docker CE以及harbor
  3. 【NOIP2007】【Luogu1094】纪念品分组(贪心,乘船问题)
  4. 主页被挟持 火狐浏览器_看过来!关于IE、360浏览器访问学校部分网站的设置说明在这里...
  5. 浏览器里面看到的表单数据映射到python_python爬虫入门01:教你在 Chrome 浏览器轻松抓包...
  6. Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
  7. NOIP 2007 普及组初赛试题(C++)(含答案)
  8. mfc控件位置随对话框窗口移动
  9. ios-实现ARC与MRC混编
  10. 【SimuPy】Python实现的Simulink 文档翻译全部完毕
  11. 一个人独立完成一个网站上线的前前后后
  12. Java并发编程之volatile关键字解析
  13. linux更新字体库失败,wps for linux 字体库缺失问题的解决办法
  14. 使用 Tesseract 进行文字识别
  15. Teamcenter 与各种工具软件的集成解决方案
  16. java解压出来损坏_ZipOutputStream创建损坏的(可解压缩的)zip文件
  17. 【零基础微信小程序入门开发一】小程序介绍及环境搭建
  18. Export2Excel实现多级表头以及多个sheet页
  19. 初探Java设计模式------观察者模式
  20. 18个公认的 世界顶级UI开源框架汇总

热门文章

  1. PostgreSQL 字典表设计
  2. cad卸载_永远不舍得卸载的6款CAD插件,完全免费,让你三小时做一套图!
  3. biopython有什么用_Biopython简介
  4. 5分钟商学院-个人篇-沟通能力
  5. R语言之dpqr概率函数
  6. ABB机器人外部轴电机配置(MU系列)
  7. Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
  8. Hello Qt(十三)——QT信号与槽机制
  9. TCP粘包和拆包问题
  10. 深度学习教程 | 吴恩达专项课程 · 全套笔记解读