第四次实验
C程序设计实验报告(四)
•实验项目:5.3.1练习2 求数列的前n项的和;5.3.2练习2 求水仙花数;5.3.4 十进制转换;5.3.5练习1 白马百担问题;5.3.5练习2 等差数列;5.3.5练习3 食品分配问题;九九乘法表。
•姓名:聂石燕
•实验地点:家中
•实验时间:2020.04.09
一、实验目的与要求
1、熟练的掌握while,do...while及for 语句实现循环的方法。
2、了解3种循环语句的区别和转换、各自的适应性、循环嵌套的使用。
3、掌握如何在循环语句中使用break,continue语句,改变程序流程。
4、掌握在程序设计中使用循环的方式实现各种算法。
二、实验内容
1、实验练习:5.3.1练习2 求数列的前n项的和
1问题的简单描述:i 和 j 的含义没弄明白。
2实验代码:需要使用MARKDOWN插入代码。
/*求数列(-1)n-1
(2n-1)!的前n项的和*/ #include<stdio.h> int 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<=2*n-1;i=i+2) { fac=1.0; for(j=1;j<=i;j++) fac=fac*j;//计算第n项 fac=fac*sign;//求前n项的和 sum=sum+fac; sign=-sign; } printf("sum=%f\n",sum); }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
该数列为(-1)n-1(2n-1)!,要求该数列的前n项和,先计算出前n项,再求和;外循环用 i 控制,内循环 j 控制第n项;用两个for语句循环嵌套使用。
2、实验练习:5.3.2练习2 求水仙花数
1问题的简单描述:编译运行后啥也没有。
2实验代码:
/*求水仙花数*/ #include<stdio.h> void main() { int x,y,z; int k=100; while(k<=999)//while循环条件,水仙花数是一个3位数 { x=k/100; y=(k/10)%10; z=k%10; if(k==pow(x,3)+pow(y,3)+pow(z,3)) //水仙花数应当满足的条件 printf("%d\n",k); k++; } }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
if 语句后面我用 { } 括住了printf 语句和 k++,k++是循环变量表达式不属于 if 语句的分支语句不应该被括住;所以我去掉了{ } 。注意 = 代表赋值,而 == 代表等于,两个含义不同,不要混淆。
3、实验练习:5.3.4 十进制转换
1问题的简单描述:无
2实验代码:
/*十进制转换*/ #include<stdio.h> main() { char c; int k,Data; Data=0; for(k=0;k<4;k++) { while(k<4) { c=getchar(); if(c>='0'&&c<='9') break; } //将数字字符转化为对应的十进制整数,并形成4位数 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); }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
break 语句是跳出本次循环,终止循环;continue 语句是结束当前循环,提前进入下一个循环。
4、实验练习:5.3.5练习1 白马百担问题
1问题的简单描述:m+n+k大于100.
2实验代码:
/*白马百担问题*/ #include<stdio.h> int main() { int m,n,k;//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+k/2)==100) //大、中、小马驮货物满足的关系 { printf("大马%3d匹;中马%3d匹;小马%3d匹.\n",m,n,k); sum++; } } printf("共有%d种驮法.\n",sum); }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
if()后面加了分号,if 语句没有分号,还有注意运算符的优先级问题。
5、实验练习:5.3.5练习2 等差数列
1问题的简单描述:运行后得不到数列的前6项和。
2实验代码:
/*求等差数列*/ #include<stdio.h> main() { int a,b,c,d,i,sum=0; //a为首项,b为前4项的和,c为前4项的积,d为差值 for(a=1;a<=26;a++) for(d=1;d<=26;d++) { b=4*a+6*d;//等差数列前4项之和 c=a*(a+d)*(a+2*d)*(a+3*d); //等差数列前4项之积 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); }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
等差数列的第n 项公式:an=a1+(n-1) d ; if 语句中的条件表达式 c==880 打成了 c=880 ,虽然只相差了一个 = 符号,但是含义和用法都不同。所以敲代码的时候要仔细。
6、实验练习:5.3.5练习3 食品分配问题
1问题的简单描述:x+y+z不等于30
2实验代码:
/*食品分配问题*/ #include<stdio.h> main() { int x,y,z,sum; //x代表大学生,y代表中学生,z代表小学生 sum=0; for(x=1;x<30;x++) { for(y=1;y<30;y++) { z=30-x-y; if((3*x+2*y+z)==50)//3类学生花钱满足的关系式 { printf("大学生%3d\t中学生%3d\t小学生%3d\n",x,y,z); sum=sum+1; } } } printf("共有%d种不同的组合。\n",sum); }
3问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
3*x+2*y+z 打成了 3x+2y+z ,漏掉了 * 。
三、项目实训:九九乘法表
1、设计思路:首先,九九乘法表的大框架是一个直角三角形,并且是九行九列,用两个for语句循环嵌套使用,就可以实现了。
2、流程图:

3、设计过程中遇到的问题及改进的方法:
问题:打出来的乘法表乱七八糟的,不是规则的三角形形状。
改进的方法:用 %2d 控制宽度为两个字符,且右对齐;用 \t :水平制表(就是跳到下一个Tab位置) 。这样打出来的乘法表就比较规范。
4、代码:
/*九九乘法表*/ #include<stdio.h> main() { int i,j,k;//i,j分别代表行和列 for(i=1;i<=9;i++) { for(j=1;j<=i;j++) { k=i*j; printf("%d*%d%=%2d\t",i,j,k); } printf("\n"); } }
♥运行结果:


浙公网安备 33010602011771号