• 2019年7月5日星期五(C语言)


    一、在程序如何定义个变量?定义变量在内存中代表什么意思?

    1、 变量的定义?

    格式:数据类型 + 变量  

    数据类型 -> 决定在内存中占用字节的大小。

    变量名字 -> 决定如何访问到这片内存的空间。 

    2、初始化变量的值?

    1)定义的同时初始化

       int a = 100; 

     

    2)先定义,后初始化。

       int a;    -> 局部变量a = 随机值

                -> 全局变量a = 0

       a = 100;

     

    注意:

    "左值=右值"    -> 把右值(变量/常量)赋值给左值(只能是变量)。

    "左值==右值"   -> 判断左值是否等于右值?

     

    3、 变量的生命周期以及作用域?

    生命周期: 这个变量从什么时候出现在内存中到什么时候在内存中释放。

    作用域:变量能够作用的地方。

     

         局部变量     Vs    全局变量

     

    1)在函数体内部定义的变量,就是局部变量,在函数体外部定义的变量,就是全局变量。

    2)两者在内存中占用的空间位置?

       局部变量都在存在于栈区,全局变量都是存在于数据段(已初始化->data段,未初始化->bss段)

    3)变量不初始化,则局部为随机值,全局为0。

    4)局部变量作用域是函数内部,全局变量作用域整个程序。

    5)局部变量在栈区申请空间,在定义该变量的函数结束时,这个局部变量的空间就会释放。

       全局变量在数据段申请空间,程序结束时,全局变量的空间才会被释放。

    4、形式参数属于局部变量还是全局变量?

    局部变量,在栈区申请空间。

     

    5、不同函数中能不能定义相同名字变量。

    可以,因为它们在栈区占用不同的空间。

     

    6、 全局变量的作用域?

    只能往下,不能往上。

     

      练习1: 以下程序在内存空间中是如何变化的?结果是多少?

     

    #include <stdio.h>

     

    int fun2(int c)

    {

           c = 20;

           return 0;

    }

     

    int fun1(int b)

    {

           int c = 10;

           fun2(c);

           return 0;

    }

     

    int main(int argc,char *argv[])

    {

           int a,b = 5;

           fun1(b);

           printf("b = %d ",b);

           return 0;

    }

     

    二、ASCII码

    1、 在Ubuntu中可以查看ASCII码表

        man ASCII(按'q'退出)

     

    2、 什么是ASCII码?

    其实ASCII表就是字符、八进制、十进制、十六进制转换。

     

     八进制   十进制   十六进制   字符

      Oct       Dec     Hex      Char

      060      48         30          0

      101      65         41          A

      141      97         61          a

     int a = 65;

     %d   -> 以十进制形式输出内容   printf("%d ",a); //65

     %o   -> 以八进制形式输出内容   printf("%o ",a); //101

     %x   -> 以十六进制形式输出内容 printf("%x ",a); //41

     %c   -> 以字符形式输入内容     printf("%c ",a); //'A'

     %f   -> 输出浮点型数据,保留小数点后6位。

     

     %s   -> 输出字符串

     %p   -> 输出指针地址

     结论: 其实字符类型也是整型数据。

    三、语句与表达式?

    表达式 = 语句;

    a = 5   把5赋值给a  -> 赋值语句

    a = 5;  表达式

    1、 逗号表达式?

    计算规则:从左到右依次计算,结果以最后一个表达式为准。

    例子:

    d = (a=a+b,c=b+c,a+c); 

    a=1+2=3

    c=2+3=5

    d=a+c=3+5=8

    例子:

    int a=1,b=2,c=3,d;

    d = (a+b,b-=c,c+=c);  -> 6

    d = (c=a+b,b-=c,c+=b); -> 2

    2、自增自减

     

      a++  先运算后,再自加1.

      ++a  先自加1,再运算.

      a--  先运算后,再自减1.

      --a  先自减1,再运算.

    例子:

    int a = 10;

    printf("%d ",a++);//10   a=11

    printf("%d ",++a);//12   a=12

    printf("%d ",a--);//12   a=11

    printf("%d ",--a);//10   a=10

    3、 +=  -=  *=  /=  %=

      a+=5  等价于  a=a+5

    4、 三目运算

    形式:

    表达式?结果1:结果2;

    如果表达式为真,则结果就是结果1。

    如果表达式为假,则结果就是结果2。

    例子1:

    int a = 3,b = 2,c;

    c = (a >= b ? a : b);  -> 求a与b之间的最大值。

    例子2:

    A ? i : j; 以下哪个表达式与之等价?    假 -> 0  真  -> 1 

    A==0 ? i:j;

    A!=0 ? i:j;  ->  OK

    A==1 ? i:j;

    A!=1 ? i:j;

    四、IO函数?

    头文件:#include <stdio.h>

    printf()  -> 输出带格式内容到屏幕上

    scanf()   -> 从键盘中输入带格式内容 

    int a;

    a  -> 代表这整片内存空间

    &a -> 代表这整片内存空间的地址

    例子:

    ===================================================

    #include <stdio.h>

     

    int main(int argc,char *argv[])

    {

           int a;

          

           scanf("%d",&a);

          

           printf("%d ",a);

          

           return 0;

    }

    ===================================================

    五、linux C语言控制流

    控制流有两大块,分别是分支、循环。

    分支: if  else  switch

    循环: for  while  do-while

     

    1、 while循环

    1)基本框架

    while(判定条件)

    {      -> 复合语句:循环体

           表达式;

    }

    -> 循环体之外 

    2)处理流程

    判定条件  ->  真  -> 执行循环体内容  -> 判定条件   ->  假  -> 跳出循环

    3)死循环

    死循环就是判定条件恒为真,无法通过判断判定条件为假来跳出循环。

    while(1)

    {

           xxxx;  -> 一直执行!

    }

     

    4)省略{}写法

    ======================================================

    while(1)

       xxxx;   -> 紧跟while(1)语句的表达式就是循环体的内容

       yyyy;   -> 不属于循环体的内容

     

    等价于

    while(1)

    {

       xxxx;

    }

    yyyy;

    ======================================================

     

    while(1);  -> 有分号,有循环,但是循环体没有内容。

      xxxx;

      yyyy;

    等价于

    while(1)

    {

     

    }

    xxxx;

    yyyy;

       结论: 当循环体表达式大于2个时,复合语句{}不能省略!

              当循环体表达式只有1个,则{}可以省略!

      练习2: 使用while循环实现将所有的参数都打印出来!

    #include <stdio.h>

    int main(int argc,char *argv[])  //  ./xxx aaa bbb   argc=3  argv[0]="./xxx"  argv[1]="aaa"

    {

           int i = 0; //初始化语句

           while(i < argc)  //0~2   判定条件

           {

                  printf("argv[%d] = %s ",i,argv[i]);

                  i++; //条件修改

           }  

           return 0;

    }

      练习3: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x

    #include <stdio.h>

    int main(int argc,char *argv[])

    {

           int x,i=1,sum=0;

           scanf("%d",&x);

          

           while(i<=x)

           {

                  sum += i;

                  i++;

           }

          

           printf("sum = %d ",sum);

          

           return 0;

    }

    2、for循环

    1)基本框架

    for(初始化语句;判定条件;变量操作)  -> 里面三个语句不一定要填,可以空白!

    {  -> 循环体 

    }

    循环体之外。

     

    2)处理流程

    1

    for(2;3;4)

    {

       5;

    }

    6;

     

    1->2->3->真->5->4->3->假->6    (初始化语句,只会执行一次)

     

    3)死循环

    for(;;); 等价于  while(1); 

     

    等价于          等价于

    for(;;)  等价于  while(1)

    {             {

     

    }             }

     

    4)省略{}写法

    for(;;)

       xxxx;  -> 紧跟语句才是循环体的内容

       yyyy;  -> 不属于循环体的内容

     

    等价于

    for(;;)

    {

       xxxx;

    }

    yyyy;

     

      练习4: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用for循环。

     

    #include <stdio.h>

     

    int main(int argc,char *argv[])

    {

           int x,i,sum=0;

           scanf("%d",&x);

          

           for(i=1;i<=x;i++)

           {

                  sum += i;

           }

          

           printf("sum = %d ",sum);

          

           return 0;

    }

     

     

    3、 do-while循环

    1)基本框架

    do{   -> 循环体

     

    }while(判定条件);   -> 注意: 没有分号是语法出错!

     

    2)处理流程

    先执行一遍循环体  ->  判定条件  -> 真  -> 执行循环体   -> 判断条件  -> 假  -> 跳出循环

     

    3)死循环

    do{

     

    }while(1);

     

    4)省略{}写法

    例子1:

    do

      xxxx;

    while(1);

     

    等价于

    do{

      xxxx;

    }while(1);

     

    例子2:

    do

      xxx;

      yyy;    -> 编译出错: error: expected ‘while’ before ‘printf’

    while(1);

     

      结论: 当表达式只有一条时,则复合语句可以省略,如果大于1条表达式,则必须添加,否则编译出错。

     

    while(1)

       xxxx;

       yyyy;

     

    等价于

    do

      xxxx;

    while(1);

    yyyy;

     

     

       练习5:使用do-while循环实现将所有的参数都打印出来!

     

       int i = 0;

       do{

           printf("argv[%d] = %s ",i,argv[i]);

           i++;

       }while(i<argc);

     

       练习6:从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用do-while循环。

     

       int x,i=1,sum=0;

       scanf("%d",&x);

     

       do{

           sum+=i;

           i++;

       }while(i<=x);

       printf("sum = %d ",sum);

     

     

    4、if分支

     

    用法一: if单独使用

     

    1)基本框架

    if(判定条件)   -> 如果判定条件为真,则执行复合语句,否则不执行复合语句!

    {    //复合语句

     

    }

     

    2)省略{}写法

    if(判定条件)

       xxxx;   -> 如果条件为真,则执行xxxx;如果为假,就不执行xxxx;

       yyyy;   -> yyyy;不是if语句的判定范围,所以无论条件真假,这个yyyy都会被执行。

     

    等价于

    if(判定条件)

    {

       xxxx;

    }

    yyyy;

     

    ================================================

     

    if(判定条件);

        xxxx;

        yyyy;

     

    等价于

    if(判定条件)

    {

     

    }

    xxxx;

    yyyy;

     

     

    用法二: if与else配合使用

    1)基本框架

    if(判定条件)   -> 如果判定条件为真,就执行复合语句1

    {  //复合语句1

     

    }

    else     -> 不满足判定条件的情况,就会执行复合语句2

    {  //复合语句2

     

    }

     

    2)省略{}写法

    if(判定条件)

       xxxx;

    else

       yyyy;    --> 可以!

     

     

    if(判定条件)  xxxx   else   yyyy;   -> 编译出错: expected ‘;’ before ‘else’

     

     

     

    if(判定条件)

       xxxx;

    else

       yyyy;

    else

       zzzz;  --> 编译出错: error: ‘else’ without a previous ‘if

     

     

    if(判定条件1)

       xxxx;

    if(判定条件2)

       yyyy;

    else

       zzzz;   -> 编译通过,else受到最近的if语句的影响!

     

     

    用法三: 多个情况判断  else if

    1)基本框架

    if(判定条件1)  -> 如果判定条件1是真,则执行复合语句1

    {  //复合语句1

     

    }

    else if(判定条件2)  -> 如果判定条件1为假,则进行判断判定条件2,如果为真,则执行复合语句2

    {  复合语句2

     

    }

    else    -> 不满足以上所有的判定条件,则执行复合语句3。

    {  复合语句3

     

    }

     

     

       练习7: 分别使用以上三种办法,完成该题。

              从键盘中获取一个数字

            0~100   -> 打印small

             101~200 -> 打印middle

              201~300 -> 打印large

     

       完成:<练习>

    ======================================================================================================================================================

    #include <stdio.h>
    int main(int argc,char *argv[])
    {
     int a=0;
     printf("Please enter the number: ");
     scanf("%d",&a);//输入数字
     if(a >= 0 && a <= 100)//0~100   -> 打印small
      printf("small ");
     if(a >= 101 && a <= 200)//101~200 -> 打印middle
      printf("middle ");
     if(a >= 201 && a <= 300)//201~300 -> 打印large
      printf("large ");
     if(a < 0 || a > 300)//不在上诉范围输出error
      printf("error ");
     return 0;
    }
    ======================================================================================================================================================
    #include <stdio.h>
    int main(int argc,char *argv[])
    {
     int a=0;
     printf("Please enter the number: ");
     scanf("%d",&a);//输入数字
     if(a >= 0 && a <= 100)//0~100   -> 打印small
      printf("small ");
     else
     {
      if(a >= 101 && a <= 200)//101~200 -> 打印middle
       printf("middle ");
       else
       {
        if(a >= 201 && a <= 300)//201~300 -> 打印large
         printf("large ");
        else//不在上诉范围输出error
         printf("error ");
       }
     }
     return 0;
    }
    =====================================================================================================================================================
    #include <stdio.h>
    int main(int argc,char *argv[])
    {
     int a=0;
     printf("Please enter the number: ");
     scanf("%d",&a);//输入数字
     if(a >= 0 && a <= 100)//0~100   -> 打印small
      printf("small ");
     else if(a >= 101 && a <= 200)//101~200 -> 打印middle
      printf("middle ");
     else if(a >= 201 && a <= 300)//201~300 -> 打印large
      printf("large ");
     else       //不在上诉范围输出error
      printf("error ");
     return 0;
    }
     
    ===========================================================================================================================================================
  • 相关阅读:
    天地图专题六:复杂操作,天地图上标注点的连线以及模拟点击事件
    天地图专题五:在天地图上绘制电子区域并保存数据
    天地图专题四:在天地图上显示运行轨迹
    天地图专题三:根据标注点的范围确定天地图的中心点和缩放级别
    天地图专题二:在天地图上循环显示标注点以及悬停显示信息窗口
    天地图专题一:加载天地图
    从百度地图批量获取中国县级以上行政区划边界坐标
    【百度地图API】如何获取行政区域的边界? (转载)
    高德地图api之location定位
    url中的空格
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11153523.html
Copyright © 2020-2023  润新知