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