一、控制流分支 -> switch语句
1、 特点:
针对多种情况判断,特别else if使用比较麻烦!
2、 基本框架
switch(需要判定的值) -> 值类型限制:整型、字符型、枚举类型
{
case x: -> 如果需要判定的值与x相等的,那么执行xxxx;这个表示式。
xxxx;
break;
case y: -> 如果需要判定的值与y相等的,那么执行yyyy;这个表示式。
yyyy;
break;
default: -> 如果判定的值与上面的情况都不符合,则执行kkkk;
kkkk;
break;
}
zzzz; -> 执行break语句后,就会执行zzzz;
例题:输入1个数字,1->one 10->ten 都不是->error
#include <stdio.h>
int main(int argc,char *argv[])
{
int x;
scanf("%d",&x);
switch(x)
{
case 1:
printf("one! ");
break;
case 10:
printf("ten! ");
break;
default:
printf("error! ");
break;
}
return 0;
}
例题:使用switch语句完成,从键盘中获取一个数字
0~100 -> 打印small
101~200 -> 打印middle
201~300 -> 打印large
#include <stdio.h>
int main(int argc,char *argv[])
{
int x;
scanf("%d",&x);
switch(x)
{
case 0 ... 100:
printf("small! ");
break;
case 101 ... 200:
printf("middle! ");
break;
case 201 ... 300:
printf("large! ");
break;
default:
printf("error! ");
break;
}
return 0;
}
3、 switch结论
1)判定的值必须是整型。
2)每一个case语句后面必须添加break语句,除非有意执行后面语句。
3)记得一定要写default,即使default永远都不会执行。
4)break语句跳出的是swtich语句。
5)进行范围判断时,“...”两边必须有空格,包括两边的值 0 ... 100 x>=0 && x<=100
二、影响控制流的两个语句 -> break语句/continue语句
1、 break语句
1)作用对象: for循环,while循环,do-while循环,switch分支
2)作用:跳出循环/跳出switch语句
作用对象决定作用!
3)基本框架
当break语句作用循环时,立即跳出循环,一般与if语句连用。
while(1)
{
xxxx;
if(满足跳出循环的条件)
break; -> break语句跳出的是while循环,不是if语句。 -> 继续执行xxx; 而不是yyy;
yyy;
}
xxx;
当break语句作用switch时,立即跳出switch。
switch(需要判定的值) -> 值类型限制:整型、字符型、枚举类型
{
case x: -> 如果需要判定的值与x相等的,那么执行xxxx;这个表示式。
xxxx;
break;
case y: -> 如果需要判定的值与y相等的,那么执行yyyy;这个表示式。
yyyy;
break;
default: -> 如果判定的值与上面的情况都不符合,则执行kkkk;
kkkk;
break;
}
zzzz; -> 执行break语句后,就会执行zzzz;
4)几个特殊的例子
例子1:
while()
{
switch()
{
break;
xxx;
}
yyy; -> 跳到这里。
}
zzz;
例子2:
while()
{
while()
{
while()
{
break;
}
xxxx; -> 跳到这里!
}
yyyy;
}
zzzz;
练习1: 在全校1000名学生中征集捐款,当总数到达10万块就结束捐款,统计此时捐款的人数,以及平均每人捐款的金额。
#include <stdio.h>
int main(int argc,char *argv[])
{
float money,total=0,aver; //个人捐款数量,总捐款数,平均。
int i; //人数
for(i=1;i<=1000;i++)
{
scanf("%f",&money);
total += money;
if(total >= 100000)
break;
}
aver=total/i;
printf("i = %d ",i);
printf("aver = %f ",aver);
return 0;
}
2、 continue
1)作用对象: for循环、while循环、do-while循环。
2)作用: 立即结束当次循环,马上继续开始执行下一次循环。
3)基本框架:
while(1)
{
xxxx;
if(判定条件)
continue;
yyyy;
}
xxxx; -> 判定条件 -> 假 -> yyyy; -> xxxx; -> 判定条件 -> 真 -> continue; -> xxxx;
练习2: 要求输出100~200之间不能被3整除的数,要求使用continue语句完成。
#include <stdio.h>
int main(int argc,char *argv[])
{
int num;
for(num=100;num<=200;num++)
{
if(num%3==0)
continue;
printf("%d ",num);
}
return 0;
}
三、函数概念?
1、 在linux C语言中,什么是函数?
C语言是一种面向过程的语言,C语言称之为函数式语言,可以将任何功能都封装成一个函数接口。
2、 在C语言中,封装函数意义?
在某些功能比较复杂,往往用户需要将其封装成一个函数接口,调用者使用该函数时,不需要关注过程,只需要知道传递什么参数和函数有什么返回值即可。
play_music("xxx.mp3"); -> 参数就是这首歌名字。
听到这首歌 -> 返回值就是听到声音。
四、函数的书写规则?
1、 在linux C语言中,函数有哪些种类?
main函数: 主函数,在C语言中有且仅有一个,一般都在main函数开始执行,然后调用别的函数。
系统函数(system calls):man手册的2手册中,这些函数不需要用户写实现过程。
库函数(library calls):man手册的3手册中,这些函数不需要用户写实现过程。
自定义函数:不能在man手册查询得到,用户必须写清楚实现过程。
例子:
#include <stdio.h>
//1. main函数
int main(int argc,char *argv[])
{
//2. 调用printf()库函数
printf("helloworld! ");
//3. 调用自定义函数
func(); //undefined reference to `func' -> func()实现过程没有定义!
return 0;
}
===========================================================================================
2、自定义函数的书写规则?
1)确定函数的函数名 -> 函数名字最好体现函数的功能
命名规则: 与C语言中变量一样。 例子: my_fun
2)确定函数的形式参数列表
有形式参数:my_fun(形式参数1,形式参数2, .... ,形式参数n) -> 有多少个形参,将来就需要传递多少个实参。
无形式参数:my_fun()
什么是形式参数?
形式参数在函数中作用,首先声明好,要调用该函数,首先需要什么参数。
例子: 露营(一张大被子,一张厚席子,一个高枕头,一个绿色桶)
例子:my_fun(int a,int b) -> 说明调用该函数时,需要传递二个整型数据给这个函数!
3)确定返回值类型 -> 写在名字前面
有返回值 -> 确定返回值类型
int -> 无论这个函数是调用成功还是失败,都会返回一个int类型。
char -> 无论这个函数是调用成功还是失败,都会返回一个char类型。
float -> 无论这个函数是调用成功还是失败,都会返回一个float类型。
例子: int my_fun(int a,int b)
return 0;
无返回值 -> void -> 代表该函数没有返回值
例子: void my_fun(int a,int b)
返回值类型 函数名字(形式参数列表) -> 自定义函数头
4)函数体 -> {}
例子:
int my_fun(int a,int b)
{ -> 功能就写在函数体中
}
===========================================================================================
3、如何调用函数?
1)确保调用函数实现过程已经写好了!
例子:
int my_fun(int a,int b)
{
printf("a = %d ",a);
printf("b = %d ",b);
return 0;
}
2)直接写函数名字,后面紧跟一个圆括号(),圆括号中存放东西就是实际参数(实参)。
例子:
my_fun(5,10);
结论: 形式参数值由实际参数直接初始化。 -> 这是不可逆的过程。
上述例子: a=5,b=10;
===========================================================================================
4、函数返回值情况
int my_fun(int a,int b) -> 需要接受两个参数,返回一个int类型数据。
int ret;
ret = my_fun(5,10); -> 将my_fun函数的返回值结果赋值给ret。
练习3:写一个函数实现接收三个int参数,经过约定的运算后,得到结果并打印出来。
前面两个参数是计算,最后参数计算方式。
计算方式: 1 -> +
2 -> -
3 -> *
4 -> /
fun(3,4,2) -> 结果: 3-4=-1
fun(3,4,3) -> 结果: 3*4=12
=======================================================================
#include <stdio.h>
int my_fun(int x,int y,int z) // x=a y=b z=c
{
int ret;
switch(z)
{
case 1:
ret=x+y;
break;
case 2:
ret=x-y;
break;
case 3:
ret=x*y;
break;
case 4:
ret=x/y;
break;
default:
printf("enter error! ");
break;
}
return ret;
}
int main(int argc,char *argv[])
{
int a,b,c,result;
while(1)
{
scanf("%d %d %d",&a,&b,&c);
result = my_fun(a,b,c);
printf("result = %d ",result);
}
return 0;
}
==================================================================
练习4:以下程序运行结果是?
int fun(int a,int b)
{
if(a > b) return a;
else return b;
}
int main(int argc,char *argv[])
{
int x=3,y=8,z=6,r;
r = fun(fun(x,y),2*z);
printf("%d ",r); //12
}
五、 函数的声明?
1、 函数的定义与函数的声明有什么区别?
函数的定义包含了函数的名字,返回值类型,形式参数列表,具体实现过程。
例子:
int my_fun(int a)
{
printf("a = %d ",a);
return 0;
}
函数的声明包含了名字,返回值类型,形式参数列表,函数声明必须写在函数调用之前。
用通俗的话来讲,函数的声明意思是: 在你调用某个函数之前你必须要告诉我,这个函数长什么样子。
例子:
int my_fun(int a);
2、 函数声明需要注意的点
1)如果函数定义写在函数调用之前,就不要声明了。
例子:
int my_fun2(); -> 需要声明
int my_fun1() -> 不需要声明
{
}
int main()
{
my_fun1();
my_fun2();
}
int my_fun2() -> 需要声明
{
}
2)一般库函数/系统函数声明都是放在头文件中
例子:
printf()函数声明写在#include <stdio.h>里面.
所以当我们调用printf()函数时,不需要自己声明,只需要包含对应的头文件即可。
六、从内存的角度分析自定义函数运行过程。
1、 回顾栈区以及函数特征
1)函数内部申请的变量都是栈区申请。
2)函数返回时,在函数内部申请过的全部栈区的内存空间都要全部释放。
3)函数返回时,会返回到函数调用的地方。
例题1: 请从内存角度分析以下代码,求出结果?
int swap(int x,int y)
{
int t;
t = x;
x = y;
y = t;
return 0;
}
int main(int argc,char *argv[])
{
int a,b;
scanf("%d %d",&a,&b); //5 3
swap(a,b);
printf("a = %d,b = %d ",a,b); //5 3
return 0;
}
例题2: 请从内存角度分析以下代码,求出结果?
int a,b;
int swap()
{
int t;
t = a;
a = b;
b = t;
return 0;
}
int main(int argc,char *argv[])
{
scanf("%d %d",&a,&b); //5 3
swap();
printf("a = %d,b = %d ",a,b); //3 5
return 0;
}