数据类型 / 计算
第一部分
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int foot = 0;
int inch = 0;
scanf("%d %d", &foot, &inch);
printf("%f\n", (foot + inch / 12.0)*0.3048);
return 0;
}
在C语言中整数/整数只能是整数,如果相除之后含有小数部分,则直接省去小数部分。
在C语言中如果是整数/浮点数,那么就会把运算符号两边的都自动转化为浮点数,得到的结果也是浮点数。
在上述代码中inch是整数,12.0是浮点数。C语言就会把inch转换为浮点数后进行运算。如果是inch/12,当inch=7时,左右两边都是整数,但是相除的结果是浮点数,C语言会只得到一个整数,省去小数部分。
第二部分
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
double foot = 0;
double inch = 0;
scanf("%lf %lf", &foot, &inch);
printf("%f\n", (foot + inch /12)*0.3048);
return 0;
}
在这段代码中也是和第一段代码的原理一样,这里inch/12中,inch是浮点数,而12是整数。C语言会自动把12转化为浮点数,然后得到的结果就是一个浮点数,打印的时候就要用%f。
例子:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
double c = (a + b )/ 2.0;
printf("%f\n", c);
return 0;
}
定义C为double类型的数据(a+b)为整数类型,2.0为浮点数,那么结果就是浮点数。如果是(a+b)/2,左右两边都是整数,那么得到的结果中如果有小数部分也会被去除,只保留整数部分。如:(2+3)/2这个结果就是2,(2+3)/2.0这个结果就是2.5。
第三部分
数据类型
- 整数 int printf("%d",.....); scanf("%d %d",......,.....);
- 小数 double printf("%f",.....); scanf("%lf %lf",......,.....);
表达式 / 计算
第一部分
a=b+5中,a,b,5都是算子,无论是变量还是常量都是算子,这里面的+,=是运算符。+,-,*,/,%分别表示加,减,乘,除,取余。表达式是由算子和运算符组成的。而程序是由数据和算法组成的。
计算时间差:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int hour1=0, minute1=0, hour2=0, minute2=0;
printf("请输入第一个时间_小时_分钟\n");
scanf("%d %d", &hour1, &minute1);
printf("输入的第二个时间为_小时_分钟\n");
scanf("%d %d", &hour2, &minute2);
int a = hour1 * 60 + minute1;
int b = hour2 * 60 + minute2;
int t = b - a;
printf("两个时间的时间差为%d小时%d分钟\n", t / 60, t % 60);
return 0;
}
输入第一个时间如:2 40,中间有一个空格,然后回车键,输入第二个时间:3 50,然后回车键,就得到了时间差。
该段代码中用到了除法和取余,其中除法t/60,左右两边都是整数,但是结果可能不是整数,那么C语言就会把不是整数的部分中的小数部分去除掉,只保留整数。在取余会舍去商数只得余数,这样就可以得到小时数与分钟数了。
第二部分
运算的优先级,结合关系,赋值运算符
运算的优先级:单目+(正号),单目-(取负),*(乘法),/(除法),%(取余),+(加法),-(减法),=(赋值)。最应该理解的就是赋值=,赋值不是一个语句而是一个运算符,运算后是有结果的。
结合关系:单目运算符和赋值运算符=是自右向左,其余都是自左向右。
int result = a = b = c + 5;
上面代码中先计算c+5,然后让c+5的结果赋值给b,然后把b的结果赋值给a,然后把a的结果赋值给result。其中c+5是自左向右运算,赋值运算符是自由向左运算。
第三部分
交换两个变量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 5;
int b = 6;
int c;
c = a;
a = b;
b = c;
printf("a=%d,b=%d\n", a, b);
return 0;
}
这段代码就体现了运算符的重要性,首先定义了a=5,b=6。然后准备了变量c,把a的值赋给c,然后c=a=5,然后把b=6赋值给a,就变成了a=b=6,最后把c中的值赋值给b,得到b=c=5。就完成两个变量的交换。重点就是赋值运算符的运算是自右向左进行的。还有初学者肯定不会想到这种方法,我们管这种码农比较常用的方法称为套路。和学习英语一样,单词你可以记住,但是怎样组成语言让别人听的懂,那就听听别人是怎么说的。学习C语言也是一样,遇到这件事情,人们是怎么做的。当你要交换两个变量的时候,人们是怎么做的,当你要做一个加法的时候人们是怎么做加法的,当你要做一个复杂的表达式计算的时候,人们是怎么做计算的。很多事情都有一般的做法,这个就是学习C语言的套路。这些套路的学习,靠阅读,你看别人是怎么做的,你看别人是怎么说的。你就跟着做,你就跟着说,你就知道了这件事该怎么做了
第四部分
复合赋值递增递减
复合赋值:total+=5的意思就是total=total+5。这个和运算顺序也有关系,先自左向右算total+5,然后自右向左赋值给total。先算total+5,再算total=total+5。
递增递减:a++,++a的区别。a++是等于+1之前的值,++a表示+1之后的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 20;
int b = a++;
printf("a=%d b=%d\n", a, b);
/*这段代码的先执行b=a,然后在执行a=a+1。输出的结果是b=20,a=21*/
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 20;
int b = ++a;
printf("a=%d b=%d\n", a, b);
/*这段代码的先执行a=a+1,然后在执行b=a。输出的结果是a=21,b=21*/
return 0;
}
第五部分
求按位逆序的数。如输入321,输出123。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个三位数\n");
scanf("%d", &num);
int a = 0;
int b = 0;
int c = 0;
a = num / 100;
/*因为a是一个整数变量,所以如果除完之后有小数的话会自动去除。
这个运算过后就得到了百位的数字*/
b = (num % 100) / 10;
/*这个是先把三位数除100取余得到一个两位数,再把两位数除10,
可能会有一个小数,但是因为b是一个整数变量,有小数的话会自动去除。
这个运算过后就得到了三位数中的十位上的数字*/
c = num % 10;
/*这个就是把三位数除10取余,三位数除10 之后,再取余就是个位上的数字。
如456/10后得到45余6,其中6就个位数字*/
int d = c * 100 + b * 10 + a;
printf("%d\n", d);
return 0;
}
这个就是前面说的套路,人们在解决这个问题的时候,是这样解决的。其中用到了除法和取余。