小刘最近在读《老子》,被道家“一生二,二生三”的哲学思想迷住了,他不禁想代码是谁生的呢?首先代码就是一堆字符,字符不是代码,就像“白马非马”,但是当字符按照一定的顺序组织起来时,就有点逻辑了,杂乱无章的字符好像有规律可循了,再给每个字符赋予一定意义,那么代码就出现了。表达一定含义的字符有序组合,就是代码。那么是不是就可以说,思维生逻辑,逻辑生结构,结构生代码呢?这时一个QQ消息的声音传来打破了小刘的沉思,上面写着:“学长你怎么还没来?”,小刘一拍脑袋说:“坏了,忘了今晚上课了!”说着就披上一衣服飞奔到教室。
“同学们,昨天给大家讲了C语言中最常用的三大运算符,有算数运算符、关系运算符和逻辑运算符。其中算数运算符是对数据进行加减乘除的,关系运算符是用来对数据进行比较大小的,逻辑运算符是对数据进行“与、或、非”逻辑运算的。其中后两种运算符单用的时候不多,通常都是在选择结构或者循环结构中使用的。”
“我们先来说说选择结构,选择结构又称分支结构,意思上很好理解,就像是一条路的走着走着出现了两条分支,需要你判断到底要走哪边。如图:”
黑板:
“而选择结构就是用代码体现出这种效果,让程序运行的时候能有多个不同的选择。”
“下面我们就来看一下最经典的选择结构if…else…”
“if…else…明显是有两条分支选择结构。它的语法定义如下:”
if(bool){…}else{…}
流程图:
“其中if后面括号里是布尔类型参数,如果参数类型为真,则执行if后面{ } 里的语句;如果参数类型为假,则执行else 后面{ }里的语句。其中括号里的代码被称为条件语句,就是判断应该走哪边的选择器。举个例子:分岔路口中间的告示牌,就相当于if…else…中的条件语句。它能给程序指出一条明路,到底应该走哪边。”
黑板
“代码实例:[code_1]”
#include<stdio.h>
int main()
{
int a;
int b;
a = 1;
b = 2;
printf("a=%d\nb=%d\n",a,b);
if(a<b)
{
printf("a小于b\n");
}else{
printf("a大于或等于b\n");
}
return 0;
}
输出:
“上述代码我们使用了if…else…语句,其中条件语句为a<b(a=1,b=2),条件成立,所以返回值为真,程序执行 if 语句的代码:a小于b。当条件为假时(修改上面代码中条件语句符号为>),程序则会执行else语句中的代码:[code2]”
#include<stdio.h>
int main()
{
int a;
int b;
a = 1;
b = 2;
printf("a=%d\nb=%d\n",a,b);
if(a>b)
{
printf("a小于b\n");
}else{
printf("a大于或等于b\n");
}
return 0;
}
输出
“从结果来看,条件明显是假的。”
“上面说的是两条分支的选择结构,那么如果我的选择不只有两个该怎么办呢?下面我们再介绍一种if…else…的升级版:if…else if…else语句。”
语法:
if(bool){
……
}
else if(bool){
……
}
……
else{
}
程序流程图
“由上述结构可以看出,该选择结构中 else if 分支可以有多个,if和else头尾各一个。且该结构具有连续性,如果其中一条不成立就进行下一条判断,直到最后的else判断结束。如果其中有一条成立,则往下不再进行判断。示例代码[code_3]”
#include<stdio.h>
int main()
{
int a;
a = 3;
if(a==1)
{
printf("a=1\n");
}
else if(a==2)
{
printf("a=2\n");
}
else if(a==3)
{
printf("a=3\n");
}
else
{
printf("a=4\n");
}
return 0;
}
输出:
“ if 语句既能进行两个选项直接的选择还能进行多个选项之间的选择,那么if 单独能不能进行一个选择呢?可以的,但是那不叫‘选择’,通常叫做叫‘判断’,if 语句在程序中单独出现的时候,它不会影响程序的走向,但是如果程序中if 前面的代码符合if条件时,那么 if 语句中的代码就会执行。否则不执行。举个例子:[code_4]”
#include<stdio.h>
int main()
{
int a;
a = 0;
if(a==1)
{
a++;
}
printf("a=%d",a);
return 0;
}
输出:
“程序中只有单独的一个if语句出现,当if语句前的代码不满足if 语句的条件时,则if语句不予执行,所以输出的是a=0;但是当if前面的代码满足if条件时,if语句里的代码才会执行,如下:[code_5]”
#include<stdio.h>
int main()
{
int a;
a = 1;
if(a==1)
{
a++;
}
printf("a=%d",a);
return 0;
}
输出
“所以这里需要强调的是,if和else或else if联合出现时,是选择语句,单独出现时,主要作用是进行判断的。”
“多选择分支除了if …else if… else 以外,C语言中还有一个语法结构是实现多选择的,那就是‘开关语句’。”
“开关语句的语法结构是这样的:”
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
…
case 整型数值n: 语句 n;
default: 语句 n+1;
}
流程图:
“它和else if语句作用相同,都是C语言中的选择结构,但是他们的实现方式却有很大区别,if语句中的条件语句可以是任何变量,只有结果为“真”或“假”就能运行。而switch语句中的所有分支的条件必须是同一变量的不同值,哪个分支符合条件就走哪条分支。其次,当条件变量唯一时,switch语句的写法比else if更加简洁,下面举个例子:[code_6]”
//if语句
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
if(a==1){
printf("Monday\n");
}else if(a==2){
printf("Tuesday\n");
}else if(a==3){
printf("Wednesday\n");
}else if(a==4){
printf("Thursday\n");
}else if(a==5){
printf("Friday\n");
}else if(a==6){
printf("Saturday\n");
}else if(a==7){
printf("Sunday\n");
}else{
printf("error\n");
}
return 0;
}
输出:
//switch语句
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default:printf("error\n"); break;
}
return 0;
}
输出
“switch语句中还有一点需要注意,那就是每个分支后面的break,如果不在分支后面加break,则会依次执行下面每一个分支;只有分支后面break时,程序才会执行到此就结束。break就像是水渠里的闸门,没有的话水就会继续往下流淌。”
“示例如下:[code_7]”
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
case 4: printf("Thursday\n");
case 5: printf("Friday\n");
case 6: printf("Saturday\n");
case 7: printf("Sunday\n");
default:printf("error\n");
}
return 0;
}
输出:
“选择结构就给大家讲这么多,下面我们来讲C语言中另一个常用的结构——“循环结构”。”
“什么是循环结构呢?举个例子,大家假假期看没看过电视剧《开端》?里面的男女主角在公交车上为了阻止炸弹爆炸一次又一次的死而复生,陷入了一个死循环中,而跳出循环的办法就是成功的阻止炸弹不在公交车上爆炸。用一个流程图来表示就是:”
如果炸弹炸了,主角被炸死就要复活重新阻止炸弹爆炸,直到成功阻止爆炸,才能结束循环。
“C语言中的循环结构也是同理,它的流程图如下:”
“C语言中有三种循环结构,分别是while、do-while和for循环。上述流程图就是最好理解的while语句的流程图。只要定义一个循环条件,判断条件是否为真,为真就执行里面的循环语句,为假就跳出循环。它的语法为:”
while(表达式){
语句块
}
“下面我们就把刚才的事例用C语言代码表达一下:[code_8]”
#include <stdio.h>
int main(){
int a = 1;//a=1表示炸弹爆炸,a=0表示爆炸被成功阻止
int b = 0;//b表示主角复活次数
while(a){
printf("炸弹爆炸了!\n");
b++;
if(b==10){
printf("爆炸被成功阻止!\n");
a=0;//条件为假,跳出循环
}
}
printf("主角复活次数:%d\n",b);
return 0;
}
输出:
我们据此可以看到,炸弹爆炸了10次,主角复活了十次,最后一次炸弹没有爆炸,是因为被成功阻止了,且终于结束了循环。
“上述代码中,我们可以看出,是因为,b=10时,变量a变成了0,此时不在符合while语句的循环条件,故此跳出循环,那么假如我们想不遵守遵守条件不遵守谋值时就跳出循环可不可以呢?答案是可以的。还记的我们switch语句中讲的分支“水闸”吗,循环中我们一样能用break阻止循环的继续。代码如下:[code_9]”
#include <stdio.h>
int main(){
int a = 1;//a=1表示炸弹爆炸,a=0表示爆炸被成功阻止
int b = 0;//b表示主角复活次数
while(a){
printf("炸弹爆炸了!\n");
b++;
if(b==10){
printf("爆炸被成功阻止!\n");
break;
}
}
printf("主角复活次数:%d\n",b);
return 0;
}
输出:
“上面代码中的a=0,换成了break,也能同样跳出循环,但是需要注意的是,break是强制退出,往往强制的办法都是我们最后的杀手锏,所以能不用就尽量不用。”
“如果说我们只是想跳过一次循环,而不是把整个循环截断,那该怎么办呢?答案是用continue关键字,而不是break。如下:用循环输出数字1~10中的奇数。[code_10]”
#include <stdio.h>
int main(){
int a = 0;
while(a<10){
a++;
if(a%2==0){
continue;//跳过当前迭代
}
printf("%d ",a);
}
return 0;
}
输出:
关于continue的更多详情请看
“从上面的代码结构中我们能看出while循环的规律是先判断条件在执行循环体,那么有没有一种结果是先执行循环体在判断符不符合条件的呢?答案是:有的。那就是while循环的表亲,do-while循环。”
语法表达式:
do{
语句块
}while(表达式);
示例代码[code_11]
#include <stdio.h>
int main(){
int a = 0;
do{
a++;
printf("%d ",a);
}while(a<10);
return 0;
}
输出:
对比while[code12]
#include <stdio.h>
int main(){
int a = 0;
do{
a++;
printf("%d ",a);
}while(a<10);
printf("\n");
a = 0;
while(a<10){
a++;
printf("%d ",a);
}
return 0;
}
输出:
“这个代码并没有体现出两种循环的大致区别,但是从本质上while循环先进行条件判断,属于先礼后兵;do-while循环先执行循环体然后再进行判断,属于先斩后奏;所以根据这点特性来看,遇到具体问题要具体分析使用哪个方式更好。”
“下面我们来讲最后一个循环结构——for循环。”
“for循环与前两个循环的区别在于,它循环条件的表达式更多,更加灵活。”
“语法结构和流程图如下:”
语法结构:
for(表达式1; 表达式2; 表达式3){
语句块
}
流程图
“从结构流程图我们不难看出,for循环有三个表达式,作用分别是循环条件初始化、判断是否继续进行循环、条件迭代。其中如果三个表达式都没有则是一个死循环。[code_13]”
#include <stdio.h>
int main(){
int a = 0;
for(;;)
{
printf("%d",a);
}
return 0;
}
输出:
如果不停止循环将一直进行下去。
“如果只没有中间的条件,也是同理。[code_14]”
#include <stdio.h>
int main(){
int a = 0;
for(int i = 0;;i++)
{
printf("%d",i);
}
return 0;
}
“下面举一个正常点的例子,用for循环输出1~10:[code_15]”
#include <stdio.h>
int main(){
for(int i = 1;i<11;i++)
{
printf("%d ",i);
}
return 0;
}
输出:
“下面举一个正常点的例子,用for循环输出1~100内的奇数:[code_16]”
#include <stdio.h>
int main(){
for(int i = 1;i<101;i++)
{
if(i%2==0) continue;
printf("%d ",i);
}
return 0;
}
输出:
“下面举一个难一点的例子,用两层for循环打印成法口诀:[code_17]”
#include <stdio.h>
int main(){
for(int i = 1;i<10;i++)
{
for(int j=1;j<=i;j++)
{
printf("%d*%d=%d ",j,i,i*j);
}
printf("\n");
}
return 0;
}
输出:
“好了,循环就讲这么多了,这节课内容比较多,大家好好消化吸收。尤其是课下多敲代码,好好体会循环的奥妙。”
“其实除了这两种结构外,C语言中还有一种默认的语法结构,或者说所有的语言都有这种结构,你们能猜出来是什么吗?它就是:顺序结构。我们的代码都是从上到下写的,计算机也是从上到下进行识别的,甚至当我们学计算机网络时,你们也会听到,计算机网络是自顶向下设计的,这就是我们计算机人都遵守的一种不成文的规定,那就是程序代码或者结构基本上都是从上至下的,包括我们的C语言最基本的结构就是顺序结构。”
“今天就给大家讲这么多,三种结构(顺序、选择、循环)一定要牢记于心,下课。”