一、实验总结
本次实验共尝试编写9个程序,其中5个为自主编写与课本程序,3个参考其他优秀作品,1个尝试未果(错误结果将在下文呈现)。由于是第一次比较系统的编译,以往虽有所接触,但还是生疏,大部分没有一次编译成功,总有许多细微的错误,也是初学者经常犯的错误。下面将逐一进行简要自评。
①输入自己的学号
1 #include<stdio.h> 2 int main() 3 { 4 printf("201883300022"); 5 return 0; 6 }
来自课本例题的简单改编,使我对其结构有大概的了解,也由于其结构简单,无法明显体现出初学者易错点,并无过多可讨论之处。
②两书相乘(例题照搬)
1 #include<stdio.h> 2 int product(int,int); 3 int main(void) 4 { 5 int x,y,s; 6 scanf("%d %d",&x,&y); 7 s = product(x,y); 8 printf("The mul is:%d", s); 9 return 0; 10 } 11 int product(int a,int b) 12 { 13 int mul; 14 mul = a * b; 15 return mul; 16 }
较之前的①多了"scanf",可就算是依葫芦画瓢我也在第6行处"%d"与"%d"之间多打了一逗号,使得无论输入什么,结果都为0。我认为这可以作为一个典型,即说明在代码比较多的情况下,初学者会对括号、引号、逗号之类的符号应用不清或无意识的出错,这都要引起我们的重视。
③整数相除(课后练习)
1 #include<stdio.h> 2 int main() 3 { 4 int a = 5,b = 7,c = 100,d,e,f; 5 d = a/b*c; 6 e = a*c/b; 7 f = c/b*a; 8 printf("d = %d,e = %d,f = %d\n",d,e,f); 9 return 0; 10 }
很显然,三式之计算结果与我们一贯的认知有差别,即对于计算机而言,两整数相除,商仍为整数,小数舍去。另外题中a、b、c、d、e、f均为int型,故结果自然也均为整数。
④自加、自减运算
1 /*自加、自减运算*/ 2 #include<stdio.h> 3 int main() 4 { 5 int a=5,b=8; 6 printf("a++=%d\n",a++); 7 printf("a=%d\n",a); 8 printf("++b=%d\n",++b); 9 printf("b=%d\n",b); 10 return 0; 11 }
此题旨在明确自增/减运算符前置运算与后置运算时表达式与变量自身的变化情况,可以总结如下:变量本身均+/-1,前置运算表达式同样+/-1,后置运算表达式值不变。
⑤关系运算和逻辑运算
1 #include<stdio.h> 2 int main() 3 { 4 int a=5,b=8,c=8; 5 printf("%d,%d,%d,%d\n",a==b&&a&&c,a!=b&&a!=c,a>=b&&a>=c,a<=b&&a<=c); 6 printf("%d,%d\n",a<=b||a>=c,a==b||b==c); 7 printf("%d,%d,%d,%d\n",!(a==b),!(a>=b),!(a>=c),!(a<=b)); 8 return 0; 9 }
使用关系运算符或逻辑运算符的表达式对False和True分别返回值0或1。其中,非"!"结合性不同于其他,为从右向左,需引起注意。而逻辑表达式中,只有在必须执行下一个逻辑运算符才能求出表达式的解时才继续执行(短路表达式)。
⑥判断奇偶(填第11行空)
1 #include <stdio.h> 2 int main() 3 { 4 int x; 5 6 printf("输入一个整数: \n"); 7 scanf("%d",&x); 8 9 // 在×××处填写相应表达式 10 // 使得当表达式成立时,判定x是奇数,否则是偶数 11 if(x%2==1) 12 printf("是奇数"); 13 else 14 printf("是偶数"); 15 16 return 0; 17 }
用到了取余运算,而取余运算两端必须均为整型数据。易将"=="错写为"="使得结果出错。
⑦if...else if(填第9、11行空)
1 #include <stdio.h> 2 int main() { 3 int days; 4 5 printf("输入一个整数: \n"); 6 scanf("%d",&days); 7 8 // 补足×××处的表达式,使得满足程序功能描述 9 if((days>=1)&&(days<=5)) // days在1到5之间 10 printf("workdays, fighting\n"); 11 else if((days==6)||(days==7)) // days是6或7 12 printf("weekend, relax~\n"); 13 else 14 printf("Ooops,not in 1~7\n"); 15 16 return 0; 17 }
逻辑运算符应用,变向表示数的取值范围。同⑥注意区分"="与"=="。
⑧大小写字母转化(填第9、10行空)
1 #include <stdio.h> 2 int main() { 3 char ch; 4 5 printf("输入一个字符:\n"); 6 scanf("%c",&ch); 7 8 // 根据程序功能描述,补足程序 9 if((int)ch>=65&&(int)ch<=96) // 如果ch是小写字母,补足判定ch是小写字母的表达式 10 ch=ch+32; // 补足把ch中的小字母转换成大写字母的表达式语句 11 // 说明:语句就是在表达式末尾加分号; 12 13 printf("%c\n",ch); 14 15 return 0; 16 }
C语言中字符按其所对应的ASCII码(十进制/十六进制)储存,可运用强制类型转换“(类型名)(表达式)”将字母用十进制表示,又字符A~Z十进制对应65~90,a~z对应十进制97~122,大小写相差32,综上可得。
⑨十进制整数转二进制(错误演示)
1 #include<stdio.h> 2 int main() 3 { 4 int x,y,z=0,k=1; 5 printf("输入一个正整数\n"); 6 scanf("%d",&x); 7 while(x>=0) 8 { 9 y=x%2; 10 x/=2; 11 z+=y*k; 12 k*=10; 13 } 14 printf("%d\n",z); 15 return 0; 16 }
while内语句序列没问题,错在这是一个“死循环”,即此题被除数始终不会小于0,循环便一直进行。截至定稿,受能力所限暂时未编成可正常运行的程序,能力达到再解。
————————————————————————————————————————分 割 线————————————————————————————————————————————————
二、实验体会
由于刚接触编程,处于适应期,理论部分看懂了到实践还是生疏,经常会犯一些细节上的错误导致整个程序无法运行。要善于总结自己错误的类型,同时多看一些优秀的编程范例或许有助于在同样的时间内获得较高的效率。
作于2019年3月19日傍晚
李张瑞
原文地址:https://www.cnblogs.com/lizhangrui/p/10560359.html