1、C语言综合设计实例第八章 综合设计实例本章重点 问题描述 程序设计的方法及描述工具 根据程序流程图编码 程序测试 综合设计报告C语言程序设计是一门实践性很强的课程,编写程序、调试程序和测试程序的能力需要经过大量实践学习来培养。综合设计是综合运用C语言程序设计课程所学知识解决一个实际问题,强化实践能力,进一步提高综合运用能力的重要环节。本章从问题描述、程序设计、编程、测试、综合设计报告几个方面,分析了两个C语言程序设计的综合设计案例以供参考。81 简单集合运算实例8.1.1 实例描述【例8.1】建立简单的用户菜单界面,处理两个简单整型数据集合,要求具有如下功能:(1) 为集合增加、删除元素。(2
2、) 求两个集合的交集、并集及补集。(3) 用链表来存储集合的元素。题目要求:(1) 按照分析、设计、编码、测试的软件开发过程完成这个应用程序;(2) 为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单; (3) 用户根据需求输入相应得命令选择希望进行的操作;(4) 界面友好,操作方便,给出清晰、明确的提示信息。8.1.2 程序设计通过分析问题描述,程序必须“做什么”已经清楚了,程序设计阶段是要决定“怎么做”,也就是要设计算法和重要数据的数据结构。程序设计的任务得出对目标系统的精确描述,即给出各模块的程序流程图。该系统可划分为以下模块:(1) 创建空链表,函数名为CreateTable(
3、);(2) 为链表输入元素,函数名为AppendToTable(struct Collelm * x);(3) 向链表插入一个元素,函数名为InsertToTable(struct Collelm * x,int number);(4) 删除链表元素,DeleteTable(struct Collelm *x,int number);(5) 求集合x,y的交集,函数名为 Multiply(struct Collelm *x,struct Collelm *y);(6) 求集合x,y的并集,函数名为Addition(struct Collelm *x,struct Collelm *y);(7)
4、 求集合x,y的补集,函数名为Subtraction(struct Collelm *x,struct Collelm *y);(8) 输出链表元素,函数名为PrintTable(struct Collelm * x);(9) 显示系统主菜单,函数名为Help();(10)系统主函数,函数名为void main();下面是部分功能模块程序流程图:(1) 向链表插入一个元素的程序流程图如图8.1所示。图8.1 链表插入一个元素的程序流程图(2) 删除链表元素的程序流程图如图8.2所示。图8.2 删除链表元素的程序流程图(3) 求集合x,y的交集的程序流程图如图8.3所示。图8.3 求集合x,y的
5、交集的程序流程图(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!=NULLq!=NULL是p-number!=q-number否q=q-nextbreak是q=NULL否将p-number插入链表r中r=r-nextp=p-nextq=y-next输出collSub图8.5 求集合x- y的补集的程序流
6、程图8.1.3 编程编码就是用高级语言表示设计阶段产生的算法。在编码阶段,要遵循结构化程序设计思想。按照结构化程序设计思想,功能模块独立,这样使程序层次清晰,容易保证程序开发时的正确性和易纠错性。因此,按照这种思想开发的程序便于编写、阅读、修改和维护,减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。下面是根据8.1.2的程序流程图编写的一个结构化程序,请读者参考。#include stdio.h#include conio.h#include #include process.hvoid PrintTable(struct Collelm * x); /*打印元素*/void Ap
7、pendToTable(struct Collelm * x); /*为集合x输入元素*/void Addition(struct Collelm *x,struct Collelm *y); /*求集合x,y的并集*/void InsertToTable(struct Collelm * x,int number); /*向集合x中插入元素number*/void Multiply(struct Collelm *x,struct Collelm *y); /*求集合x,y的交集*/void DeleteTable(struct Collelm *x,int number); /*删除集合x
8、中的元素number*/void Subtraction(struct Collelm *x,struct Collelm *y); /*求集合x - y的补集*/void Subtractionhelp(struct Collelm *x,struct Collelm *y); /*求两集合的补集菜单*/struct Collelm * CreateTable(); /*创建空链表*/ void Help(); /*显示系统主菜单*/struct Collelm /*定义结构体*/ int number; struct Collelm * next;struct Collelm * Crea
9、teTable() /*创建空链表*/ struct Collelm * c; c = (struct Collelm *) malloc(sizeof(struct Collelm); c-number = 0; c-next = NULL; return(c); /*返回链表头指针*/ void AppendToTable(struct Collelm * x) /*向集合中添加元素x*/ int number; Help(); printf(n); printf(Please input the number (0 to quit): ); scanf(%d, &number); whi
10、le(number) InsertToTable(x,number); scanf(%d, &number); void InsertToTable(struct Collelm * x,int number) /*向集合x中插入一个元素number*/ struct Collelm * newc, * last; /*newc新建节点指针*/ last = x; /*last是链表的尾指针*/ while(last-next!=NULL) last=last-next; newc = (struct Collelm *) malloc(sizeof(struct Collelm); newc
11、-number = number; last-next = newc; newc -next= NULL;void Addition(struct Collelm *x,struct Collelm *y) /*求两集合的并集*/ struct Collelm *p,*q,*r; struct Collelm* collAdd; /*存放集合ab的并集*/ collAdd= CreateTable(); p=x-next; q=y-next; r=collAdd; if(!p) /*若集合p为空*/ if(!q) /*若集合q为空*/ return; else /*若集合q不为空*/ whil
12、e(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) Inse
13、rtToTable(r,p-number); r=r-next; p=p-next; PrintTable(collAdd);void Multiply(struct Collelm *x,struct Collelm *y) /*求两集合的交集*/ struct Collelm *p,*q,*r; struct Collelm* collMul; /*存放集合ab的交集*/ collMul= CreateTable(); p=x-next; q=y-next; r=collMul; if(!p|!q) /*p,q两个集合中有一个为空*/ return; else while(p) while
14、(q) if(p-number=q-number) InsertToTable(r,p-number); r=r-next; q=q-next; p=p-next; q=y-next; PrintTable(collMul);void Subtractionhelp(struct Collelm *x,struct Collelm *y) /*求两集合的补集*/ system(cls); puts( *); puts( * w = a-b *); puts( * s = b-a *); puts( * 0 to return *); puts( *); puts( Please choose
15、w or s:); 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; void Subtraction(struct Collelm *x,struct Collelm *y) /*求两集合x-y的补集*/ struct Collelm *p,*q,*r; struct Collelm* collSub; /*存放集合ab的补集*/ collSub=
16、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);void PrintTable(struct Collelm * c) /*输出集合中元素的功能函数*/ struct Collelm *t; Help(); t=c; t=t-n
17、ext; printf(n); if(!t) puts(The table is EMPTY!); return; while(t!=NULL) printf(%3dt, t-number); t = t-next; printf(n); void DeleteTable(struct Collelm *x,int number) /*删除集合x中的元素number*/ struct Collelm *p,*q; int n=0; q=x; while(q-next) if(number=q-next-number) n+; printf(Having Find !n); p=q-next;
18、q-next=q-next-next; free(p); else q=q-next; PrintTable(x); if(n=0) printf(Cant find the number %d!n,number); void Help() /*显示系统主菜单*/ system(cls); puts( *); puts( * Collection System Command Help *); puts( *); puts( * L = List Collection *); puts( * + = Addition *); puts( * * = Multiply *); puts( * -
19、 = Subtraction *); puts( * A = Append records *); puts( * H = Show this help message *); puts( * D = Delete records *); puts( * C = Clear screen *); puts( * Q = Quit System *); puts( *); puts( * Designers (C) *); puts( * Liang Yunchuan *); puts( * 2008.07.03 *); puts( *);void main() /*主函数*/ char key
20、Value; int number; struct Collelm* colla;/*存放集合a*/ struct Collelm* collb;/*存放集合b*/ colla = CreateTable(); collb = CreateTable(); Help(); while(keyValue = getch() != q & keyValue != Q & keyValue != 27) puts(); switch(keyValue) case l: case L: /*调用输出函数*/ printf(Please selection Print object:a or b); i
21、f(keyValue = getch() = a | keyValue = A) PrintTable(colla); else PrintTable(collb); break; case a: case A: /*调用输入函数*/ printf(Please selection Appand object:a or b); if(keyValue = getch() = a | keyValue = A) AppendToTable(colla); else AppendToTable(collb); break; case d: case D: /*调用删除函数*/ printf(Ple
22、ase input the number you want to delete:); scanf(%u,&number); printf(Please selection Delete object:a or bn); 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();
23、 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(Error command!); 8.1.4 测试系统开发完成后,在软件开发阶段的最后一步工作就是对系统进行测试。软件测试需经过制定测试计划,设计测试用例和填写测试报告等过程。软件
24、测试是为了发现程序中的错误。软件测试的过程亦是程序运行的过程,程序运行需要数据,为测试设计的数据称测试用例。设计测试用例的原则是尽可能多地暴露程序错误。软件测试技术主要有白盒测试(Whitebox Testing)和黑盒测试(Blackbox Testing)两大类。白盒测试又称结构测试,是根据被测对象操作的逻辑结构设计测试用例;黑盒测试又称功能测试,把被测对象看成一个黑盒子,检查各函数模块的操作是否满足功能要求。实际测试中,常采用黑盒测试法。如果发现错误,再采用白盒测试进行调试。在软件测试过程中需要按照一定的策略选择一组能充分暴露程序可能发生错误的输入数据,观察程序的实际输出是否与预期结果一
25、致。因此测试用例由输入值和期望值组成。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)计算两个数
26、相加,函数名为add(char *m1,char *m2,char *sum); (4)一位数a与一位数b相乘,函数名为onebitmul(char *a,char *b,int *jw,int *m); (5)字符串右移n位,函数名为rightmove(char *multiply,int n);(6)字符串左移n位,函数名为leftmove(char *multiply,int n);下面是部分功能模块程序流程图:(1)计算多位数a乘以多位数b的程序流程图如图8.6所示。m2MAXMATRIX=0 ,sumMAXMATRIX=0,计算字符串b的长度lenbi=lenb-1,即从字符串b的最后一位开始与字符串a进行相乘i=0取b的一位数x,即x=bi调用函数mulbitmulonebit()计算a*x,乘积为m1将m1乘以10的lenb-1-i次方计算m1和m2的和将m2赋值给sum将sum赋值给multiply图8.6 计算多位数a乘以多位数b的程序流程图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1