风云三号卫星地面应用系统产品质量检验系统(QCS)业务软件开发项目
代码编写实例
QCS项目组 20100804
变更
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
表
序号
变更时间
变更人
变更内容
1 STL示例
1.#include
//STL通用算法
2.#include //定义运算函数(代替运算符)
目前在该头文件中可能要用到的方法包括:针对数据块的排序、查找、对集合中的每个元素进行操作(如数组)for_each、移除remove(remove_if)等。具体实例如下:
【sort用法】:
int nvalue[100]; //假设里面放的是-54至55的无序数据
//按照默认的方式进行排序(从小到大)
sort(nvalue, nvalue + 100);
//按照从大到小的方式进行排序
sort(nvalue, nvalue + 100, greater());
//按照自定义的方式进行排序,假设按照绝对值的大小从小到大排序
bool FabsSort(int nElem1, int nElem2)
{
return fabs(nElem1) > fabs(nElem2) ? false : true;
//从大到小
//return fabs(nElem1) > fabs(nElem2) ? true : false;
}
sort(nvalue, nvalue + 100, FabsSort());
【find用法】
int nvalue[100];
int *p = NULL;
//查找数组中元素值为7的pos
p = find(nvalue, nvalue + 100, 7);
int n = p – nvalue; //n即为7在数组中的位置
【for_each用法】
如对L0仪器状态监测对获取到的数据集进行物理量转换操作
//定义一个类对象,进行物理量转换操作,当然也可以定义一个仿函数实现类似的功能
class CLogic2Phy
{
public:
CLogic2Phy();
void operator()(int &nValue)
{
//假设转换
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
为phy = logic * 2 – 1;
nValue = nValue * 2 – 1;
}
}
int nDataSet[100]; //假设数据集中有100个数据,
//定义一个数组保存数据集中的数据
伪码:对nDataSet数组赋值;
for_each(nDataSet, nDataSet + 100, CLogic2Phy());
经过for_each之后,nDataSet中保存的值全部改变了
【remove_if用法】
假设要对提取出来的数据集进行求平均值的操作,要先将数据集中的填充值剔除掉,然后计算剩下来的有效值的平均值:
//定义一个类对象
template
class CCheckValue
{
public:
CCheckValue(const T1 &Value)
{
m_Value = Value;
}
bool operator()(const T1 &Value) const
{
return m_Value == Value;
}
private:
T1 m_Value;
};
int nDataSet[100]; //假设数据集中有100个数据,
//定义一个数组保存数据集中的数据
伪码:对nDataSet数组赋值;
//假设填充值为50
int *p = NULL;
p = remove_if(nDataSet, nDataSet + 100, CCheckValue(50));
//经过remove_if之后,所有值为50的元素已经移除到指针p之后了
CMathAlgo oMathAlgo;
double dbAverageNum = 0.0;
dbAverageNum = oMathAlgo. Average(nDataSet, p);
【关于list、map、vector的实际用法】
对list容器使用remove_if和sort算法时严禁使用通用算法中的remove_if和sort,而应该使用list的成员方法remove_if和sort。
对vector和map容器使用erase算法时使用严禁使用通用算法中的erase,而应该使用vector和map的成员方法erase。
【关于
模板
个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载
的实际用法】
template
class CMathAlgo
{
public:
CMathAlgo();
virtual ~CMathAlgo();
InputIterator Max( T itrFirst, T itrEnd) //最大值
{
return max_element(itrFirst, itrEnd);
}
//模板类中再定义一个模板函数
template
InputIterator Max(InputIterator itrFirst,
InputIterator itrEnd, BinaryPredicate Comp) //最大值
{
return max_element(itrFirst, itrEnd, Comp);
}
}
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
CMathAlgo oMathAlgo;
int a[3] = {-11, 23, -25};
double dbTemp = 0.0;
dbTemp = *(oMathAlgo1.Max(b, b+3));
dbTemp = *(oMathAlgo1.Max(b, b+3, mod_lesser));
2 数据类型初始化
【1.数组的初始化】
数组的初始化分以下三种形式:
char chArr[] = “hello world!”
char *pArr = new char [100];
if (NULL == pArr)
{
//异常处理部分
}
memset(pArr, 0, 100);
char chArr[100];
memset(chArr, 0, 100);
【2.结构初始化】
结构体的初始化必须在构造函数中完成,严禁使用memset对结构体进行操作
const int MAX_NAME_LENTH = 10;
const int MAX_SEX_LENTH = 10;
typedef struct stStudent
{
int nNum; //学号
char chName[MAX_NAME_LENTH]; //姓名
char chSex[MAX_SEX_LENTH]; //性别
stStudent()
{
nNum = 0;
memset(chName, 0, MAX_NAME_LENTH);
memset(chSex, 0, MAX_SEX_LENTH);
}
}ST_STUDENT;
【3.枚举的初始化】
枚举常量必须以0开始,并按序递增
typedef enum enColor
{
RED = 0,
ORANGE,
YELLOW,
……
}EN_COLOR;
严禁使用以下方式自己定义枚举常量的值
typedef enum enColor
{
RED = 3,
ORANGE = 5,
YELLOW = 2,
……
}EN_COLOR;
【4.指针的初始化】
int *p;
p = NULL;
char *pArr = “hello, world!”;
3 内存的申请方法
【1.栈内存】
严禁申请大数组(大于1M),以防止栈溢出,当数组过大时采用申请堆内存的方式
char chArr[1024 * 1024 * 20]; //在栈中申请20M的内存,容易导致溢出,禁止使用
char chArr[1024 * 20]; //在栈中申请20K的内存,可以使用
memset(chArr, 0, 1024 * 20); //必须立即进行初始化
【2.堆内存】
//以下为自己申请内存合法的使用方式
步骤1:对指针本身置空
char *pArr = NULL;
步骤2:申请堆内存
pArr = new char [1024 * 1024 * 20];
步骤3:内存是否申请成功,进行异常调用处理
assert (NULL != pArr);
步骤4:初始化内存
memset(pArr, 0, 1024 * 1024 * 20);
步骤5:使用内存
DoSomething();
步骤6:释放内存
delete [] pArr; //注意和new的方式配对
步骤7:指针置空
pArr = NULL;
//自己封装的内存申请方法
char * GetMemory(char * &pOut, int nSize) //自己定义内存申请函数
{
pOut = new char [nSize];
assert(NULL != pOut);
memset(pOut, 0, nSize);
DoSomething();
return pOut;
}
void FreeMemory(char *p) //同时要自己定义一个内存释放的函数
{
if (NULL == p)
{
return;
}
delete [] p;
return;
}
char *pMem = NULL;
GetMemory(pMem, 1024);
DoSomething();
FreeMemory(pMem); //合法
char *pMem = NULL;
GetMemory(pMem, 1024);
DoSomething();
delete [] pMem; //非法,严禁此种使用方式,虽然不会出错
//使用OCILIB的方式
OCI_Initialize(); //OCILIB库初始化
DoSomething();
OCI_Cleanup(); //OCILIB库清理
//使用xerces的方式
XMLString::transcode();
DoSomething();
XMLString::release();
1 类的声明方法
【尽量不要使用父子继承,而使用包含继承】
class CBase
{
public:
CBase(); //构造
//各种方法
virtual ~CBase(); //析构
};
class CSub : public CBase //不要这样使用继承
{
public:
CSub();
//各种方法
~ CSub();
};
class CSub
{
public:
CSub();
//各种方法
~ CSub();
CBase oBase; //使用包含继承
};
2 附:关于内存使用的思考
【内存使用常见错误1】
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
【内存使用常见错误2】
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:可能是乱码。
因为GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原
现的内容已经被清除,新内容不可知。
【内存使用常见错误3】
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏
【内存使用常见错误4】
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str 成为野指针,
if(str != NULL)语句不起作用。