- 目的
编写一个可以生成数组的模版类,用于后续的排序算法测试。
模版类包含如下功能:
1)可以生成简单类型的特定长度,特定元素顺序的数组。
2)可以进行生成数据的展示。
3)提供外部可以获得内部生成数组的接口。 - 代码实现
模版类:
/************************************************************************************
*文件名:Test.h
*文件说明:进行数据测试的类,现阶段只针对数组排序。
*版本:1.0.0
*修改履历:lshuo 创建于2016-3-14
**************************************************************************************/
#ifndef TEST_H
#define TEST_H
#include<iostream>
#include <windows.h>
#include<ctime>
#define NULL 0
namespace Test{
enum ArrayType{
PositiveArray = 0,//正序数组
NegativeArray = 1,//逆序数组
RandomArray = 2//随机序列
};
template <class T,int nSize,ArrayType nArrayType>
class TestDataCreator
{
public:
TestDataCreator(){
Sleep(1000);//暂停一秒,否则产生相同的随机种子
srand((unsigned int)time(NULL));//产生一个随即种子
T Tbase = T();//产生一个初始基准值。
int nMod = nSize + 1;
if (nSize == 0) return;
switch (nArrayType){
case PositiveArray:
//正序数组,从前向后递增
for (int i = 0; i < nSize; i++){
if (i != 0){
pArray[i] = pArray[i - 1] + rand() % nMod;
}
else{
pArray[i] = Tbase + rand() % nMod;
}
}
break;
case NegativeArray:
//逆序数组从后向前递增
for (int i = nSize - 1; i >= 0; i--){
if (i != nSize - 1){
pArray[i] = pArray[i + 1] + rand() % nMod;
}
else{
pArray[i] = Tbase + rand() % nMod;
}
}
break;
case RandomArray:
//正序数组,从前向后递增
for (int i = 0; i < nSize; i++){
pArray[i] = Tbase + rand() % nMod;
}
break;
}
};
~TestDataCreator(){
};
private:
T pArray[nSize];
public:
//返回数组地址
T* GetArray(){
return pArray;
};
//返回数组长度
int GetSize(){
return nSize;
};
//展示数组内容
void ShowArray(){
using namespace std;
cout << "数组数据为:" << endl;
for (int i = 0; i < nSize; i++){
cout << pArray[i]<<" ";
}
cout << endl;
};
};
}
#endif
测试代码:
#include<iostream>
#include"Test.h"
int main()
{
using namespace Test;
using namespace std;
//测试升序数组
TestDataCreator<double, 10, PositiveArray> testPosArray = TestDataCreator<double, 10, PositiveArray>();
testPosArray.ShowArray();
//测试降序数组
TestDataCreator<double, 10, NegativeArray> testNegaArray = TestDataCreator<double, 10, NegativeArray>();
testNegaArray.ShowArray();
//测试随机数组
TestDataCreator<double, 10, RandomArray> testRandArray = TestDataCreator<double, 10, RandomArray>();
testRandArray.ShowArray();
cout << "外部输出测试" << endl;
double* pArray = testRandArray.GetArray();
for (int i = 0; i < testRandArray.GetSize(); i++)
{
cout << pArray[i] << " ";
}
int nWait;
cin >> nWait;
return 0;
}
结果输出:
3. 错误
1)将模版类的定义与实现分类导致出现无法找到外部标识符错误。
2)三种顺序数据测试的随机种子相同,导致产生的随机序列的数据相同。
3)数组和动态数组混淆,析构函数进行了delete[]
4)和其他语言混淆,使用If then与new对象的错误。
5)名称空间使用不熟悉,导致无法使用枚举类型。
4. 经验总结
1)编程时时刻注意规范,在学习中掌握规范。
2)挑战自己,拔高自己,自然会遇到更多问题,解决这些问题,自然得到更多,更深刻的经验。
3)学习一种语言的开始就要忘记自己以前的所有学习,不然学习中产生很多奇怪的干扰。等到熟悉后,再进行语言的区分揣摩。我只是一个C++初学者。
4)初始抽象的太厉害,没有基础,你只是初学者,必须在实现的基础上,然后抽象,然后重构。没有代码你重构什么。
5)有问题自己去学会解决,网上的资料很多。
5. 后续
1)进行数据排序算法的练习。
2)扩充该类,使之可以生成多维数组,后续练习多维数组相关算法时使用,当前该计划搁置,实现必须基于当前需求。