第二章 计算
2.1变量
算找零
如何能在程序运行时输入那个数字23,然后计算输出结果?
需要:1.有地方放输入的数字;2.有办法输入数字;3.输入的数字能参与计算。
#include<stdio.h>
int main()
{
int price=0;
printf("请输入金额(元):");
scanf("%d",&price);
int change=100-price;
printf("应找您%d元",change);
return 0;
}
2.1.1 变量定义
1、变量
int prince =0;
//这一行,定义了一个变量。变量的名字是price,类型是int,初始值是0。
变量是一个保存数据的地方,当我们需要在程序里保存数据时,比如上面的例子中要记录用户输入的价格,就需要一个变量来保存它。用一个变量保存了数据,它才能参加到后面的计算中,比如计算找零。
2、变量定义
变量定义的一般形式就是:<类型名称> <变量名称>;
int price;
int amount;
int price, amount;
3、变量的命名
变量需要一个名字,变量的名字是一种“标识符”,意思是它是用来识别这个和那个的不同的名字。
标识符有标识符的构造规则。基本的原则是:标识符只能由字母、数字和下划线组成,数字不可以出现在第一个位置上,C语言的关键字(有的地方叫它们保留字)不可以用做标识符。
- C语言的保留字
auto,break,case,char,const,continue ,default,do ,double,else, ,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof, static,struct,switch,typedef,union,unsigned,void,volatile , while,inline,restrict
不需要背诵,随着学习自然会了解
2.1.2 变量赋值与初始化
int price = 0;
这一行定义了一个变量。变量的名字是price,类型是int,初始值是0。
price=0是一个式子,这里的“=”是一个赋值运算符,表示将“=”右边的值赋给左边的变量。
1、赋值
和数学不同,a=b在数学中表示关系,即a和b的值一样;而在程序设计中,a=b表示要求计算机做一个动作:将b的值赋给a。关系是静态的,而动作是动态的。在数学中,a=b和b=a是等价的,而在程序设计中,两者的意思完全相反。
2、初始化
当赋值发生在定义变量的时候,就像程序I中的那样,就是变量的初始化。虽然C语言并没有强制要求所有的变量都在定义的地方做初始化,但是所有的变量在第一次被使用(出现在赋值运算符的右边)之前被应该赋值一次
#include<stdio.h>
int main()
{
int i;
int j;
j=i+10;
printf("%d\n",j);
return 0;
}//未初始化可能会出现乱码
3、变量初始化
<型名称> <变量名称>= <初始值>;
int price = 0;
int amount = 100;
组合变量定义的时候,也可以在这个定义中单独给单个变量赋初值,如:int price = 0, amount = 100;
4、表达式
“= "是赋值运算符,有运算符的式子就叫做表达式。
price=0;
change= l00-price;
5、变量类型
int price = 0;
这一行,定义了一个变量。变量的名字是price,类型是int,初始值是0。
C是一种有类型的语言,所有的变量在使用之前必须定义或声明,所有的变量必须具有确定的数据类型。数据类型表示在变量中可以存放什么样的数据,变量中只能存放指定类型的数据,程序运行过程中也不能改变变量的类型。
6、第二个变量
int change = 100 - price;
//定义了第二个变量change,并且做了计算
2.1.3变量的输入
1、读整数
scanf("%d", &price);
要求scanf这个函数读入下一个整数,读到的结果赋值给变量price
注意:小心price前面的&
2.1.4常量VS变量
1、常量
int change = 100 - price;
固定不变的数,是常数。直接写在程序里,我们称作直接量(literal)。
更好的方式,是定义一个常量:
const int AMOUNT = 100;
#include<stdio.h>
int main()
{
const int AMOUNT=100;
int price=0;
printf("请输入金额(元):");
scanf("%d",&price);
int change=100-prince;
printf("应找您%d元",change);
return 0;
}
2、const
-
const是一个修饰符,加在int的前面,用来给这个变量加上一个const (不变的)的属性。这个const的属性表示这个变量的值一旦初始化,就不能再修改了。
-
int change = AMOUNT - price;
-
如果你试图对常量做修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误。
让用户输入变量AMOUNT的值,而不是使用固定的初始值。这个变量在哪里定义合适呢?
#include<stdio.h>
int main()
{
int amount=100;
int price=0;
printf("请输入金额(元):");
scanf("%d",&price);
printf("请输入票面");
scanf("%d",&amount);
int change=amount-price;
printf("找您%d元。\n",change);
return 0;
}
plus
#include<stdio.h>
int main()
{
int a=0;
int b=0;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
printf("%d+%d=%d\n",a,b,a+b);
return 0;
}
2.1.5 浮点数
例:身高5尺7寸
美国人固执地使用英制计量单位,他们习惯用几尺几寸(英尺英寸)来报自己的身高。如果遇到一个美国人告诉你他是5英尺7,他的身高应该是一米几呢?
(5+7/12)x0.3048= 1.7018米
#include<stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸:");
int foot;
int inch;
scanf("%d %d",&foot,&inch);
printf("身高是%f米。\n",((foot+inch/12)*0.3046));
return 0;
}
在这些结果里英寸并没有起到作用
因为两个整数的运算的结果只能是整数
10和10.0在C中是完全不同的数
10.0是浮点数
要把12改为12.0
当浮点数和整数放到一起运算时,C会将整数转换成浮点数,然后行浮点数的运算。
#include<stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸:");
int foot;
int inch;
scanf("%d %d",&foot,&inch);
printf("身高是%f米。\n",((foot+inch/12.0)*0.3046));
return 0;
}
带小数点的数值。浮点这个词的本意就是指小数点是浮动的,是计算机内部表达非整数(包含分数和无理数)的一种方式。另一种方式叫做定点数,不过在C语言中你不会遇到定点数。人们借用浮点数这个词来表达所有的带小数点的数。
1、double
inch是定义为int类型的变量,如果把int换成double,我们就把它改为double类型的浮点数变量了。
double的意思是“双”,它本来“双精度浮点数”的第一一个单词,人们用来表示浮点数类型。除了double,还有float (意思就是浮点! )表示单精度浮点数。
#include<stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸:");
double foot;
double inch;
scanf("%d %d",&foot,&inch);
printf("身高是%f米。\n",((foot+inch/12)*0.3046));
return 0;
}
2、数据类型
-
整数
- int
- printf(“%.”,…)
- scanf(“%d”,…) …
-
带小数点的数
- double
- printf("%f,…)
- scanf(“%lf”,…)
2.2 表达式
表达式是一系列运算符和算子的组合,用来计算一个值。
2.2.1.运算符
-
运算符(operator) 是指进行运算的动作,比如加法运算符“+”,减法运算符“-”
-
算子(operand)是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值
例:计算时间差
输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分表示。
#include<stdio.h>
int main()
{
int hour1,minute1;
int hour2,minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int t1=hour1*60+minute1;
int t2=hour2*60+minute2;
int t=t2-t1;
printf("%d小时%d分钟",t/60,t%60);
return 0;
}
2.2.2运算符优先级
写一个程序,输入两个整数,输出它们的平均值
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
double c=(a+b)/2.0;
printf("%d和%d的平均值=%f\n",a,b,c);
return 0;
}
1、运算符优先级
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
---|---|---|---|---|
1 | + | 单目不变 | 自右向左 | a*+b |
1 | - | 单目取负 | 自右向左 | a*-b |
2 | ** | 乘 | 自左向右 | a*b |
2 | / | 除 | 自左向右 | a/b |
2 | % | 取余 | 自左向右 | a%b |
3 | + | 加 | 自左向右 | a+b |
3 | - | 减 | 自左向右 | a-b |
4 | = | 赋值 | 自右向左 | a=b |
单目运算,取负,优先级最高
2、赋值运算符
-
赋值也是运算,也有结果
-
a=6的结果是a被赋予的值,也就是6
-
a=b=6—> a=(b=6)
3、结合关系
-
一般自左向右
-
单目±和赋值=自右向左
例:计算复利
在银行存定期的时候,可以选择到期后自动转存,并将到期的利息计入本金合并转存。如果1年期的定期利率是3.3%,那么连续自动转存3年后,最初存入的x元定期会得到多少本息余额?
本息合计= x(1+3.3%)}.
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
double amount=x*(1+0.033)*(1+0.033)+(1+0.033);
printf("%lf",amount);
return 0;
}
2.2.3变量交换
如果已经有:
Int a = 6;
int b= 5;
如何交换a、b两个变量的值?
- 程序是按步骤执行的
程序表达的是顺序执行的动作,而不是关系
a=b;
b=a;
是依次执行的,结果使得a和b都得到b原来的值
- 像交换两杯水,需要第三个杯子
int c;
c=b;
b=a;
a=c;
#include<stdio.h>
int main()
{
int a=5;int b=6;
int t;
t=a;
a=b;
b=t;
printf("a=%d,b=%d",a,b);
return 0;
}
2.2.4复合赋值和递增递减
1、复合赋值
-
5个算术运算符,+ - * / %,可以和赋值运算符”="结合起来,形成复合赋值运算符:“+=”、”-=”、“*=”、“/=”和“%=”
-
total +=5;
-
total = total + 5;
-
注意两个运算符中间不要有空格
2、递增递减运算符
“++”和“–”是两个很特殊的运算符,它们是单目运算符,这个算子还必须是变量。这两个运算符分别叫做递增和递减运算符,他们的作用就是给这个变量+ 1或者-1。
count++;
count += 1;
count=count+1;
- 前缀后缀
++和–可以放在变量的前面,叫做前缀形式,也可以放在变量的后面,叫做后缀形式。
a++的值是a加1以前的值,而++a的值是加了1以后的值,无论哪个,a自己的值都加1了。
#include<stdio.h>
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以后的值 |