重新学习c语言之《c primer plus》(运算符,表达式和语句)

本章深入介绍了C语言中的运算符,包括赋值、算术、比较等,以及运算符优先级和类型转换规则。重点讲解了while循环的使用,包括带有输入的循环结构和循环条件的巧妙设置。此外,还探讨了const关键字在数值和字符串常量中的应用。习题涵盖了时间转换、数列打印和温度转换等实际问题,强调了用户交互和函数调用。
摘要由CSDN通过智能技术生成

学习方法:见专栏的第一篇

温馨提示:-----只看剥离的精华------,主要内容只是为了大致的了解这章的内容,方便以后查找。希望可以抛砖引玉

第五章   运算符,表达式和语句

学习内容(可以不看,只是为了和精华做对比)

● 关键字——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);
	
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在变秃的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值