• 小朋友学C语言(5):常量和变量,for循环


    动手编写程序:

    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        printf("a = %d
    ", a);
        a = 2;
        printf("a = %d
    ", a);
        
        return 0;
    }
    

    运行结果:

    a = 1
    a = 2
    



    程序分析:
    int a = 1;
    定义了一个整型变量a,把1赋值给a。注意,C语言中的等号表示赋值,作用是把一个常量赋值给一个变量,这样变量就获得了一个临时的固定值。
    为什么说是临时的呢?因为在把另一个常量2赋值给a的时候,a的值就变为了2,不再1了。
    注意a = 2不要误写为int a = 2。第一次定义一个变量时,要把变量类型(比如int型)写出来,下次再用到这个变量时,直接使用就行,不用再重新定义。加了类型就是重新定义,不加类型就是直接使用。

    从程序的运行结果可以看出,a的第一次的值是1,第二次的值是2。可见a的值是可变的,所以称a为变量。而相应的,1、2、A、B都是固定的值,被称为常量。

    编写程序:

    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        int b = 2;
        int c = a + b;
        printf("sum is %d
    ", c);
        
        return 0;
    }
    

    运行结果:

    sum is 3
    

    程序分析:
    先定义一个整型变量a,把1赋值给a。
    再定义一个整型变量b,把2赋值给b。
    最后定义一个整型变量c,它的值不是靠赋值得到的,而是把a和b相加之后的值赋值给它,即c的值为3。



    编写程序:

    #include <stdio.h>
    
    int add(int x, int y)
    {
        int z = x + y;
        return z;
    }
    
    int main()
    {
        int a = 1;
        int b = 2;
        int c = add(a, b);
        printf("c = %d
    ", c);
        
        return 0;
    }
    

    运行结果:

    c = 3
    



    程序分析:
    (1)
    函数定义的形式为:
    类型 函数名称(类型 形式参数,……)
    {
    函数体
    }

    (2)
    对应于咱们的程序,定义了一个名为add的函数,add左边的int代表的函数的返回值的类型。对应于函数体中返回的z的类型。

    (3)
    x和y是形式参数,main()函数中的add(a,b)中a和b是实际参数。

    (4)
    main函数中的add(a,b)后面没跟大括号,说明是函数调用,不是函数定义。具体的add函数定义在main函数的上方。

    (5)
    调用add函数时,实际参数(实参)传递给形式参数(形参),这样x = a = 1, y = b = 2

    (6)
    z = x + y = 1 + 2 = 3

    (7)
    int c = add(a, b)说明要把add函数得到的值赋给c。即c = add(1, 2) = z = 3。最终c = 3

    (一)if...else

    先动手编写一个程序

    #include <stdio.h>
    
    int main()
    {
        int x = -1;
        if(x > 0)
        {
            printf("x is a positive number!
    ");
        }
        else
        {
            printf("x is not a positive number!
    ");
        }
                       
        
        return 0;
    }
    

    运行结果:

    x is not a positive number!
    

    程序分析:
    定义一个整数x,并给他赋值。这个值要么大于0,要么不大于0(等于或小于0)。
    若是大于0,则打印x is a positive number!
    若不大于0,则打印x is not a positive number!

    这里建议不要再使用在线编译器,而是使用本机编译器(苹果电脑推荐Xcode,PC推荐dev C++)。在本机编译器上设置断点逐步执行,会发现if中的printf语句和else中的printf语句只会执行一个。这是因为if和else是互斥的关系,不可能都执行。

    (二)if...else if...else

    稍微改动程序

    #include <stdio.h>
    
    int main()
    {
        int x = 0;
        if(x > 0)
        {
            printf("x is a positive number!
    ");
        }
        else if(x == 0)
        {
            printf("x is zero!
    ");
        }
        else
        {
            printf("x is a negative number!
    ");
        }              
        
        return 0;
    }
    

    运行结果:

    x is zero!
    

    程序分析:
    假如条件不止两种情况,则可用if...else if...else...的句式。
    这个程序里的条件分成三种: 大于0、等于0或小于0。
    大于0则打印x is a positive number!
    等于0则打印x is zero!
    小于0则打印x is a negative number!

    注意,x == 0,这里的等号是两个,而不是一个。
    C语言中,一个等号表示赋值,比如b = 100;
    两个等号表示判断等号的左右侧是否相等。

    (三)多个else if的使用

    #include <stdio.h>
    
    int main()
    {
        int x = 25;
        if(x < 0)
        {
            printf("x is less than 0
    ");
        }
        if(x >= 0 && x <= 10)
        {
            printf("x belongs to 0~10
    ");
        }
        else if(x >= 11 && x <= 20)
        {
            printf("x belongs to 11~20
    ");
        }
        else if(x >= 21 && x <= 30)
        {
            printf("x belongs to 21~30
    ");
        }
        else if(x >= 31 && x <= 40)
        {
            printf("x belongs to 31~40
    ");
        }
        else
        {
            printf("x is greater than 40
    ");
        }
       
        return 0;
    }
    

    运行结果:

    x belongs to 21~30
    

    程序分析:
    (1)
    这里把x的值分为好几个区间:(负无穷大, 0), [0, 10], [11, 20], [21, 30], [31, 40], (40, 正无穷大)
    (负无穷大, 0)用if来判断
    [0, 10], [11, 20], [21, 30], [31, 40]用else if来判断
    (40, 正无穷大)用else来判断

    (2)
    符号“&&”代表“并且”,表示“&&”左右两侧的条件都成立时,判断条件才成立。


    (一)a++

    在C语言或其它语言中,++符号表示“自加”,就是变量在原来的基础上加1。
    例1:

    a = 0;
    a++;
    

    则此时a的值为1。

    同样的道理,--表示”自减”。
    例2:

    a = 100;
    a--;
    

    则此时a的值为99。

    注意,程序语言里没有”自乘”和”自除”的概念。

    验证程序:

    #include <stdio.h>
    
    int main()
    {
        int a = 0;  // 给a赋值
        a++;
        printf("After ++, a = %d
    ", a);
        
        a = 100;    // 重新给a赋值
        a--;
        printf("After --, a = %d
    ", a);
       
        return 0;
    }
    

    运行结果:

    After ++, a = 1
    After --, a = 99
    

    (二)++a

    除了a++表示自加外,++a也表示自加。同理--a表示自减

    验证程序:

    #include <stdio.h>
    
    int main()
    {
        int a = 0;  // 给a赋值
        ++a;
        printf("After ++, a = %d
    ", a);
        
        a = 100;    // 重新给a赋值
        --a;
        printf("After --, a = %d
    ", a);
       
        return 0;
    }
    

    运行结果:

    After ++, a = 1
    After --, a = 99
    

    (三)a++与++a的区别

    既然a++与++a都是让a自加,那么二者是否完全一样呢?
    先看一个程序:

    #include <stdio.h>
    
    int main()
    {
        int a = 0;
        printf("a = %d
    ", a++);
        printf("a = %d
    ", a);
        printf("a = %d
    ", ++a);
        printf("a = %d
    ", a);
        
        return 0;
    }
    

    运行结果:

    a = 0
    a = 1
    a = 2
    a = 2
    

    从运行结果可以看出,a++和++a是有区别的:
    a++是先读取a的值,再让a的值增加1;
    ++a是先让a的值增加1,再读取a的值。

    先看程序:

    #include <stdio.h>
    
    int main()
    {
        for(int i = 0; i < 5; i++)
        {
            printf("i = %d
    ", i);
        }
        
        printf("Loop ended!
    ");
       
        return 0;
    }
    

    运行结果:

    i = 0
    i = 1
    i = 2
    i = 3
    i = 4
    Loop ended!
    



    for循环的语句结构为:
    for(表达式1; 表达式2; 表达式3)
    {
        语句;
    }

    其执行顺序为:
    (1)执行表达式1
    (2)执行表达式2。表达式2是一个判断语句;若为真,则执行{}中的语句。若为假,则结束for循环
    (3)若表达2为真,执行表达式3
    (4)执行表达式2
    (5)不断重复步骤(3)和步骤(4),直到表达式2为假,结束循环。

    流程图如下所示:

     
    for.png



    程序执行过程:
    第一次,表达式1中i的值为0;表达式2中0<5是成立的,打印出i的值。
    第二次,表达式3中i++后i变为1;表达式2中1<5是成立的,打印出i的值。
    第三次,表达式3中i++后值变为2,表达式2中2<5是成立的,打印出i的值。
    第四次,表达式3中i++后值变为3,表达式2中3<5是成立的,打印出i的值。
    第五次,表达式3中i++后值变为4,表达式2中4<5是成立的,打印出i的值。
    第六次,表达式3中i++后值变为5,表达式2中5<5是不成立的,不执行大括号中的打印语句。循环结束,跳出循环。程序继续往下执行。



    作业:
    (1)使用断点观察上面程序的每一步的执行过程
    (2)根据上面的分析,思考下面的程序的运行结果并动手操作一遍

    #include <stdio.h>
    
    int main()
    {
        for(int i = 0; i < 0; i++)
        {
            printf("i = %d
    ", i);
        }
        
        printf("Loop ended!
    ");
       
        return 0;
    }

     

    题目:求1+2+3+……+98+99+100
    (1)用数学方法求解
    (2)编写C语言程序求解

    解:
    (1)数学方法

    S = 1+2+3+……+98+99+100
      = (1+100) + (2+99) + (3+98) + …… + (49+52) + (50+51)
      = 101 * 50
      = 5050
    

    (2)C语言编程

    #include <stdio.h>
    
    int main()
    {
        int sum = 0; // 赋初值
        for(int i = 1; i <= 100; i++)
        {
            sum = sum + i;
        }
        
        printf("total is %d
    ", sum);
    }
    

    运行结果:

    total is 5050
    

    分析:
    (1)第一次循环
    i = 1, sum = sum + i = 0 + 1 = 1,这里右边的sum的值为初值0,将1赋给左边的sum后,sum的最新值变成了1
    (2)第二次循环
    i = 2, sum = sum + i = 1 + 2 = 3, 这里右边的sum的值已经通过上一步的计算变成了1。把3赋值给左边的sum后,sum的最新值就成了3
    (3)第三次循环
    i = 3, sum = sum + i = 3 + 3 = 6, 这里右边的sum的值已经通过上一步的计算变成了3。把计算结果6赋值给左边的sum后,sum的最新值就成了6
    (4)第四次循环
    i = 4, sum = sum + i = 6 + 4 = 10, 这里右边的sum的值已经通过上一步的计算变成了6。把计算结果10赋值给左边的sum后,sum的最新值就成了10
    (5)……这样执行一百次后,得到的结果为5050

    新知识点:
    sum = sum + i可以写成sum += i,都是让sum和i相加后,把新的值赋给sum。
    以后编程尽量使用+=这种方式。
    理由:C语言要通过编译器编译,在编译器没开启优化的情况下,两种写法是完全等价的;编译器开启了优化后,+=的执行速度可能会快一点。(这个先有点印象即可,目前不用深入了解)

    作业:
    (1)调试上面的程序。每次运行到右大括号时,把鼠标悬在sum上面,观察sum的值。
    上面的程序会循环100次,调试的时候,循环10次左右就可以step out了。

    (2)
    把sum = sum + i改成sum += i,运行结果

    #include <stdio.h>
    
    int main()
    {
        int sum = 0; // 赋初值
        for(int i = 1; i <= 100; i++)
        {
            sum += i;
        }
        
        printf("total is %d
    ", sum);
    }
    

    (3)在纸上默写这个程序。

    关注微信公众号请扫二维码

     

  • 相关阅读:
    Django的认证系统
    Django 中间件
    Django Form和ModelForm组件
    AJAX
    Django中ORM介绍和字段及字段参数
    Django ORM那些相关操作
    Python中应该使用%还是format来格式化字符串?
    Cookie、Session和自定义分页
    ORM版学员管理系统3
    ORM版学员管理系统2
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9603978.html
Copyright © 2020-2023  润新知