前言
C语言是结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构。编程是为了处理实际生活中的事件而存在的,只要我们仔细的分析,可以发现任何事情都可以拆分成由顺序,选择和循环所组成的小的事情。这也正是这几种结构存在的意义,也是编程具有强大的将实际问题转化成由计算机执行的程序问题的能力
顺序结构
C语言的顺序结构是最简单的结构,在运行时语句会从上到下逐条执行。就像我们日常生活中按时间顺序做事一样。如果将我们的一天按照顺序结构表达出来可以按照-起床-洗漱吃饭-工作-回家-休息来表达。当然,其中的小的子事件可以根据需求进行详细化。
#include <stdio.h>
int main()
{
int a ,b= 0;
a = 1;
b = a+b;
printf("%d\n",a);
printf("%d\n",b);
}
这是一个非常简单的例子,可能显的我有些多余,但是我记得在我刚学习C语言时,我就不理解这样的代码。为什么b=b+a;0=0+1是什么东西。其实那是我没能正确的理解编程的执行逻辑。等号左边的b是变量名,这里的意思是把0+1的值赋给b存储起来。这也是C语言顺序结构的一种体现
选择结构
选择结构语句主要由if语句,switch语句,加上一些操作符共同完成的。
关系操作符
- 这里与数学中的概念类似,具体用法则不同
比如常见的>,<,>=,<=,,!=等。含有关系操作符的表达式称为关系表达式 例如ab,a>b等。如果一个关系表达式为真则其值为1,为假其值为0现在暂且告知其意义,具体用法要用到语句中
条件操作符
又称为三目操作符(操作符用到三个部分)其形式为exp1?exp2:exp3.如果exp1后的语句为真,则计算exp2后的表达式,反之计算exp3.计算的结果就是这个表达式的结果
实例
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
printf("%d", a == b ? a + b : a - b);
return 0;
}
在上面的代码中,a==b?a+b:a-b. 我们初始化 a=0,b=1,所以a == b为假。所以执行第三条语句。a-b计算结果为-1所以打印出来的数字就是-1.
逻辑操作符
- a&&b
逻辑与,只有a和b两部分全为真,则此条语句才会被判定为真 - a||b
- 逻辑或,a和b中有一条语句为真,此条语句就为真
- !
逻辑非,如果a为真,那么!a为假。反之亦成立。
if语句
表达形式
if(语句)
{
语句;
}
在()内的语句为真,则执行{}内的语句,为假则不执行。
这里结合前面的逻辑操作符举例
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
int c = 2;
if (a < b && b < c)
printf("hehe\n");
if (a<b || b>c)
{
printf("haha\n");
}
return 0;
}
(注意:if语句后面如果执行一条语句可以不添加花括号)
在上面的代码中if(a<b&&b<c)意思是如果a<b和b<c这两条语句全为真if后面的语句才会执行。if(a<b || b>c)意思是a<b和b>c中只要有一条语句为真,就会执行。很显然b>c为假,但是a<b为真,所以后面的语句还是执行了。
这里有一个易错的地方,如果写出if(a<b<c)这样的表达式,那你很有可能写错了。正确写法if(a<b&&b<c).如果写成a<b<c,a = 0,b =1,a<b为真所以a<b的值就是1,1由小于c.结果为真(1)。这是第一个表达式的执行逻辑。
else
if(语句)
{
语句;
}
else
{
语句
}
举例
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
if (a == b)
printf("hehe");
else
printf("haha");
return 0;
}
else的执行判断条件是对应if的补集,a==b对应的逆命题就是a!=b.显然上面的代码中a!=b为真,所以执行else后面的语句
(注意else后面如果只有一条语句可以不加{},a == b不要写成a=b)
嵌套if
使用if else 语句输入一个年龄,并判断属于什么年龄段的人
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year < 18)
{
printf("青少年");
}
else
{
if (year < 30)
printf("青年人");
else
{
if (year < 60)
printf("中年人");
else
{
printf("老年人");
}
}
}
return 0;
}
在上面的代码中年龄<18为青少年,>=18&&<30为青年人,>=30&&<60为中年人,>=60为老年人
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year < 18)
printf("青少年");
else if(year < 30)
printf("青年人");
else if(year < 60)
printf("中年人");
else
printf("老年人");
return 0;
}
上面的代码也可以写成这样,这两段代码的功能是一样的,代码2用else if替换了else{if()}.便于简化if语句的嵌套
所谓嵌套就是在if语句内部继续使用if语句
else语句悬空问题
else语句总是与它最近的if匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
此代码中打印结果是hehe,因为else并不是与第一个if匹配的,而是与第二个if匹配的,尽管我上面的代码中好像是让else与第一个if匹配,实际上只是一个障眼法。b==2为真所以不会打印else后面的语句
switch语句
表达形式
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("hehe\n");
break;
case 2:
printf("haha\n");
break;
case 3:
printf("xixi\n");
break;
default:
printf("error");
}
return 0;
}
switch()内的不同的值对应执行相应的语句,但是需要注意的是每个case最后都加上了break语句。break的作用是跳出该结构,不止可以用于switch语句,还可用于循环结构等结构,如果这里不加循环语句,比如输入n = 1,那么三条语句全会执行。break正是为了阻止这一现象。此外这里一共设置了三条case语句,如果输入的n>3,可以利用此处设置的default语句,最终都会表达里面的内容。
除了break之外,还有continue语句,break用于跳出整个循环,而continue用于跳过一次循环,其具体用法在循环介绍时再详细介绍
注意case和default的顺序问题,default不一定要放在最后,但是通常我们在编写代码时习惯于把default放在最后
循环结构
while语句
在单片机代码编写中最为常用的循环
#include <stdio.h>
int main()
{
int i = 0;
while (i<10)
{
printf("呵呵\n");
i++;
}
return 0;
}
上面的代码是while的基本用法
注意使用while循环时,先进行条件的判断,再执行循环体
do while语句
do while语句使用频率不如while语句,偶尔使用
#include <stdio.h>
int main()
{
int i = 0;
do
{
printf("hehe\n");
i++;
} while (i < 10);
return 0;
}
do while循环也和while循环差不多,其区别为while语句会先进行条件的判断再执行,而do while语句会至少先执行一遍循环体,在进行判断是否进行下一次循环
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("hehe\n");
i++;
} while (i < 1);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
while (i < 1)
{
printf("hehe\n");
i++;
}
return 0;
}
对比上面两段代码,不难发现while和do while的区别
for循环
for循环时代码别写时最常用的循环,尝尝可以用于遍历数组等操作
#include <stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
while (i < 10)
{
printf("%d ", arr[i]);
i++;
}
return 0;
}
在上面两段代码中,最后的执行结果相同,两段代码是等价的,我们可以借助while循环来理解for循环。for循环的基本形式是**for(表达式1;表达式2;表达式3)**其中表达式1只执行1次,表达式2每次循环都要执行,表达式3用于判断此次循环是否执行
continue语句
#include <stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
while (i < 9)
{
i++;
if (i == 5)
continue;
printf("%d ", arr[i]);
}
return 0;
}
continue用于跳过一次循环中continue后面的语句,直接跳到下一次循环的判断部分,上面的代码中i = 5时,执行continue语句,跳过后面的打印部分,直接进行下一次循环的判断。
注意代码中i++如果放在continue后面,那么i++被跳过,程序进入死循环。
goto语句
goto语句是一种转向语句可以跳到任意自己设置的节点
#include <stdio.h>
int main()
{
printf("haha\n");
goto next;
printf("hehe\n");
next:
printf("xixi\n");
return 0;
}
goto语句的用法十分简单,但是如果使用过多的转向语句,可能会导致代码跳转混乱。所以尽量避免使用。但是在有些时候,对我们快速跳出某段代码十分方便
实际运用
判断素数
//如果一个数n从2开始除,如果一直除到这个数-1,中间每次做除的余数
//都不等于0,那么这个数为素数
//我们设置一个count用于计次,从2开始除,如果一直除到这个数-1
//中间一共做除n-2次,那么count从零开始计次,最后结果是n-2,证明为素数
#include <stdio.h>
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)//方便多次判断
{
int i = 0;
int count = 0;//count负责计次
for (i = 2;i < n;i++)
{
if (n % i != 0)
{
count++;
}
}
if (count == (n - 2))
{
printf("%d是素数", n);
}
else
printf("%d不是素数", n);
}
return 0;
}
猜数字游戏
设计一个小游戏,猜数字,设置一个随机数,如果猜大了,那么获得反馈猜大了,反之一样。知道猜出结果
rand函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
rand函数是头文件stdlib.h中的函数,用于生成一个为随机数,这个为随机数是依赖于种子生成的,如果只是这样相同的种子,那么生成的随机数是不变的,所以我们要生成种子
srand
srand函数可以生成一个种子用于rand函数使用,有了srand提供的种子,rand才可以生成不同的随机数
void srand (unsigned int seed);
time
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫time,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer);
time函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒
time函数的返回类型是time_t,实际上就是32位或6位的整型,()内是指针类型。如果timer是非空指针,还会把返回的差值放进指向的地址中。如果timer是NULL的话就只会返回时间差,这个时间差叫做时间戳
使用需要包含头文件time.h
最终代码
//随机生成一个数字
//输入数字获得反馈大了或小了
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void game()
{
printf("游戏开始");
int r = rand() % 100 + 1;//设置一个0到100之间的随机数
int guess = 0;
printf("请输入:");
int chance = 0;//限制五次回答机会
for (chance = 5;chance > 0;chance--)
{
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
printf("你还有%d次机会\n", chance-1);
}
if (guess < r)
{
printf("猜小了\n");
printf("你还有%d次机会\n", chance-1);
}
if (guess == r)
{
printf("恭喜你,猜对了");
}
}
if (chance == 0)
{
printf("猜数字失败\n");
printf("正确值是%d", r);
}
}
int main()
{
srand((unsigned int)time(NULL));//生成种子
printf("输入0开始游戏\n");
printf("输入1退出游戏\n");
int n = 0;//确认是否进入游戏
scanf("%d", &n);
while(n != 1 && n != 0)
{
printf("输入错误请重新输入:");
scanf("%d", &n);
}
if (n == 1)
{
return 0;
}
game();//进入游戏
return 0;
}
最后
选择和循环结构是C语言程序设计中必不可少的一部分,希望阅读这篇文章能够为初学者解答一些困惑,如果哪里有问题,欢迎在评论区指正。