本来说好讲讲除了scanf和printf以外例如gets、puts,petchar、putchar等输入输出函数。
但准备了半天东西发现牵扯的知识太多,并且很多东西我自己也没有弄清楚。
所以啦,我就打算先讲讲程序中最常见的两种循环语句,分别是while 循环语句和for循环语句。
这个while啊,我们都学过英语都知道有“当....的时候”的意思。
对,学c语言时就当这个意思就行。
这个例题也没找到什么好的,就搬来了《c程序设计语言》上的例子,如果看过来就当是复习吧。
请看题:使用公式℃=(5/9)(℉-32),打印下列华氏温度与摄氏温度的对照表。
0 -1720 -640 460 1580 26100 37120 48140 60160 71180 82200 93220 104240 115260 126280 137300 148我们的答案如下#include<stdio.h>/*当fahr=0,20,40,...,300时,打印华氏温度与摄氏温度对照表*/main(){int fahr,celsius;int lower,upper,step;lower=0; /*华氏温度下限*/upper=300;/*华氏温度上限*/step=20;/*步长*/fahr=lower;while(fahr<=upper){celsius=5*(fahr-32)/9;printf("%d\t%d\n",fahr,celsius);fahr=fahr+step;}}值得高兴的是,我们又遇到了很多没有见过的东西,总是能见到新东西总是让人感到高兴的。
先是fahr、celsius等几个没见过的单词。
这个其实不用说也都知道是啥东西,也就是几个可能原来不认识的变量名,并不是函数。
接下来是/**/格式的几个句子/*当fahr=0,20,40,...,300时,打印华氏温度与摄氏温度对照表*//*华氏温度下限*//*华氏温度上限*//*步长*/这种在/*和*/之间加东西的东西叫做注释。
和它的名字一样,仅作为注释,在程序运行过程就会被编译器忽略,因为编译器只对文章正文感兴趣。
这东西存在的主要价值基本上就是帮助看你程序的人或在你检查自己程序时可以快速理解你写的这一部分是干啥用的。
因此注释在每个语句的句尾都可以加,在任何可以跳格也就是可以打空格或制表符的地方也都可以加。
剩下我们可能看不懂的大概也就剩while的循环语句了:while(fahr<=upper){celsius=5*(fahr-32)/9;printf("%d\t%d\n",fahr,celsius);fahr=fahr+step;}首先我们要注意的是,有没有发现while循环语句的第一句括号后面没有分号?并不是我忘了打,因为这里确实没有分号也能有分号。
具体有了会怎样可以自己去试一试。
当然我是个喜欢啰里啰唆的人,所以还是想啰嗦两句为啥不能加分号。
原因也很简单,因为我们都知道,分号在c语言中代表一个语句的结束,在这里要注意是一个语句的结束。
而对于循环语句来说,构成它的至少应该有两部分:前面的判断条件和后面的循环体(在这里指后面花括号及以内的内容),因此我们要把前面的条件判定部分和后面的循环体当成整体来看待。
也就是说它们共同构成了循环语句这一个语句。
如果你在while(fahr<=upper)后面加上了分号,再通过运行的结果对照程序进行思考,一定可以更深刻地理解我这句话的含义。
好吧又扯出两个词,条件判断部分和循环体。
条件判断部分就是while后面圆括号即里面的内容啦,也有的人叫条件部分。
我为了省事在下面就也叫它条件部分啦。
循环体可以由两部分组成,花括号和花括号里面的语句。
在这里说可以是因为如果循环语句只有一个语句的话(马上我们就会遇到),就没有必要加花括号了。
直接接在while那句的下面就行了。
好像就没啥知识了吧,循环语句的循环过程主要还是要自己去理解,至于这个while循环语句的执行方式是这样的:首先编译器在读取while函数后(忘了说这玩意还有个名字叫条件函数),会先测试它后面圆括号中的条件部分,如果条件为真(在这里是fahr<=upper),则执行循环体;执行完循环体后,因为是while函数,编译器会返回来再次测试条件部分。
直到某一次当编译器测试条件部分结果为假时(这里体现为fahr>upper),编译器就会结束while函数的循环,然后按正常顺序去进行循环语句后面语句的运行。
在本程序中因为while的循环语句是程序的最后一个语句,所以在循环语句结束后整个程序也就执行终止啦。
好吧这个程序还有两个问题。
我们一个个的讲。
第一个就是printf语句中\t和\n的作用。
(不要跟我说不认识这两个东西啦我以前一定是说过的。
)在这个程序里这两个符号是不能省去的。
\t用来保持华氏温度和摄氏温度之间的距离,\n用来实现必要的跳行。
如果在这里还不用这两个东西,相信我,运行结果出来后你会后悔的。
第二个是摄氏温度的计算方式。
公式给的明明是℃=(5/9)(℉-32),为啥我们非要写成蹩脚的celsius=5*(fahr-32)/9;?你非要写成celsius=(5/9)*(fahr-32);我也不反对,系统也不会报错,但你运算出来的结果是不正确滴。
因为先前我们定义的fahr和celsius都是整数形式,而在c语言中整型除法的计算规则,它们相除后是要舍位的,而5/9的舍位结果为0。
因此如果我们如果想把摄氏度的运算写成celsius=(5/9)*(fahr-32);的话,就需要把程序改成#include<stdio.h>/*当fahr=0,20,40,...,300时,打印华氏温度与摄氏温度对照表*/main(){float fahr,celsius;float lower,upper,step;lower=0; /*华氏温度下限*/upper=300;/*华氏温度上限*/step=20;/*步长*/fahr=lower;while(fahr<=upper){celsius=(5.0/9.0)*(fahr-32.0);printf("%.2f\t%.2f\n",fahr,celsius);fahr=fahr+step;}}(这个程序设置的是保留了两位小数)这样我们就可以以一种更自然的方式来书写运算语句了,并且我们可以得到转化后更高精确度。
但严格地讲,我们依然没有把摄氏度的运算写成celsius=(5/9)*(fahr-32);的形式。
因为在这个运算语句中必须至少有一个数字是小数形式的,否则就会出现0.00的输出出现。
在这里我为什么说“至少一个数是小数形式”?是因为在一个运算语句中,如果所有操作数(请允许我使用这个专用性强一点的词,其实我心里都管这种数叫被操作数)均为整数,则执行整型运算。
但是,如果某个运算语句中既存在浮点型操作数和整型操作数,则在运算时整型操作数也都会被转换成浮点型的操作数参与运算。
就比如这个程序中的celsius=(5.0/9.0)*(fahr-32.0);运算语句是可以改成celsius=(5.0/9)*(fahr-32);的。
因为后面有printf("%.2f\t%.2f\n",fahr,celsius);,结果依然是以保留两位小数的形式输出的。
但由此也引发了我的好奇如果把我们最早编写的程序改成这样会怎样呢?#include<stdio.h>main(){int fahr,celsius;int lower,upper,step;lower=0;upper=300;step=20;fahr=lower;while(fahr<=upper){celsius=(5.0/9.0)*(fahr-32.0); printf("%d\t%d\n",fahr,celsius); fahr=fahr+step;}}或者这样#include<stdio.h>main(){int fahr,celsius;int lower,upper,step;lower=0;upper=300;step=20;fahr=lower;while(fahr<=upper){celsius=(5.0/9)*(fahr-32); printf("%d\t%d\n",fahr,celsius); fahr=fahr+step;}}这两个程序和我们写的第一个程序唯一的区别就是我在写运算语句时套用了浮点式时运算语句的书写原则。
令人高兴的是输出结果和我们刚开始写的第一个程序是相同的。
(我这里用的编译器是codeblocks10.05而非VC++6.0,所以考试报错了不要怪我。
)。
这也就给了我们另外一种以一种更自然的方式来书写运算语句的途径。
但最后要提起注意的是,我们在定义变量(即int fahr,celsius;)和格式化输出变量的值(即printf("%d\t%d\n",fahr,celsius);)时,所定义变量的类型(指int)和格式输出变量所输出的格式(指%d)还是要一一对应的。
int要和%d对应出现,float和%f要对应出现,如果对应关系没有一致系统不会报错但运行结果会是错误的。
while循环语句就算是讲完了,下次我们会说一说和while 循环语句作用相同的for循环语句。
10.5。