结合QT完成矩阵计算器(1)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用

文章目录

  • 前言
  • 一、整体程序展示
  • 二、函数的实现
    • 1.整体GUI控件布置
    • 2.矩阵相加
    • 3.矩阵相减
  • 总结


前言

        随着科学计算的日益广泛,矩阵运算在各个领域得到越来越多的应用,实现一个功能全面且易于使用的矩阵计算器显得尤为重要。本文设计并实现了一个基于Qt的矩阵计算器,具有矩阵的基本运算、转置、求逆等功能。

        该计算器具有简洁的图形界面,用户可以方便地输入矩阵数据,选择所需的计算操作,并实时显示运算结果。相比传统的命令行界面,图形界面的矩阵计算器对用户更加友好,降低了使用难度。本文首先阐述了矩阵运算的基础知识,如矩阵的表示、加减法、数乘等运算规则。然后描述了基于Qt框架构建图形界面的设计思路,包括界面布局、各控件的添加。关键部分是利用Qt的信号和槽机制实现矩阵运算功能,根据用户的输入数据和选择的计算模式,调用Qt中的数学函数库进行矩阵运算,并更新显示结果。开发过程中,设计合理的界面的布局,使各功能模块区分明确且易操作,是关键所在。

        本文对界面设计的思路进行了详细的描述。另外,如何解析用户输入,进行错误检查,以及如何组织运算函数的调用流程,也是实际编码实现时需要注意的点。该矩阵计算器具有一定的参考意义,可以为相关专业的教学提供支持。


提示:以下是本篇文章正文内容,下面案例仅供参考

一、整体程序展示

 

二、函数的实现

1.整体GUI控件布置

   QFont fangsong("仿宋",14);
    ui->label->setFont(fangsong);
    ui->label_2->setFont(fangsong);
    ui->label_3->setFont(fangsong);
    ui->label_4->setFont(fangsong);
    ui->label_6->setFont(fangsong);

    //指定菜单栏
#ifdef USE_DEFAULT_MENU_BAR
    //添加菜单栏(此处添加为的为QMainWindow自带的菜单)
    pMenuBar = this->menuBar();
#else
    //添加自定义菜单
    pMenuBar = new QMenuBar(this);
#endif

    //定义菜单项
    pMenuTest = new QMenu("功能",this);

    //定义子菜单
    //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应
    pActionTest = new QAction("矩阵相加",this);
    //新建一个带图标的菜单项,图标使用资源文件中的资源
    pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"矩阵相减",this);
    pActionTest2 = new QAction("矩阵相乘",this);
    pActionTest3 = new QAction("矩阵求逆",this);
    pActionTest4 = new QAction("矩阵转置",this);

    //将菜单项添加到子菜单
    pMenuTest->addAction(pActionTest);
    pMenuTest->addAction(pActionTest1);
    pMenuTest->addAction(pActionTest2);
    pMenuTest->addAction(pActionTest3);
    pMenuTest->addAction(pActionTest4);

    //将子菜单添加到菜单栏
    pMenuBar->addMenu(pMenuTest);

#ifndef USE_DEFAULT_MENU_BAR
    //当不使用QMainWindow自带的菜单栏时,必须要加上此行
    setMenuBar(pMenuBar);
#endif
    //添加菜单响应函数
    connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest);
    connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest1);
    connect(pActionTest2,&QAction::triggered,this,&MainWindow::OnActionTest2);
    connect(pActionTest3,&QAction::triggered,this,&MainWindow::OnActionTest3);
    connect(pActionTest4,&QAction::triggered,this,&MainWindow::OnActionTest4);

2.矩阵相加

void MainWindow::OnActionTest(){
    int jugement_v = 1;
    if((ALICE->mu!=BEN->mu)||(ALICE->nu!=BEN->nu)){
        QDialog dlg;
        dlg.setWindowTitle("不是同类型矩阵,不能进行加法运算");
        jugement_v=0;
        dlg.exec();
      }
     COTY->mu=ALICE->mu;
     COTY->nu=BEN->nu;
     COTY->tu=0;
     int a=0,b=0;
     while(a<ALICE->tu && b<BEN->tu){//a,b都小于非零元个数时
      if(ALICE->data[a].i<BEN->data[b].i){//如果a中数据的行号小于b中数据行号,把A放进C
       COTY->tu++;
       COTY->data[COTY->tu].i=ALICE->data[a].i;
       COTY->data[COTY->tu].j=ALICE->data[a].j;
       COTY->data[COTY->tu].v=ALICE->data[a].v;
       a++;
      }
      else if(ALICE->data[a].i==BEN->data[b].i){
        //如果a中数据的行号等于b中数据行号,则看列号,把列号小的放入C,若行列都相同,若相加不为0,则相加后放入C
        if(ALICE->data[a].j<BEN->data[b].j){
            COTY->tu++;
            COTY->data[COTY->tu].i=ALICE->data[a].i;
            COTY->data[COTY->tu].j=ALICE->data[a].j;
            COTY->data[COTY->tu].v=ALICE->data[a].v;
            a++;
        }
        else if(ALICE->data[a].j>BEN->data[b].j){
            COTY->tu++;
            COTY->data[COTY->tu].i=BEN->data[b].i;
            COTY->data[COTY->tu].j=BEN->data[b].j;
            COTY->data[COTY->tu].v=BEN->data[b].v;
            b++;
       }
       else{
            COTY->tu++;
            COTY->data[COTY->tu].i=BEN->data[b].i;
            COTY->data[COTY->tu].j=BEN->data[b].j;
            COTY->data[COTY->tu].v=BEN->data[b].v+ALICE->data[a].v;
            a++;
            b++;
       }
      }
      else{//如果a中数据的行号大于b中数据行号,把B放进C
       COTY->tu++;
       COTY->data[COTY->tu].i=BEN->data[b].i;
       COTY->data[COTY->tu].j=BEN->data[b].j;
       COTY->data[COTY->tu].v=BEN->data[b].v;
       b++;
      }
     }
     //把还有剩余数据的数组的数据放到C中
     while(a<=ALICE->tu)
     {
      COTY->tu++;
      COTY->data[COTY->tu].i=ALICE->data[b].i;
      COTY->data[COTY->tu].j=ALICE->data[b].j;
      COTY->data[COTY->tu].v=ALICE->data[b].v;
      a++;
     }
     while(b<=BEN->tu)
     {
      COTY->tu++;
      COTY->data[COTY->tu].i=BEN->data[b].i;
      COTY->data[COTY->tu].j=BEN->data[b].j;
      COTY->data[COTY->tu].v=BEN->data[b].v;
      b++;
     }
if(jugement_v==1){
     qDeleteAll(btnlabellist);
     btnlabellist.clear();
     int num=0;
     for(int i_1=0;i_1<COTY->mu;i_1++){
         for(int j_1=0;j_1<COTY->nu;j_1++){
             for(int q_1=0;q_1<COTY->tu;q_1++){
                 num++;
                 btnlabel=new QLabel(this);
                 btnlabel->setParent(this);
                 btnlabel->show();
                 //设置按钮在主对话框的位置
                 //  每一个的坐标, 横、纵 、宽度、高度
                 btnlabel->setGeometry(20+(500/COTY->mu)*j_1,20+(500/COTY->mu)*i_1,(500/COTY->mu),(500/COTY->mu));

                 //设置按钮对象名字
                 btnlabel->setObjectName("btnlabel"+QString::number(num));//num正序

                 //设置按钮显示文本
                 if(COTY->data[q_1].i == i_1+1&&COTY->data[q_1].j == j_1+1 && COTY->data[q_1].v != 0){
                     btnlabel->setText(QString::number(COTY->data[q_1].v));
                 }
                 btnlabel->setStyleSheet("QLabel{border:2px solid rgb(128,128,128);}");
                 btnlabel ->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                 QFont fangsong("仿宋",14);
                 btnlabel->setFont(fangsong);

                 //向QList添加成员项
                 btnlabellist.append(btnlabel);

                 }
            }
        }
    }
}

3.矩阵相减

void MainWindow::OnActionTest1(){
    if((ALICE->mu!=BEN->mu)||(ALICE->nu!=BEN->nu)){
        QDialog dlg;
        dlg.setWindowTitle("不是同类型矩阵,不能进行减法运算");
        dlg.exec();
      }
     COTY->mu=ALICE->mu;
     COTY->nu=BEN->nu;
     COTY->tu=0;
     int a=0,b=0;
     while(a<ALICE->tu && b<BEN->tu){//a,b都小于非零元个数时
      if(ALICE->data[a].i<BEN->data[b].i){//如果a中数据的行号小于b中数据行号,把A放进C
       COTY->tu++;
       COTY->data[COTY->tu].i=ALICE->data[a].i;
       COTY->data[COTY->tu].j=ALICE->data[a].j;
       COTY->data[COTY->tu].v=ALICE->data[a].v;
       a++;
      }
      else if(ALICE->data[a].i==BEN->data[b].i){
        //如果a中数据的行号等于b中数据行号,则看列号,把列号小的放入C,若行列都相同,若ALICE减去BEN不为零则将数据加入COTY
        if(ALICE->data[a].j<BEN->data[b].j){
            COTY->tu++;
            COTY->data[COTY->tu].i=ALICE->data[a].i;
            COTY->data[COTY->tu].j=ALICE->data[a].j;
            COTY->data[COTY->tu].v=ALICE->data[a].v;
            a++;
        }
        else if(ALICE->data[a].j>BEN->data[b].j){
            COTY->tu++;
            COTY->data[COTY->tu].i=BEN->data[b].i;
            COTY->data[COTY->tu].j=BEN->data[b].j;
            COTY->data[COTY->tu].v=0-BEN->data[b].v;
            b++;
       }
       else{
            COTY->tu++;
            COTY->data[COTY->tu].i=ALICE->data[b].i;
            COTY->data[COTY->tu].j=ALICE->data[b].j;
            COTY->data[COTY->tu].v=ALICE->data[b].v-BEN->data[a].v;
            a++;
            b++;
       }
      }
      else{//如果a中数据的行号大于b中数据行号,把B放进C
       COTY->tu++;
       COTY->data[COTY->tu].i=BEN->data[b].i;
       COTY->data[COTY->tu].j=BEN->data[b].j;
       COTY->data[COTY->tu].v= 0-BEN->data[b].v;
       b++;
      }
     }
     //把还有剩余数据的数组的数据放到C中
     while(a<=ALICE->tu)
     {
      COTY->tu++;
      COTY->data[COTY->tu].i=ALICE->data[b].i;
      COTY->data[COTY->tu].j=ALICE->data[b].j;
      COTY->data[COTY->tu].v=ALICE->data[b].v;
      a++;
     }
     while(b<=BEN->tu)
     {
      COTY->tu++;
      COTY->data[COTY->tu].i=BEN->data[b].i;
      COTY->data[COTY->tu].j=BEN->data[b].j;
      COTY->data[COTY->tu].v= 0-BEN->data[b].v;
      b++;
     }

     qDeleteAll(btnlabellist);
     btnlabellist.clear();
     int num=0;
     for(int i_1=0;i_1<COTY->mu;i_1++){
         for(int j_1=0;j_1<COTY->nu;j_1++){
             for(int q_1=0;q_1<COTY->tu;q_1++){
                 num++;
                 btnlabel=new QLabel(this);
                 btnlabel->setParent(this);
                 btnlabel->show();
                 //设置按钮在主对话框的位置
                 //  每一个的坐标, 横、纵 、宽度、高度
                 btnlabel->setGeometry(20+(500/COTY->mu)*j_1,20+(500/COTY->mu)*i_1,(500/COTY->mu),(500/COTY->mu));

                 //设置按钮对象名字
                 btnlabel->setObjectName("btnlabel"+QString::number(num));//num正序

                 //设置按钮显示文本
                 if(COTY->data[q_1].i == i_1+1&&COTY->data[q_1].j == j_1+1 && COTY->data[q_1].v != 0){
                     btnlabel->setText(QString::number(COTY->data[q_1].v));
                 }
                 btnlabel->setStyleSheet("QLabel{border:2px solid rgb(128,128,128);}");
                 btnlabel ->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                 QFont fangsong("仿宋",14);
                 btnlabel->setFont(fangsong);

                 //向QList添加成员项
                 btnlabellist.append(btnlabel);

            }
        }
    }
}

其他文章:

参考链接:

【Qt】边学边写之Qt教程(零基础)

C++矩阵计算器

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值