C语言课程设计数组游戏.docx
- 文档编号:23425275
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:18
- 大小:88.11KB
C语言课程设计数组游戏.docx
《C语言课程设计数组游戏.docx》由会员分享,可在线阅读,更多相关《C语言课程设计数组游戏.docx(18页珍藏版)》请在冰豆网上搜索。
C语言课程设计数组游戏
C语言课程设计-数组游戏
前言
计算机对社会发展所具有的广泛而深远的影响。
人类文化的内涵是随着社会发展而进化的。
在现代信息社会中,计算机已不仅仅是一种工具,而且是一种文化。
信息技术对人类社会进行的全方位渗透,已经形成一种新的文化形态——信息时代的计算机文化。
计算机知识成为当代知识分子结构中不可缺少的重要部分。
设计是一门重要的计算机基础课程,通过学习,学生不仅要掌握高级程序设计语言的知识,更重要的是在实践中逐步掌握程序设计的思想和方法,培养问题求解和语言的应用能力。
此次上机实习,不但要使同学们的程序设计能力上一台阶,同时要提高与程序设计和软件开发有关的各种综合能力。
通过这次对C语言的进一步学习,为我们日后学习单片机安打下了基础。
在机电一体化日趋明显的当下,掌握一门计算机语言是多么的重要,这必将为我们机电学院学生日后的发展产生深远的影响。
由于课时和上机时间的仓促,所以我对很多内容还来不及消化,对上机演练十分陌生,还有一些知识遗忘,因而这次程序设计的实习实际上是对我的一次集中的强化练习。
虽然其时间短,任务重,但我们的确达到了此次课程设计的目的。
本次实习得到樊**老师的指导和帮助,至此表示感谢!
第一部分题目要求
数组游戏
【要求】
设有n个正整数(n≤20),将它们连成一排,组成一个最大的多位数。
程序输入:
n个正整数。
程序输出:
n个数连接成的多位数。
【提示】
以下是设计思路:
可以将问题这样变化一下:
比如输入的是123、2、33、1006、12这样几个数字。
先找出最大的数字的位数为4位,再将所有的数字变成4位数:
12302000330010061200
然后进行排序:
33002000123012001006
这样将后面加上的0去掉的序列不就是最大数字吗?
于是最大数字就是:
332123121006。
第二部分程序设计思路
1.需求分析
根据题目要求,输入若干个数字(中间用空格隔开),输入的数字个数不大于20。
然后,让这些数随机连在一起,把组合中的最大数输出。
2.程序总体设计
输入一组数,输出所需要的数。
大致流程图:
3.程序详细设计
3.1主函数
主要负责输入和输出一定的数据。
main()
{
输入数字,
进行一定的处理,
输出数字,
}
流程图
输入一组数字
按字符串进行读取
遇到空格‘’
n=n+1
n=0
Y
N
得到数组a[n]
3.2排序函数(选择法)voidsort(intx[],intn)
将数字按从大到小的顺序排列(如果两个数字相等,交换位置)
voidsort(intx[],intn)/*用选择法将正整数按从大到小排列*/
{
inti,j,k,t;
for(i=0;i { k=i; for(j=i+1;j if(x[j]>=x[k])k=j; if(k! =i) { t=x[i]; x[i]=x[k]; x[k]=t; } } 3.3求位数函数intnum(inty) 求每个数个的位数,以便补位。 intnum(inty)/*求最大数字的位数*/ { inti=0; while(y) { y=y/10; i++; } returni; } 3.4变位函数voidmodificate(intz[],intn); 把排序后的数字变成最高位数。 流程图: 数组a[i] 计算需要补的位数y 新数组a[i]=a[i]×10y 将新数组a[n]排序 用标记数组b[n]记录每个数字的变为数 3.5还原函数voidrevert(intr[],intn); 把进行过补位的数字还原到原来的样子 voidrevert(intr[],intn)/*把变位后的数字还原成原数字*/ { intj,h; for(j=0;j { h=b[j]; while(h) { r[j]=r[j]/10; h--; } } } 流程图: 变位后的数组a[i] 新数组a[i]=a[i]/10h 输出还原后的数组a[n] 使用标记数组b[n]记录的每个数字的变为数h 第三部分程序代码 #include staticintb[20];/*作为标记,记录数字的变位个数*/ main() { voidsort(intx[],intn);/*用选择法将正整数按从大到小排列*/ intnum(inty);/*求数字的位数*/ voidmodificate(intz[],intn);/*变位函数,在数字后面加“0”*/ voidsorts(intx[],inty[],intn);/*把数组和标记数组同时排序*/ voidrevert(intr[],intn);/*还原函数*/ inta[20]; charc; charstr[200]; int*p,i,e,d,f=0,n=0; printf("Pleaseinputafewnumbers(Theamountislessthanorequalto20): \n");/*输入若干个数字(n<=20)*/ gets(str); for(e=0;(c=str[e])! ='\0';e++) { switch(c) { case'1': d=1;break; case'2': d=2;break; case'3': d=3;break; case'4': d=4;break; case'5': d=5;break; case'6': d=6;break; case'7': d=7;break; case'8': d=8;break; case'9': d=9;break; case'0': d=0;break; case'': n++,f=0,d=0;break; default: printf("Error! ! ! \nAttention: Whatyouinputmustbenumber! \n"); } f=f*10+d; a[n]=f; } n=n+1;/*输入数字的个数*/ p=a; sort(p,n); for(i=0;i { b[i]=num(a[0])-num(a[i]); } modificate(a,n); sorts(p,b,n);/*对变位后的所有数字进行排序*/ printf("\nSortthesemodificatednumbers: \n"); for(i=0;i { printf("%d",a[i]); } printf("\n"); revert(p,n); printf("\nThenewnumberis: ");/*按要求输出输入的数*/ for(p=a,i=0;i { printf("%d",*p); p++; } printf("\n\n"); } voidsort(intx[],intn)/*用选择法将正整数按从大到小排列*/ { inti,j,k,t; for(i=0;i { k=i; for(j=i+1;j if(x[j]>=x[k])k=j; if(k! =i) { t=x[i]; x[i]=x[k]; x[k]=t; } } } intnum(inty)/*求最大数字的位数*/ { inti=0; while(y) { y=y/10; i++; } returni; } voidmodificate(intz[],intn)/*通过在数字后面加一定数目的“0”后,将所有的数字变为最高位*/ { inti,k,maxnum; maxnum=num(z[0]); for(i=0;i { k=maxnum-num(z[i]); while(k) { z[i]=z[i]*10; k--; } } } voidsorts(intx[],inty[],intn)/*正整数按从大到小排列*/ { inti,j,k,t,w; for(i=0;i { k=i; for(j=i+1;j if(x[j]>=x[k])k=j; if(k! =i) { t=x[i]; x[i]=x[k]; x[k]=t; w=b[i]; b[i]=b[k]; b[k]=w; } } } voidrevert(intr[],intn)/*把变位后的数字还原成原数字*/ { intj,h; for(j=0;j { h=b[j]; while(h) { r[j]=r[j]/10; h--; } } } 第四部分设计数据和运行结果 4.1运用举例的数据进行验证 需要输入一组数字 进行输入 运行结果 4.2自行设计数据进行验证 输入一组数字 进行输入 运行结果 第五部分所遇问题及解决方案 5.1数字的输入问题 当定义的数组(int)为a[20]时,如果输入的数字个数小于20个,那么剩下的元素将会被赋予初值“0”。 如果这样的话,在数组的最后输出时,就会在所输入的数字所组成的最大数字的后面多加一定数量的“0”,这样就得不到预期的效果。 比如: 12343674563235,在输出它们组成的最大的数字中,正确结果为45633673423512,但是输出的结果却是45633673423512000000000000000。 这是因为输入数字的个数为5,那么数组的其余15个元素会被赋“0”值,自然会在输出结果后面加上15个“0”。 进过思考后,决定以字符(char)的形式输入,再将字符转换为数字。 这样做的好处是: (1)可以很快的计算出所输入数字的个数n; (2)通过以上计算,就可以确定所需数组的长度a[n];(3)这样还避免了不必要的计算时间和存储空间。 5.2switch和break的用法 在把字符转换为数字时,发现“0~9”的ASCⅡ代码值与其本身不相等(char1的值不等于int1),所以选用了switch机构来实现。 这是break的使用就必须注意一下,可以说break使用错误会使结果完全不同。 正确的使用方法为: switch(c) { case'1': d=1;break; case'2': d=2;break; case'3': d=3;break; case'4': d=4;break; case'5': d=5;break; case'6': d=6;break; case'7': d=7;break; case'8': d=8;break; case'9': d=9;break; case'0': d=0;break; case'': n++,f=0,d=0;break; default: printf("Error! ! ! \nAttention: Whatyouinputmustbenumber! \n"); } 如果将以上语句该为: switch(c) { case'1': d=1; case'2': d=2; case'3': d=3; case'4': d=4; case'5': d=5; case'6': d=6; case'7': d=7; case'8': d=8; case'9': d=9; case'0': d=0; case'': n++,f=0,d=0;break; default: printf("Error! ! ! \nAttention: Whatyouinputmustbenumber! \n"); } 那么,数组a[n]的值都将是1234567890,。 所以,break的准确使用是很重要的。 5.3数组排序问题 在这次程序设计中,特别要注意的是在补位后相等的那些数字,如12120,343400,450045等。 变位后再排序时,如果处理不当。 就会出现12012,340034,450045的不正确的结果。 我是这样处理的: 第一步: 在确定数组元素的之后,将其按从大到小排序,得到新的数组a[n],这样就把小的数字放在数字后面。 第二步: 将变为后的数组按从大到小排序,相等的数字交换位置,在还原为原来的数字。 类似12120,343400,450045等,会变为12120,343400,454500。 这样就保证了结果的正确性。 5.4标记数组的使用 在还原数字的时候,因为不知道那些数字进行了变位,所以致使程序无法运行。 这就需要用一些东西来记录所变位的数字,记录其变位的个数。 我选用了标记数组b[n],其下标随数组a[n]的改变而改变,这就将解决了还原阶段遇到的问题。 5.5最后结果的输出 题目要求的是最后的结果必须是一个数字,所以,我觉得只要结果看上去是一个数就行了,不必将数组在变位一个数。 于是,我把最后的数组的输出格式中,取消了它们各自之间的间隔,最后的结果就看上去是一个数字了。 具体操作: printf("%d",*p)该为printf("%d",*p),这样就完成了正确结果的输出。 以上遇到的问题是我切实遇到的,它们的解决进一步提升了我的C语言知识。 可以说,在解决问题的过程中,我学到了很多自己平时不注意的地方。 第六部分总结与感受 上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁,更需要通过编程的实践来真正掌握它。 刚开始基本上都是在看书,把基本知识再熟悉一遍。 接着,只是在照着书上写一些程序模块,感觉异常艰难。 但是还是有很大的收获,学到了一些东西。 而看了两天书之后,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。 但是,写了一部分程序后,我们由不得不再次陷入困境。 在整个程序的编写过程中。 最难的就是补位和还原这两个模块,这也是我要解决的重点问题。 开始编写补位和还原时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。 困难之时,我通过上网查资料,了解所需语句的具体功能,完成了补位和还原。 这样的话,整个程序基本上全部完成了,就剩下完善工作了。 程序中遇到的困难及解决的思路: 1.数字的读取。 使用数组时不能按要求排序,只能把数字当作字符串来读取,这样增加了程序的运行效率。 2.标记函数的使用,必须知道那些数字发生了变位,记录其补位的个数。 3.所需的数字在输出时,它不是一个数字,而还是一个数组,只是改变了它们的输出格式,让他们外表看上去像一个数。 4.我深刻了解了switch和break的用法,以及函数的调用方式。 通过这次实习,我收获很多,感触也颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。 首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这几天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。 其次,在几天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。 再次,通过几天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。 第四,在几天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。 第五,通过几天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。 第六,通过天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。 总之,通过天的实习对我自身有了很大的提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 数组 游戏