程序框架
#include <stdio.h>
int main()
{
return 0;
}
输出
printf("Hello Word!\n);
""里面的内容叫做“字符串”,printf会把其中的内容原封不动的输出
\n表示要在输出的结果后面换一行
做计算
printf("23+43=%d\n",23+43);
如何在程序运行中输入数字23,然后计算输出结果?
change.c
int price=0;
printf("请输入金额(元):");
scanf("%d",&price);
int change=100-price;
printf("找您%d元。\n",change);
如何输入
- 输入也在终端窗口中
- 输入以行为单位进行的,行的结束标志就是你按下了回车键。在你按下回车键之前,你的程序不会读到任何东西。
输入的数字放哪里,放在变量里
变量
- int price=0;
- 这一行,定义了一个变量。变量的名字是price,类型是int,初始值是0。
- 变量是一个保存数据的地方,当我们需要在程序里保存数据时,比如上面的例子中要记录用户输入的价格,就需要一个变量保存它。用一个变量保存了数据,它才能参加到后面的计算中,比如计算找零。
变量定义
- 变量定义的一般形式就是:<类型名称> <变量名称>;
- int price;
- int amount;
- int price,amount; 同时定义两个变量方法
名称变量——变量的名字
- 变量需要一个名字,变量的名字是一种“标识符”,意思是它是用来识别这个和那个的不同名字的名字。
- 标识符有标识符的构造规则。基本的原则是:标识符只能是字母、数字和下划线组成,数字不可以出现在第一个位置上,C语言的关键字,不可以用做标识符。
赋值和初始化
int price=0 是一个式子,这里的“=”号是一个赋值运算符,表示将“=”右边的值赋给左边的变量。
赋值
和数学不同,a=b在数学中表示关系,即a和b的值一样。而在程序设计中,a=b表示要求计算机做一个动作:将b的值赋给a。关系是静态的,而动作是动态的。在数学中,a=b和b=a是等价的,而在程序设计中,两者的意思完全相反。
初始化
当赋值发生在定义变量的时候,就是变量的初始化。虽然C语言并没有强制要求所有的变量都在定义的地方做初始化,但是所有的变量在第一次被使用(出现在赋值运算符的右边)之前被应该赋值一次。
变量初始化
- <类型名称><变量名称>=<初始值>
- int price=0;
- int amount=100;
- 组合变量定义的时候,也可以在这个定义中单独给单个变量赋初值,如:int price=0,amount=100;
表达式
“=”是赋值运算符,有运算符的式子就叫做表达式。
price=0;
change=100-price;
变量类型
C是一种有类型的语言,所有的变量在使用之前必须定义和声明,所有的变量必须具有确定的数据类型。数据类型表示在变量中可以存放什么样的数据,变量中只能存放指定类型的数据,程序运行过程中也不能改变变量的类型。
读整数
scanf("%d",&price);
- 要求scanf这个函数读入写一个整数,读到的结果赋值给变量price
- 小心price前面的&
常量
- int change=100-price
- 固定不变的数,是常数。直接写在程序里,我们称作直接量(literal)。
- 更好的方式,是定义一个常量: const int AMOUNT=100;
const
const是一个修饰符,加在int的前面,用来给这个变量加上一个const(不变的)的属性。这个const的属性表示这个变量的值一旦初始化,就不能再修改呢。
int change=AMOUNT-price (大写AMOUNT原因,因为它是const的)
如果你试图对常量进行修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误。
scanf同时读取两个整数
int a;
int b;
printf(“请输入两个整数:”);
scanf("%d %d,&a,&b"); 注:两个%d之前用空格
printf("%d+%d=%d\n",a,b,a+b);
整数运算
printf("%d",10/3); 结果3 说明直接扔掉了小数部分
- 因为两个整数的运算结果只能是整数
- 10/3*3 结果为9
- 10和10.0在C中是完全不同的数
- 10.0是浮点数
printf("%f",10.0/3); 结果3.333333 当浮点数和整数放一起运算时,C会将整数转化成浮点数,然后进行浮点数的运算。相应的%d改为%f
浮点数
带小数点的数值。浮点数这个词的本意就是指这个小数点是浮动的,是计算机内部表达非整数(包含分数和无理数)的一种方式。另一种方式叫做定点数,不过在C语言中你不会遇到定点数。人们借用浮点数这个词来表达所有带小数点的数
例:#include <stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英寸7英尺:");
int foot;
int inch;
scanf("%d %d",&foot,&inch);
printf("身高是%f米",(foot+inch/12.0)*0.3048);
return 0;
}
double
- inch是定义为int类型的变量,如果把int换成double,就把inch 改为double类型的浮点数变量了。
- double意思是“双”,它本来是“双精度浮点数”的第一个单词,人们用来表示浮点数类型。除了double,还有float(意思就是浮点),表示单精度浮点数。
double foot;
double inch;
scanf("%lf %lf",&foot,&inch); 当变量是double类型时,输入时用%lf
printf("身高是%f米",(foot+inch/12.0)*0.3048); 当变量是double类型时,输出时用%f
数据类型
- 整数
- int
- printf("%d",...)
- scanf("%d,...)
- 带小数点的数
- double
- printf("%f",...)
- scanf("%lf,...)
表达式
一个表达式是一系列运算符和算子的组合,用来计算一个值。
运算符是指进行运算的的动作,如加减
算子是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。
a=b+5 =和+都是运算符,a b 5都是算子
四则运算
加+
减-
乘*
除/
取余% 取相除之后的余数
例:计算时间差 1.整数相除只能是整数,余数扔掉。2.取余
#include <stdio.h>
int main()
{
int hour1,minutes1;
int hour2,minutes2;
scanf("%d %d",&hour1,&minutes1);
scanf("%d %d",&hour2,&minutes2);
int t1=hour1*60+minutes1;
int t2=hour2*60+minutes2;
int t=t2-t1;
printf("时间差为%d小时%d分钟",t/60,t%60);
return 0;
}
运算符优先级
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
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+b(a加b),运算符+有两个算子,叫双目,单目指运算符只有一个算子。如:a是一个变量,已经有一个值呢,但想取a变量的负值,写-a就可以呢。
赋值运算符
- 赋值也是运算,也有结果
- a=6的结果是a被赋予的值,也就是6
- a=b=6 a=(b+6)
例:计算复利
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
double amount=x*(1+0.033)*(1+0.033)*(1+0.033) ; %在C里是运算符,所以3.3%写为0.033,C没幂次方运算,所以连乘三次
printf("您的本息合计为%f",amount);
return 0;
}
交换两个变量 注:像交换两杯水,需要第三个杯子
例:
#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;
}
复合赋值
- 5个算数运算符,+-*/%可以和赋值运算符=结合起来,形成复合赋值运算符:+= -= *= /=和%= 注:两个运算符中间不要有空格
如;total+=5;
即total=total+5;
total*=sum+12;
即total=total*(sum+12); 复合赋值运算实际上是把右边整体算完,在=左边的做计算
递增递减运算符
- ++和--是两个很特殊的运算符,他们是单目运算符(只有一个算子),这个算子还必须是变量。这两个运算符分别叫做递增和递减运算符,他们的作用就是给这个变量+1或-1,
count++;
即count+=1;
即count=count+1;
前缀和后缀
- ++和--可以放在变量的前面,叫做前缀形式,也可以放在变量的后面,叫做后缀形式。
a++的值是a+1以前的那个值,而++a的值是a+1以后的值,无论那个,a自己的值都加了1呢。
表达式 | 运算 | 表达式的值 |
count++ | 给count+1 | count原来的值 |
++count | 给count+1 | count+1以后的值 |
count-- | 给count-1 | count原来的值 |
--count | 给count-1 | count-1以后的值 |
例:
#include <stdio.h>
int main()
{
int a=5;
printf("a++=%d\n",a++); 表达式的值
printf("a=%d",a); 运算
return 0;
}
结果 a++=5 a=6
做判断
如果
if(条件成立){
...
} 注:如果条件成立,做大括号了里计算。如条件不成立,直接跳过大括号内容,进行下一步。
例:#include <stdio.h>
int main()
{
int hour1,minutes1;
int hour2,minutes2;
scanf("%d %d",&hour1,&minutes1);
scanf("%d %d",&hour2,&minutes2);
int ih=hour2-hour1;
int im=minutes2-minutes1;
if(im<0){
im=im+60;
ih--;
}
printf("时间差为%d小时%d分钟",ih,im);
return 0;
}
条件
- 计算两个值之间的关系,所以叫做关系运算
运算符 | 意义 |
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
注:既然是运算符,就会有结果
注:一个=号是赋值运算
注:!在C中往往表示“不是”“非”“NOT”
习惯上把下面4个关系运算符叫比较运算符
- 关系运算的结果
当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0。
#include <stdio.h>
int main()
{
printf("%d\n",5==3);
printf("%d\n",5>=3);
return 0;
}
- 优先级
所有关系运算符的优先级比算数运算的低,但是比赋值运算的高
7>=3+4;
int r=a>0;
判断是否相等的=和!=的优先级比其他低(包括> <),而连续的关系运算是从左到右进行的
5>3==6>4;
6>5>4;
a==b=6;
注释
1.以两个双斜杠“//"开头的语句 单行注释
2./**/ 多行注释,*和*之间填写注释内容
if else
例:找零
#include <stdio.h>
int main()
{
int price;
int bill;
printf("总计");
scanf("%d",&price);
printf("请输入面票") ;
scanf("%d",&bill);
if(bill>=price){
printf("应该找您%d",bill-price);
}else{
printf("余额不足");
}
return 0;
}
例:比较两个数
#include <stdio.h>
int main()
{
int a;
int b;
int MAX;
printf("请输入两个整数");
scanf("%d %d",&a,&b);
if(a>=b){
printf("MAX=%d",a);
}else{
printf("MAX=%d",b);
}
return 0;
}
例;比较两个数 方法2
#include <stdio.h>
int main()
{
int a;
int b;
printf("请输入两个整数");
scanf("%d %d",&a,&b);
int MAX=b;
if(a>=b){
MAX=a;
}
printf("MAX=%d",MAX);
return 0;
}
if 语句
- 一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号{}之间的若干条语句。如果表示条件的逻辑表达式的结果不是0,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。
- if语句另一种表示方法:
if(total>amount)
total+=amount+10;
if语句在这一行结束的时候并没有表示语句结束的;,而后面的赋值语句写在if的下一行,并且缩进了,在这一行结束的时候有一个表示语句结束的;。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句的,决定它是否要被执行。
例:判断成绩
#include <stdio.h>
int main()
{
const int PASS=60;
int score;
printf("请输入您的成绩");
scanf("%d",&score);
printf("您输入的成绩为%d\n",score); 注:常用方法,读入用户输入,紧接着输出用户输入。可以有效检验刚才输入是否输入进去呢,输入进去的是否是对的。
if(score>=PASS)
printf("及格\n");
else
printf("不及格\n");
printf("再见!");
return 0;
}
例:找三个数中的最大值
#include <stdio.h>
int main()
{
int a,b,c;
printf("请输入三个整数");
scanf("%d %d %d",&a,&b,&c);
int MAX;
if(a>=b){
if(a>=c){
MAX=a;
}
else{
MAX=c;
}
}else{
if(b>=c){
MAX=b;
}else{
MAX=c;
}
}
printf("MAX=%d",MAX);
return 0;
}
嵌套的判断
- 当if的条件满足或不满足的时候,要执行的语句也可以是一条if或if else语句,这就是嵌套的if语句。
- else的匹配总是和最近的if匹配(无大括号的if else语句中,加大括号的if else不适用)
嵌套的if
if(a==b)
if(c==2)
printf("正确”);
else{
printf("不正确"); 注:这样写,else是和开头第二个if匹配的
if(a==b){ 注:加大括号,else才是和开头第一个if匹配的
if(c==2)
printf("正确”);
}
else{
printf("不正确");
tips
- 在if或else后面总是用{}
- 即使只有一条语句的时候
级连的if-else if
例:分段函数
x<0,f=-1
x=0,f=1
x>0,f=2x
流程图:
#include <stdio.h>
int main()
{
int x;
printf("请输入X的值");
scanf("%d",&x);
int f;
if(x<0){
f=-1;
} else{
if(x==0){
f=0;
}else{
f=2*x;
}
}
printf("f为%d",f);
return 0;
}
另一种编排if else的方式:让所有的else对齐。
#include <stdio.h>
int main()
{
int x;
printf("请输入X的值");
scanf("%d",&x);
int f;
if(x<0){
f=-1;
}else if(x==0){ 注:并将else和if相连,取消了else和if之间的一对大括号。
f=0;
}else{
f=2*x;
}
printf("f为%d",f);
return 0;
}
级联的if-else if
if(exp 1)
stl;
else if(exp 2)
st2;
else
st3;
两种写法代码对比:
- 第一种 注:推荐第一种写法,好处:单一出口(我只是把f算出来,f在后面可以做别的计算,是灵活的。但第二种只是输出给别人看,写死呢)
int f;
if(x<0){
f=-1;
}else if(x==0){
f=0;
}else{
f=2*x;
}
printf("f为%d",f);
- 第二种
int f;
if(x<0){
printf("f为%d",-1);
}else if(x==0){
printf("f为%d",0);
}else{
printf("f为%d",2x);
}
printf("f为%d",f);
if语句常见的错误
- 忘记大括号
- if后面的分号
- 错误使用==和= if只要求括号里的值是0或非0
if(a=0){
printf("%d",a)} 当If判断圆括号里的条件为0时,大括号的内容不会被执行
- 使人困惑的else
风格 风格是三观
- 在if和else之后必须加上大括号形成语句块;
- 大括号内的语句缩进一个tab的位置;
风格一
if(x<0){
f=-1;
}else if(x==0){
f=0;
}else{
f=2*x;
}
风格二
if(x<0)
{
f=-1;
}else if(x==0)
{
f=0;
}else
{
f=2*x;
}
风格三
if(x<0)
{
f=-1;
}
else if(x==0)
{
f=0;
}
else
{
f=2*x;
}
多路分支
switch-case
switch(控制表达式){ 注:控制表达式只能是整数型的结果
case 常量: 注:常量可以是常数,也可以是常数计算的表达式
语句
...
case 常量:
语句
...
case 常量:
语句
...
}
例:成绩转换
#include <stdio.h>
int main()
{
printf("请输入您的成绩");
int grade ;
scanf("%d",&grade);
grade/=10;
switch(grade){
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("F");
break;
}
return 0;
}
- switch可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处,分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。