C语言程序课程设计_第1页
C语言程序课程设计_第2页
C语言程序课程设计_第3页
C语言程序课程设计_第4页
C语言程序课程设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、20102011学年第二学期 C语言程序设计信息安全1002 3100604047 徐钊C语言程序课程设计信息安全1002 徐钊学号:3100604047指导老师:林庆时间:2011年7月1日C语言程序课程设计目录一 内容提要.4二 程序设计1. 进制转换1) 主要算法和思想52) 流程图53) 源代码64) 调试和运行情况72. 位数大小排序1) 主要算法和思想82) 流程图83) 源代码84) 调试和运行情况103. 平方回文数1) 主要算法和思想112) 流程图113) 源代码124) 调试和运行情况134. 马克思手稿中的数学题(穷举法)1) 主要算法和思想142) 源代码143) 流

2、程图144) 调试和运行情况155. 小孩吃梨问题1) 主要算法和思想162) 流程图163) 源代码164) 调试和运行情况176. 奇异的三位数1) 主要算法和思想182) 流程图183) 源代码184) 调试和运行情况197. 回文数的形成1) 主要算法和思想202) 流程图203) 源代码214) 调试和运行情况228. 人机猜数游戏11) 主要算法和思想232) 流程图233) 源代码.234) 调试和运行情况.259. 人机猜数游戏21) 主要算法和思想.262) 流程图.263) 源代码274) 调试和运行情况2710. 简单计算器1) 主要算法和思想282) 流程图283) 源

3、代码284) 调试和运行情况2911. 学生成绩管理系统1) 主要算法和思想312) 框架图313) 源代码314) 调试和运行情况46三 课程设计体会.47四 参考文献.48一.内容提要 课程设计是培养学生综合运用所学知识 ,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。在运用穷举法、递归法等等方法以及结合简单算法的基础上,可以解决

4、一些相对比较复杂的问题,进而可以进一步提升自我的编程能力。为此,在本次C语言课程设计过程中,解决了以下这些问题:(1)进制转换;(2)位数大小排序;(3)平方回文数;(4)马克思手稿中的数学题(5)小孩吃梨问题;(6)奇异的三位数;(7)回文数的形成;(8)人机猜数游戏1;(9)人机猜数游戏2;(10)简单计算器;(11)学生成绩管理系统。 而我觉得在这次课程设计中,应该培养一些编程的意识,比如:(1)利用C语言面向过程的编程思想来完成系统的设计;(2)突出C语言的函数特征,以多个函数实现每一个子功能;(3)画出功能模块图;(4)进行简单界面设计,能够实现友好的交互;(5)具有清晰的程序流程图

5、和数据结构的详细定义;(6)熟练掌握C语言对文件的各种操作。二.程序设计1.进制转换 编子函数,实现将输入的一个无符号整数转换为二进制和八进制表示,分别 存入字符数组中并输出。注:计算机模拟人工是编程中常用的方法,这种方法要求编程者首先分析在人工方式下解决问题的过程,从中找出步骤和规律,然后编写程序,按照人工解决问题的步骤和规律进行操作。1) 主要算法和思想将无符号整数每一次对2或8求余后的结果分别存入数组,再倒序输出即可。2) 流程图 (子函数binary) (主函数) (子函数octal) 3) 源代码#include#define N 100main()int binary(char a

6、,unsigned long u);int octal(char a,unsigned long u);unsigned long u;int i;char *p;char aN;printf(请输入一个无符号整数:n);scanf(%u,&u);i=binary(a,u);p=&ai-1;printf(整数的二进制为:n);for(;p=a;p-)printf(%c,*p);printf(n);i=octal(a,u);p=&ai-1;printf(整数的八进制为:n);for(;p=a;p-)printf(%c,*p);printf(n);int binary(char a,unsigne

7、d long u)/*将无符号整数转化成二进制*/int i=0;while(u!=0)ai=u%2+0;i+;u/=2;return i;int octal(char a,unsigned long u)/*将无符号整数转化成八进制*/int i=0;while(u!=0)ai=u%8+0;i+;u/=8;return i;4) 调试和运行情况2.位数大小排序子函数功能说明:输入一个五位整数,对此整数中的五个数值进行从大到小的顺序排序,形成一个新的五位整数。同时需要编写主函数和其它相关子函数进行调试。1) 主要算法和思想将五位整数的每一位数字提取出来,放入数组进行比较,再形成新的五位整数。2

8、) 流程图 (子函数f) (子函数f1)(主函数)3) 源代码#includemain()int f(int a,unsigned long g);int f1(int a);unsigned long g;int a5;int i,n=1;printf(请输入一个五位数:n);scanf(%u,&g);f(a,g);f1(a);g=0;for(i=0;i=4;i+)g+=ai*n;n*=10;printf(%dn,g);int f(int a,unsigned long g)/*取出五位整数的各位数字*/int i=0; while(g!=0)ai=g%10;i+;g/=10;int f1(

9、int a)/*冒泡排序*/int i,j,t;for(i=0;i4;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;4) 调试和运行情况3.平方回文数求所有不超过200的N值,N的平方是具有对称性质的回文数。回文数就是将一个数从左向右读是一样的,如满足题意要求的数有:N11,112121。1) 主要算法和思想将原来的数字与其反序的数字相比,如果相等,就是回文数。2) 流程图3) 源代码#includemain()int a,b,c,d,e;int n;long m;long l;printf(所有满足平方回文条件的数值N和平方值M:n);for(n=1;n10000

10、)/*当M为五位数时*/l=e*10000+d*1000+c*100+b*10+a;else if(m1000)/*当M为四位数时*/l=e*1000+d*100+c*10+b;else if(m100)/*当M为三位数时*/l=e*100+d*10+c;else if(m10)/*当M为两位数时*/l=e*10+d;else/*当M为一位数时*/l=e;if(m=l) printf(%3d,%5ldn,n,m);4) 调试和运行情况4.马克思手稿中的数学题(穷举算法)马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭共花了50先令:每个男人花3先令,每个女人花2

11、先令,每个小孩花1先令,问男人、女人、小孩各有几人?1) 主要算法和思想将所有可能的情况一一代入,注意按男、女、小孩顺序写循环可以节省时间。2) 流程图3) 源代码#includemain()int x,y,z;/*设有男人x个,有女人y个,有小孩z个*/printf(满足题目条件的男人x、女人y、小孩z的数目:n);for(x=0;x30;x+)for (y=0;y30;y+)for(z=0;z30;z+)if(x+y+z=30)&(3*x+2*y+z=50)printf(x=%2d,y=%2d,z=%2dn,x,y,z);4) 调试和运行情况5.小孩吃梨问题小孩买了一些梨,当即吃了一半,还

12、不过瘾,又多吃了一个,第二天早上又将剩下的梨吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半,并又多吃了一个。到第18天只剩下一个梨了,问小孩共买了多少梨?提示:据初始条件,用倒推法1) 主要算法和思想利用递归的方法,由第18天倒过来推,即可知道小孩买了多少梨子。2) 流程图3) 源代码#includemain()long a,b;int i;a=1;for(i=17;i=1;i-)b=(a+1)*2;a=b;printf(小孩共买了%ld个梨子n,b);4) 调试和运行情况6.奇异的三位数一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的

13、数码顺序正好相反,求这个三位数。1) 主要算法和思想 用穷举法的方式对所有的三位数进行尝试,得到所有满足条件的数。2) 流程图3) 源代码#includemain()int i,m1,m2,m3,n1,n2,n3; /*m3、m2、m1分别表示自然数七进制的第三、二、一位,n3、n2、n1同理*/for(i=100;i0& n30 & m37 & n39 & m1=n3 & m3=n1 & m2=n2) printf(满足题目条件的数:%d 其七进制为:%d%d%d 其九进制为:%d%d%dn,i,m3,m2,m1,n3,n2,n1); /*输出这个数,以及七进制和九进制形式*/ 4) 调试和

14、运行情况7.回文数的形成任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数后重复以上步骤,则最终可得到一个回文数。请编程验证。(回文数就是将一个数从左向右读是一样的,如121,11等)。(注:回文数不超过2147483647)回文数的这一形成规则目前还属于一个猜想,尚未获得数学上的验证,有些回文数要经历上百个步骤才能获得,请编程验证,打印形成过程。如输入整数78,则形成回文数的过程为:7887165,165561726,7266271353,135335314884。提示:一个函数用来求反序数,另一个函数判断是否为回文数,在主函数中输入输出。1) 主要算法和思想将问题模块化,利

15、用两个子函数,一个用来求反序,一个用来判断回文。2) 流程图 (子函数re) (主函数) (子函数nonres)3) 源代码#include#define MAX 2147483647long re(long int);int nonres(long int s);main()long int n,m;int count=0; /*count为记录形成回文数步骤的次数*/ printf(请输入一个数::);scanf(%ld,&n);printf(回文数形成的过程:n);while(!nonres(m=re(n)+n)/*判断整数与其反序数相加后是否为回文数*/ if(m+n=MAX)prin

16、tf(输入错误!n);break;elseprintf(%d:%ld+%ld=%ldn,+count,n,m,m+n);n+=m;printf(%d:%ld+%ld=%ldn,+count,n,m,m+n); /*输出最后得到的回文数*/printf(我们最终得到了回文数!n);long re(long int a) /*求输入整数的反序数*/long int t;for(t=0;a0;a/=10)/*将整数反序*/ t=t*10+a%10;return t;int nonres(long int s) /*判断给定的整数是否是回文数*/ if(re(s)=s) return 1; /*若是回

17、文数则返回1*/ else return 0;/*否则返回0*/ 4) 调试和运行情况8.人机猜数游戏1 由计算机“想”一个四位数,请人猜这个四位数是多少。人输入这个四位数后,计算机首先判断这四个数中有几个猜对了,并且在猜对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数为止。请编程实现该游戏,游戏结束时,显示人猜一个数用了几次。提示:用库函数随机数发生器函数random()产生一个随机数的用法 函数原型: int random(int num); 程序例: #include /*包含库函数random()的头文件*/#include /* pr

18、ints a random number in the range 0 to 99 */ int main(void) int n;randomize(); /*初始化随机数发生器*/n= random (100); /*产生一个0-100的随机数。*/printf(Random number in the 0-99 range: %dn,n); 1) 主要算法和思想取出所输入数和被猜数的每一位,分别进行比较,并设立专门变量记录数字位置。2) 流程图(略)3) 源代码#include#includeint main()int a,z,t,i,c,m,g,s,j,k,x4; /*j为数字正确的位

19、数,k为位置正确的位数*/z=rand(9999);/*计算机想一个随机数*/ printf(*欢迎参加人机猜数游戏1*);printf(n);printf(n);printf(我有一个四位数的数字,请猜一猜!n);printf(n);for(c=1;c+)/*c为猜数次数计数器*/ scanf(%d,&g);/*请人猜*/ printf(请输入一个四位数:);a=z;j=0;k=0;x0=x1=x2=x3=0;for(i=1;i5;i+) /*i为原数中的第i位数。个位为第0位,千位为第3位*/s=g;m=1;for(t=1;t5;t+) if(a%10=s%10)/*人所猜想的数若第i位与

20、人猜的第t位相同*/if(m & t!=x0 & t!=x1 &t !=x2 & t!=x3) /*若该位置上的数字尚未与其它数字“相同”*/j+;m=0;xj-1=t; /*记录相同数字时,该数字在所猜数字中的位置*/ if(i=t) k+;/*若位置也相同,则计数器k加1*/s/=10;a/=10;printf(你猜对了%d个数字,n,j);printf(并且在猜对的数字中有 %d 个位置也是正确的n,k);if(k=4) break; /*若位置全部正确,则人猜对了,退出*/ printf(恭喜你,猜对了!);printf(n);printf(你用了%d次猜出了这个数n,c);4) 调试

21、和运行情况9.人机猜数游戏2程序说明:游戏的开始由机器产生一个随机数(1100之间,用库函数random()),然后游戏者在程序的提示下猜数,若输入的数比这个数大,程序提示:Your answer is HIGH,try again. ,否则,程序提示:Your answer is LOW,try again.,直到猜对为止。程序可实现连续猜数,直到游戏者退出。程序输出要求:累计游戏者猜对一个数所需次数n,当n=15时,用exit(0)库函数退出程序。1) 主要算法和思想简单的判断语句的组合,设立专门的变量记录猜数的个数。2) 流程图3) 源代码#include #include main()

22、int z,g,n;/*z为机器产生的一个随机数字,g为猜的数字*/ z=rand(100); printf(*欢迎参加人机猜数游戏2*);printf(n);printf(n);printf(我有一个从1到100之间的数字,请猜一猜!n);printf(n);for(n=1;n+)/*n为猜数次数计数器*/printf(请输入一个从1到100之间的数字:n);scanf(%d,&g);if(g=z) break;else if(gz) printf(Your answer is HIGH,try again.n);else printf(Your answer is LOW,try agai

23、n. n);if(n=7) printf(Congratulationn);else if(7n & n15) printf(Ican bet you can do it better.n);else exit(0);4) 调试和运行情况10简单计算器请编写一个程序计算表达式:data1 op data2的值。其中,op为运算符、*、/。1) 主要算法和思想运用switch语句将四则运算结合起来,注意特别考虑除数为0的情况。2) 流程图3) 源代码#include#include#includemain()float a,b;char op;printf(请输入表达式:n);scanf(%f%

24、c%f,&a,&op,&b);printf(计算式为:n);switch(op)case +:printf(%f%c%f=%fn,a,op,b,a+b);break;case -:printf(%f%c%f=%fn,a,op,b,a-b);break;case *:printf(%f%c%f=%fn,a,op,b,a*b);break;case /:if(b!=0) printf(%f%c%f=%fn,a,op,b,a/b);break; else printf(错误!n); break; default :printf(错误!n); 4) 调试和运行情况运行加法: 运行减法: 运行乘法: 运

25、行除法: 运行除法(除数为0):11学生成绩管理系统(结构体数组、函数、指针、链表及文件等的综合应用)程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能:(1) 成绩录入,插入后按学号自动排序,创建链表;(2) 成绩文件的存取,创建链表;(3) 成绩的多种查询、修改;(4) 成绩的多种统计、排序;(5) 学生增加、删除、列表。提示:int num; /* 定义学号*/char name20; /* 定义姓名*/float score3; /* 定义存贮三门课成绩的数组*/float average; /* 定义平均

26、成绩*/1) 主要算法和思想将函数模块化、结构化,各个功能都利用子函数进行编辑即可。2) 框架图登记学生资料删除学生资料查询学生资料修改学生资料保存学生资料公布学生资料统计学生资料排序学生资料帮助信息推出系统开始 (总框架图)3) 源代码#include #include #include int shoudsave=0;/* 用于判断数据是否发生了改动 */ struct student char num10;/* 学号 */ char name20;/* 姓名 */ char sex4;/* 性别 */float score3;/* 三门学科的分数 */float totle;/* 总分

27、*/float ave;/* 平均分 */char neartime10;/* 最近更新时间 */ ; typedef struct node struct student data; struct node *next; Node,*Link; void menu() printf(*); printf(t1登记学生资料ttttt2删除学生资料n); printf(t3查询学生资料ttttt4修改学生资料n); printf(t5保存学生资料ttttt6公布学生资料n); printf(t7统计学生资料ttttt8排序学生资料n); printf(t9帮助信息ttttt0退出系统n); pr

28、intf(*n); void printstart() printf(-n); void Wrong() printf(n=提示:输入错误!n); void Nofind() printf(n=提示:没有找到该学生!n); void printc()/* 本函数用于输出中文 */ printf(学号t 姓名 性别 成绩一 成绩二 成绩三 总分 平均分n); void printe(Node *p)/* 本函数用于输出英文 */ printf(%-12s%st %st%.1ft%.1ft%.1ft %.1ft %.1fn,p-data.num,,p-data.sex,p-d

29、ata.score0,p-data.score1,p-data.score2,p-data.totle,p-data.ave); Node* Locate(Link l,char findmess,char nameornum)/* 该函数用于定位链表中符合要求的结点,并返回该指针 */ Node *r; if(strcmp(nameornum,num)=0)/* 按学号查询 */ r=l-next; while(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(nameornum,nam

30、e)=0)/* 按姓名查询 */ r=l-next; while(r!=NULL) if(strcmp(,findmess)=0) return r; r=r-next; return 0; void Add(Link l)/* 增加学生 */ Node *p,*r,*s; char num10; r=l; s=l-next; while(r-next!=NULL) r=r-next;/* 将指针置于最末尾 */ while(1) printf(请你输入学号(以0返回上一级菜单:); scanf(%s,num); if(strcmp(num,0)=0) break; wh

31、ile(s) if(strcmp(s-data.num,num)=0) printf(=提示:学号为%s的学生已经存在,若 要修改请你选择4 修改!n,num); printstart(); printc(); printe(s); printstart(); printf(n); return; s=s-next; p=(Node *)malloc(sizeof(Node); strcpy(p-data.num,num); printf(请你输入姓名:); scanf(%s,); getchar(); printf(请你输入性别:); scanf(%s,p-data.s

32、ex); getchar(); printf(请你输入成绩三:); scanf(%f,&p-data.score2); getchar(); printf(请你输入成绩二:); scanf(%f,&p-data.score1); getchar(); printf(请你输入成绩一:); scanf(%f,&p-data.score0); getchar(); p-data.totle=p-data.score0+p-data.score1+p-data.score2; p-data.ave=p-data.totle / 3; /* 信息输入已经完成 */ p-next=NULL; r-next

33、=p; r=p; shoudsave=1; void Qur(Link l)/* 查询学生 */ int sel; char findmess20; Node *p; if(!l-next) printf(n=提示:没有资料可以查询!n); return; printf(n=1按学号查找n=2按姓名查找n); scanf(%d,&sel); if(sel=1)/* 学号 */ printf(请你输入要查找的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(tttt查找结果n); printstart(); prin

34、tc(); printe(p); printstart(); else Nofind(); else if(sel=2)/* 姓名 */ printf(请你输入要查找的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) printf(tttt查找结果n); printstart(); printc(); printe(p); printstart(); else Nofind(); else Wrong(); void Del(Link l)/* 删除 */ int sel; Node *p,*r; char findmess2

35、0; if(!l-next) printf(n=提示:没有资料可以删除!n); return; printf(n=1按学号删除n=2按姓名删除n); scanf(%d,&sel); if(sel=1) printf(请你输入要删除的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else if(sel=2) p

36、rintf(请你输入要删除的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else Wrong(); void Modify(Link l) Node *p; char findmess20; if(!l-next) printf(n=提示:没有资料可以修改!n); return; printf(请你输入要修改的学生学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(请你输入新学号(原来是%s):,p-data.num); scanf(%s,p-data.num); printf(请你输入新姓名(原来是%s):,); scanf(%s,); getchar(); printf(请你输入新性别(原来是%s):,p-data.sex); scanf(%s,p-data.se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论