怎么才能简化代码方法


void MainWindow::surveyData()
{
    int math=0, chinese=0, english=0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem *aItem= theModel->item(i, 1);
        int text = aItem->text().toInt();
        if (text < 60)
            math++;
    }
    QString Math = QString::number(math);
    math = 0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 2);
        int text = aItem->text().toInt();
        if (text < 60)
            chinese++;
    }
    QString Chinese = QString::number(chinese);
    chinese = 0;

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 3);
        int text = aItem->text().toInt();
        if (text < 60)
            english++;
    }
    QString English = QString::number(english);
    english = 0;


    QStringList headerList;
    headerList << "     分数段" << "数学" <<"语文"<< "英语";
    ui.treeWidget->setHeaderLabels(headerList);
    QTreeWidgetItem* item;
    item = new QTreeWidgetItem(1001);
    item->setText(0, "60分以下");
    item->setText(1, Math);
    item->setText(2, Chinese);
    item->setText(3, English);
    ui.treeWidget->addTopLevelItem (item);

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 1);
        int text = aItem->text().toInt();
        if (text > 60&&text<69)
            math++;
    }
    QString Math1 = QString::number(math);
    math = 0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 2);
        int text = aItem->text().toInt();
        if (text > 60&&text<69)
            chinese++;
    }
    QString Chinese1 = QString::number(chinese);
    chinese = 0;

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 3);
        int text = aItem->text().toInt();
        if (text > 60&&text<69)
            english++;
    }
    QString English1 = QString::number(english);
    english = 0;
    item = new QTreeWidgetItem(1002);
    item->setText(0, "60-69分");
    item->setText(1, Math1);
    item->setText(2, Chinese1);
    item->setText(3, English1);
    ui.treeWidget->addTopLevelItem(item);

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 1);
        int text = aItem->text().toInt();
        if (text > 70 && text < 79)
            math++;
    }
    QString Math2 = QString::number(math);
    math = 0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 2);
        int text = aItem->text().toInt();
        if (text > 70 && text < 79)
            chinese++;
    }
    QString Chinese2 = QString::number(chinese);
    chinese = 0;

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 3);
        int text = aItem->text().toInt();
        if (text > 70 && text < 79)
            english++;
    }
    QString English2 = QString::number(english);
    english = 0;
    item = new QTreeWidgetItem(1003);
    item->setText(0, "70-79分");
    item->setText(1, Math2);
    item->setText(2, Chinese2);
    item->setText(3, English2);
    ui.treeWidget->addTopLevelItem(item);

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 1);
        int text = aItem->text().toInt();
        if (text > 80 && text < 89)
            math++;
    }
    QString Math3 = QString::number(math);
    math = 0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 2);
        int text = aItem->text().toInt();
        if (text > 80 && text < 89)
            chinese++;
    }
    QString Chinese3 = QString::number(chinese);
    chinese = 0;

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 3);
        int text = aItem->text().toInt();
        if (text > 80 && text < 89)
            english++;
    }
    QString English3 = QString::number(english);
    english = 0;
    item = new QTreeWidgetItem(1004);
    item->setText(0, "80-89分");
    item->setText(1, Math3);
    item->setText(2, Chinese3);
    item->setText(3, English3);
    ui.treeWidget->addTopLevelItem(item);

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 1);
        int text = aItem->text().toInt();
        if (text > 90)
            math++;
    }
    QString Math4 = QString::number(math);
    math = 0;
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 2);
        int text = aItem->text().toInt();
        if (text > 90)
            chinese++;
    }
    QString Chinese4 = QString::number(chinese);
    chinese = 0;

    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem* aItem = theModel->item(i, 3);
        int text = aItem->text().toInt();
        if (text > 90)
            english++;
    }
    QString English4 = QString::number(english);
    english = 0;
    item = new QTreeWidgetItem(1005);
    item->setText(0, "90分以上");
    item->setText(1, Math4);
    item->setText(2, Chinese4);
    item->setText(3, English4);
    ui.treeWidget->addTopLevelItem(item);
}
大佬们,这个代码有办法简化吗?

目测可以提炼出函数,避免重复编写。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/854023
  • 这篇博客也不错, 你可以看下创建文件夹并按顺序生成文件名字
  • 除此之外, 这篇博客: 窗口、按钮中的 使用方法: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    Qt 串口通信(QSerialPort)_shenmingyi.blog.csdn.net-CSDN博客_qt串口通信

    Qt 串口类QSerialPort 使用笔记_Ivan 的专栏-CSDN博客

    1.包含头文件

    #include "QtSerialPort/QSerialPort"         //提供了操作串口的各种接口
    #include "QtSerialPort/QSerialPortInfo"     //是一个辅助类,可以提供计算机中可用串口的各种信息

    2.在pro文件中增加如下内容:

    QT += serialport

    3.要先获取到 可连接的所有的串口的名字

    QSerialPortInfo::availablePorts()
    [static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
    Returns a list of available serial ports on the system.
    返回系统上可用串行端口的列表

    void MainWindow::GetSerialNames()
    {
        QStringList m_serialPortName;
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            m_serialPortName << info.portName();
            qDebug()<<"serialPortName:"<<info.portName();
        }
    }

            通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。 

            QSerialPort 负责具体的串口操作。选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。

    另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()

    每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。
    QT的串口类QSerialPort_FunkyFrog821951259的博客-CSDN博客

    4.根据串口名字,打开相应串口

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 背包问题代码实现小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    作为一名资深的IT专家,我可以给你一些关于简化代码的建议:

    1. 利用函数和类

    将一些常用的计算任务或数据处理操作封装成函数或类,这样可以避免代码的重复,提高代码的重用性。例如,对于一些重复的操作,可以将其封装成一个函数,以便于多次调用。

    1. 优化算法

    在数据分析和计算任务中,算法优化可以大大提高代码的性能和效率。比如,可以尝试使用更高效的算法和数据结构,以减少程序的运行时间。

    1. 使用适当的库和框架

    对于一些常用的计算和数据分析任务,可以使用相关的库和框架来完成,而不需要自己编写冗长的代码。例如,对于数据分析任务,可以使用Pandas库;对于机器学习任务,可以使用Scikit-learn库。

    1. 使用环境变量

    在编写程序时,可以使用环境变量来指定一些常用路径和配置信息,这样可以避免在程序中重复输入这些信息,减少代码的冗长。例如,可以使用os模块中的os.environ变量来获取和设置环境变量信息。

    总之,简化代码的关键在于合理利用函数、类、算法和库,同时使用环境变量等工具来提高代码的可读性和可维护性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

void MainWindow::surveyData()
{
QStringList headerList;
headerList << "     分数段" << "数学" <<"语文"<< "英语";
ui.treeWidget->setHeaderLabels(headerList);

for(int j=0;j<5;j++){  //j表示分数段的等级
    int math=0, chinese=0, english=0;
    QString level;
    if(j==0){
        level="60分以下";
    }else if(j==1){
        level="60-69分";
    }else if(j==2){
        level="70-79分";
    }else if(j==3){
        level="80-89分";
    }else{
        level="90分以上";
    }
    for (int i = 0; i < iniDataRowCount; i++)
    {
        QStandardItem *aItem= theModel->item(i, 1+j);
        int text = aItem->text().toInt();
        if (text < 60+j*10 && text >= 50+j*10)  //根据分数段等级计算分数范围
            math++;
        else if(text < 60+j*10 && text < 50+j*10)
            continue;
        else if(text >= 60+j*10 && text < 70+j*10)
            chinese++;
        else if(text >= 70+j*10 && text < 80+j*10)
            english++;
        else
            continue;
    }
    QString Math = QString::number(math);
    QString Chinese = QString::number(chinese);
    QString English = QString::number(english);
    
    QTreeWidgetItem* item = new QTreeWidgetItem(1001+j);
    item->setText(0, level);
    item->setText(1, Math);
    item->setText(2, Chinese);
    item->setText(3, English);
    ui.treeWidget->addTopLevelItem (item);
}
}

改动说明:

将创建树形控件的表头的代码放在最初部分。
使用循环来简化代码,避免重复编写相似的代码。用j表示分数段等级,通过计算分数范围来统计各科分数段的学生人数。
删除了一些冗余的变量,并对变量进行命名。