测试程序可以单独写,也可以做为模块整合在源程序中。
像我们熟知的debug语句,就是测试的最简单例子。在没有“断电查看”这一功能之前,为了监测程序每步执行后变量的结果,往往加入一些输出关键变量的语句。
例如以下程序:
#incldue<iostream>
using namespace std
#define DEBUG
int main(){
int n
#ifdef DEBUG
cout<<n<<endl
#endif
n = 3
cout<<n<<endl
return 0
}
此处DEBUG的作用是查看未初始化的变量n的值。通常会显示-89******00(0xcccccccc).
一般这样的语句还会出现在对指针进行 *** 作之后,用debug语句输出指针所指向内存的内容等。
这只是测试程序的一个功能。正如前面提到的,测试程序应该提供数据以检测程序的健壮性和安全性,以及用海量数据对执行效率进行检验等。
测试数据的选择有以下几个要点,分别检测程序的不同特性:
@ 尽可能包括输入集合内所有可能出现的元素,观察程序能否给出正确结果。(Authenticity)
比如:有一个程序输入给定迷宫平面图,要测试出最短路径长度。那么输入的迷宫应该包括各种可能:有通路的和没有通路的,有死胡同的和没有的,有回路的(避免搜索时出现死循环),出口在左上角,右上角的等,都要考虑进去。程序应该对每种情况都做出正确的反应。
@ 注意测试极端情况以及临界情况。(Security)
这是为了检测程序的健壮性,用户不可避免地会做出不合法的举动,程序需要有足够的防护强度来应对这些意外。
比如:如果编写了一个简易的计算器,那么一定要检查除数为0的情况;一个程序的功能是将一片文档的内容链接到另一个文档内,那么一定要检查自己链接自己的情况;等等。
@ 注意输入数据的规模以及随机性。(Efficiency)
衡量程序效率的标准应该考虑大规模数据下的表现。数据需要有足够的随机性以避免意外情况。
比如:比较几种不同排序算法的效率时,选用的数据应该是随机顺序的。在顺序数据的情况下:冒泡算法显然比快排还快,但这是偶然情况。
@ 如果有可能,还可以检测程序的通用性及扩展性(Versatility &Compatibility)
好的程序应该易于扩展,可利用价值高。大多数软件都在不停的打补丁,而不是推倒重写。
测试程序一般无法直接检测这两种特性。然而,测试中出现的错误有时可以帮助我们提升程序的质量。
我曾经写过一个类似于美图秀秀的图像处理程序,C++写的,相当粗糙。输入还要用命令行控制。当时我用各种图片进行了测试,包括纯色的,有明显背景色调的,以及完全混乱的噪声点。前面的图片表现都很好,但处理最后一张图片时程序抛出了异常——经过检验发现,我的处理程序是基于24位图片写的,而最后一张图片是32位的。类似的情况还有32位系统和64位系统下程序运行的问题等,在此就不赘述了。
要编写测试程序,一般分为两个模块:数据生成和结果检测。
测试程序的第一部分将生成的数据写入一个文件,让程序读取文件并运行后,再将结果写入另一个文件,之后由测试程序的第二部分比对输出文件和标准答案。
对于检测健壮性的测试程序,只需有第一部分即可,待检测程序在处理数据时如果发生异常,就根据结果作相应的修改。
测试效率的程序,可以在待检程序内加入计时模块。具体写法如下:
#include<ctime>
#define CHECK_TIME
int main(){
//....intput
#ifdef CHECK_TIME
clock t start = clock()
#endif
#ifdef CHECK_TIME
cout <<"Execution Time: " <<clock() - start <<" ms." <<endl
#endif
嗯,就是这么多啦,希望对你有帮助!
这是一款图书管理系统 但是我没有写排序 没有写归还 因为归还和借出都差不多 里面有图书删除 *** 作 学生查找 图书查找 学生输出 图书输出 图书借出 插入图书 插入学生 最多借三本书 没有对把数据格式化写入文件 而是块读入 读出 插入学生和图书 约定学生 图书看、号不为0 输入图书label 和 stu_num 为0时就结束插入 插入全部插在文件末尾 程序很简单 也是随便写的 不过我觉得接近我们这种初学者 以下附上代码#ifndef B_MANAGEMENT_H
#define B_MANAGEMENT_H
#include<stdio.h>
#define MAX_BO 3
#define LENTH_SB sizeof(sb_book)
#define LENTH_ST sizeof(st_book)
#define sb_book struct b
#define st_book struct s
//声明学生的数据结构
struct s
{
char name[20]
int num_student
char book[MAX_BO][30]
int num_book
}
//声明图书的数据结构
struct b
{
long book_label
char book_name[30]
int book_num
int book_remain
sb_book* next
}
//声明图书的 *** 作
sb_book* search_book(const char*,FILE*,sb_book*)//用线性存储结构存储文件数据
void delete_book()
void insert_book(sb_book*)
//声明学生的 *** 作
st_book* search_student(int,FILE *p,st_book*)
void insert_student(st_book*)
void borrow_book(int,const char*,sb_book*,st_book*,FILE*,FILE*)
#endif
void main()
{
delete_book()
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void insert_book(sb_book* pb_book)
{
FILE* fp=NULL
fp=fopen("D:\\book.txt","a+")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
if(fwrite(pb_book,LENTH_SB,1,fp)==0)
{
printf("failed to write string to book.txt")
exit(0)
}
fclose(fp)
}
#include"bk_management.h"
#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
void delete_book()
{
long delete_label
FILE* fp=NULL
sb_book *p1,*p2,*head=NULL
printf("please input book_label:")
scanf("%ld",&delete_label)
fp=fopen("D:\\book.txt","r")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
head=p1=p2=(sb_book*)malloc(LENTH_SB)
fread(p1,LENTH_SB,1,fp)
if(feof(fp)) exit(0)
//将文件中的数据读入内存形成链表,head为链表首指针
while(!feof(fp))
{
p2=p1
p1=(sb_book*)malloc(LENTH_SB)
fread(p1,LENTH_SB,1,fp)
p2->next=p1
}
p1->next=NULL
fclose(fp)
//删除指定的书籍的数据块
p1=p2=head
while(p1->book_label!=delete_label&&p1->next!=NULL)
{
p2=p1
p1=p1->next
}
if(p1->book_label==delete_label)
{
if(p1==head)
head=p1->next
else
p2->next=p1->next
}
else
{
printf("no book you want to delete")
}
//将数据块写会文件
fp=fopen("D:\\book.txt","w")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
while(head->next!=NULL)
{
fwrite(head,LENTH_SB,1,fp)
head=head->next
}
fclose(fp)
}
#include<stdio.h>
#include"bk_management.h"
void borrow_book(int num_student,const char* book_name,sb_book book[1000],st_book stu[1000],FILE* fp_sb,FILE* fp_st)
{
extern sum_book
extern sum_student
sb_book* book_sb
st_book* stu_st
stu_st=search_student(num_student,fp_st,stu)
if(stu_st->num_book<MAX_BO)
{
book_sb=search_book(book_name,fp_sb,book)
(book_sb->book_remain)--
strcpy(stu_st->book[stu_st->num_book],book_name)
(stu_st->num_book)++
fseek(fp_sb,sum_book*LENTH_SB,0)
fwrite(book_sb,LENTH_SB,1,fp_sb)
fseek(fp_st,sum_student*LENTH_ST,0)
fwrite(stu_st,LENTH_ST,1,fp_st)
}
else printf("you can not borrow book!!!")
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void main()
{
FILE *fp_sb=NULL,*fp_st=NULL
int stu_num
char _book[30]
sb_book book[1000]
st_book stu[1000]
fp_sb=fopen("D:\\book.txt","r+")
fp_st=fopen("D:\\stu.txt","r+")
if(fp_sb==NULL || fp_st==NULL)
{
printf("fail to open file")
exit(0)
}
printf("Please input student number:")
scanf("%d",&stu_num)
getchar()
printf("please input book:")
gets(_book)
borrow_book(stu_num,_book,book,stu,fp_sb,fp_st)
getch()
fclose(fp_sb)
fclose(fp_st)
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void insert_student(st_book* pt_book)
{
FILE* fp=NULL
fp=fopen("D:\\stu.txt","a+")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
if(fwrite(pt_book,LENTH_ST,1,fp)==0)
{
printf("failed to write string to book.txt")
exit(0)
}
fclose(fp)
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void main()
{
st_book stu[1000]
int i,j
FILE* fp=NULL
fp=fopen("D:\\stu.txt","r")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
for(i=0i<1000i++)
{
fread(&stu[i],LENTH_ST,1,fp)
if(feof(fp)) break
printf("%8d %-20s %8d\n",stu[i].num_student,stu[i].name,stu[i].num_book)
for(j=0j<stu[i].num_bookj++)
printf("%-30s, ",stu[i].book[j])
printf("\n")
}
getch()
fclose(fp)
}
#include<stdio.h>
#include"bk_management.h"
#include<stdlib.h>
int sum_student
st_book* search_student(int num_stu,FILE* fp,st_book stu[1000])
{
int i
for(i=0(!feof(fp))&&i<1000i++)
{
fread(&stu[i],LENTH_ST,1,fp)
sum_student++
}
for(i=0num_stu!=stu[i].num_student&&i<sum_studenti++)
sum_student=i
if(num_stu==stu[i].num_student)
return &stu[i]
else
printf("no student you search")
return NULL
}
#include<stdio.h>
#include"bk_management.h"
#include<stdlib.h>
void main()
{
FILE* fp=NULL
st_book _stu[1000]
int num_stu
st_book* stu
int j
fp=fopen("D:\\stu.txt","r")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
printf("please input student number:")
scanf("%d",&num_stu)
stu=search_student(num_stu,fp,_stu)
if(stu!=NULL)
{
printf("%8d %-20s %8d\n",stu->num_student,stu->name,stu->num_book)
for(j=0j<stu->num_bookj++)
printf("%-30s, ",stu->book[j])
printf("\n")
}
fclose(fp)
getch()
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void main()
{
sb_book* p
FILE* fp=NULL
fp=fopen("D:\\book.txt","r")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
while(1)
{
p=(sb_book*)malloc(LENTH_SB)
fread(p,LENTH_SB,1,fp)
if(feof(fp)) break
printf("%8d %-30s %-3d %-3d\n",p->book_label,p->book_name,p->book_num,p->book_remain)
}
fclose(fp)
getch()
}
#include "bk_management.h"
#include<malloc.h>
void main()
{
sb_book *pb
while(1)
{
pb=(sb_book*)malloc(LENTH_SB)
printf("please input book_label:")
scanf("%ld",&pb->book_label)
getchar()
printf("please input book_name:")
gets(pb->book_name)
printf("please input book_num:")
scanf("%d",&pb->book_num)
pb->book_remain=pb->book_num
if(pb->book_label==0) break
insert_book(pb)
}
}
#include "bk_management.h"
#include<malloc.h>
void main()
{
st_book* pt
while(1)
{
pt=(st_book*)malloc(LENTH_ST)
printf("please input num_student:")
scanf("%d",&pt->num_student)
getchar()
printf("please input name:")
gets(pt->name)
strcpy(pt->book[0],"0")
strcpy(pt->book[1],"0")
strcpy(pt->book[2],"0")
pt->num_book=0
if(pt->num_student==0) break
insert_student(pt)
}
}
#include<stdio.h>
#include"bk_management.h"
#include<stdlib.h>
int sum_book
sb_book* search_book(const char* ptr,FILE* fp,sb_book book[1000])
{
int i
for(i=0(!feof(fp))&&i<1000i++)
{
fread(&book[i],LENTH_SB,1,fp)
sum_book++
}
for(i=0strcmp(&book[i].book_name,ptr)&&i<sum_booki++)
sum_book=i
if(!strcmp(&book[i].book_name,ptr))
return &book[i]
else
printf("no book you search")
return NULL
}
#include<stdio.h>
#include<stdlib.h>
#include"bk_management.h"
void main()
{
FILE* fp=NULL
char book_name[30]
sb_book* book
sb_book _book[1000]
fp=fopen("D:\\book.txt","r")
if(fp==NULL)
{
printf("can not open file")
exit(0)
}
printf("please input book_name:")
gets(book_name)
book=search_book(book_name,fp,_book)
if(book!=NULL)
printf("%8d %-30s %-3d %-3d\n",book->book_label,book->book_name,book->book_num,book->book_remain)
fclose(fp)
getch()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)