zoukankan      html  css  js  c++  java
  • 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)形式参数值由实际参数直接初始化。

  • 相关阅读:
    Elasticsearch学习,请先看这一篇!
    加解密/数字签名/证书 原理
    C# 给对象赋null值会释放内存吗?
    打包常见问题
    友盟推送
    谈一谈可能用到数据持久化的地方
    浅谈设置字体大小
    AFN和SDWebImage请求网络图片的一点问题
    linux学习(1)——这是一个新的开始,加油吧少年
    C指针——简单总结
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11159959.html
Copyright © 2011-2022 走看看