C语言实现一个简单的矩阵运算器

这个博客介绍了一个使用C++编写的矩阵运算程序,包括矩阵的加减、乘法、转置、求逆和行列式的计算。程序通过用户输入选择操作,并提供了友好的交互界面。文章还展示了加法操作的示例,并鼓励读者尝试其他功能。

源代码:

正文开始@Assassin

#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); //接收input
    switch (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));
    }
    //输入1
    printf("\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");
    }
    //输入2
    printf("请输入第二个矩阵(请按行规范输入)\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]); //释放lie
        free(Matrix2[a]); //hang次
    }
    free(Matrix1); //释放hang
    free(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 * lie
        jvzhen3[a] = (int *)malloc(lie2 * sizeof(int)); //hang * lie2
    }
    for (int a = 0; a < lie; a++)
    {
        Matrix2[a] = (int *)malloc(lie2 * sizeof(int)); //lie * lie2
    }
    //输入1
    printf("\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");
    }
    //输入2
    printf("请输入第二个矩阵(请按行规范输入)\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*lie
    int **Matrix2 = (int **)malloc(lie * sizeof(int *));  //lie*hang
    for (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));
    }
    //输入1
    printf("\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*jie
    double **Matrix2 = (double **)malloc(jie * sizeof(double *)); //结果  jie*jie
    double **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));
    }
    //输入1
    printf("\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~~

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁海没有七号公园

谢谢你%%%

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值