学习内容
运算符
算术运算符
有:+ - * /(除) %(取余数)
关系运算符
有:> >= < <= !=(不等于) ==(等于)
逻辑运算符
有:!(非) &&(并且) ||(或)
赋值运算符
有= += *= /= -=
优先级别
算术运算符>关系运算符>逻辑运算符>赋值运算符
&&左边的表达式为假,右边的表达式肯定不会执行
||左边的表达式为真,右边的表达式肯定不会执行
附录运算符知识
自增(自减)
分类:
前自增 -- ++i
后自增 -- i++
前自增和后自增的异同:
相同:
最终都使i的值加1
不同
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
#include<math.h>
int main(void)
{
int i;
int j;
int k;
int m;
i=j=3;
k=i++;
m=++j;
printf("i=%d j=%d k=%d m=%d",i,j,k,m);
return 0;
}
为什么会出现自增(自减)
代码更精炼
自增的速度更快
学习自增要明白的几个问题
1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
2.自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说i++和++i单独成一个语句,不要把它作为一个完整复合语句的一部分来使用
三目运算符
A?B:C
等价于
if(A)
B;
else
C;
#include<math.h>
int main(void)
{
int i;
i=(3>2?5:1);
printf("%d\n",i);
return 0;
}
逗号表达式
格式:
(A,B,C,D)
功能:
从左到右执行
最终表达式的值时最后一项的值
#include<math.h>
int main(void)
{
int i;
int j=2;
i=(j++,++j,j+2,j-3);
printf("%d\n",i);
return 0;
}
流程控制
什么是流程控制
程序代码执行的顺序
流程控制的分类
顺序执行
选择执行
定义 某些代码可能执行,也可能不执行,有选择的执行某些代码
分类
if
1.if的最简单的用法
格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
2.if的范围问题
if(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行,或者讲语句B一定会执行
if(表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
由此可见,if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,那么就必须把这些语句用{}括起来
链接:www.bilibili.com/video/BV1os…
3.if...else...的用法
链接:www.bilibili.com/video/BV1os…
4.if...else...if...else...的用法
格式:
if(1)
A;
else if(2)
B;
else if(3)
C;
else
D;
链接:www.bilibili.com/video/BV1os…
5.C语言对真假的处理
非零是真
零就是假
真用1表示
假用0表示 链接:www.bilibili.com/video/BV1os…
6.if举例
求分数的等级
#include<math.h>
int main(void)
{
float score;
printf("please input your score!");
scanf("%f",&score);
if(score > 100)
printf("This is a dream!\n");
else if(score>=90 && score<=100)
printf("you are excellent!\n");
else if(score>=80 && score<90)
printf("you did well!\n");
else if(score>=60 && score<80)
printf("you passed!\n");
else if(score>=0 && score<60)
printf("you are fail!\n");
else
printf("The input score is too low!\n");
return 0;
}
链接:www.bilibili.com/video/BV1os…
三个数排序
#include<math.h>
int main(void)
{
int a,b,c;
int t;
printf("please input three nmubers!\n");
scanf("%d %d %d",&a,&b,&c);
if(a<b)
{
t=a;
a=b;
b=t;
}
if(a<c)
{
t=a;
a=c;
c=t;
}
if(b<c)
{
t=b;
b=c;
c=t;
}
printf("%d %d %d\n",a,b,c);
return 0;
}
链接:www.bilibili.com/video/BV1os… \
7.if的常见问题解析
1.空语句的问题 if(3>2);
等价于
if(3>2)
;//这是一个空语句
2.if(表达式1)
A;
else
B;
是正确的
if(表达式1);
A;
else
B;
是错误的
3.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else
D;
即便表达式1和2都成立,也只会执行A语句
4.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
这样写语法不会出错,但逻辑上有漏洞
5.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else (表达式4)//7行
D;
这样写是不对的,正确的写法是:
要么去掉第七行的(表达式4),要么在七行的else后面加if
6.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else(表达式4);
D;
这样写语法不会出错,但逻辑上是错误的
else(表达式4);
D;
等价于
else
(表达式4);
D;\
链接:www.bilibili.com/video/BV1os…
switch
#include<math.h>
int main(void)
{
int val;
printf("please enter the floor you want to enter!\n");
scanf("%d",&val);
switch(val)
{
case 1:
printf("on the first floor open!\n");
break;
case 2:
printf("on the second floor open!\n");
break;
case 3:
printf("on the third floor open!\n");
break;
default:
printf("fault!\n");
break;
}
return 0;
}
格式: switch(表达式) { case常量表达式1:语句1; case常量表达式2:语句2; ... case常量表达式n:语句n; default:语句n+1; }
循环执行
定义 某些代码会被重复执行
分类
for
#include<math.h>
int main(void)
{
int i;
int sum = 0;
for(i = 1;i<=10;++i)
sum = sum + i;
printf("sum is %d\n",sum);
return 0;
}
1.格式
for(A;B;C)
语句A;
2.执行的流程
单个for循环的使用
多个for循环的嵌套使用
for(1;2;3)//1
for(4;5;6)//2
A;//3
B;//4
整体是两个语句,1 2 3是第一个语句,4是第二个语句
for(1;2;3)
for(4;5;6)
{
A;
B;
}
整体是一个语句
for(1;2;3)
for(4;5;6)
{
A;
B;
for(7;8;9)
C
}
整体是一个语句
#include<math.h>
int main(void)
{
int i,j;
for(i=0;i<3;++i)
printf("heihei!\n");
for(j=2;j<5;++j)
printf("haha!\n");
printf("xixi!\n");
return 0;
}
#include<math.h>
int main(void)
{
int i,j;
for(i=0;i<3;++i)
printf("1111!\n");
for(j=2;j<5;++j)
{
printf("2222!\n");
printf("3333!\n");
}
printf("4444!\n");
return 0;
}
3.范围问题
4.举例
1+2+3+4……+100
1+1/2+1/3+1/4+……+1/100
#include<math.h>
int main(void)
{
int i;
float sum = 0;
for(i = 1;i<=100;++i)
sum = sum + 1.0/i;
printf("sum is %f\n",sum);
return 0;
}
5.for和if的嵌套使用
1到100之间奇数之和
#include<math.h>
int main(void)
{
int i;
int sum=0;
for(i=1;i<101;++i)
{
if(i%2 == 1)
sum += i;
}
printf("sum = %d\n",sum);
return 0;
}
1到100之间奇数的个数
#include<math.h>
int main(void)
{
int i;
int cnt = 0;
for(i=1;i<101;++i)
{
if(i%2 == 1)
++cnt;
}
printf("cnt = %d\n",cnt);
return 0;
}
1到100之间奇数的平均值
#include<math.h>
int main(void)
{
int i;
int sum = 0;
int cnt = 0;
float avg;
for(i=1;i<101;++i)
{
if(i%2 == 1)
{
sum += i;
++cnt;
}
}
avg = 1.0*sum/cnt;
printf("sum = %d\n",sum);
printf("cnt = %d\n",cnt);
printf("avg = %f\n",avg);
return 0;
}
1到100之间奇数之和,1到100之间偶数之和
#include<math.h>
int main(void)
{
int i;
int sum1 = 0;
int sum2 = 0;
for(i=1;i<101;++i)
{
if(i%2 == 1)
sum1 += i;
else
sum2 += i;
}
printf("sum1 = %d\n",sum1);
printf("sum2 = %d\n",sum2);
return 0;
}
链接:www.bilibili.com/video/BV1os…
while
1.执行顺序
格式:
while(表达式)
语句;
2.与for的相互比较
while和for可以相互转换
for(1;2;3)
A;
等价于
1;
while(2)
{
A;
3;
}
while和for可以相互转化
但ford的逻辑性更强,更不容易出错
#include<math.h>
int main(void)
{
int i;
int sum = 0;
i=1;
while(i<101)
{
sum = sum + i;
i++;
}
printf("sum = %d\n",sum);
return 0;
}
3.举例
从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数:正着写和倒着写都一样,比如:121,12321都是回文数
#include<math.h>
int main(void)
{
int val;//存放待判断的数字
int m;
int sum = 0;
printf("enter a number to determine!\n");
scanf("%d",&val);
m=val;
while(m)
{
sum = sum*10 + m%10;
m/=10;
}
if(sum == val)
printf("yes!\n");
else
printf("no!\n");
return 0;
}
斐波拉契序列
#include<math.h>
int main(void)
{
int n;
int f1,f2,f3;
int i;
f1=1;
f2=2;
printf("please enter the sequence of items you want:\n");
scanf("%d",&n);
if(1 == n)
{
f3=1;
}
else if(2 == n)
{
f3=2;
}
else
{
for(i=3;i<=n;++i)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
}
printf("%d\n",f3);
return 0;
}
4.do...while
格式:
do
{
A;
}
while(表达式)
do...while并不等价于for,当然也不等价于while
一元二次方程
#include<math.h>
int main(void)
{
double a,b,c;
double delta;
double x1,x2;
printf("please enter three coefficients:\n");
printf("a = ");
scanf("%lf",&a);
printf("b = ");
scanf("%lf",&b);
printf("c = ");
scanf("%lf",&c);
delta = b*b - 4*a*c;
if(delta >0)
{
x1=(-b + sqrt(delta)) / 2*a;
x2=(-b - sqrt(delta)) / 2*a;
printf("there are two solutions!\n");
}
else if(0 == delta)
{
x1=x2=(-b) / 2*a;
printf("there is a solutions!\n");
}
else
printf("no solution!\n");
return 0;
}
break和continue
break
如果用于循环是用来终止循环
如果用于switch,则是用于终止switch
不能直接用于if,除非if属于循环内部的一个子句
在多重循环中,break只能终止离它最近的循环
例如:
#include<math.h>
int main(void)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=1;j<4;j++)
break;
printf("haha!\n");
}
return 0;
}
在多层switch嵌套中,break只能终止距离它最近的switch
continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环 例子: 1. for(1;2;3)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都会被跳过去,C和D不会被执行
C;
D;
}
while(表达式)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和D不会被执行
C;
D;
}
强化类型转换
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型
浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数
循环中更新的变量不能定义成浮点型
课后作业答案
5.10
第七题
第十三题
a.x--
b.m=n%k
c.p=q/b-a
d.x=(a+b)/c*d
5.11
第三题
第八题
6.16
第五题
第十二题
第十八题
7.11
第二题
a.(number>=90) && (number<100)
b.ch !='q'||ch !='k'
c.number >=1 && number<=9 && number !=5
d.number <1 || number >9