Stay hungry. Stay foolish. ——Steve Jobs
求知若饥,虚心若愚。
c语言是结构化的程序设计语言,它有三种基本结构,分别是:顺序结构,选择结构,循环结构。
-
C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。
-
C语言选择结构也称分支结构,就是让程序“拐弯”,有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。
-
C语言循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。
顺序结构不再赘述,今天我们来重点学习一下一下分支语句(选择结构)和循环语句。
首先,我们先搞清楚两个概念。
什么是语句?
C语言中,由一个分号隔开的就是一条语句。eg:
printf("你真漂亮");
a++;
; -------空语句
什么是语句块?
C语言中,由一个{}括起来的一个或多个语句,就称为语句块。如果语句块中只有一个语句,也可以省略{ }。
int main()
{
return 0;
}
目录
分支语句
-
if语句
我们需要在满足某种条件时进行一些操作,而不满足条件时就不进行任何操作,这个时候我们可以只使用 if 语句。
例如判断一个数是否为偶数。
int n=0;
scanf("%d",&n);
if ( n % 2 == 0)
{
printf( " 是偶数 ");
}
return 0;
-
if-else语句
if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。不同情况执行不同代码,从而实现多分支。
if(判断条件)
语句1;
else if(判断条件)
语句2;
else
语句2;
应用:
转换学生成绩。
悬空else
if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe");
else
printf("haha");
return 0;
}
你觉得是输出什么?
解析:else 总是与它前面最近的 if 配对,a=0,第一个if语句根本就没进入,所以无输出。
这里就要注意一下我们的书写形式,我们需要养成良好的代码风格。修改一下。
if书写形式的对比
代码一:
if(condition)
{
return x;
}
return y;
代码二:
if(condition)
{
return x;
}
else
{
return y;
}
这两个代码表达的意义一样吗?如果是你你选择哪一种代码?
代码三:
int num=1;
if(num==5)
{
printf("haha");
}
代码四:
int num=1;
if(5==num)
{
printf("haha");
}
如果是你你选择哪一种代码?
代码2、4更为直观,逻辑性好,不易出错,可读性高。
练习:
1:判断一个数是否为奇数
2.打印1-100之间的奇数
-
switch语句
C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。对于这种情况,一般使用 switch 语句代替。
switch(表达式)
{
case 整形常量表达式1:语句1;
case 整形常量表达式2:语句2;
case 整形常量表达式3:语句3;
case 整形常量表达式4:语句4;
case 整形常量表达式n:语句n;
default: 语句n+1;
运行过程:
1.首先执行switch后的表达式,设得出它的值为a
2.如果a==整形常量表达式1,则执行其后所有的语句; 也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3. 如果“整形常量表达式1”和a 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整形常量表达式1”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。
break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
练习:
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m=%d n=%d\n", m, n);
}
循环
所谓循环(Loop),就是重复地执行同一段代码。
-
while循环
while(表达式)
{
语句块;
}
运行过程:先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
while 循环的整体思路:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。
while语句中的break和continue
break:永久终止循环。
continue:终止本次循环。
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d", i);
i++;
}
return 0;
}
代码输出结果是什么?
练习:
1.看两个代码
注:1.EOF------文件结束的标志
2.getchar 读取失败的时候就会返回EOF
3.返回的字符,本质上是ASCII码值,是整数,可以存放到ch中
4.getchar 函数不仅仅是返回正常字符,还会返回EOF,其值为-1
2.分析下边的代码
scanf/getchar 都是在输入缓冲区中获取输入值,scanf获取输入值时,取走了\0前的值,赋给了数组,所以下一个getchar来的时候,从输入缓冲区中取走剩下的\0,因而不再等待输入。
修改代码:
这样操作依旧有缺陷:
修改:
-
for循环
for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3)
{
语句块
}
它的运行过程为:
1) 先执行“表达式1”。
2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。
continue问题:
continue跳过后边的代码,去了调整部分,使得循环变量得以调整,不容易造成死循环。
-
do-while循环
do-while循环的一般形式为:
do
{
语句块
}while(表达式);
do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
continue问题:
代码练习:
1.计算n的阶乘:
2.计算1!+2!+3!+.....+n!
3.在一个有序数组中查找数字n
二分查找
3.编写代码,演示多个字符从两端移动向中间汇聚
4.编写代码实现,模拟用户登录场景,并且只能登陆三次。
5.猜数字游戏
简介:
rand()函数
功能:返回一个伪随机数。之所以说是伪随机数,是因为在没有其它操作下,每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”)。
为了使rand的结果更“真”一些,也就是令其返回值更具有随机性(不确定性),C语言在stdlib.h中还提供了srand函数,通过该函数可以设置一个随机数种子,一般用当前时间的毫秒数来做参数。通过time(NULL)可以获取到当前时间的毫秒值(该函数位于time.h)中。如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。
使用rand的流程可以总结为:
1 调用srand(time(NULL))设置随机数种子。
2 调用rand函数获取一个或一系列随机数。
需要注意的是,srand只需要在所有rand调用前,被调用一次即可,没必要调用多次。
void menu()
{
printf("**********************************\n");
printf("****1.paly************************\n");
printf("****0.exit************************\n");
printf("**********************************\n");
printf("**********************************\n");
}
void play()
{
int input = 0;
int random_num = rand() % 100 + 1;
while (1)
{
printf("请输入数字:");
scanf("%d", &input);
if (input > random_num)
{
printf("猜大了\n");
}
else if (input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了");
break;
}
}
}
int main()
{
int input = 0;
int random_num = rand() %100 + 1;
do
{
menu();
printf("请选择(0/1):");
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
play();
break;
default:
printf("输入错误");
}
} while (input);
return 0;
}
一个整蛊小游戏
(把文件发给你的盆友,感受一下生活的快乐~)
goto语句
goto语句最常见的用法是跳出两层或多层循环。 不过由于 goto 语句很容易造成代码混乱,维护和阅读困难,饱受诟病,不被推荐,而且 goto 循环完全可以被其他循环取代。
现在让我们用goto玩一个小游戏
不用goto也可以用while
完结。
天天开心~