C语言综合设计实例.docx
《C语言综合设计实例.docx》由会员分享,可在线阅读,更多相关《C语言综合设计实例.docx(29页珍藏版)》请在冰点文库上搜索。
C语言综合设计实例
第八章综合设计实例
本章重点
①问题描述
②程序设计的方法及描述工具
③根据程序流程图编码
④程序测试
⑤综合设计报告
C语言程序设计是一门实践性很强的课程,编写程序、调试程序和测试程序的能力需要经过大量实践学习来培养。
综合设计是综合运用C语言程序设计课程所学知识解决一个实际问题,强化实践能力,进一步提高综合运用能力的重要环节。
本章从问题描述、程序设计、编程、测试、综合设计报告几个方面,分析了两个C语言程序设计的综合设计案例以供参考。
8.1简单集合运算实例
8.1.1实例描述
【例8.1】建立简单的用户菜单界面,处理两个简单整型数据集合,要求具有如下功能:
(1)为集合增加、删除元素。
(2)求两个集合的交集、并集及补集。
(3)用链表来存储集合的元素。
题目要求:
(1)按照分析、设计、编码、测试的软件开发过程完成这个应用程序;
(2)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单;
(3)用户根据需求输入相应得命令选择希望进行的操作;
(4)界面友好,操作方便,给出清晰、明确的提示信息。
8.1.2程序设计
通过分析问题描述,程序必须“做什么”已经清楚了,程序设计阶段是要决定“怎么做”,也就是要设计算法和重要数据的数据结构。
程序设计的任务得出对目标系统的精确描述,即给出各模块的程序流程图。
该系统可划分为以下模块:
(1)创建空链表,函数名为CreateTable();
(2)为链表输入元素,函数名为AppendToTable(structCollelm*x);
(3)向链表插入一个元素,函数名为InsertToTable(structCollelm*x,intnumber);
(4)删除链表元素,DeleteTable(structCollelm*x,intnumber);
(5)求集合x,y的交集,函数名为Multiply(structCollelm*x,structCollelm*y);
(6)求集合x,y的并集,函数名为Addition(structCollelm*x,structCollelm*y);
(7)求集合x,y的补集,函数名为Subtraction(structCollelm*x,structCollelm*y);
(8)输出链表元素,函数名为PrintTable(structCollelm*x);
(9)显示系统主菜单,函数名为Help();
(10)系统主函数,函数名为voidmain();
下面是部分功能模块程序流程图:
(1)向链表插入一个元素的程序流程图如图8.1所示。
图8.1
链表插入一个元素的程序流程图
(2)删除链表元素的程序流程图如图8.2所示。
图8.2删除链表元素的程序流程图
(3)求集合x,y的交集的程序流程图如图8.3所示。
图8.3求集合x,y的交集的程序流程图
(4)求集合x,y的并集的程序流程图如图8.4所示。
图8.4求集合x,y的并集的程序流程图
(5)求集合x-y的补集的程序流程图如图8.5所示。
创建空链表collSub,准备存放集合x和集合y的补集
p=x->next;p指向集合x的首节点
q=y->next;q指向集合y的首节点
r=collSub;r指向链表collSub的首地址
p!
=NULL
q!
=NULL
是
p->number!
=q->number
否
q=q->next
break
是
q==NULL
否
将p->number插入链表r中
r=r->next
p=p->next
q=y->next
输出collSub
图8.5求集合x-y的补集的程序流程图
8.1.3编程
编码就是用高级语言表示设计阶段产生的算法。
在编码阶段,要遵循结构化程序设计思想。
按照结构化程序设计思想,功能模块独立,这样使程序层次清晰,容易保证程序开发时的正确性和易纠错性。
因此,按照这种思想开发的程序便于编写、阅读、修改和维护,减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。
下面是根据8.1.2的程序流程图编写的一个结构化程序,请读者参考。
#include"stdio.h"
#include"conio.h"
#include
#include"process.h"
voidPrintTable(structCollelm*x);/*打印元素*/
voidAppendToTable(structCollelm*x);/*为集合x输入元素*/
voidAddition(structCollelm*x,structCollelm*y);/*求集合x,y的并集*/
voidInsertToTable(structCollelm*x,intnumber);/*向集合x中插入元素number*/
voidMultiply(structCollelm*x,structCollelm*y);/*求集合x,y的交集*/
voidDeleteTable(structCollelm*x,intnumber);/*删除集合x中的元素number*/
voidSubtraction(structCollelm*x,structCollelm*y);/*求集合x-y的补集*/
voidSubtractionhelp(structCollelm*x,structCollelm*y);/*求两集合的补集菜单*/
structCollelm*CreateTable();/*创建空链表*/
voidHelp();/*显示系统主菜单*/
structCollelm/*定义结构体*/
{
intnumber;
structCollelm*next;
};
structCollelm*CreateTable()/*创建空链表*/
{
structCollelm*c;
c=(structCollelm*)malloc(sizeof(structCollelm));
c->number=0;
c->next=NULL;
return(c);/*返回链表头指针*/
}
voidAppendToTable(structCollelm*x)/*向集合中添加元素x*/
{
intnumber;
Help();
printf("\n");
printf("Pleaseinputthenumber(0toquit):
");
scanf("%d",&number);
while(number)
{
InsertToTable(x,number);
scanf("%d",&number);
}
}
voidInsertToTable(structCollelm*x,intnumber)/*向集合x中插入一个元素number*/
{
structCollelm*newc,*last;/*newc新建节点指针*/
last=x;/*last是链表的尾指针*/
while(last->next!
=NULL)
last=last->next;
newc=(structCollelm*)malloc(sizeof(structCollelm));
newc->number=number;
last->next=newc;
newc->next=NULL;
}
voidAddition(structCollelm*x,structCollelm*y)/*求两集合的并集*/
{
structCollelm*p,*q,*r;
structCollelm*collAdd;/*存放集合ab的并集*/
collAdd=CreateTable();
p=x->next;
q=y->next;
r=collAdd;
if(!
p)/*若集合p为空*/
{
if(!
q)/*若集合q为空*/
return;
else/*若集合q不为空*/
while(q)
{
InsertToTable(r,q->number);
r=r->next;
q=q->next;
}
}
else/*若集合p不为空*/
{
if(!
q)/*若集合q为空*/
while(p)
{
InsertToTable(r,p->number);
r=r->next;
p=p->next;
}
else/*若集合q不为空*/
{
while(q)
{
InsertToTable(r,q->number);
r=r->next;
q=q->next;
}
while(p)
{
q=y->next;
while(q)
{
if(p->number!
=q->number)
q=q->next;
else
break;
}
if(!
q)
{
InsertToTable(r,p->number);
r=r->next;
}
p=p->next;
}
}
}
PrintTable(collAdd);
}
voidMultiply(structCollelm*x,structCollelm*y)/*求两集合的交集*/
{
structCollelm*p,*q,*r;
structCollelm*collMul;/*存放集合ab的交集*/
collMul=CreateTable();
p=x->next;
q=y->next;
r=collMul;
if(!
p||!
q)/*p,q两个集合中有一个为空*/
return;
else
while(p)
{
while(q)
{
if(p->number==q->number)
{
InsertToTable(r,p->number);
r=r->next;
}
q=q->next;
}
p=p->next;
q=y->next;
}
PrintTable(collMul);
}
voidSubtractionhelp(structCollelm*x,structCollelm*y)/*求两集合的补集*/
{
system("cls");
puts("*********************************************");
puts("*w=a-b*");
puts("*s=b-a*");
puts("*0toreturn*");
puts("*********************************************");
puts("Pleasechoosewors:
");
if(getch()=='w'||getch()=='W')/*求集合a-b*/
Subtraction(x,y);
if(getch()=='s'||getch()=='S')/*求集合b-a*/
Subtraction(y,x);
if(getch()=='0')/*返回系统主菜单*/
{
Help();
return;
}
}
voidSubtraction(structCollelm*x,structCollelm*y)/*求两集合x-y的补集*/
{
structCollelm*p,*q,*r;
structCollelm*collSub;/*存放集合ab的补集*/
collSub=CreateTable();
p=x->next;
q=y->next;
r=collSub;
while(p!
=NULL)
{
while(q!
=NULL)
{
if(p->number!
=q->number)
q=q->next;
else
break;
}
if(q==NULL)
{
InsertToTable(r,p->number);
r=r->next;
}
p=p->next;
q=y->next;
}
PrintTable(collSub);
}
voidPrintTable(structCollelm*c)/*输出集合中元素的功能函数*/
{
structCollelm*t;
Help();
t=c;
t=t->next;
printf("\n");
if(!
t)
{
puts("ThetableisEMPTY!
");
return;
}
while(t!
=NULL)
{
printf("%3d\t",t->number);
t=t->next;
}
printf("\n");
}
voidDeleteTable(structCollelm*x,intnumber)/*删除集合x中的元素number*/
{
structCollelm*p,*q;
intn=0;
q=x;
while(q->next)
{
if(number==q->next->number)
{
n++;
printf("HavingFind!
\n");
p=q->next;
q->next=q->next->next;
free(p);
}
else
q=q->next;
}
PrintTable(x);
if(n==0)
printf("Can'tfindthenumber%d!
\n",number);
}
voidHelp()/*显示系统主菜单*/
{
system("cls");
puts("*********************************************");
puts("*CollectionSystemCommandHelp*");
puts("*********************************************");
puts("*L=ListCollection*");
puts("*+=Addition*");
puts("**=Multiply*");
puts("*-=Subtraction*");
puts("*A=Appendrecords*");
puts("*H=Showthishelpmessage*");
puts("*D=Deleterecords*");
puts("*C=Clearscreen*");
puts("*Q=QuitSystem*");
puts("*********************************************");
puts("*Designers(C)*");
puts("*LiangYunchuan*");
puts("*2008.07.03*");
puts("*********************************************");
}
voidmain()/*主函数*/
{
charkeyValue;
intnumber;
structCollelm*colla;/*存放集合a*/
structCollelm*collb;/*存放集合b*/
colla=CreateTable();
collb=CreateTable();
Help();
while((keyValue=getch())!
='q'&&keyValue!
='Q'&&keyValue!
=27)
{
puts("");
switch(keyValue)
{
case'l':
case'L':
/*调用输出函数*/
{
printf("PleaseselectionPrintobject:
aorb");
if((keyValue=getch())=='a'||keyValue=='A')
PrintTable(colla);
else
PrintTable(collb);
break;
}
case'a':
case'A':
/*调用输入函数*/
{
printf("PleaseselectionAppandobject:
aorb");
if((keyValue=getch())=='a'||keyValue=='A')
AppendToTable(colla);
else
AppendToTable(collb);
break;
}
case'd':
case'D':
/*调用删除函数*/
{
printf("Pleaseinputthenumberyouwanttodelete:
");
scanf("%u",&number);
printf("PleaseselectionDeleteobject:
aorb\n");
if((keyValue=getch())=='a'||keyValue=='A')
DeleteTable(colla,number);
else
DeleteTable(collb,number);
break;
}
case'C':
case'c':
/*调用清屏函数*/
system("cls");
break;
case'h':
case'H':
/*调用系统菜单函数*/
Help();
break;
case'+':
/*调用并集函数*/
{
printf("\na+b=\n");
Addition(colla,collb);
break;
}
case'*':
/*调用交集函数*/
{
printf("\na*b=\n");
Multiply(colla,collb);
break;
}
case'-':
/*调用补集菜单函数*/
Subtractionhelp(colla,collb);
break;
default:
puts("Errorcommand!
");
}
}
}
8.1.4测试
系统开发完成后,在软件开发阶段的最后一步工作就是对系统进行测试。
软件测试需经过制定测试计划,设计测试用例和填写测试报告等过程。
软件测试是为了发现程序中的错误。
软件测试的过程亦是程序运行的过程,程序运行需要数据,为测试设计的数据称测试用例。
设计测试用例的原则是尽可能多地暴露程序错误。
软件测试技术主要有白盒测试(WhiteboxTesting)和黑盒测试(BlackboxTesting)两大类。
白盒测试又称结构测试,是根据被测对象操作的逻辑结构设计测试用例;黑盒测试又称功能测试,把被测对象看成一个黑盒子,检查各函数模块的操作是否满足功能要求。
实际测试中,常采用黑盒测试法。
如果发现错误,再采用白盒测试进行调试。
在软件测试过程中需要按照一定的策略选择一组能充分暴露程序可能发生错误的输入数据,观察程序的实际输出是否与预期结果一致。
因此测试用例由输入值和期望值组成。
8.2计算100的阶乘实例
8.2.1实例描述
【例8.2】计算100的阶乘。
题目要求及说明:
(1)数据类型不能定义为整型或长整型,其表示范围不能满足要求,以字符串形式进行计算;
(2)用字符串移位相加模拟乘法运算;
8.2.2程序设计
计算100的阶乘可划分为以下模块:
(1)计算多位数a乘以多位数b,函数名为mulbitmulmulbit(char*a,char*b,char*multiply);
(2)计算多位数a乘以一位数,函数名为bmulbitmulonebit(char*a,char*b,char*multiply);
(3)计算两个数相加,函数名为add(char*m1,char*m2,char*sum);
(4)一位数a与一位数b相乘,函数名为onebitmul(char*a,char*b,int*jw,int*m);
(5)字符串右移n位,函数名为rightmove(char*multiply,intn);
(6)字符串左移n位,函数名为leftmove(char*multiply,intn);
下面是部分功能模块程序流程图:
(1)计算多位数a乘以多位数b的程序流程图如图8.6所示。
m2[MAXMATRIX]="0",sum[MAXMATRIX]={'\0'},计算字符串b的长度lenb
i=lenb-1,即从字符串b的最后一位开始与字符串a进行相乘
i>=0
取b的一位数x,即x=b[i]
调用函数mulbitmulonebit()计算a*x,乘积为m1
将m1乘以10的lenb-1-i次方
计算m1和m2的和
将m2赋值给sum
将sum赋值给multiply
图8.6计算多位数a乘以多位数b的程序流程图