《C语言入门》
热情篇 — — 热情像一对翅膀,带我飞过山岭
目录
前言
在我们的生活中,做任何事情都要遵循一定的原则、流程。程序设计也是如此,需要控制语句控制程序的执行流程。控制语句可以根据用户的输入决定程序要“做什么”“怎么做”等等,因此控制语句对于任何一门编程语言都是至关重要的。C语言支持三种结构:顺序结构、选择结构、循环结构。在顺序结构中,程序的流程是固定的,会按照程序的顺序逐语句执行。
选择结构的特点是程序的流程由多路的分支组成。而循环结构是指对同一程序会段执行若干次。
一、“C陷阱”问题思考
测试问题1:{}问题,例if语句后面加与不加花括号的区别
代码测试:(if语句后面+{})
int main() { int a = 10; if (a < 20) { printf("Hello\n"); printf("hehe"); } else { printf("你好\n"); printf("HaHa"); } return 0; }
a = 10 更改a = 30
还是这段代码,if语句后面不加{}
观察发现在不加括号的情况下出现了报错,说明在这种情况下if语句只对它下面的一行代码起管理作用。
#include <stdio.h> int main() { int a = 30; if (a < 20) printf("Hello\n"); else printf("你好\n"); printf("HaHa"); return 0; }
修改代码后,发现else后面没加{}的两条语句没有报错,这是为什么?运行结果看一下:
a = 10; a = 30
结果都输出了HaHa,所以“HaHa”不属于if()else语句。
综上所述:if语句后面只控制一条语句,不加{}也是可以的,但是如果后面有多条语句一定要记得加上{}。
测试问题2:什么是悬挂“else”
#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; }
当看到这样一段代码的时候,一定要杜绝自己写出这样代码风格,可读性较差。分析:运行结果为空,所以逐条执行到第一if语句的时候,a 不等于1,不会进入到第二个if语句,直接跳了出去。
综上所述:没有{}的情况,else是和它离的最近的if匹配的。
2.C语言中如何表示真假
0表示假,非0表示真。
3.EOF是什么意思
End Of File (文件结束符)
二、分支语句
分支语句可以根据不同的条件执行不同的语句。包括if语句和switch语句
1.if语句
if语句的三种语法结构:
if(表达式)
{
语句;
}
if(表达式)
{
语句;
}
else
{
语句;
}
if(表达式)
{
语句;
}
else if(表达式)
{
语句;
}
.....
else
{
语句;
}
应用:直接体验下第三种语句
#include <stdio.h>
int main()
{
int weight = 0;
printf("请输入你的体重:>");
scanf("%d",&weight);
if (weight > 0 && weight <= 60)
{
printf("瘦");
}
else if (weight > 60 && weight <= 120)
{
printf("完美");
}
else
{
printf("胖");
}
return 0;
}
嘻嘻,举例可能不是很准确,重点体会语法的应用!
小练习: 输出1-100之间的奇数
解法1:
#include <stdio.h> int main() { int num = 0; while (num <= 100) { if (num % 2 == 1) { printf("%d ", num); } num++; } return 0; }
解法2:
#include <stdio.h> int main() { int num = 0; for (num = 1;num<=100;num++) { if (num % 2 == 1) { printf("%d ",num); } } return 0; }
解法3:
#include <stdio.h> int main() { int i = 1; while (i <= 100) { printf("%d ",i); i += 2; } }
2.switch语句
switch 语句也是一种分支语句。 常常用于多分支的情况。当检测一个变量是否符合条件时,如果不符合,就再用另一个值来检测。这样的问题用if语句也是可以解决的,但是代码看起来比较笨重,这时候用switch语句就是一个很好的选择!
switch语句的语法结构:
switch(表达式)
{
case 整形常量表达式:
语句;
}
在switch语句中的break
没有使用break的情况下,运行如下代码:
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch (day) { case 1: printf("星期一"); case 2: printf("星期二"); } return 0; }
结果:
没有达到我们想要的效果。修改代码后:
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch (day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; } return 0; }
结果:
总结:在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
问题的需求改变:例如:1-5是工作日而周六、周日是休息日
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); } return 0; }
测试结果:
所以,break语句 的实际效果是把语句列表划分为不同的分支部分。
细心的你可能还会发现一个问题,如果表达的值与所有的case标签的值都不匹配怎么办?
这时可以加上一个default子句。
在上面的代码中加上default字句:
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); default: printf("输入错误!"); } return 0; }
测试结果:
![]()
总结:
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个 switch 语句中只能出现一条 default 子句。
注意:switch语句中的表达式必须是整型、字符型、字符串类型 ;case语句后面跟的是 整形常量表达式;
3.分支语句的比较
当有一种或两种的分支情景时,我们使用if语句非常的方便,告诉程序在某个条件成立的条件下执行某段语句,判断是否要执行紧跟在条件之后的语句;在有多种情况时使用switch更巧妙,当switch(条件)满足case 后面的常量,则执行对应的语句,若满足的条件未能匹配到对应的常量,则执行default后的语句。
三、循环语句
在生活中很多的实际的例子是:同一件事情我们需要完成很多次;循环语句就是在满足一定条件的情况下反复执行一个语句。
1.while循环
while 语法结构:while(表达式) { 循环语句; }
循环方式是通过一个条件来控制是否要反复执行这个语句。
实践:在屏幕上打印1-10的数字。(用while循环)
#include <stdio.h> int main() { int i = 1; while (i <= 100) { printf("%d ",i); i++; } return 0; }
结果:
break在上面已经谈到过了,
其实在循环中只要遇到 break ,就停止后期的所有的循环,直接终止循环。测试:#include <stdio.h> int main() { int i = 0; while (i <= 10) { printf("%d ",i); //break; i++; } return 0; }
结果:无break 有break:
测试发现,当程序执行到break的时候 直接终止了循环!
综上所述:while中的break是用于永久终止循环的。
continue翻译成汉语是继续的意思,那么它在程序中起到怎样的作用呢?
代码测试:
#include <stdio.h> int main() { int num = 0; while (num <= 10) { num += 1; if (3 == num) { continue; printf("haha"); } printf("%d ", num); } return 0; }
测试结果:
当num = 3,执行到continue时,循环并没有结束,也没有执行continue后面的语句,而是直接进入到了下次循环。
总结:
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,而是 直接跳转到while语句的判断部分 。进行下一次循环的入口判断。
2.for循环
语法结构:
for(表达式1; 表达式2; 表达式3) { 循环语句; }
表达式 1: 初始化部分 ,用于初始化循环变量的。表达式 2: 条件判断部分 ,用于判断循环时候终止。表达式 3: 调整部分 ,用于循环条件的调整。实践:
#includ <stdio.h> int main() { int i = 0; for (i = 0; i <= 10; i++) { printf("%d ",i); } return 0; }
结果:
for循环中break和continue:
break测试:
#include <stdio.h> int main() { int i = 0; for (i = 1; i < 10; i++) { printf("%d ",i); //break; } return 0; }
结果:无break 有break
continue测试:
#include <stdio.h> int main() { int i = 0; for (i = 1; i < 10; i++) { if (i == 4) { continue; printf("haha"); } printf("%d ",i); } return 0; }
结果:
经过测试发现,他们的意义和在while循环中是一样的!
小练习:打印9*9乘法口诀(forx循环)
#include <stdio.h> int main() { int i = 0; int j = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%2d ",j,i,i*j ); } printf("\n"); } }
结果:
3.do while循环
do while循环语法:
do { 循环语句; } while(表达式);
特点:循环至少执行一次,使用的场景有限,所以不是经常使用。
实践:
#include <stdio.h> int main() { int i = 5; do { printf("%d ",i); } while (i > 10); return 0; }
结果:
通过测试发现, 循环至少执行一次,循环先执行一次在进行判断。
四、综合使用
通过分支和循环语句,编写一个简易的菜单界面!
#incldue <stdio.h> void menu() { printf("**********************\n"); printf("******1.开始游戏*******\n"); printf("******0.退出游戏*******\n"); printf("**********************\n"); } int main() { int input = 0; do { menu(); printf("请输入选项:>"); scanf("%d", &input); switch (input) { case 0: printf("游戏结束!\n"); break; case 1: printf("游戏开始!\n"); break; default: printf("请重新输入选项!\n"); } } while (input); return 0; }
运行结果:
总结
本章主要介绍了C语言的分支语句if、switch和循环语句for 、while、do while以及控制语句break、continue.
分支语句根据不同的条件执行不同的语句
通常情况下,3种循环可以处理同一个问题,while和for循环都是先判断条件再执行循环体语句,因此有可能一次也不执行。而do while循环是先执行在判断,所以至少会执行一次!
分支和循环的语法和简单应用基本掌握,接下来就要做大量的练习,熟练的在不同的场景使用不同的语法。小张加油!