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

时间:2021-09-08 15:27:27

动手编写程序:

#include <stdio.h>

int main()
{
int a = 1;
printf("a = %d\n", a);
a = 2;
printf("a = %d\n", 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\n", 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\n", 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!\n");
}
else
{
printf("x is not a positive number!\n");
} 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!\n");
}
else if(x == 0)
{
printf("x is zero!\n");
}
else
{
printf("x is a negative number!\n");
} 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\n");
}
if(x >= 0 && x <= 10)
{
printf("x belongs to 0~10\n");
}
else if(x >= 11 && x <= 20)
{
printf("x belongs to 11~20\n");
}
else if(x >= 21 && x <= 30)
{
printf("x belongs to 21~30\n");
}
else if(x >= 31 && x <= 40)
{
printf("x belongs to 31~40\n");
}
else
{
printf("x is greater than 40\n");
} 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\n", a); a = 100; // 重新给a赋值
a--;
printf("After --, a = %d\n", 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\n", a); a = 100; // 重新给a赋值
--a;
printf("After --, a = %d\n", 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\n", a++);
printf("a = %d\n", a);
printf("a = %d\n", ++a);
printf("a = %d\n", 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\n", i);
} printf("Loop ended!\n"); 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为假,结束循环。

流程图如下所示:

 
小朋友学C语言(5):常量和变量,for循环
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\n", i);
} printf("Loop ended!\n"); 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\n", 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\n", sum);
}

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

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

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