数据结构课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构课程设计全”。
数据结构课程设计
利用栈求表达式的值
2013级计算机科学与技术系
数据结构课程设计
目 录
目 录..................................................................................................................................2 摘要......................................................................................................................................3 1 引言..................................................................................................................................4 1.1问题的提出.............................................................................................................4 1.2 任务与分析............................................................................................................4 2 程序的主要功能................................................................................................................5 2.1 程序功能设计.........................................................................................................5 2.2 附加功能................................................................................................................5 2.3功能函数.................................................................................................................5 3 程序运行平台....................................................................................................................6 4总体设计............................................................................................................................6 4.1 方案总体设计.........................................................................................................6 4.2程序流程图.............................................................................................................7 5程序类的说明....................................................................................................................8 5.1主要函数.................................................................................................................8 5.2 函数间的调用关系..................................................................................................9 5.2.1函数调用流程................................................................................................9 5.2.2函数调用说明................................................................................................9 6系统测试分析..................................................................................................................10 7程序源代码......................................................................................................................13 8心得体会..........................................................................................................................25 9参考文献..........................................................................................................................25
数据结构课程设计
摘要
随着计算机科学与技术的迅猛发展,计算机应用层面的不断普及,利用计算机及相关的计算机编程技术实现对现实生活中一些问题的处理,可以简化生活中的某些问题,给人民生活带来方便。数据结构是一门基于数据类型处理的学科,利用数据结构相关知识处理表达式的合法性及表达式的处理结果可以简化计算、判断表达式。
此软件可以实现判断表达式的合法性,如果表达式合法则进行计算,如果不合法则提醒用户表达式错误,请用户重新输入。在合法的基础上会对表达式进行计算,在计算完成的同时会提醒用户是否继续进行计算,不进行计算则进入是否保存界面。用户可以保存多次记录,并可以随时查看,也可以清楚全部记录,根据用户需求而定。
关键词:表达式的值,数据结构,栈;
数据结构课程设计引言
1.1问题的提出
数据结构是一门理论性很强的学科、思维抽象、难度较大的课程,是专业课和基础课之间的桥梁。该课程的先行课是计算机基础,c语言程序设计,离散数学等,后续课程有操作系统,数据库原理,软件工程等。通过本门课程的学习,我们应该能够透彻的理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力,而且该课程的研究方法对我们学生在校及工作学习都是很有帮助,意义重大。数据结构是计算机科学与技术的一门专门的核心专业基础课,在该专业起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力都有着极为重要的作用。学好数据结构的最终目的是为了获得新的解决问题的办法。对于现实世界的问题,应该能抽象出一个适当的数学模型,该数学模型在计算机内部的数据结构表示,然后设计一个解决此数学模型的算法,在进行程序编写调试,最后得到问题的解答。
1.2 任务与分析
基于上述数据结构的分析,我们开设了数据结构课程设计这门课。针对这门课程的特点,着重培养我们的动手实践能力,我们的任务是基于visual c++ 6.0运行平台设计出一套完整的c语言算法,解决表达是求值问题。表达式的求值分为几个阶段:首先判断表达式是否正确,针对出现的符号是否是合法字符以及是否是字符重复出现进行判断,此过程运用数据结构中栈的基本原理。然后对于检查过的表达式进行计算,运用数学中的先乘后除再加减,有括号先计算括号的运算规则进行四则运算。最后,在计算完整的基础上询问是否保存本次运行记录,根据相应提示即可进行操作。利用栈求表达式的值,虽然是很简单的程序算法,但是在编写过程中可能也会遇到很多问题,我们组的成员也会通过各种途径进行排难,达到成功运行并解决问题的办法。
数据结构课程设计程序的主要功能
2.1 程序功能设计
编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。主要功能描述如下:
1、从键盘上输入表达式,以“=” 号结束表达式。
2、分析该表达式是否合法:
(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。
(3)若是其它字符,则返回错误信息。
3、若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。
2.2 附加功能
1、规定表达式的合法性
2、小数计算
3、计算记录的保存与查看
4、其他
(1)规定表达式的合法性,括号配对,不能出现“6++3”、“6+-3”等符号重叠的情况。
(2)表达式开头只能是数字或“(”,表达式中只能有一个“=”。
2.3功能函数
程序中主要包含下面几个功能函数: void initstack():初始化堆栈 int make_str():语法检查并计算
int push_num(double num):将操作数压入堆栈 char procede(char top,char code):处理操作码
数据结构课程设计
int change_opnd(int operate):将字符型操作码转换成优先级 int change_opnd(char code):将操作码压入堆栈 char pop_opnd(opnd *op):将操作码弹出堆栈 int caculate(int cur_opnd):简单计算+,-,*,/ double pop_num(num *nu):弹出操作数程序运行平台
硬件系统:Intel(R)Core(TM)i3-3240 CPU @ 3.40GHz 3.39GHz, 4GB内存,500GB硬盘。
软件系统:windows xp操作系统,visual c++ 6.0 编译软件。
4总体设计
4.1 方案总体设计
(1)定义一个expreion全局表达式结构体expr[1000]存放计算过的表达式(expstr[MAXSIZE])和计算结果(result)、一个计量器(i)、一个表达式字符串、一个操作码栈和一个操作数栈;
(2)把表达式字符串从头到尾逐一扫描,将输入的表达式进行语法检查;(3)第一个字符只能是数字或“(”,最重一个字符只能是“=”;(4)表达式括号必须配对,中间不能出现“=”;
(5)在“(”前面只能是“+、-、*、/、(”,在“+、-、*、/、=、)”前面只能是数字或“)”;
(6)把表达式字符串从头到尾逐一扫描,直到表达式扫描完毕,操作码栈为空;
(7)把字符根据运算优先级别选择操作;
(8)把表达式中的数值部分字符串转成数值压入操作数栈;
(9)是“(”直接压入到操作码栈,级别比操作码栈顶元素高的,把运算符压入操作码栈;
数据结构课程设计
(10)级别比操作码栈低的,弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算后再压入操作数栈;
(11)是“)”,若操作码栈顶是“(”,把弹出操作码栈顶元素,否则“)”视为级别最低的元素,重复7;
(12)最后计算出结果并将其存放在expr[i],计量器加1;(13)重复计算后,将结果保存在文件里,并统计计算次数;(14)查看多次计算结果,以表形式输出;(15)查看本次计算记录,以表形式输出;(16)清除计算记录,重新计算。
4.2程序流程图
main Exit()start()load()ClearFile result()check()
Start2()save()7
数据结构课程设计
5程序类的说明
5.1主要函数
void start(opnd *op,num *nu)//程序主菜单
void start2(opnd *op,num *nu)//第二层计算选择,子菜单 void load()//显示所有计算记录 void save()//保存计算结果 void check()//显示本次计算结果 void result(opnd *op,num *nu)//计算结果
double caculate(opnd *op,num *nu)//简单计算+,-,*,/ 表达式处理函数: int make_str()//语法检查
double change_num(char str[])//数字字符串转成double型数字 char procede(char top,char code)//处理操作码,判断栈的操作 int change_opnd(char code)//字符型操作码转换优先级,非表达式字符返回-2 栈操作函数:
double get_num(num *nu)//查看操作数栈栈顶 double pop_num(num *nu)//操作数栈出栈
int push_num(num *nu,double da)//压入操作数栈 int empty_num(num *nu)//判空 void initstack(num *nu)char get_opnd(opnd *op)//查看栈顶 char pop_opnd(opnd *op)//出栈 int push_opnd(opnd *op,char co)//压栈 int empty_opnd(opnd *op)//判空 void initstack(opnd *op)//初始化栈
数据结构课程设计
5.2 函数间的调用关系 5.2.1函数调用流程
main():主函数 → start();↗load()→start();start()程序模式函数→清空文件→exit();↘make_str()→result(op,nu)→start2()→start();↗ load → start();start2()子菜单 → save()→ start2();↘ check()→ start2();result(op,nu)计算结果→initstack(op)→initstack(nu)→push_opnd(op,'=')→
↗push_num(nu,change_num(str2));→change_opnd(*ps)↗push_opnd(op,*ps); ↘procede(get_opnd(op),*ps)→pop_opnd(op);↘push_num(nu,caculate(op,nu))caculate(op,nu)→b=pop_num(nu)→a=pop_num(nu)→pop_opnd(op)
5.2.2函数调用说明
main()函数:调用了一个函数start(),start()判断执行查看所有计算记录函数load(),或是清空以往的所有计算记录,或是退出程序,或是检查输入表达式语法make_str()并计算表达式result(op,nu)的操作。
result(op,nu)函数:是计算表达式,调用了初始化栈函数和字符级别判断change_opnd(*ps),若是数字,则调用转化数字change_num(str2)然后压入操作数栈,若是运算符,刚调用判断操作procede(get_opnd(op),*ps),若是“”,则弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算caculate(op,nu)后再压入操作数栈,计算完毕后按start()顺序
数据结构课程设计
运行。
start2()函数:在计算结果后调用跟随的选择菜单,进行查看结果check()、保存结果save()、查看计算记录load()、回到主菜单的操作。
6系统测试分析
(1)程序主界面,根据提示选择相应的输入字母选择相应菜单。在系统第一次运行的时候,查看记录是不会有结果的,应当首先进行计算式子,然后进行保存过,才会有结果。
数据结构课程设计
(2)计算式子,根据需要输入了以上三个式子,计算结果都正确无误。计算完毕,输入e结束计算,程序进入子菜单。
(3)在计算完式子以后进入子菜单选择界面,我们对式子进行保存处理。进入(4)。
(4)对刚刚输入计算的式子进行保存,选择s,提示式子已经被保存下来了。接下来我们回到主界面,查看记录。
数据结构课程设计
(5)我们输入了l,程序返回我们刚刚保存的计算记录,并且进行个数统计。
(6)我们对刚才的保存的记录进行清空处理,按c,确定后,返回结果为所有记录为空,我们也可以对此事的系统进行再次查询处理,结果也会发现是没有记录的。最后我们按e,则整个系统退出。
数据结构课程设计
7程序源代码
#include #include #include #include //宏定义
#define MAXSIZE 100 #define N 1000 int i=0;
//表达式数
typedef struct expreion//表达式结构
{ long double result;
char expstr[MAXSIZE];}expreion;expreion expr[N];//表达式的一个整体容器s
typedef struct//操作码栈定义
{ char code[MAXSIZE];int top;}opnd;
typedef struct//操作数栈定义
{ double date[MAXSIZE];int top;}num;//《——opnd栈操作——》:
void initstack(opnd *op)//初始化栈
{ op->top=-1;} int empty_opnd(opnd *op)//判断是否为空栈
{ if(op->top==-1)
return 0;else return 1;}
int push_opnd(opnd *op,char co)//入栈
{
数据结构课程设计
if(op->top==MAXSIZE-1)
{
printf(“The ”opnd“ stack is full.”);
return 0;
} op->top++;op->code[op->top]=co;return 1;} char pop_opnd(opnd *op)//出栈
{ char a=' ';if(op->top==-1)
{
printf(“error:The ”opnd“ stack is empty.”);
return a;
} a=op->code[op->top];op->top--;return a;} char get_opnd(opnd *op)//查看栈顶
{ char a=' ';if(op->top==-1)
{
printf(“error:The ”opnd“ stack is empty.”);
return a;
} else
return op->code[op->top];} //《——num栈操作——》: void initstack(num *nu){ nu->top=-1;} int empty_num(num *nu)//判空
{ if(nu->top==-1)
return 0;else return 1;}
数据结构课程设计
int push_num(num *nu,double da)//入栈
{ if(nu->top==MAXSIZE-1)
{
printf(“error:The ”date“ stack is full.”);
return 0;
} nu->top++;nu->date[nu->top]=da;return 1;} double pop_num(num *nu)//出栈
{ double a=' ';if(nu->top==-1)
{
printf(“error:The ”date“ stack is empty.”);
return a;
} a=nu->date[nu->top];nu->top--;return a;} double get_num(num *nu)//查看栈顶
{ if(nu->top!=-1)
return nu->date[nu->top];} //《——结束栈定义操作——》 //《——函数操作——》:
int change_opnd(char code)//将字符型操作码转换成优先级,非表达式字符反回-2 { switch(code)
{
case '=':return 1;break;
case ')':return 2;break;
case '+':return 3;break;
case '-':return 3;break;
case '*':return 4;break;
case '/':return 4;break;
case '(':return 0;break;//操作码级别>=0;
case '1':case '2':case '3':case '4':case '5':case '6':case '7':
case '8':case '9':case '0':case '.': return-1;//操作数级别=-1;
default: return-2;//其它符号级别=-2
数据结构课程设计
} } char procede(char top,char code)//处理操作码,判断栈的操作
{ if(change_opnd(code)==0)//“(”入栈
return('
if(change_opnd(code)==2&&change_opnd(top)==0)//“(”和“)”同时出现,“(”出栈,“)”不入栈
return('=');
else
if(change_opnd(code)
return('>');
else
return('
} double change_num(char str[])//数字字符串转成double型数字
{ char *s=str;int p=1,q=0;//p=小数点前位数,q=小数点后位数
char d[]=“.”,z[]=“0”;double da=0,p1;if(strstr(str,d)==0)//判断是否有小数点
p=strlen(str);else
if(strstr(str,d)==str)//没有输入小数点前的数,如“.032”
{
p=1;
q=strlen(str)-1;
strcpy(str,strcat(z,str));
}
else
{
p=strstr(str,d)-str;
q=strlen(str)-p-1;
}
for(int i=0;i
//小数点前的各位数乘以各自的阶数,然后叠加:123=1*100+2*10+3*1
da=da+((int)str[i]-48)*pow(10,p-i-1);
for(int j=0;j
//小数点后的各位数乘以各自的阶数,然后叠加:0.123=1*0.1+2*0.01+3*0.001
da=da+((int)str[strlen(str)-1-j]-48)*pow(0.1,q-j);
return da;}
数据结构课程设计
int make_str()//语法检查
{ char *p,*p1;int n=0;printf(“n请输入表达式,以“=”结尾:”);gets(expr[i].expstr);p=expr[i].expstr;p1=p;
while(1)
{
if(*p==' ')
if(*(p-1)=='=')//语法检查结束
break;
else
{//没有以“=”结尾
printf(“n表达式以”=“结尾。请重新输入:”);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
if(change_opnd(*p)==2)//一个“)”,n-1
n--;
if(change_opnd(*p)==0)//一个“(”,n+1
n++;
if(*p1==*p)//第一个字符的判断,只能以“数字”或“(”开头,不能有非法字符
if(change_opnd(*p)>0)
{
printf(“n表达式只能以“数字”或“(”开头。请重新输入:”);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
else
if(change_opnd(*p)==-2)
{
printf(“n表达式”%c“为非法字符。请重新输入:”,*p);
gets(expr[i].expstr);
数据结构课程设计
p=expr[i].expstr;
n=0;
continue;
}
else
{//合法刚跳到下一个字符
p=p+1;
continue;
}
if(change_opnd(*p)==-2)//非法字符判断
{
printf(“n表达式”%c“为非法字符。请重新输入:”,*p);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
if(change_opnd(*p)==0)//“(”前一个字符只能是“+、-、*、/、(”
{
if(change_opnd(*(p-1))4)
if(change_opnd(*(p-1))!=0)
{
printf(“n表达式”%c“或”%c“不符合语法。请重新输入:”,*(p-1),*p);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
}
if(change_opnd(*p)>0)//“+、-、*、/、=、)”前一个字符只能是数字和“)”
if(change_opnd(*(p-1))!=-1)
if(change_opnd(*(p-1))!=2)
{
printf(“n表达式”%c“或”%c“不符合语法。请重新输入:”,*(p-1),*p);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
if(change_opnd(*p)==1)//判断表达式中是否有“=”重复出现,最后括号是否配对
数据结构课程设计
{
if(*(p+1)!=' ')
{
printf(“n表达式中”=“,只能出现在表达式结束处。请重新输入:”);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
if(n!=0)
{
printf(“n表达式括号不配。请重新输入:”);
gets(expr[i].expstr);
p=expr[i].expstr;
n=0;
continue;
}
}
p=p+1;
}
return 1;}
double caculate(opnd *op,num *nu)//简单计算+,-,*,/ { double b=pop_num(nu),a=pop_num(nu);switch(pop_opnd(op))
{
case '+':return(a+b);break;
case '-':return(a-b);break;
case '*':return(a*b);break;
case '/':return(a/b);break;
} } void result(opnd *op,num *nu)//计算结果
{ char str2[MAXSIZE]=“”,str3[2]=“0”;char *ps=expr[i].expstr;initstack(op);//初始化栈
initstack(nu);push_opnd(op,'=');
数据结构课程设计
while(!((*ps=='=')&&(get_opnd(op)=='=')))//检查是表达式和操作码是否到尾
if(change_opnd(*ps)==-1)//操作数处理
{
while(change_opnd(*ps)==-1)
{
strncpy(str3,ps,1);//数字字符一个个取出放在str2
strcat(str2,str3);
ps++;
}
push_num(nu,change_num(str2));
strcpy(str2,“”);
}
else //操作码处理
{
switch(procede(get_opnd(op),*ps))
{
case '
case '=':pop_opnd(op);break;
case '>':push_num(nu,caculate(op,nu));continue;break;
}
if(*ps==')'&&get_opnd(op)=='=')
{
ps++;
continue;
}
if(*ps=='='||get_opnd(op)=='=')
continue;//表达式和操作码有一个到尾,则跳出继续循环
ps++;
}
expr[i].result=get_num(nu);
printf(“nt
表达式:%st计算结果:%lfn”,expr[i].expstr,expr[i].result);
printf(“t--n”);
i++;//表达式个数加1;
}
void check()//显示计算结果
{ for(int n=0;n
{
printf(“n”);
printf(“t%d n”,n+1);
数据结构课程设计
printf(“t
表达式:%s”,expr[n].expstr);
printf(“t计算结果:%.2lfn”,expr[n].result);
if(expr[n].expstr[0]=='#')break;//只显示当次计算的记录
} printf(“t--n”);}
void save()//保存计算结果
{ FILE *fp;int m,n;if((fp=fopen(“calculate.dat”,“ab”))==NULL)//创建文件
{
printf(“cannot open filen”);
return;
} if(expr[i-1].expstr[0]=='#')//不能重复保存
{
printf(“*提醒:记录已保存过,不需要再次保存。n”);
return;
} for(n=i;n>0;n--)//记录最后一个#号位置,即未保存的结果的开始位置,重复保存只会追加
if(expr[n-1].expstr[0]=='#')
break;strcpy(expr[i].expstr,“#表达式个数:”);//每次保存都统计计算次数
expr[i].result=i-n;i++;for(m=n;m
if(fwrite(&expr[m],sizeof(struct expreion),1,fp)!=1)//将表达式和计算结果存到文件中
printf(“file write errornn”);fclose(fp);printf(“*提醒:计算记录已经保存nn”);}
void load()//显示所有计算记录
{ int m;expreion e[N];FILE *fp;printf(“n”);if((fp=fopen(“calculate.dat”,“rb”))==NULL)//空文件
{
printf(“t--n”);
printf(“*提醒:没有记录信息,请进行计算并保存信息:nn”);
数据结构课程设计
return;
}
for(m=0;fread(&e[m],sizeof(struct expreion),1,fp);m++)//按照expreion结构一个个读取
{
printf(“t%d n”,m+1);
printf(“t
表达式:%st计算结果:%.2lfn”,e[m].expstr,e[m].result);
if(e[m].expstr[0]=='#')//控制输出不同次计算的记录
{
m=-1;
printf(“n”);
}
} printf(“t--n”);fclose(fp);printf(“n”);} void help(){ printf(“t|
|n”);printf(“t|
1、请用户正确输入表达式,不得出现非法字符及重复出现。|n”);printf(“t|
2、表达式以 “=”号结尾,负数用(0-X)形式表示。
|n”);printf(“t|
3、请用户及时保存计算结果,否则计算结果会被清除。
|n”);printf(“t|
|n”);
} //void start(opnd *op,num *nu);
void start2(opnd *op,num *nu)//第二层计算选择菜单
{ void start(opnd *op,num *nu);char r;while(1)
{
printf(“t*************************计算表达式的值**********************n”);
printf(“t***
***n”);
printf(“t***
一、查看本次计算记录,请输入”r“或”R“
***n”);
printf(“t***
***n”);
printf(“t***
二、保存本次计算记录,请输入”s“或”S“
***n”);
printf(“t***
***n”);
printf(“t***
三、查看所有计算记录,请输入”l“或”L“
***n”);
printf(“t***
***n”);
printf(“t***
四、回到主菜单,请输入”E“或”e“
***n”);
数据结构课程设计
printf(“t***
***n”);
printf(“t*************************************************************n”);
printf(“t请输入: ”);
scanf(“%s”,&r);
if(r=='r'||r=='R')
check();
else
if(r=='s'||r=='S')
save();
else
if(r=='l'||r=='L')
load();
else
{
i=0;
start(op,nu);
}
} } void start(opnd *op,num *nu)//程序主导
{
char ch,c,g;
g='Y';
printf(“t*************************计算表达式的值**********************n”);
printf(“t***
***n”);
printf(“t***
一、计算式子,请输入”Y“或”y“
***n”);
printf(“t***
***n”);
printf(“t***
二、查看记录,请输入”l“或”L“
***n”);
printf(“t***
***n”);
printf(“t***
三、清空记录,请输入”C“或”c“
***n”);
printf(“t***
***n”);
printf(“t***
四、退出程序,请输入”E“或”e“
***n”);
printf(“t***
***n”);
printf(“t*************************************************************n”);
printf(“t请输入:”);
scanf(“%s”,&c);
getchar(ch);
if(c=='l'||c=='L')
{
load();
start(op,nu);
}
else
if(c=='Y'||c=='y')
数据结构课程设计
{
while(1)
{
if(g=='Y'||g=='y')
{
if(make_str())//语法检查
{
printf(“t--n”);
result(op,nu);//计算
}
}
else
{
printf(“nt*提醒:计算结束!nn”);
break;
}
printf(“n继续计算,请输入”Y“或”y“,否则按“E”或“e”键结束计算:”);
scanf(“%s”,&g);
getchar(ch);
}
start2(op,nu);
}
else
if(c=='C'||c=='c')//清空文件
{
printf(“t--n”);
remove(“calculate.dat”);
printf(“*提醒:所有记录已经清空。nn”);
start(op,nu);
}
else{
printf(“nt*提醒:结束!nn”);
exit(0);
} } void main(){ system(“color 1A”);opnd op;//操作码栈
num nu;//操作数栈
printf(“nt ——————————————请注意—————————————n”);help();start(&op,&nu);//启动程序
}
数据结构课程设计
8心得体会
(1)设计中遇到的问题及解决过程
调试过程中出现一些逻辑和语法错误,但是语法错误容易纠正,而 逻辑错误则比较难纠正,需要通过多次调试,找出过程中的漏洞。在设计数值转换时,只有抓住小数点为中界条件,找出整数位数和小数位数;在保存计算记录时,不能重复保存,需要断点。这些问题都是靠仔细分析,逐步琢磨出来的,要勤动手,先设计,后实现。
(2)设计体会和收获。
发现自己也能解决有点复杂的问题,程序设计思想上有了很大的提高,学会了仔细分析问题的关键和辅助功能,在应用上设计程序要符合大众化的思维方式。
(3)因为时间问题,只能做出表达式基本运算,在以后的时间里,我会改善这个计算程序,让它能计算更复杂的表达式,如加上sin,cos时的运算。
9参考文献
【1】.[美] Gary Bronson 著,刘勇译.Programming Development and Design Using C++, Second Edition(C++程序开发与设计,第2版).北京:人民邮电出版社,2002 【2】.王萍.C++面向对象程序设计.北京:清华大学出版社.2002 【3】.罗建军等.C++程序设计教程(第2版).北京:高等教育出版社,2004 【4】.谭浩强.C++程序设计.北京:清华大学出版社.2004 【5】.黄维通.Visual C++面向对象与可视化程序设计(第2版).北京:清华大学出版社,2007 【6】.张基温.C++程序设计基础.北京:高等教育出版社,2001 【7】.刁成嘉.面向对象C++程序设计.北京:机械工业出版社,2004 【8】.郑莉等.C++语言程序设计(第2版).北京:清华大学出版社,2001