学习方法:见专栏的第一篇
温馨提示:-----只看剥离的精华------,主要内容只是为了大致的了解这章的内容,方便以后查找。希望可以抛砖引玉
第五章? ?运算符,表达式和语句
学习内容(可以不看,只是为了和精华做对比)
● 关键字——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);
}
|