第五章 流程控制 Pro
五、流程控制
1、条件语句
一、if语句(三种形式)
1、单分支语句:
if (表达式)语句; //表达式可以是任何表达式 0和非0 多条语句加{ }构成复合语句
2、双分支语句
if(表达式)
语句1;
else
语句2;
3、多分支语句
(1)一般形式:if_else_if 形式
if(表达式1)语句1;
else if (表达式2) 语句2;
else if(表达式3) 语句3;
[else 语句n;]
注意区别:if(a==5) 判断
if(a=5)赋值
if(a) if(a!=0)
(2) if嵌套形式
if ()
if() 语句1;
else 语句2;
else
if ()语句1;
else 语句2;
#include <stdio.h>
void main(){
int m,x=3,y=4,z=5;
if(x>y) m=x; //判断3大于4 不成立向下执行
if(y<z) m=y; //判断4小于五成立 将y的4赋值给m
else m=z;
printf("%d",m); //m=4
}
2、空语句与复合语句
空语句即只有一个分号,它通常用于占位,为以后补充代码预留,是合法的语句。
if (x); //合法 if (x) {}//合法 if (x) {}//合法
复合语句用于将一组语句视为 一条(一个整体) ,通常用于分支和循环中。
3、 switch+break
#include <stdio.h>
void main(){
switch (表达式) { //表达式只能是整型和字符型
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
case 常量表达式3:语句n;break;
default:语句;break;
}
}
二、功能:
1、计算表达式的值;
2、值与某常量表达式的值相等,转常量表达式后面语句执行;直到遇break或switch结束时退出,期间不再进行同级别case判断。
3、若均不相等,执行default部分,若无default,则switch语句什么也不做。
三、知识点
1、表达式的值必须是确定的,且应与case后面的常量为同类型变量,可以是字符型、整型;
不可是实型,实型没有精确值
2、case后面加空格,每个常量表达式后面有冒号;
3、每个case后面的常量值不能相同;
4、各个case后的语句可以是多个语句,可不用花括号括起来;
5、不能漏掉break(如果需要);
6、多case可共用同一组语句;
7、 case后的值决定了入口, break决定了出口
8、switch允许嵌套,break只能跳出紧包裹着switch结构;
9、如果所有语句都有break ,则很容易用if-else语句表示
#include <stdio.h>
void main(){
int x=1,y=0,a=1,b=0;
switch (x) //x为1
{case 1: //执行
switch (y) //y=0执行
{
case 0:b++; //b=1
case 1:a++;break;//b=1,a=2 跳出
case 2:b++;break;
}
case 2:a++;b++;break; //b=2.a=3
case 3:a++;b++;
}
printf("a=%d,b=%d\n",a,b);
}
#include <stdio.h>
int main(void){
int a=2,b=1;
switch (a+1) //3
{ case 2:b=b+2;break;
case 3:b=b*3; //1*3=3
case 4:b=b*4;break; //3*4=12
case 5:b=b+5;
}
printf("b=%d",b);
}
#include <stdio.h>
int main(void){
int n='c';
switch (n) {
case 'c':case 'C':printf("pass");
case 'd':case 'D':printf("fail");break;
default:printf("error");break;
}
}
4、 if(x)与if(!x)的正确理解
两个等价条件的四种形式
if(x) 等价于if(x!=0) 同理,while(x)等价于while(x!=0)
if(!x)等价于if(x==0)同理, while(!x)等价于while(x==0)
要区分!(逻辑,取反)和!=(关系符,不等于)
5、循环结构的三个语句
while 当型
do... while 直到型
for 循环
while循环语句
一、一般形式:
while (表达式) //可以是任何表达式,主要用于判断0和非0
循环体语句;
二、执行过程
(1)计算表达式的值
(2)如果表达式为真,执行循环体语句
(3)如果表达式值为假,则退出循环
三、说明:
1、表达式任意,表达式省略时,会有语法错误;
2、先判断表达式,再执行循环体;
3、循环部分为多个语句时,必须用大括号构成复合语句;
四、while关键点
循环条件的初态
while(循环条件){
循环体语句;
(一定要有改变循环条件的语句)
}
do while循环语句
一、一般形式
do
循环体语句;
while(表达式);
二、执行过程
1、执行循环体的语句
2、计算循环控制表达式的值,如果表达式为真,则返回
3、如果表达式值为假,则退出循环,执行循环后面的语句
三、注意:
1、先执行循环体,再判断表达式,循环体至少执行一次;
2、while后面要有分号;
for循环
一、一般形式
for (表达式1;表达式2;表达式3)
循环体语句;
二、执行过程
(1)求解表达式1;
(2)判断表达式2;
(3)表达式2为真,执行循环体语句,求解表达式3;转(2),若为假,结束循环,执行下面语句;
1、结构体类型及变量定义与赋值
用途:把不同类型的数据组合成一个整体
1.定义结构体类型:
struct <结构体名>{
成员表列
};
由程序设计者指定了一个结构体类型struct Student可以用它定义变量它包括num,name,sex,age,score,addr等不同类型的成员
结构体的成员可以是另一个结构体
2.结构体变量的定义
定义结构体变量后,系统分配内存单元,单元个数为所有成员所占单元个数之和。
三种定义方法:
1、先定义结构体类型再定义变量名
2、在定义结构体类型的同时定义变量
3、直接定义结构体类型变量(不出现结构体名)
struct student stu,a[3],*p;
3.结构体变量的引用(访问)
1、结构体变量名.成员名
(*指针变量).成员 3种形式等价
指针变量→成员
a.age=21;strcpy(a.name, "zs"); //变量名.成员名:
("p).age=21; stropy(("p).name,"zs");//(*指针名).成员名:
p->age=21; strepy(p->name,"zs"); " //指针名->成员名:
2、结构体变量的成员还是结构体,则层层访问;
stu.birthday.year
3、对结构体变量的成员可以像普通变量一样进行各种运算(根据成员的类型决定可以进行的运算) ;
4·结构体变量的赋值,输出和输入
1、相同类型的结构体变量可以互相赋值
2、不能将一个结构体变量作为一个整体进行输入输出。必须一个一个成员按其类型输入输出;
5,可在定义结构体类型同时自定义给类型别名:方便定义该类型变量
2019.设有定义:struct sk(int a; float b; }data,*p=&data;
则对data中成员b的引用不正确的是( )A. data.bB.p-> data.b C.(*p).b D.p->b
二、共用体
使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。
1.共同用体类型的定义
union 共用体类型标识符{
类型标识符1 成员名1;
类型标识符2 成员名2;
类型标识符n 成员名n;
};
2. 共用体变量的定义
共用体变量的定义
union data a, b, c;
(三种定义形式同结构体)
占内存数是成员最大字节数;
3,共用变量成员的引用:同结构体
重点
1、同一内存在每一瞬时只能存放其中一种类型的成员;
2、起作用的是最后一次存放的成员,不能作为函数参数;
3、只能对第一个成员初始化;
4、共用体变量的地址和它的各成员的地址都是同一地址;
5、不能对共用体变量名赋值,也不能企图引用变量名来得到一个值;
6、共用体类型可以出现在结构体类型定义中,作为共用体的成员。反之,结构体也可以出现在共用体类型定义中,作为共用体的成员;
共用体与结构体定义形式相似,但含义不同
1、结构体变量所占的内存长度等于各成员所占的内存长度之和。(每个成员分别占有自己的内存)
2、共用体变量所占的内存长度等于最长的成员的长度。
2018,当说明一个共用体变量时,系统分配给它的内存分配的是
A.第一个成员所需内存空间
B.各成员所需内存空间之和
C.各成员所需内存空间的最大值
D.最后一个成员所需内存空间
2017,当说明一个结构体变量时,系统分配给它的内存
A.各成员所需内存空间的最大值
B.各成员所需内存空间之和
C.结构中第一个成员所需内存空间
D.结构中最后一个成员所需内存空间
1、宏(无参、带参)
程序在正式编译前,要进行预处理,对程序中所有出现的宏名使用宏定义中的字符串去替换,称宏替换或宏展开。
全屏宏替换时,特别注意的一点就是将宏定义中的"字符串"视为真正的字符串,进行原样替换,切忌不要人为计算!
调用带参宏时,首先进行宏展开,再实参代换形参。
宏不分配内存,不占用程序运行时间,只占用编译时间。
形参不分配内存,不必做类型说明
2、文件包含include
要想使用系统提供的库函数,必须将库函数对应的头文件通过include引入到当前文件中。
头文件引入的两种写法
-include <stdio.h>:标准格式,系统到存放C库函数头文件所在目录寻找要包含的文件(配置)。- include "my.c" :系统首先在当前目录寻找包含文件,找不到再按标准方式查找。
—一般使用系统库函数使用<>,包含自定义文件用双引号。
2019.若程序中调用库函数strlen() ,则必须包含头文件
A. stdio.h (输出输出)
B. stdlib.h (时间函数随机函数)
C. string.h (四个函数)
D. math.h (数学函数)