C程序设计实验报告
姓名:黄静微 实验地点:家 实验时间:2020.03.25
实验项目
5.3.1 练习2 求数列的和
5.3.2 求水仙花数
5.3.4 十进制转换
5.3.5 练习1 百马百担问题
5.3.5 练习2 求等差数列
5.3.5 练习3 食品分配问题
九九乘法表
一、实验目的与要求
- 熟悉循环嵌套的使用方法
- 巩固对循环的概念
- 掌握用for语句实现循环的方法
- 掌握用while语句实现循环的方法
- 掌握do···while语句实现循环的方法
- 练习while和for语句配合实现循环的方法
二、实验内容
1、实验练习:5.3.1 练习2 求数列的和
问题的简单描述:
编写程序,求数列1,-3!,5!,-7!,···,(-1)n-1(2n-1)!前n项的和。
流程图:
实验代码:
#include
main()
{
int n,i,j,sign=1;
float fac,sum;
printf("Please input value of n:");
scanf("%d",&n);
sum=0.0;
for(i=1;i<=n;i++)
{
fac=1.0;
for(j=1;j<=2*i-1;j++)
{
fac=fac*j;
}
fac=fac*sign;
sum=sum+fac;
sign=-sign;
}
printf("sum=%.0f\n",sum);
}
问题分析:
在写这个程序的时候,外循环的表达式条件表达式和循环变量表达式写错了,虽然编译没有问题,但是得不出正确得结果。经过老师和同学的讲解将错误改正,获得正确的运行结果。
2、实验练习:5.3.2 求水仙花数
问题的简单描述:
求所有的水仙花数(水仙花数是一个3位自然数,该数各位数的立方和等于该数本身,如153为水仙花数13+53+33)。
流程图
实验代码:
#include
main()
{
int x,y,z;
int k=100;
while(k<=999)
{
x=k/100;
y=(k/10)%10;
z=k%10;
if(k==x*x*x+y*y*y+z*z*z)
printf("%d\n",k);
k++;
}
}
问题分析:
判断是否为水仙花数的程序在之前已经有过学习,所以没有什么问题,但是还是要注意x3+y3+z3)的表达。
3、实验练习:5.3.4 十进制转换
问题的简单描述:
输入4个字符型数字,并把其转换为十进制整数后显示出来。
流程图
实验代码:
#include
main()
{
char c;
int k,data;
data=0;
for(k=0;k<4;k++)
{
while(1)
{
c=getchar();
if(c>='0'&&c<='9')
break;
}
if(k==0) data+=(c-'0')*1000;
if(k==1) data+=(c-'0')*100;
if(k==2) data+=(c-'0')*10;
if(k==3) data+=(c-'0');
}
printf("Data=%d",data);
}
问题分析:
编写这个程序的时候,把data+=(c-'0')里面的单引号忘记了,运行结果错误,然后就重新分析了一下流程图,发现少了单引号,加上去就得出了正确的结果。
4、实验练习:5.3.5 练习1 百马百担问题
问题的简单描述:
有100匹马,要驮100担货物。其中,1匹大马可以驮3担货物,1匹中马可以驮量担货物,两匹小马可以驮1担货物,求所需要的大马、中马和小马可以有多少种组合。
流程图
实验代码:
#include
main()
{
int m,n,k;
int sum=0;
printf("各种驮法如下:\n");
for(m=1;m<=100;m++)
for(n=1;n<=100-m;n++)
{
k=100-m-n;
if((k%2==0)&&(3*m+2*n+0.5*k==100))
{
printf("大马%3d匹;中马%3d匹;小马%3d匹.\n",m,n,k);
sum++;
}
}
printf("共有%d种驮法.\n",sum);
}
问题分析:
百马百担问题里面有一个条件是两匹小马驮1担货物,一开始没有考虑到这个问题,只判断了(3m+2n+0.5k=100),结果不会出现错误,但向其他同学的代码进行比对后,发现同时满足k%2=0和3m+2n+0.5k=100更加严谨,两匹小马驮一担,所以小马的数量必须是偶数k%2=0。
5、实验练习:5.3.5 练习2 求等差数列
问题的简单描述:
有一个整数等差数列,已知该数列前4项之和等于26,前4项之积等于880,编写程序求出该数列前6项的值及该数列前6项的和。
实验代码:
#include
main()
{
int a,b,c,d,i,sum=0;
for(a=1;a<=26;a++)
for(d=1;d<=26;d++)
{
b=4*a+6*d;
c=a*(a+d)*(a+2*d)*(a+3*d);
if((b==26)&&(c==880))
{
printf("数列的初始值为a=%d,差值为d=%d\n",a,d);
printf("\n数列前6项的值:");
for(i=0;i<6;i++)
{
printf("%d ",a+i*d);
sum=sum+(a+i*d);
}
printf("\n");
}
}
printf("\n数列的前6项的和:%d\n",sum);
}
问题分析:
编写这个for语句嵌套的算法要专注一点,因为嵌套里面很多花括号。
6、实验练习:5.3.5 练习3 食品分配问题
问题的简单描述:
有30个学生一起卖买小吃,共花费50元,其中,每个大学生花3元,每个中学生花2元,每个小学生花1元,求大、中、小学生的人数分配共有多少种不同的组合(不计算某类学生数为0的组合)。
实验代码:
#include
main()
{
int x,y,z,sum;
sum=0;
for(x=1;x<30;x++)
{
for(y=1;y<30;y++)
{
z=30-x-y;
if((z!=0)&&(3*x+2*y+z==50))
{
printf("大学生%3d\t中学生%3d\t小学生%3d\n",x,y,z);
sum=sum+1;
}
else
continue;
}
}
printf("sum=%d\n",sum);
}
问题分析:
这个问题和百马百担问题相似,需要注意的是z=30-x-y,在表述共有30个学生的时候,不能写成x+y+z=30,这样会导致编译错误,因为这个表达式是赋值,在编写百马百担问题的时候出现了这个错误,通过写这个代码发现了百马百担的问题。
7、实验练习:九九乘法表
问题的简单描述:
编写程序,在屏幕上输出阶梯式的乘法口诀表。
流程图:
实验代码:
#include
main()
{
int i=0;
int j=0;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
printf("%dx%d=%d\t",j,i,i*j);
}
printf("\n");
}
}
问题分析:
九九乘法表用到的是for循环结构的嵌套,一开始没有在每一行后换行,也没有在每一个式子后面设置空格,然后出现式子比较混乱,将"%dx%d=%d"改为"%dx%d=%d\t"在外循环加printf("\n"), 问题就解决了。
四、实验小结
循环结构有点绕,分析起来有点头晕,有时候绕得没有清晰的思路,所以在编写代码之前需要流程图帮助理解,但是通过这次实验,我发现我对循环结构的理解还不是很到位,在判断条件上还需要考虑得周全一点,还需要多分析C语言程序代码,多理解,多分析循环结构。