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;jif(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;jif(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;jif(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的用法,以及函数的调用方式。
通过这次实习,我收获很多,感触也颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。
首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这几天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。
其次,在几天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。
再次,通过几天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。
第四,在几天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。
第五,通过几天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。
第六,通过天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。
总之,通过天的实习对我自身有了很大的提高。