实验二 张珂瑜
实验二
(一)实验任务一
(程序源代码)
#include <stdio.h> int main(int argc, const char * argv[]) { int a = 5, b = 7 ,c = 100, d,e,f; d = a / b * c; e = a * c / b; f = c / b * a; printf("d = %d,e = %d,f = %d\n",d,e,f); return 0; }
(程序运行结果截图)

(问题回答)
1.表达式对应的数学计算式分别是什么?
d=[a/b]*c (先计算a/b,将结果取整,然后乘以c,把值赋给d)
e=[(a*c)/b] (先计算a*c,然后把结果除以b,将结果取整,把值赋给e)
f=[c/b]*a (先计算c/b,将结果取整,然后乘以a,把值赋给f)
p.s.抱歉电脑没有办法输入数学符号,所以我将计算过程在括号中备注了。
2.变量d,e,f计算结果不同的原因是?
由于表达式的结合从左到右,并且*和/的优先级相同,因此每次都从左往右计算,运算结果不同。
(二)实验任务二
(程序源代码)
#include <stdio.h> int main(int argc, const char * argv[]) { int x=1234; float f=123.456; double m=123.456; char ch='a'; char a[]="Hello,world!";//定义一个数组a,存放字符串常量。 int y=3, z=4; printf("%d %d\n",y,z); printf("y=%d z=%d\n",y,z); printf("%8d,%2d\n",x,x); printf("%f,%8f,%8.1f,%0.2f,%.2e\n",f,f,f,f,f); printf("%lf\n",m); printf("%3c\n",ch); printf("%s\n %15s\n %10.5s\n %2.5s\n %.3s\n",a,a,a,a,a); return 0; }
(程序运行结果截图)

(总结程序中用到的格式符的用法)
%d~~~按十进制格式输出
%f~~~按单精度浮点数输出
%lf~~~按双精度浮点数输出
%md~~~输出m位,不足补空格到m位
%.mf~~~输出m位小数
%ms~~~输出的数组字符串占m位,且不足的位数补在前
%.ms~~~输出数组字符串的前m位
(三)实验任务三
(修改语法错误后能正确运行的源代码)
#include <stdio.h> int main(int argc, const char * argv[]) { double x,y; char c1,c2,c3; int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); printf("a1=%d,a2=%d,a3=%d\n",a1,a2,a3); scanf(" %c %c %c",&c1,&c2,&c3); printf("c1=%c,c2=%c,c3=%c\n",c1,c2,c3); scanf("%lf%lf",&x,&y); printf("x=%.1f,y=%.1lf \n",x,y); return 0; }
(根据实验任务要求正确输入并显示运行结果的截图)

(四)实验任务四
(补充完整并能正确运行的c程序代码)
#include <stdio.h> int main(int argc, const char * argv[]) { char x; x=getchar(); if(x>='0' && x<='9'){ printf("%c是数字字符。\n",x); }else if((x>='a'&&x<='z')||(x>='A'&&x<='Z')){ printf("%c是英文字母。\n",x); }else{ printf("%c是其他字符。\n",x); } return 0; }
(运行测试结果截图)



(五)实验任务五
(补充完整并能正确运行的c程序代码)
#include <stdio.h> int main(int argc, const char * argv[]) { char ans1,ans2; printf("复习了没?(输入y或Y表示复习了,输入n或N表示没复习。):"); ans1 = getchar(); getchar(); printf("\n动手敲代码了没?(输入y或Y表示敲了,输入n或N表示没有敲代码。):"); ans2=getchar(); if((ans1=='n'||ans2=='N')&&(ans2=='n'||ans2=='N')){ printf("\n罗马不是一天建成的。:)\n"); }else{ printf("\n罗马不是一天毁灭的。:)\n"); } return 0; }
(运行测试结果截图)


(六)实验任务六
(c程序源代码)
#include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { const double num=2; double n,sum; printf("请输入一个1~10以内的正整数:"); scanf("%lf",&n); sum = 1*(1 - pow(num,n+1))/(1-num); printf("当 n=%d时,sum=%d\n",(int)n,(int)sum); return 0; }
(运行结果截图)



(七)实验任务七
(1)最初不动脑子的实现方法一
(源代码)
#include <stdio.h> int main(){ //9 printf(" o\t o\t o\t o\t o\t o\t o\t o\t o\n"); printf("<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("I I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n"); //7 printf(" \t o\t o\t o\t o\t o\t o\t o\n"); printf("\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n"); //5 printf(" \t \t o\t o\t o\t o\t o\n"); printf("\t \t<H>\t<H>\t<H>\t<H>\t<H>\n"); printf("\t \tI I\tI I\tI I\tI I\tI I\n\n"); //3 printf(" \t \t \t o\t o\t o\n"); printf("\t \t \t<H>\t<H>\t<H>\n"); printf("\t \t \tI I\tI I\tI I\n\n"); //1 printf(" \t \t \t \t o\n"); printf(" \t \t \t \t<H>\n"); printf(" \t \t \t \tI I\n\n"); return 0; }
(运行结果截图)

(2)开始动脑子想是不是可以用for()循环
但是我还没有很好的算法真正实现这个程序,但是随着学习,我会补上的。以下是我完成的部分,我只能达到这一步。(11.1)
(源代码)
#include <stdio.h> int main(int argc, const char * argv[]) { int i; for(i=5;i>=1;i--){ printf(" o\n<H>\nI I\n"); } return 0; }
(运行结果截图)
灵光一现,我打算先简化问题,我把小人先用简单的*来代替,试试看用for语句先把阵型打印出来,于是。。。(11.6)
(源代码)
#include <stdio.h> int main(int argc, const char * argv[]) { int i; int cnd; for(i=9;i>0;i-=2){ cnd=i; for(;cnd>0;cnd--){ printf("*\t"); } printf("\n"); } return 0; }
(运行结果截图)

实验总结
(1)首先,在实践中,我对于各个函数的调用以及格式符的用法有了深刻的理解。其次,在动手操作尤其是实验六和七的思考算法和代码实现中,不断出错修改,事实上真正锻炼了自己的能力。最后,从上次实验到这次实验,细节方面的代码习惯开始养成,基本不会出现scanf中忘记&,文段末尾忘记;的情况。
(2)通过本次实验,让我深刻认识到,掌握一门编程语言并不仅仅是掌握语法知识,用法等,最最重要的还是要学会运用。并且,算法是可以不断优化的,程序代码为什么这样可以实现,那样不会报错但是会出问题,每一步都是有章可循的,都是有原因的。去发现,去挖掘其中的原因所在,先实现代码,而后修改精简代码,再通过学习不断优化算法,这是在我看来非常重要的过程。

浙公网安备 33010602011771号