1、C语言课程设计数组游戏C语言课程设计-数组游戏前言计算机对社会发展所具有的广泛而深远的影响。人类文化的内涵是随着社会发展而进化的。在现代信息社会中,计算机已不仅仅是一种工具,而且是一种文化。信息技术对人类社会进行的全方位渗透,已经形成一种新的文化形态信息时代的计算机文化。计算机知识成为当代知识分子结构中不可缺少的重要部分。设计是一门重要的计算机基础课程,通过学习,学生不仅要掌握高级程序设计语言的知识,更重要的是在实践中逐步掌握程序设计的思想和方法,培养问题求解和语言的应用能力。此次上机实习,不但要使同学们的程序设计能力上一台阶,同时要提高与程序设计和软件开发有关的各种综合能力。通过这次对C语言
2、的进一步学习,为我们日后学习单片机安打下了基础。在机电一体化日趋明显的当下,掌握一门计算机语言是多么的重要,这必将为我们机电学院学生日后的发展产生深远的影响。由于课时和上机时间的仓促,所以我对很多内容还来不及消化,对上机演练十分陌生,还有一些知识遗忘,因而这次程序设计的实习实际上是对我的一次集中的强化练习。虽然其时间短,任务重,但我们的确达到了此次课程设计的目的。本次实习得到樊*老师的指导和帮助,至此表示感谢 !第一部分 题目要求数组游戏【要求】 设有n个正整数(n20),将它们连成一排,组成一个最大的多位数。程序输入:n个正整数。程序输出:n个数连接成的多位数。 【提示】 以下是设计思路:
3、可以将问题这样变化一下: 比如输入的是123、2、33、1006、12这样几个数字。 先找出最大的数字的位数为4位,再将所有的数字变成4位数:12302000 3300 1006 1200然后进行排序:33002000 1230 1200 1006这样将后面加上的0去掉的序列不就是最大数字吗?于是最大数字就是:332123121006。 第二部分 程序设计思路1.需求分析根据题目要求,输入若干个数字(中间用空格隔开),输入的数字个数不大于20。然后,让这些数随机连在一起,把组合中的最大数输出。2.程序总体设计输入一组数,输出所需要的数。大致流程图:3.程序详细设计3.1主函数主要负责输入和输出
4、一定的数据。main( ) 输入数字, 进行一定的处理, 输出数字,流程图输入一组数字按字符串进行读取遇到空格 n=n+1n=0YN得到数组an3.2排序函数(选择法)void sort(int x,int n)将数字按从大到小的顺序排列(如果两个数字相等,交换位置)void sort(int x,int n) /*用选择法将正整数按从大到小排列*/ int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;j=xk)k=j; if(k!=i) t=xi; xi=xk; xk=t; 3.3求位数函数int num(int y)求每个数个的位数,以便补位。int
5、num(int y) /*求最大数字的位数*/ int i=0; while(y) y=y/10; i+; return i;3.4变位函数void modificate(int z,int n);把排序后的数字变成最高位数。流程图:数组ai计算需要补的位数y新数组ai=ai10y将新数组a n排序用标记数组bn记录每个数字的变为数3.5 还原函数void revert(int r,int n);把进行过补位的数字还原到原来的样子void revert(int r,int n) /*把变位后的数字还原成原数字*/ int j,h; for(j=0;jn;j+) h=bj; while(h) r
6、j=rj/10; h-; 流程图:变位后的数组ai新数组ai=ai/10h输出还原后的数组a n使用标记数组bn记录的每个数字的变为数h第三部分 程序代码#includestatic int b20; /*作为标记,记录数字的变位个数*/main() void sort(int x,int n); /*用选择法将正整数按从大到小排列*/ int num(int y); /*求数字的位数*/ void modificate(int z,int n); /*变位函数,在数字后面加“0”*/ void sorts(int x,int y,int n); /*把数组和标记数组同时排序*/ void r
7、evert(int r,int n); /*还原函数*/ int a20; char c; char str200; int *p,i,e,d,f=0,n=0; printf(Please input a few numbers(The amount is less than or equal to 20):n); /*输入若干个数字(n=20)*/ gets(str); for(e=0;(c=stre)!=0;e+) switch(c) case1: d=1;break; case2: d=2;break; case3: d=3;break; case4: d=4;break; case5:
8、 d=5;break; case6: d=6;break; case7: d=7;break; case8: d=8;break; case9: d=9;break; case0: d=0;break; case : n+,f=0,d=0;break; default:printf(Error!nAttention:What you input must be number!n); f=f*10+d; an=f; n=n+1; /*输入数字的个数*/ p=a; sort(p,n); for(i=0;in;i+) bi=num(a0)-num(ai); modificate(a,n); sort
9、s(p,b,n); /*对变位后的所有数字进行排序*/ printf(nSort these modificated numbers:n); for(i=0;in;i+) printf(%d ,ai); printf(n); revert(p,n); printf(nThe new number is: ); /*按要求输出输入的数*/ for(p=a,i=0;in;i+) printf(%d,*p); p+; printf(nn);void sort(int x,int n) /*用选择法将正整数按从大到小排列*/ int i,j,k,t; for(i=0;in-1;i+) k=i; for
10、(j=i+1;j=xk)k=j; if(k!=i) t=xi; xi=xk; xk=t; int num(int y) /*求最大数字的位数*/ int i=0; while(y) y=y/10; i+; return i;void modificate(int z,int n) /*通过在数字后面加一定数目的“0”后,将所有的数字变为最高位*/ int i,k,maxnum; maxnum=num(z0); for(i=0;in;i+) k=maxnum-num(zi); while(k) zi=zi*10; k-; void sorts(int x,int y,int n) /*正整数按从
11、大到小排列*/ int i,j,k,t,w; for(i=0;in-1;i+) k=i; for(j=i+1;j=xk)k=j; if(k!=i) t=xi; xi=xk; xk=t; w=bi; bi=bk; bk=w; void revert(int r,int n) /*把变位后的数字还原成原数字*/ int j,h; for(j=0;jn;j+) h=bj; while(h) rj=rj/10; h-; 第四部分 设计数据和运行结果4.1 运用举例的数据进行验证需要输入一组数字进行输入运行结果4.2 自行设计数据进行验证输入一组数字进行输入运行结果第五部分 所遇问题及解决方案5.1 数
12、字的输入问题当定义的数组(int)为a20时,如果输入的数字个数小于20个,那么剩下的元素将会被赋予初值“0”。如果这样的话,在数组的最后输出时,就会在所输入的数字所组成的最大数字的后面多加一定数量的“0”,这样就得不到预期的效果。比如:12 34 367 4563 235,在输出它们组成的最大的数字中,正确结果为45633673423512,但是输出的结果却是45633673423512000000000000000。这是因为输入数字的个数为5,那么数组的其余15个元素会被赋“0”值,自然会在输出结果后面加上15个“0”。进过思考后,决定以字符(char)的形式输入,再将字符转换为数字。这样
13、做的好处是:(1)可以很快的计算出所输入数字的个数n;(2)通过以上计算,就可以确定所需数组的长度an;(3)这样还避免了不必要的计算时间和存储空间。5.2 switch和break的用法 在把字符转换为数字时,发现“09”的ASC代码值与其本身不相等(char1的值不等于int1),所以选用了switch机构来实现。这是break的使用就必须注意一下,可以说break使用错误会使结果完全不同。正确的使用方法为:switch(c) case1: d=1;break; case2: d=2;break; case3: d=3;break; case4: d=4;break; case5: d=5
14、;break; case6: d=6;break; case7: d=7;break; case8: d=8;break; case9: d=9;break; case0: d=0;break; case : n+,f=0,d=0;break; default:printf(Error!nAttention:What you input must be number!n); 如果将以上语句该为:switch(c) case1: d=1; case2: d=2; case3: d=3; case4: d=4; case5: d=5; case6: d=6; case7: d=7; case8:
15、d=8; case9: d=9; case0: d=0; case : n+,f=0,d=0;break; default:printf(Error!nAttention:What you input must be number!n); 那么,数组an的值都将是1234567890,。所以,break的准确使用是很重要的。5.3数组排序问题在这次程序设计中,特别要注意的是在补位后相等的那些数字,如12 120,34 3400,4500 45等。变位后再排序时,如果处理不当。就会出现12012,340034,450045的不正确的结果。我是这样处理的:第一步:在确定数组元素的之后,将其按从大到
16、小排序,得到新的数组an,这样就把小的数字放在数字后面。 第二步:将变为后的数组按从大到小排序,相等的数字交换位置,在还原为原来的数字。类似12 120,34 3400,4500 45等,会变为12 120,34 3400,45 4500。这样就保证了结果的正确性。5.4 标记数组的使用在还原数字的时候,因为不知道那些数字进行了变位,所以致使程序无法运行。这就需要用一些东西来记录所变位的数字,记录其变位的个数。我选用了标记数组bn,其下标随数组an的改变而改变,这就将解决了还原阶段遇到的问题。5.5 最后结果的输出题目要求的是最后的结果必须是一个数字,所以,我觉得只要结果看上去是一个数就行了,
17、不必将数组在变位一个数。于是,我把最后的数组的输出格式中,取消了它们各自之间的间隔,最后的结果就看上去是一个数字了。具体操作:printf(%d ,*p) 该为printf(%d,*p),这样就完成了正确结果的输出。 以上遇到的问题是我切实遇到的,它们的解决进一步提升了我的C语言知识。可以说,在解决问题的过程中,我学到了很多自己平时不注意的地方。第六部分 总结与感受上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁,更需要通过编程的实践来真正掌握它。刚开始基本上都是在看书,把基本知识再熟悉一遍。接着,只是在照着书上写一些程序模块,感觉异常艰难。但是还是有很大的收获,学到了一些
18、东西。而看了两天书之后,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。但是,写了一部分程序后,我们由不得不再次陷入困境。在整个程序的编写过程中。最难的就是补位和还原这两个模块,这也是我要解决的重点问题。开始编写补位和还原时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。困难之时,我通过上网查资料,了解所需语句的具体功能,完成了补位和还原。这样的话,整个程序基本上全部完成了,就剩下完善工作了。程序中遇到的困难及解决的思路:1. 数字的读取。使用数组时不能按要求排序,只能把
19、数字当作字符串来读取,这样增加了程序的运行效率。 2. 标记函数的使用,必须知道那些数字发生了变位,记录其补位的个数。3. 所需的数字在输出时,它不是一个数字,而还是一个数组,只是改变了它们的输出格式,让他们外表看上去像一个数。4.我深刻了解了switch和break的用法,以及函数的调用方式。通过这次实习,我收获很多,感触也颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这几 天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。其次,在几天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。再次,通过几天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。第四,在几天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。第五,通过几天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。第六,通过天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。总之,通过天的实习对我自身有了很大的提高。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1