C语言课设.docx

上传人:b****8 文档编号:10506245 上传时间:2023-02-17 格式:DOCX 页数:17 大小:178.98KB
下载 相关 举报
C语言课设.docx_第1页
第1页 / 共17页
C语言课设.docx_第2页
第2页 / 共17页
C语言课设.docx_第3页
第3页 / 共17页
C语言课设.docx_第4页
第4页 / 共17页
C语言课设.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

C语言课设.docx

《C语言课设.docx》由会员分享,可在线阅读,更多相关《C语言课设.docx(17页珍藏版)》请在冰豆网上搜索。

C语言课设.docx

C语言课设

一、需求分析

所做题号为1,包含6个小题,分别如下:

1、字符类型统计器:

编写程序,在终端用键盘输入字符串,以CTRL+Z组合表示输入完毕,统计输入的字符串中空格符、制表符、换行符的个数,并显示统计结果。

2、舍罕王的失算:

相传国际象棋是古印度舍罕王的宰相达依尔发明的。

罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。

这位聪明的宰相指着8*8

共64格的象棋棋盘说:

“陛下,请您赏给我一些麦子吧。

就在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上64格,我就感激不尽了。

”舍罕王让人扛来一袋麦子,他要兑现他的许诺。

请问,国王共要多少麦子赏赐他的宰相?

3、汉诺塔:

一块板上有三根针:

A、B、CoA针上套有64个大小不等的圆盘,大的在下,小的在上,如下图所示。

要把这64个圆盘从A针移动到C针上,每次只能移动一个圆盘,移动可以借助B针进行。

但在任何时候,任何针的圆盘都必须保持大盘在下,小盘在上。

求移动的步骤。

64牛盘子

1

11

1一r」

L

C

4、用递推化梯形法求定积分:

I=i^dx的值。

氐x

5、算法设计题:

输入一个字符串并将它输出,以ctrl+z组合键表示输入完

毕,要求将输入的字符串中多于一个的连续空格符合并为1个。

6、一个有序的字母序列:

a,b,d,f,h,j,l,p,t;编写一个程序,要求

从终端输入一个字幕,将该字母插入这个序列中使得字母序列依然保持有序,然后输出新的字母序列。

注意:

如果输入的字母在原序列中存在,就将该字母插入到已存在字母的后面。

二、总体设计

1因为计算机存储的都是ASCII码,查表可知空格符、制表符、换行符的ASCII码值分别为32、9、100要判断是否输入完毕,所以也需要知道CTRL+Z输入的字符在计算机中对应什么,查询可知CTRL+Z输入的字符在计算机中对

应EOF结束标志。

(经过操作输入CTRL+Z无法结束,所以改为输入为1时结束)

流程图如下:

2、达依尔要求:

第一个格子1粒麦子,第二个格子2粒麦子,第三个格子

4粒麦子,……以后每一小格都比前一个小格的麦粒数增加一倍,直到64个小

64

格子为止。

可知:

第i个格子的麦粒数为2i-1(i=1,2,...,64),所以总数为:

送2i-1

i=1

可以用for循环做。

(在c语言中有两种方法计算2i-1,直接调用pow函数或者采用for循环)

流程图:

 

3、因为要大盘在上,小盘在下。

所以这样移动:

(1)现将第1~63个盘子移到B针上,保证大盘在下小盘在上。

(2)再将最下面的盘子移动到C针上。

(3)将B针上的63个盘子移到C针上。

关键在于第

(1)步和第(3)步,由于每次只能移动一个圆盘,所以在移动过程中必须要借助另外一根针,即第

(1)步将第1~63个盘子借助C针移到B针上;第(3)步将B针上的63个盘子借助A针移到C针上。

这又是两个新的汉诺塔问题。

将上第1~63个盘子借助C针移到B针上:

(1)将A针第1~62个盘子借助B针移到C针上,保证大盘在下小盘在上。

(2)再将最下面的(第63个)盘子移动到B针上。

(3)将C针上的62个盘子借助A针移到B针上。

将B针上的63个盘子借助A针移到C针上:

(1)将B针第1~62个盘子借助C针移到A针上,保证大盘在下小盘在上。

(2)再将最下面的(第63个)盘子移动到C针上。

(3)将A针上的62个盘子借助B针移到C针上。

这明显是一个递归问题

流程图:

4梯形法计算T号dx:

定步长:

若有型二f(x),则用梯形法有yki二ykh(f(k)f(k1))dx2

流程图:

5、本题要求输入的字符串中多于一个的空格符合并为一个,因此可以在输入每个字符时判断它是否为空格符。

若是,则接下来的空格符不输出输出。

流程图:

6、注意数组的大小,因为要插入一个字母。

将输入的字母和原序列的字母按顺序比较ascii码值大小。

确定好位置后,将该位置后的字母按顺序后移一个单位,然后插入该字母。

流程图:

三、详细设计

1程序及注释#include#includemain(){

charc;〃定义字符变量

intSpace=0,Tab=0,Enter=0//定义整型变量

printf("Pleaseinputastring:

\n');〃在运行窗口显示“Pleaseinputastring(:

请输入一段字符串)”

scanf("%c",&c);〃输入一个字符

while(c!

='1/'当输入字符不为ctrl+z时,运行while里面的语句

{

if(c==32)Space++〃当输入的字符的ASCII码等于32(即空格键的

ASCII码值)时,Space加一

elseif(c==9)Tab++;//当输入的字符的ASCII码等于9(即制表键的ASCII码值)时,Tab加一

elseif(c==10)Ente叶+;//当输入的字符的ASCII码等于10(即回车键的ASCII码值)时,Enter加一

scanf('%c",&c);//输入一个字符

}

printf("thenumberofSpace:

%d\n"Space);//输出显示这串字符串的空格键个数

printf("thenumberofTab:

%d\n",Tab);〃输出显示这串字符串的制表键个数printf("thenumberofEnter:

%d\n",Enter);//输出显示这串字符串的回车键个数system('pause");〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

2、程序及注释

①采用pow函数计算2的i次方。

#include#includevoidmain()

{」

doublesum=0〃定义双精度变量

inti;//定义整型变量

for(i=0;i<64;i++)〃进行64次循环sum=sum+pow(2,i);〃累加求和

printf("thenumberofqrainis:

%lf\n",sum);//显示结果

system('pause");〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

②采用for循环方式计算2的i次方。

#include

#include

voidmain()

{

doublex,sum=0〃定义双精度变量

inti,n;〃定义整型变量

for(n=0;n<64;n++)〃进行64次循环计算sum

{

x=1;

for(i=0;i

x=2*x;〃循环结束后x=2的i次方

sum=sum+刈循环结束后sum为最后结果

}

printf("thenumberofqrainis:

%lf\n",sum);//显示结果

system('pause");〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

3、

#include

move(intn,charx,chary,charz)〃定义调用函数move()

{

if(n==1)

printf("movediskfromposition%cto%c\n",x,z);

else

{

move(n-1,x,z,y);〃调用move()函数

printf("movediskfromposition%cto%c\n",x,z);

move(n-1,y,x,z);〃调用move()函数

}

}

intmain(void)

{

intn;〃定义整型变量

printf("inputdiskesnumber:

\n");

scanf("%d",&n);〃从键盘上输入n的值

printf("thesteptomoving%ddiskes:

\n:

n);

move(n,'A','B',C);〃调用move()函数

system('pause");〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

4、程序及注释

#include

#include

doublefunc(doublex)//定义调用函数func(),计算sin(x)/x的值

{

if(x!

=O)

returnsin(x)/x;

else

return1;

}

intmain(void)

{

doublei,y,h,n;〃定义双精度变量

y=0;

scanf('%lf/n",&h);〃输入步长值

n=1/h;

for(i=0;i

{

y=y+0.5*h*(func(i*h)+func((i+1)*h));//梯形法计算

_}

printf("thehis:

%lf\n",h);//显示步长

printf("theresultofintegrationis%10lf\n",y);//显示求和结果system('pause');〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

5、程序及注释

#include

#include

main()

{

charc,lastc='c';//定义字符变量,给lastc初值为“c”

printf("Pleaseinputastring:

\n‘);

scanf(%c",&c);〃输入一个字符

while(c!

=EOF)〃当输入ctrl+z时结束循环

{

if(c!

=32)

{

putchar(c)〃输出字符

lastc=c〃将输入的字符值给lastc

scanf(,%c",&c);//输入一个字符

}

else

{

if(lastc!

=32)putchar(c);//当lastc的ascii码值不为32(即输入空格键)时,输出字符

lastc=c〃将输入的字符值给lastc

scanf(,%c",&c);〃输入一个字符

}

}

system('pause');〃加上这句语句,可以看到结果;否则运行界面只会闪一下

6、程序及注释#include

#include

main()

{

charc;〃定义字符变量

charstr[10]={'a','b','d','f,'h','j',T,'p','t'};

inti,j,k;〃定义整型变量

printf("pleaseinputaalpha'n";

scanf('%c",&c);〃输入一个字符

if((cv'A')||(c>'z'))return(0);

if((c>'Z')&&(c<'a'))return(0);

if((c>'A')&&(c<'Z'))c=c+32;〃当输入的字符为大写字母时,转换为小写字母for(i=0;i<8;i++)

{

if((c>=str[i])&&(c

}

if(c>=str[8])

k=9;

for(j=8;j>=k;j--)

str[j+1]=str[j];

str[k]=c;

printf("theresultis:

\n");

printf("%s",str);

system('pause');〃加上这句语句,可以看到结果;否则运行界面只会闪一下

}

四、程序运行结果测试与分析

1、结果:

QC:

\U5ers\Admini5tr3tor\document5\vi5iJ8lstudio2D13\Project&\CjS^W^\Debug\,..—□X

pleaseinput,astring:

daf1.jcnl:

rh:

c

adx

da1

thenumberofSpace:

8

thenuniberofTab*3

thenuinberofEnter:

2

猜按任意键继续•…

分析:

由于当我使用EOF作为结束符时,当我在窗口输入ctrl+Z时并不能结束,

当我把结束符改为数字1就可以了,所以我用数字1作为结束符

2、两种方法结果一样:

!

3C:

\Users\Administrator\documents\visualstudio201閃Prqjects'C這言程

Ithenumberofqrainis:

18446744073709552000.000000

Ji青按任意键继续・・■

分析:

一开始定义x,sum为整型变量,结果答案出来有问题(结果为0);经过

计算发现结果非常大,所以定义x,sum双精度型变量。

3、因为当n=64结果太多不好观察,下面取n=2和n=4n=2:

SC:

\Users\Adrninistratar\documents\v^sualstudio2013\Prcjjects\C^'^1§^\Debug\.JJ

inputdiskesnuiriber:

2

thesteptomoving2diskes:

tnovediskfrompositioriAtoBpnovediskfrompositionAtoCpnovediskfrompositionBtciC士3V-fJizLJ-jiZkLid-

n=4:

分析:

因为如果n=64的话,结果就非常长,所以我用n=2和4做为示范。

4、结果:

当步长h=0.0001时:

HC:

\Users\Administrator\D

Ithehis:

0.000100

■theresultofintegrationis9460830701

[请按任意诞继续•”•

当步长h=0.01时:

3C:

\Users\Administrator\Documents\VisualStudio2013\Projects\C®W®^\Debug\„—□X

p.01

thehis:

0.010000

theresultofintegrationis:

0*9460305606

卜青按任意键继续••・

分析:

由书上可知实际值为0.946081;我采用的是定步长梯形法,所以当h越小越接近实际值。

5、结果:

3C:

\Users\AdmiriiStrator\documeritsXvisuaIstudio2013\Projects\CT«W®^\Debug\.-—□X

Pleaseinputastring!

VidianUniversity

|puzhaofuZ

OC:

\Users\Administrator\docurmente\visualstudio201越Projects'C语言程序\。

亡民目\“.—

X

pleaseinputaalpha

k

theresultis:

abdfhjklpt请按EStSM续・“•

□IC:

\Users\Administrator\documents\visuaIstudio2013\Projects\Cic^§^\Debug\h,.—□X

hleaseinputaalphad

theresultisIabddfhjlptlt按任意键继续•..

五、结论与心得

总的来说,本次C语言课程设计的小题都比较简单。

其实一开始我是想选大题的,不过由于时间关系和大题的程序编写比较复杂,所以我只看了下理解了一下,报告选择做小题。

在做第一个小题字符类型统计器时,我遇到了个问题:

就是结束符为EOF时,我在运行窗口输入ctrl+Z无法结束程序(以前我用win32位平台的vc++和win-tc能成功,但现在用win64位平台的democ、vc++和vs2013就不能成功)。

这个问题始终没能解决,我觉得有可能是操作平台的原因。

所以最后结束符我用数字1代替。

在做第三个小题汉诺塔时,对递归操作理解并不深刻,所以花了不少时间做。

在做第四个小题梯形法时,一开始我用的定步长,到最后的时候我想用变步长(加倍减半法)试试,加倍减半法确定步长循环结束有点复杂,由于时间关系并没有做。

这次实验相当于让我重新学习了一遍C语言的知识,把不熟悉的变熟悉了

如递归、数组、指针)

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

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1