一个冒泡排序的项目

项目背景:

现在是大三下半学期,每门课程都来到了课程设计的阶段。这个项目是为了应对软件质量保证这门课程而编写的,我选择的选题是:使用冒泡排序算法对含有50个数的数组进行排序的程序实现方法并使用边界值测试法来测试冒泡排序的正确性

项目技术:

        C++编程语言、QT框架

项目核心代码:

void BSort::BubbleSort(QVector<float> &data)
{
    for (int i=0;i<data.size()-1;i++) {
        for (int j=0;j<data.size()-1-i;j++) {
            if(data[j]>data[j+1]){
                float temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
        }
    }
}
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRegularExpression>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->confirm,SIGNAL(clicked()),this,SLOT(on_confirm_clicked()));
    connect(ui->cancel,SIGNAL(clicked()),this,SLOT(on_cancel_clicked()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_confirm_clicked()
{

 BSort sort;
QVector<float> data;
QString num1 =ui->num1->text();

//获取以num开头的QLineEdit控件中的数据,并转换为float数据类型
for (int i=1;i<=50;i++) {
    QString Name = "num" +QString::number(i);
    QLineEdit *linEdit = findChild<QLineEdit*>(Name);
    if(linEdit){
       QString text = linEdit->text();
       if(!text.isEmpty()){
           float element = text.toUtf8().toFloat();
           data.push_back(element);
       }
    }
}

//冒泡排序之前
 QString Before_text;
 for(float number:data){
     Before_text += QString::number(number)+" ";
 }
ui->Before_bubble_sort->setPlainText(Before_text);
ui->Before_bubble_sort->show();
 //冒泡排序:
 sort.BubbleSort(data);
//冒泡排序之后
 QString text1;
  for(float number:data){
     text1 += QString::number(number)+" ";
 }

 ui->After_bubble_sort->setPlainText(text1);
 ui->After_bubble_sort->show();
}

void Widget::on_cancel_clicked()
{
    QWidget *window = QApplication::activeWindow();
    QList<QLineEdit*> lineEdits = window->findChildren<QLineEdit*>();
      foreach (QLineEdit *lineEdit, lineEdits) {
          lineEdit->clear();
    }
}

项目总结:

对技术进行了印象加深,并从中学会新的使用方式,这次项目我学会了Vector<>数组、对Vector数组进行冒泡排序、批量获取QLineEdit控件中的数据,这些都是非常有意思的一些开拓使用,接下来我将对我这次项目学习到的新知识进行总结与深究。

Vector数组:

概述:Vector是一个可变长的动态数组,它提供了方便的操作和快速的随机访问,是C++中最常见的数据结构之一。

1、vector数组的创建与初始化:

//创建一个空的vector数组:
std::vector<int> myVector;	//创建一个int类型的vector数组
//创建一个指定大小并初始化的vector数组:
std::vector<int> myVector(10);	//创建一个大小为10的数组,初始值为0
std::vector<int> myVector(10,1);	//创建一个大小为10的数组,初始值为1
//将一个数组或另一个vector复制到新的vector中
//第一种使用等于号的方式复制:
int arr[] = {1,2,3,4};
std::vector<int> myVector(arr,arr + sizeof(arr)/sizeof(int));
myVector = arr;
//如果两个数组都是Vector数组,可以使用以下方式
std::vector<int> myVector2(myVector);

2、访问元素:

可以使用下标操作符'[ ]'或‘at( )’方法访问vector中的元素。下标从0开始计数,因此第一个元素的下标为0,最后一个元素的下标为‘size( )-1’。

【示例】:

std::vector<int> myVector(5,10);//长度为5,初始化为10的数组
myVector[0] = 1;	//修改第一个元素为1
myVector.at(1) =2;	//修改第二个元素为2
int value = myVector[2];//将myVector数组的第三个元素赋值给value

3、增加和删除元素:

push_back()方法将一个元素添加到vector的末尾。

pop_back()方法从vector的末尾删除一个元素。

insert()方法在vector的任意位置插入一个元素。

erase()方法删除vector中一个或者多个元素。

【示例】:

std::vector<int> myVector;
myVector.push_back(1); // 添加一个元素到末尾
myVector.push_back(2); // 添加另一个元素到末尾
myVector.pop_back(); // 删除末尾的元素
myVector.insert(myVector.begin() + 1, 3); // 在第二个位置插入一个元素3
myVector.erase(myVector.begin() + 2); // 删除第三个元素
myVector.erase(myVector.begin(), myVector.begin() + 2); // 删除前两个元素

4、其它常用方法:

vector是一个非常好玩的数组,它还提供了很多其它的方法来帮助你进行元素访问和修改,以及数组的重置和调整大小。

std::vector<int> myVector(5, 10); // 创建一个大小为5的数组,初始值都为10
int* ptr = myVector.data(); // 获取底层的C数组指针
myVector.size(); // 返回vector中元素的个数
myVector.empty(); // 检查vector是否为空,如果为空则返回true
myVector.clear(); // 清空vector中的所有元素
myVector.resize(10); // 调整vector的大小为10,多出的部分将被初始化为0
myVector.reserve(20); // 预留空间以容纳至少20个元素,可以提高插入元素的效率

5、迭代器遍历:

vector可以使用迭代器来遍历元素。迭代器类似于指针,可以指向vector中的元素,并用于遍历、访问和修改元素。

【示例】:

std::vector<int> myVector(5);
myVector[0] = 1;
myVector[1] = 2;
myVector[2] = 3;
myVector[3] = 4;
myVector[4] = 5;

// 使用迭代器遍历
for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
    int value = *it;
    // 在此处执行操作
}

// 使用范围循环遍历(C++11及以上)
for (int value : myVector) {
    // 在此处执行操作
}

对Vector数组进行冒泡排序:

我写了一个BubbleSort类专门对Vector数组进行冒泡排序。这里面我们来聊聊冒泡排序这个久违老朋友吧。

冒泡排序:是一种简单的排序算法,通过相邻元素之间的比较和交换 来将较大的元素逐步排到数组末尾。是基于比较的排序算法。

冒泡排序的详细步骤:

1、从数组的第一个元素开始,依次比较相邻的两个元素。

2、如果前一个元素大于后一个元素,则交换它们的位置。

3、继续向后比较交换,直到将最大的元素交换到数组末尾。

4、重复执行以上步骤,每次比较次数减一,直到所有元素都被排序。

冒泡排序的优缺点:

缺点:是一种简单但是效率较低的排序算法,特别是对于大型数据集合来说。

优点:实现简单、代码易于理解。

比冒泡排序更高效的排序算法:

1、快速算法(Quick Sort)

2、归并排序(Merge Sort)

void BSort::BubbleSort(QVector<float> &data)
{
    for (int i=0;i<data.size()-1;i++) {
        for (int j=0;j<data.size()-1-i;j++) {
            if(data[j]>data[j+1]){
                float temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
        }
    }
}

批量获取QLineEdit控件中的数据:

在这个项目中我第一次见到了批量获取QLineEdit控件中的数据这个问题,为此琢磨很久,查阅资料,总结并思考。这真是一个很美丽的问题,感觉在以后的工作中也很实用。

详细步骤:

1、在ui设计界面对每个QLineEdit进行以num开头的1~50的数字为结尾的命名。

2、使用for循环将num与这50个数字拼装起来得到每个QLineEdit的完整命名,并赋值给了name变量。

3、使用findChild<>()方法来寻找QLineEdit子集中命名等于name变量中的临时数据的QLineEdit控件。

4、通过if判断lineEdit不为空,然后通过text()方法取出控件中的数据。

5、通过if判断QLineEdit控件中的数据不为空,然后使用toFloat()方法转换成浮点型的数据。

6、通过vector的push_back()方法将数据存入vector数组中去。 

//获取以num开头的QLineEdit控件中的数据,并转换为float数据类型
for (int i=1;i<=50;i++) {
    QString Name = "num" +QString::number(i);
    QLineEdit *linEdit = findChild<QLineEdit*>(Name);
    if(linEdit){
       QString text = linEdit->text();
       if(!text.isEmpty()){
           float element = text.toUtf8().toFloat();
           data.push_back(element);
       }
    }
}

项目最终运行结果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值