C语言课设Word下载.docx
《C语言课设Word下载.docx》由会员分享,可在线阅读,更多相关《C语言课设Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
二、总体设计
1、因为计算机存储的都是ASCII码,查表可知空格符、制表符、换行符的ASCII码值分别为32、9、10。
要判断是否输入完毕,所以也需要知道CTRL+Z输入的字符在计算机中对应什么,查询可知CTRL+Z输入的字符在计算机中对应EOF结束标志。
(经过操作输入CTRL+Z无法结束,所以改为输入为1时结束)
流程图如下:
2、达依尔要求:
第一个格子1粒麦子,第二个格子2粒麦子,第三个格子4粒麦子,……以后每一小格都比前一个小格的麦粒数增加一倍,直到64个小格子为止。
可知:
第i个格子的麦粒数为
(i=1,2,...,64),所以总数为:
可以用for循环做。
(在c语言中有两种方法计算
,直接调用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、梯形法计算
:
定步长:
若有
,则用梯形法有
5、本题要求输入的字符串中多于一个的空格符合并为一个,因此可以在输入每个字符时判断它是否为空格符。
若是,则接下来的空格符不输出输出。
6、注意数组的大小,因为要插入一个字母。
将输入的字母和原序列的字母按顺序比较ascii码值大小。
确定好位置后,将该位置后的字母按顺序后移一个单位,然后插入该字母。
三、详细设计
1、程序及注释
#include<
stdio.h>
string.h>
main()
{
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)Enter++;
//当输入的字符的ASCII码等于10(即回车键的ASCII码值)时,Enter加一
scanf("
//输入一个字符
}
thenumberofSpace:
%d\n"
Space);
//输出显示这串字符串的空格键个数
thenumberofTab:
Tab);
//输出显示这串字符串的制表键个数
thenumberofEnter:
Enter);
//输出显示这串字符串的回车键个数
system("
pause"
//加上这句语句,可以看到结果;
否则运行界面只会闪一下
}
2、程序及注释
①采用pow函数计算2的i次方。
math.h>
voidmain()
doublesum=0;
//定义双精度变量
inti;
for(i=0;
i<
64;
i++)//进行64次循环
sum=sum+pow(2,i);
//累加求和
thenumberofqrainis:
%lf\n"
sum);
//显示结果
②采用for循环方式计算2的i次方。
doublex,sum=0;
inti,n;
for(n=0;
n<
n++)//进行64次循环计算sum
x=1;
for(i=0;
i<
n;
i++)//进行循环计算2的i次方
x=2*x;
//循环结束后x=2的i次方
sum=sum+x;
//循环结束后sum为最后结果
3、
move(intn,charx,chary,charz)//定义调用函数move()
if(n==1)
movediskfromposition%cto%c\n"
x,z);
else
move(n-1,x,z,y);
//调用move()函数
printf("
move(n-1,y,x,z);
intmain(void)
intn;
inputdiskesnumber:
%d"
&
n);
//从键盘上输入n的值
thesteptomoving%ddiskes:
n);
move(n,'
A'
'
B'
C'
4、程序及注释
doublefunc(doublex)//定义调用函数func(),计算sin(x)/x的值
if(x!
=0)
returnsin(x)/x;
return1;
doublei,y,h,n;
y=0;
%lf/n"
h);
//输入步长值
n=1/h;
i++)
y=y+0.5*h*(func(i*h)+func((i+1)*h));
//梯形法计算
thehis:
%lf\n"
h);
//显示步长
theresultofintegrationis:
%.10lf\n"
y);
//显示求和结果
5、程序及注释
charc,lastc='
c'
;
//定义字符变量,给lastc初值为“c”
printf("
scanf("
while(c!
=EOF)//当输入ctrl+z时结束循环
{
if(c!
=32)
putchar(c);
//输出字符
lastc=c;
//将输入的字符值给lastc
&
if(lastc!
=32)putchar(c);
//当lastc的ascii码值不为32(即输入空格键)时,输出字符
//输入一个字符
}
6、程序及注释
{
charstr[10]={'
a'
b'
d'
f'
h'
j'
l'
p'
t'
};
inti,j,k;
pleaseinputaalpha\n"
if((c<
'
)||(c>
z'
))return(0);
if((c>
Z'
)&
&
(c<
))c=c+32;
//当输入的字符为大写字母时,转换为小写字母
8;
=str[i])&
str[i+1]))
k=i+1;
if(c>
=str[8])
k=9;
for(j=8;
j>
=k;
j--)
str[j+1]=str[j];
str[k]=c;
theresultis:
);
%s"
str);
四、程序运行结果测试与分析
1、结果:
分析:
由于当我使用EOF作为结束符时,当我在窗口输入ctrl+Z时并不能结束,当我把结束符改为数字1就可以了,所以我用数字1作为结束符。
2、两种方法结果一样:
一开始定义x,sum为整型变量,结果答案出来有问题(结果为0);
经过计算发现结果非常大,所以定义x,sum双精度型变量。
3、因为当n=64结果太多不好观察,下面取n=2和n=4
n=2:
n=4:
因为如果n=64的话,结果就非常长,所以我用n=2和4做为示范。
4、结果:
当步长h=0.0001时:
当步长h=0.01时:
由书上可知实际值为0.946081;
我采用的是定步长梯形法,所以当h越小越接近实际值。
5、结果:
6、结果:
五、结论与心得
总的来说,本次C语言课程设计的小题都比较简单。
其实一开始我是想选大题的,不过由于时间关系和大题的程序编写比较复杂,所以我只看了下理解了一下,报告选择做小题。
在做第一个小题字符类型统计器时,我遇到了个问题:
就是结束符为EOF时,我在运行窗口输入ctrl+Z无法结束程序(以前我用win32位平台的vc++和win-tc能成功,但现在用win64位平台的democ、vc++和vs2013就不能成功)。
这个问题始终没能解决,我觉得有可能是操作平台的原因。
所以最后结束符我用数字1代替。
在做第三个小题汉诺塔时,对递归操作理解并不深刻,所以花了不少时间做。
在做第四个小题梯形法时,一开始我用的定步长,到最后的时候我想用变步长(加倍减半法)试试,加倍减半法确定步长循环结束有点复杂,由于时间关系并没有做。
这次实验相当于让我重新学习了一遍C语言的知识,把不熟悉的变熟悉了(如递归、数组、指针)。