学习方法:见专栏的第一篇
温馨提示:-----只看剥离的精华------,主要内容只是为了大致的了解这章的内容,方便以后查找。希望可以抛砖引玉
第五章 运算符,表达式和语句
学习内容(可以不看,只是为了和精华做对比)
● 关键字——while、typedef;
● 运算符——=、-、*、/、%、++、--、(类型名);
● C语言的各种运算符,包括用于普通数学运算的运算符;
● 运算符优先级以及语句、表达式的含义;
● while循环;
● 复合语句、自动类型转换和强制类型转换;
● 如何编写带有参数的函数。
现在,读者已经熟悉了如何表示数据,接下来我们学习如何处理数据。C语言为处理数据提供了大量的操作,可以在程序中进行算术运算、比较值的大小、修改变量、逻辑地组合关系等。我们先从基本的算术运算(加、减、乘、除)开始。组织程序是处理数据的另一个方面,让程序按正确的顺序执行各个步骤。C有许多语言特性,帮助你完成组织程序的任务。循环就是其中一个特性,本章中你将窥其大概。循环能重复执行行为,让程序更有趣、更强大
本章小结
C语言有许多运算符,如本章讨论的赋值运算符和算术运算符。一般而言,运算符需要一个或多个运算对象才能完成运算生成一个值。只需要一个运算对象的运算符(如负号和sizeof)称为一元运算符,需要两个运算对象的运算符(如加法运算符和乘法运算符)称为二元运算符。表达式由运算符和运算对象组成。在C语言中,每个表达式都有一个值,包括赋值表达式和比较表达式。运算符优先级规则决定了表达式中各项的求值顺序。当两个运算符共享一个运算对象时,先进行优先级高的运算。如果运算符的优先级相等,由结合律(从左往右或从右往左)决定求值顺序。大部分语句都以分号结尾。最常用的语句是表达式语句。用花括号括起来的一条或多条语句构成了复合语句(或称为块)。while语句是一种迭代语句,只要测试条件为真,就重复执行循环体中的语句。
在C语言中,许多类型转换都是自动进行的。当char和short类型出现在表达式里或作为函数的参数(函数原型除外)时,都会被升级为int类型;float类型在函数参数中时,会被升级为double类型。在K&R C(不是ANSI C)下,表达式中的float也会被升级为double类型。当把一种类型的值赋给另一种类型的变量时,值将被转换成与变量的类型相同。当把较大类型转换成较小类型时(如,long转换成short,或double转换成float),可能会丢失数据。根据本章介绍的规则,在混合类型的运算中,较小类型会被转换成较大类型。定义带一个参数的函数时,便在函数定义中声明了一个变量,或称为形式参数。然后,在函数调用中传入的值会被赋给这个变量。这样,在函数中就可以使用该值了
剥离的精华
(温馨提示) 上述的学习内容和本章小结虽然概括性很强,但是有些地方确实压根没讲的详细,只是提了一下,方便在下几章来学习。所以就不作为精华。
1.const的具体用法(与之前的第四章define用法可以做比较)
const 在字符的使用(不建议,因为自己在写一个printf()函数不香吗?但是可以使用)
#include <stdio.h> int main(void) { const king ="i am a chinese"; const k=" l am a chinese"; const k1='k'; printf("%s\n",king); //printf("%c\n",k);//会出现错误 printf("%c\n",k1) ;//不建议这样使用因为不香。我自己在写一个printf()函数不香吗 return 0; }
const在数字的使用,(切记在数字的前面加上类型的名字。并且与define相比要加上等号)
#include <stdio.h> #define adjust 7.31 int main(void) { const double scale=0.333; //const scale1 =0.333;//就是不知道他们的不同,书中没有说明,但应该记住的是,如果const 要定义一个变量的话,最好给出其类型,如int ,double. //可以把上述的注释去掉看一看就知道为什么要加 double shoe,foot; shoe=9.0; foot=shoe*scale+adjust; printf("这是一个脚的尺寸和英寸\n"); printf("%5.2f,%7.5f\n",shoe,foot); return 0; }
2.对于while()循环的高级点
在循环里面在加上一个输入的两个方法,可以耳目一新。非常nice
第一种(平庸的)
#include<stdio.h> #define k 60 int main(void) { int sec,min,left; printf("请输入一个值\n"); scanf("%d",&sec); while(sec>0) { min=sec/k; left=sec%k; printf("这是转换的分钟数%d,这是剩余的秒数%d\n",min,left);//在数据中设置scanf()函数我真的没有想到过。 在循环里面自己加上一个循环 printf("再次输入一个数,小于0结束\n"); scanf("%d",&sec); } printf("it is done\n"); return 0; }
第二种(高级的)
#include <stdio.h> void temperatures(double t1); int main(void) { double temp; printf("输入一个华氏温度\n"); while(scanf("%lf",&temp)==1)看我搞基吗????????在这里 { temperatures(temp); printf("再次输入一个华氏温度,知道输入非数字\n"); } return 0; } void temperatures(double t1) { const double sheshi=32.0; const double kaishi=273.16; double k,s; s=5.0/9.0*(t1-sheshi); k=s+kaishi; printf("这是转换的摄氏温度%lf\n",s); printf("这是转换的开式温度%lf\n",k); }
3.while循环的结束的判断,起始和结束的判断和程序显示完整的改进
最好,最万无一失的方法就是推一下,将结束条件的倒数第二个进行判断,看一看可不可以轮到。
最笨的方法就是记住。i++/++i在printf()函数之前的话且当条件是<的时候,是从a+1--b.
i++/++i在printf()函数之后的话且当条件是<的时候,是从a--b-1.
3.1在i++在之后的
#include <stdio.h> int main(void) { int i; i=1; //printf("%5d\n",i);//这个方案的解决方案就是在while()循环之前,在加上一层输入即可。 while(i<6) { printf("%5d\n",i); i++; }//我觉得应该从循环次数来说,因为值循环的次数是固定的。显示是什么值,取决于初始条件和循环次数。 //就拿这个循环来说的话,因为循环次数为5次,并且从i=2开始的,所以从显示5次,一直到printf(6)即可。 // //最后一种理解就是就看最后的值和输出语句的关系,就拿这个程序为例,最后结束条件为i=6, 看到数第二个5运行这个循环即可 。 //同理 //实在不行就记住++在输出语句之前就+1到原址。 return 0; }
改进是可以全部可以实现。
#include <stdio.h> int main(void) { int i; i=1; //printf("%5d\n",i);//这个方案的解决方案就是在while()循环之前,在加上一层输入即可。 while(i<=6)//看我看我!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! { printf("%5d\n",i); i++; } return 0; }
3.2i++在之前的
#include <stdio.h> int main(void) { int i; i=1; //printf("%5d\n",i);//这个方案的解决方案就是在while()循环之前,在加上一层输入即可。 while(i<6)// { i++; printf("%5d\n",i); } return 0; }
解决方法(在前面加上一个printf()函数即可)
#include <stdio.h> int main(void) { int i; i=1; printf("%5d\n",i);//这个方案的解决方案就是在while()循环之前,在加上一层输入即可。 while(i<6)// { i++; printf("%5d\n",i); } return 0; }
习题练习(题型重复的筛选掉了)
1.编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。
#include <stdio.h> #define hao 60; int main(void) { int ms; int mins,hours; printf("请输入分钟\n"); scanf("%d",&ms); while(ms>0) { hours=ms/hao; mins=ms%hao; printf("转换的时间是%d小时,%dmin\n",hours,mins); printf("请输入分钟\n"); scanf("%d",&ms); } printf("结束了\n"); return 0; }
2.编写一个程序,提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印5~15的所有整数,包括5和15)。要求打印的各值之间用一个空格、制表符或换行符分开。
#include <stdio.h> int main(void) { int a,b; printf("请输入一个整数\n"); scanf("%d",&a); b=a+10; while(a<=b) { printf("%d\n",a); a++; } return 0; }
5.修改程序addemup.c(程序清单5.13),你可以认为addemup.c是计算20天里赚多少钱的程序(假设第1天赚$1、第2天赚$2、第3天赚$3,以此类推)。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)
#include <stdio.h> int main(void) { int a,day; int sum; int now; day=sum=now=1; printf("亲输入天数\n"); scanf("%d",&day); printf("天数 ,现在, 综合\n"); while(a<=day) { now=a; sum=sum+a; printf("%5d,%5d,%5d\n",a,now,sum); a++; } printf("一共赚了%5d",sum); return 0; }
7.编写一个程序,提示用户输入一个double类型的数,并打印该数的立方值。自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给该函数。
#include <stdio.h> void x3(double k); int main(void) { double a; printf("请输入浮点数a的值\n"); scanf("%lf",&a); x3(a); return 0; } void x3(double k) { double j; j=k*k*k; printf("%lf\n",j); }
9.编写一个程序,要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。下面是华氏温度转摄氏温度的公式:摄氏温度 = 5.0 / 9.0 * (华氏温度 - 32.0)开氏温标常用于科学研究,0表示绝对零,代表最低的温度。下面是摄氏温度转开氏温度的公式:开氏温度 = 摄氏温度 + 273.16Temperatures()函数中用const创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入q或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用==运算符将scanf()的返回值和1作比较,测试两值是否相等。
#include <stdio.h> void temperatures(double t1); int main(void) { double temp; printf("输入一个华氏温度\n"); while(scanf("%lf",&temp)==1)看我搞基吗????????在这里 { temperatures(temp); printf("再次输入一个华氏温度,知道输入非数字\n"); } return 0; } void temperatures(double t1) { const double sheshi=32.0; const double kaishi=273.16; double k,s; s=5.0/9.0*(t1-sheshi); k=s+kaishi; printf("这是转换的摄氏温度%lf\n",s); printf("这是转换的开式温度%lf\n",k); }
代码分析
整个第五章只有5.11.9那个程序有亮点。
1while()函数的是scanf()函数写在了while()循环中。
2.scanf()函数的返回值作为了判断数字和字母的武器.当是数字的时候,值为1.当为字母的时候不为1.厉害。我真的c(nb)
#include <stdio.h> void temperatures(double t1); int main(void) { double temp; printf("输入一个华氏温度\n"); while(scanf("%lf",&temp)==1)看我搞基吗????????在这里 { temperatures(temp); printf("再次输入一个华氏温度,知道输入非数字\n"); } return 0; } void temperatures(double t1) { const double sheshi=32.0; const double kaishi=273.16; double k,s; s=5.0/9.0*(t1-sheshi); k=s+kaishi; printf("这是转换的摄氏温度%lf\n",s); printf("这是转换的开式温度%lf\n",k); }