西农C语言第二次实习作业
- 格式:doc
- 大小:178.50 KB
- 文档页数:9
=;LT04-08.C #include void main() { int i; for(i=1;i<50;i+=2) printf("%d",i); printf("\n"); }
这是输出i<50的数字,但是疑问就是如何把输出字符串分开,使得每个i之间都有空格将其分开. 经过多次尝试之后我得出了如下结论,只需将printf("%d",i);换成printf(" %d",i)其中的变化是将双引号与%d之间打一个空格. 初步了解了for循环的基本意思和for循环结构下的输出控制结构的改变功能.
BC04-01.c void main() { int i,s,x; float aver; do { printf("请输入(-9999结束)"); scanf("%d",&x); s=s+x; i++; } while(x!=-9999); aver=s/i; printf("这些数的平均值为:%f\n",aver); } s需要赋初值0,否则s被默认为与i相同的整型数,所以运行程序时平均值总是为:1. 然后需要对s进行强制类型转换,否则输出数据为整型.在表达式aver=s/i;转换为: aver=(float)s/i,将数据类型强制转换才能得到精度较高的平均值. 因为输入数字-9999也算在了s=s+x中所以在aver=s/i中的s需要加上9999,并且输 入的-9999也使得i的值+1所以在设置i的初值时需要使得i=-1.最终改正如下:
void main() { int i=-1,s=0,x; float aver; do { printf("请输入(-9999结束)"); scanf("%d",&x); s=s+x; i++; } while(x!=-9999); aver=(float)(s+9999)/i; printf("这些数的平均值为:%f\n",aver); } 如此编入程序之后运行结果与预测结果基本一致,但是当第一次输入-9999的时候i=0使得程序运算出错,所以需要定义i=0的无法输出结果,再次修正程序得: FH04-01.c
void main() { int i=-1,s=0,x; float aver; do { printf("请输入(-9999结束)"); scanf("%d",&x); s=s+x; i++; } while(x!=-9999); if (i==0) printf("结果无法输出!\n"); else { aver=(float)(s+9999)/i; printf("这些数的平均值为:%f\n",aver); } } 这样当第一次输入-9999时,i=0结果无法输出时会有提示。当要输入选择结构的时候需要将循环的判断语句放在前面从而使得程序能执行。 BC04-02.c #include viod main() { int i,m,n; printf("请输入两个数:"); scanf("%f%f",&m,&n); for(i=m;m%i+n%i!=0;i--); printf("最大公约数=%g\n",i); } 为何无法正常运行呢?即使把第五行中的%f改正为%d结果也是同样无法运行。
XT04-01.c #include void main() { int i,a,min,max; printf("请输入任意5个数字:"); scanf("%d",&a); min=a,max=a; for(i=2;i<=5;i++) { scanf("%d",&a); if(min>a) min=a; if(max} printf("Max=%d,Min=%d\n",max,min); } 此题目要求输入100个数字,我改为输入5个数字即可,其中难以理解的是为何要先将max=a ,min=a;这样逻辑上不会有错误吗?直接赋值之后那判断应该不起作用的。
XT04-03.c #include void main() { double i,p,s; p=1;s=0; for(i=1;i<21;i++) {p=p*i; printf("1到20的阶乘:%f\n",p); s=s+p;} printf("1到20的阶乘的和:%f\n",s); } 我所写的程序与参考答案基本相符合,但是最终结果与参考答案结果不同。
参考答案的结果中有部分阶乘为负数,所累加之和应该有错误。我觉得我这个更正确。 XT04-04.c #include void main() { int m,i,sz; printf("100以内的非素数有:"); for(m=3;m<=100;m++) {sz=1; for(i=2;iif(m%i==0) {sz=0;break;} if(sz)printf("%6d",m); } } 这题确实自己辙了,自己的思路编程吧又不能完整的输出,而老师您所讲的sqrt定义编程我始终没弄懂,我试着用sqrt定义去编制程序,可是程序老出错。 而对于这个习题,{sz=1; for(i=2;iif(m%i==0) {sz=0;break;} if(sz)printf("%6d",m); } } 是如何控制100以内的素数都被输出的还不是很清楚。这个题上课有听懂,但是下课后没有样板,自己做的时候确实难以下手。遇到只有的情况我只能先就参考答案来做了…
XT04-05.c #include void main() { int a,b,t,r; printf("请输入两整型数字:"); scanf("%d%d",&a,&b); do { if(a>b) a%b=r; if(a{b=t,a=b,a=t; a%b=r; } r=b,b=a,a=r; a%b=r; } while(r=0); printf("这两个数的最大公约数为:%d",a);
} F:\信工VC ++\Debug\XT04-05.c(8) : error C2106: '=' : left operand must be l-value F:\信工VC ++\Debug\XT04-05.c(11) : error C2106: '=' : left operand must be l-value F:\信工VC ++\Debug\XT04-05.c(14) : error C2106: '=' : left operand must be l-value Error executing cl.exe. 按照自己的思路做习题第五题时就会出现只有的错误,之后老是无从下手,看来新手的基础确实太弱了,累,参照答案对照自己的程序再弄懂它的程序,希望如此能慢慢理解掌握简单程序的自主编程吧。
汗~~突然发现了一个低级错误,a%b=r;C语言格式严重错误,应该是r=a%b的。 XT04-05.c #include void main() { int r,a,b; printf("请输入任意两个整型数:"); scanf("%d%d",&a,&b); if(a>b) { r=a;a=b;b=r;} r=a%b; while(r) {a=b;b=r;r=a%b;} printf("%d\n",b); } 如此设计确实简单多了,精华之处也就是赋值与循环,这两点能把握住那编程也就尤为简单顺手了。 根据以上赋值、循环,我稍微修改了结构,变为do-while循环体,这样虽然复杂了点但是自己更容易看懂。但是我发现我的存在BUG,当输入50 25时候程序会发生错误,而答案的却不会,这之间的某个地方有差别: FH04-05.c #include void main() { int a,b,r; printf("请输入两整型数字:"); scanf("%d%d",&a,&b); do { if(a>b) r=a%b; if(a{r=a,a=b,b=r; r=a%b; } a=b,b=r,r=a%b;
} while(r=0); printf("这两个数的最大公约数为:%d\n",b); }
所以自己编程还是有一定的缺陷性的,导致自己无法正确完整的将自己所想的程序编写出来。 LT04-13.c #include void main() { int i,j; for(i=1;i<=9;i++) { for(j=1;j<=9;j++) printf("%d*%d=%2d ",i,j,i*j); printf("\n"); } }
将此9*9乘法表中省略对角线的一部分,我的思路是将J的数值1~9每个数字出现次数随J的值的增大而减少,也就是J的值用远不大于I的值即可: 运行结果果然如此,只需要将I<=J即可:
对于这题,把握其要点就是先分析9*9乘法表的规律: ⑴第二列数字永远是相同。 ⑵第二列的数字永远不大于第一排的数字。 ⑶每列的数字J数字个数随着J值增大1而减少一个数字。 最终综合规律得到以上程序就只在循环中添加了if(i>=j) 如果添加if(i<=j),,则9*9乘法表将会斜向上。如图: