例题:美国人固执地使用英制计量单位,他们习惯用几尺几寸(英尺英寸)来报自己的身高。如果遇到一个美国人告诉你他是5英尺7,他的身高应该是一米几呢?
身高5尺7寸?
(5+7÷12 ) ×0.3048= 1.7018米
#include
int main()
{
//计算身高的程序
printf("请分别输入身高的英尺和尺寸,""如输入\"5 7\"表示5英尺7英寸:");
int foot;
int inch;
scanf_s("%d %d",&foot,&inch);
printf("身高是%f米。\n",((foot+inch/12)*0.3048));
}
控制台:5尺7寸=应该是1.7018米,这里是1.524000米,问题出在哪?
因为...
因为两个整数的运算的结果只能是整数
10/3*3=>?
10和10.0在C语言中是完全不同的数
10.0是浮点数
他的结果只能是整数
需要改:把10改成10.0,把%d改成%f。
printf("%f\n",10.0/3);
上述程序同改:
printf("身高是%f米\n", ((foot + inch / 12.0) * 0.3048));
浮点数
带小数点的数值。浮点这个词的本意就是指小数点是浮动的,是计算机内部表达非整数(包含分数和无理数)的一种方式。另一种方式叫做定点数,不过在C语言中你不会遇到定点数。人们借用浮点数这个词来表达所有的带小数点的数。
当浮点数和整数放到一起运算时,c会将整数转换成浮点数,然后进行浮点数的运算。
double
inch是定义为int类型的变量,如果把int换成double,我们就把他改为double类型的浮点数变量了。
double的意思是“双”,他本来是“双精度浮点数”的第一个单词,人们用来表示浮点数类型。除了double,还有float(意思就是浮点!)表示单精度浮点数。
#include
void main()
{
//计算身高的程序
printf("请分别输入身高的英尺和尺寸,""如输入\"5 7\"表示5英尺7英寸:");
double foot;
double inch;
scanf_s("%d %d", &foot, &inch);//改这里
printf("身高是%f米。\n", ((foot + inch / 12) * 0.3048));
return 0;
}
上述程序可以改为:
scanf_s("%lf %lf", &foot, &inch);
数据类型
整数
int
printf("%d",...);
scanf("%d",...);
带小数点的数
double
printf("%f",...);
scanf("%f",...);
表达式
一个表达式是一系列运算符和算子的组合,用来计算一个值。
如:
amount=x**(1+0.033)*(1+0.033)*(1+0.033);
total=57;
count=count+1;
value=(min/2)*lastValue;
运算符
运算符(operator)是指进行运算的动作,比如加法运算符“+”,减法运算符“-”。
算子(operand)是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。
如:
int sides=4;
Sides=7;
Sides=sides+5;
程序:计算时间差
输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间的差,也可以几小时几分钟表示
#include
void main()
{
int hour1, minute1;
int hour2, minute2;
printf("请输入时间1的小时和分钟:\n");
scanf_s("%d %d",&hour1,&minute1);
printf("请输入时间2的小时和分钟:\n");
scanf_s("%d %d",&hour2,&minute2);
int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2;
int t = t2 - t1;
printf("时间差是%d小时%d分钟。\n",t/60,t%60);
}
如果直接分别减,会出现分钟借位的情况:1点40和2点10分的差?
hour1*60+minute1 --> 转换为分钟的单位
t/60 --> 小时部分
t%60 --> 分钟
程序:求平均值
写一个程序,输入两个整数,求出他们的平均值
#include
void main()
{
int a;
int b;
double c;
scanf_s("%d %d",&a,&b);
c=(a+b)/ 2.0;
printf("%d和%d的平均数为%f",a,b,c);
}
运算符优先级
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
1 | + | 单目不变 | 自右向左 | a*+b |
1 | - | 单目取负 | 自右向左 | a*-b |
2 | * | 乘 | 自左向右 | a*b |
2 | / | 除 | 自左向右 | a/b |
2 | % | 取余 | 自左向右 | a%b |
3 | + | 加 | 自左向右 | a+b |
3 | - | 减 | 自左向右 | a-b |
4 | = | 赋值 | 自右向左 | a=b |
赋值运算符
赋值也是运算,也有结果
a=6的结果是a被赋予的值,也就是6
a=b=6 --> a=(b=6),先赋给b再赋给a
“嵌入式赋值”(不推荐使用)
int a=6;
int b;
int c=1+(b+a);
不利于阅读
容易产生错误
结合关系
一般自左向右
单目*+ ,*- 和赋值= 自右向左
程序:计算复利
在银行存定期的时候,可以选择到期后自动转存,并将到期的利息计入本金合并转存。如果1年期的定期利率是3.3%,那么连续自动转存3年后,最初存入的x元定期会得到多少本息余额?
本息合计=x(1+3.3%)³
int x;
scanf_s("%d", &x);
double a = x * (1 + 0.033) * (1 + 0.033) * (1 + 0.033);
printf("%f",a);
要计算任意年以后的本息金额,就需要做(1+0.033)n次方 的计算?
后面循环可以做!
变量交换
交换两个变量
如果已经有:
int a=6;
int b=5;
如何交换两个变量的值?
程序表达是顺序的动作,而不是关系
a=b;
b=a;
是依次执行的,结果使得a和b都得到b原来的值
#include
int main()
{
int a = 5;
int b = 6;
int t;
t = a;
a = b;
b = t;
printf("a=%d,b=%d\n",a,b);
return 0;
}
交换
int t=a;
a=b;
b=t;
符合赋值
5个算数运算符,+ - * / %,可以和赋值运算符“=”结合起来,形成复合赋值运算符:“+=”, “-=”,“*=”,“/=”和“%=”
total += 5;
total = total+5;
注意两个运算符中间不要有空格
total += (sum+100)/2;
total = total+(sum+100)/2;
total *= sum+12;
total = total*(total+12);
total /= 12+6;
total = total/(12+6);
递增递减运算符
“++”和“--”是两个很特殊的运算符,他们是单目运算符,这个算子还必须是变量。这两个运算符还分别叫做递增,递减运算符,他们的作用就是给这个变量+1或者-1。
count++;
count+=1;
count=count+1;
前缀后缀
++和--可以放在变量的前面,叫做前缀形式,也可以放在变量的后面,叫做后缀形式。
a++的值是a加1以前的值,而++a的值是加了1以后的值,无论那个,a自己的值都加了1了。
#include
int main()
{
int a = 10;
printf("a++=%d\n",a++);
printf("a=%d\n", a);
printf("++a=%d\n", ++a);
printf("a=%d\n", a);
return 0;
}
表达式 | 运算 | 表达式的值 |
count++ | 给count+1 | count原来的值 |
++count | 给count+1 | count+1以后的值 |
count-- | 给count-1 | count原来的值 |
--count | 给count-1 | count-1以后的值 |
可以单独使用,但是不要组合进表达式
++i++-->?
i++++-->?
a=b+=c++-d+**e/-f