C语言课设.docx
- 文档编号:10506245
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:17
- 大小:178.98KB
C语言课设.docx
《C语言课设.docx》由会员分享,可在线阅读,更多相关《C语言课设.docx(17页珍藏版)》请在冰豆网上搜索。
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
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
{」
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语言的知识,把不熟悉的变熟悉了 如递归、数组、指针)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言
![提示](https://static.bdocx.com/images/bang_tan.gif)