C语言实现一个简单的矩阵运算器
源代码:
正文开始@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语言实现一个简单的矩阵运算器相关推荐
- 使用html 语言建立一个简单的网页,如何用记事本建立简单的网页(1).doc
第九章 网页制作 实验一 用记事本建立简单的HTML文件 [实验目的] 学会用HTML语言建立一个简单的网页. [实验内容] 建立一个网页,布局自定,包括自我介绍.图片.自己的电子信箱地址等,要求在标 ...
- 用C语言实现一个简单的一元线性回归算法
今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...
- c语言编写一个简单的答题系统
利用c语言编写一个简单的答题系统. 思路是先设计好题目和答案,再输入自己的答案,利用输入的答案与正确答案对比,从而得出你回答的对错. (一)捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案. ...
- c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
- 用C语言实现一个简单的计算器代码
#include <stdio.h> #include <math.h> #include <stdlib.h> //预处理指令 int main(void) {d ...
- C语言编写一个简单的扫雷
C语言编写一个简单的扫雷 # include <stdio.h> # include <stdlib.h> # include <math.h> # include ...
- 用c语言实现一个简单的输入法联想功能
用c语言实现一个简单的输入法联想功能 手机输入法的联想功能十分常见,通过c语言同样可以实现一个简单的输入法联想功能. 首先读取一个文字量比较大的文件,通过线性表对汉字间的关系进行加权存储,再记录到总体 ...
- 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
- 用C语言编写一个“简单”的程序答题系统
上个星期我们老师给我们布置一道他认为很简单的题,其实就想考考我们,要我们写一个简单的答题系统.开始一看只有一道题我直呼:"仰天大笑出门去,我辈岂是蓬蒿人" 以为老师放我一马,结果点 ...
- 用c语言实现一个简单的宿舍管理系统
今天才打开电脑对自己上个学期的东西进行了回顾,才发现上学期期末课程设计是用C语言写了一个简单的宿舍管理系统,那时候学校的要求是必须要有图形化界面的要求,所以我们小组没有选择用c语言进行这次课程设计的设 ...
最新文章
- BUILD 2015: Visual Studio对GitHub的支持
- Ubuntu 安装docker CE以及harbor
- 【NOIP2007】【Luogu1094】纪念品分组(贪心,乘船问题)
- 主页被挟持 火狐浏览器_看过来!关于IE、360浏览器访问学校部分网站的设置说明在这里...
- 浏览器里面看到的表单数据映射到python_python爬虫入门01:教你在 Chrome 浏览器轻松抓包...
- Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
- NOIP 2007 普及组初赛试题(C++)(含答案)
- mfc控件位置随对话框窗口移动
- ios-实现ARC与MRC混编
- 【SimuPy】Python实现的Simulink 文档翻译全部完毕
- 一个人独立完成一个网站上线的前前后后
- Java并发编程之volatile关键字解析
- linux更新字体库失败,wps for linux 字体库缺失问题的解决办法
- 使用 Tesseract 进行文字识别
- Teamcenter 与各种工具软件的集成解决方案
- java解压出来损坏_ZipOutputStream创建损坏的(可解压缩的)zip文件
- 【零基础微信小程序入门开发一】小程序介绍及环境搭建
- Export2Excel实现多级表头以及多个sheet页
- 初探Java设计模式------观察者模式
- 18个公认的 世界顶级UI开源框架汇总
热门文章
- PostgreSQL 字典表设计
- cad卸载_永远不舍得卸载的6款CAD插件,完全免费,让你三小时做一套图!
- biopython有什么用_Biopython简介
- 5分钟商学院-个人篇-沟通能力
- R语言之dpqr概率函数
- ABB机器人外部轴电机配置(MU系列)
- Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
- Hello Qt(十三)——QT信号与槽机制
- TCP粘包和拆包问题
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读