C语言课程设计数组游戏.docx

上传人:b****0 文档编号:9056271 上传时间:2023-05-16 格式:DOCX 页数:18 大小:88.11KB
下载 相关 举报
C语言课程设计数组游戏.docx_第1页
第1页 / 共18页
C语言课程设计数组游戏.docx_第2页
第2页 / 共18页
C语言课程设计数组游戏.docx_第3页
第3页 / 共18页
C语言课程设计数组游戏.docx_第4页
第4页 / 共18页
C语言课程设计数组游戏.docx_第5页
第5页 / 共18页
C语言课程设计数组游戏.docx_第6页
第6页 / 共18页
C语言课程设计数组游戏.docx_第7页
第7页 / 共18页
C语言课程设计数组游戏.docx_第8页
第8页 / 共18页
C语言课程设计数组游戏.docx_第9页
第9页 / 共18页
C语言课程设计数组游戏.docx_第10页
第10页 / 共18页
C语言课程设计数组游戏.docx_第11页
第11页 / 共18页
C语言课程设计数组游戏.docx_第12页
第12页 / 共18页
C语言课程设计数组游戏.docx_第13页
第13页 / 共18页
C语言课程设计数组游戏.docx_第14页
第14页 / 共18页
C语言课程设计数组游戏.docx_第15页
第15页 / 共18页
C语言课程设计数组游戏.docx_第16页
第16页 / 共18页
C语言课程设计数组游戏.docx_第17页
第17页 / 共18页
C语言课程设计数组游戏.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C语言课程设计数组游戏.docx

《C语言课程设计数组游戏.docx》由会员分享,可在线阅读,更多相关《C语言课程设计数组游戏.docx(18页珍藏版)》请在冰点文库上搜索。

C语言课程设计数组游戏.docx

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的用法,以及函数的调用方式。

通过这次实习,我收获很多,感触也颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。

首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这几天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。

其次,在几天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。

再次,通过几天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。

第四,在几天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。

第五,通过几天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。

第六,通过天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。

总之,通过天的实习对我自身有了很大的提高。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2