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#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;ix=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\DIthehis:
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语言的知识,把不熟悉的变熟悉了
如递归、数组、指针)