C语言综合设计实例.docx

上传人:b****2 文档编号:1065941 上传时间:2023-04-30 格式:DOCX 页数:29 大小:99.70KB
下载 相关 举报
C语言综合设计实例.docx_第1页
第1页 / 共29页
C语言综合设计实例.docx_第2页
第2页 / 共29页
C语言综合设计实例.docx_第3页
第3页 / 共29页
C语言综合设计实例.docx_第4页
第4页 / 共29页
C语言综合设计实例.docx_第5页
第5页 / 共29页
C语言综合设计实例.docx_第6页
第6页 / 共29页
C语言综合设计实例.docx_第7页
第7页 / 共29页
C语言综合设计实例.docx_第8页
第8页 / 共29页
C语言综合设计实例.docx_第9页
第9页 / 共29页
C语言综合设计实例.docx_第10页
第10页 / 共29页
C语言综合设计实例.docx_第11页
第11页 / 共29页
C语言综合设计实例.docx_第12页
第12页 / 共29页
C语言综合设计实例.docx_第13页
第13页 / 共29页
C语言综合设计实例.docx_第14页
第14页 / 共29页
C语言综合设计实例.docx_第15页
第15页 / 共29页
C语言综合设计实例.docx_第16页
第16页 / 共29页
C语言综合设计实例.docx_第17页
第17页 / 共29页
C语言综合设计实例.docx_第18页
第18页 / 共29页
C语言综合设计实例.docx_第19页
第19页 / 共29页
C语言综合设计实例.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C语言综合设计实例.docx

《C语言综合设计实例.docx》由会员分享,可在线阅读,更多相关《C语言综合设计实例.docx(29页珍藏版)》请在冰点文库上搜索。

C语言综合设计实例.docx

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的程序流程图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2