一个冒泡排序的项目

项目背景:

现在是大三下半学期,每门课程都来到了课程设计的阶段。这个项目是为了应对软件质量保证这门课程而编写的,我选择的选题是:使用冒泡排序算法对含有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);
       }
    }
}

项目最终运行结果:

### 回答1: 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 下面是在 Scratch 中实现冒泡排序的示例代码: ``` 创建一个列表叫做 "列表",并将要排序的数字放入该列表 重复执行以下操作 设置变量 "交换" 为 "否" 对于列表中的每个元素 "i" 从第一个到倒数第二个 如果第 "i" 个元素大于第 "i+1" 个元素 交换第 "i" 个元素和第 "i+1" 个元素 设置变量 "交换" 为 "是" 如果变量 "交换" 的值为 "否",则退出循环 ``` 这段代码会将列表中的元素按照升序排序。如果要实现降序排序,只需要将判断语句中的 ">" 改为 "<" 即可。 ### 回答2: 冒泡排序是一种简单且常用的排序算法,其基本思想是重复地两两比较相邻元素,并根据大小交换位置,直到整个数组有序为止。 在Scratch中,我们可以使用变量来表示待排序的数组,然后使用嵌套的循环结构来实现冒泡排序算法。 首先,我们创建一个列表变量list,其中存储我们要排序的一组数字。同时,创建一个变量n,表示数组的长度。 然后,在外部循环中,从第一个元素到倒数第二个元素进行迭代。在内部循环中,从第一个元素到未排序部分的最后一个元素进行迭代。 在每一次内部循环中,我们判断当前元素是否大于它后面的元素。如果是,则交换这两个元素的位置。 最后,当所有的元素都有序排列时,排序完成。我们可以在外部循环结束后输出排序后的数组。 具体的Scratch程序如下: ``` 当 flag=1 定义变量 list 为 [6, 3, 8, 2, 9, 1] 定义变量 n 为 (列表 list 的项目数) 定义变量 i 为 0 当 (i < (n-1)) 成立 定义变量 j 为 0 当 (j < (n-i-1)) 成立 如果 (列表 list 的第 j 项目 > 列表 list 的第 (j+1) 项目) 成立 交换列表 list 的第 j 和第 (j+1) 项目 如果 j 设置为 (j+1) 如果 i 设置为 (i+1) 设置 flag 为 0 当 flag=1 将列表 list 输出 ``` 以上是使用Scratch编写的冒泡排序程序,将待排序的数字放入列表变量中即可执行排序。注意,在Scratch中变量的命名可以根据实际需要进行修改。 ### 回答3: Scratch是一种图形化编程语言,可以通过拖拽和组合代码方块来实现各种功能。下面是一个用Scratch编写冒泡排序算法的方法。 首先,我们需要创建一个列表,用来存储待排序的数字。可以使用Scratch中的列表方块来创建一个包含一些随机数的列表。 然后,我们创建一个变量来表示列表中的元素数量,并设置一个循环来执行冒泡排序算法。在每次循环开始时,我们需要将一个变量重置为“假”,用于判断列表是否已经完成排序。 在循环中,我们使用另一个循环来比较相邻的两个元素,并将较大的元素向后交换。同时,我们设置之前提到的变量为“真”,表示列表还需要继续排序。 在内层循环结束后,我们判断之前的变量是否为“真”。如果为“假”,则表示列表已经完成排序,并跳出外层循环。否则,我们继续执行下一轮冒泡排序。 最后,我们可以在Scratch舞台上显示已排序的列表,以便查看结果。 这只是一个简单的冒泡排序实现示例,希望可以帮助到你。如果有需要,请参考Scratch的官方文档和教程,以了解更详细的信息和功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值