2019年7月8日星期一(C语言)

一、控制流分支  -> 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;

}

结论:

1)形式参数与实际参数占用不同的储存单位。

2)形式参数值由实际参数直接初始化。

原文地址:https://www.cnblogs.com/zjlbk/p/11159959.html