目录
分支结构
我们知道生活中常常面临这各种选择,比如今天是学习还是玩耍呢,在外面吃东西时我们是选择吃中式还是西式,而我们计算机就是为了人们生活而服务的,因此我们在c程序中也存在选择,我们c程序中将这种选择称之为分支结构,选择就像一个大树一样在各个方面都有着枝条,因此我们称为分支结构。
分支结构中包含if语句和switch语句,那么接下来就让我们来了解他们吧!
if语句
if语句的语法形式
if(/*表达式*/)
{
//语句
}
注:表达式前 // 和/* */为注释
表达式为真,则执行语句,反之不执行。
列如下面的代码:
我们赋值i_a= 5,表达式i_a确实大于5,则执行语句printf,此时屏幕上会打印“你对了”,反之则无。
#include <stdio.h>
int main()
{
int i_a = 5;
if(i_a>3)
{
printf("你对了");
}
return 0;
}
还有一种就是非0为真,是0为假
#include <stdio.h>
int main()
{
int i = 1;
if (i)
{
printf("hello\n");
}
return 0;
}
但是如果i = 0,屏幕上是不会打印hello的。
if语句的流程图:
if else 语句
当然选择不是一成不变的,我们常常在生活中面临多个选择,C语言中就引用if else 语句来解决这样的问题。
对于2个对象我们的形式:
#include <stdio.h>
int main()
{
int i_b = 3;
if(i_b>2)
{
printf("hehe");
}
else
{
printf("haha");
}
return 0;
}
对于3个及以上对象我们的形式是:
#include <stdio.h>
int main()
{
int i_c = 0;
scanf("%d", &i_c);
if (i_c > 50)
{
printf("haha");
}
else if (i_c < 25&&i_c>10)
{
printf("hehe");
}
else
{
printf("heihei");
}
return 0;
}
if else语句流程图:
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;
}
这边的else又和谁对齐呢,答案是就近原则,else和距离自己最近的if对齐!在VS编译器中我们也可以很清楚的看明白。
#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;
}
题目
编写程序数一下 1到 100 的所有整数中出现多少个数字9
答案参考:
代码参考:
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9)
count++;
if (i / 10 == 9)
count++;
}
printf("%d\n", count);
return 0;
}
switch语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重 的 else if 改成更易⽤、可读性更好的形式。
switch语句的形式
switch (expression//表达式)
{
case value1: statement//语句
case value2: statement//语句
default: statement//语句
}
注:
- switch 后的 expression 必须是整型表达式
- case 后的值,必须是整形常量表达式
//输⼊任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述的代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句,不然会陷入死循环
switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊ default ⼦句。
switch (expression)
{
case value1:
statement
case value2:
statement
default:
statement
}
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗? 其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。
题目
输⼊⼀个1~7的数字,打印对应的星期⼏ 例如: 输⼊:1 输出:星期⼀ 输⼊:2 输出:星期⼆ 输⼊:3 输出:星期三 输⼊:4 输出:星期四 输⼊:5 输出:星期五 输⼊:6 输出:星期六 输⼊:7 输出:星期天
错误示范:
#include <stdio.h>
int main()
{
int days = 0;
scanf_s("%d", &days);
switch (days)
{
case 1:
printf("星期一");
case 2:
printf("星期二");
case 3:
printf("星期三");
case 4:
printf("星期四");
case 5:
printf("星期五");
case 6:
printf("星期六");
case 7:
printf("星期日");
}
return 0;
}
这样看起来没啥问题,但是当我们输入2时,按道理来说应该输出“星期二”,但是实际如下,导致这样的情况是case是入口,你输入了2那么我就从case 2入口进入但是没有出口只能继续执行下面的语句,要解决这样情况我们需要加break;
#include <stdio.h>
int main()
{
int days = 0;
scanf_s("%d", &days);
switch (days)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期日");
break;
}
return 0;
}
循环结构
我们往往生活中会做一些重复的是,如每天吃饭,每天上班,上学等等,在C语言中为了解决这样的问题我们就使用了循环结构,本次我们要讲的包括:while/for/do-while循环。
while循环
while 语句的语法结构和 if 语句⾮常相似。
if (/*表达式*/)
{
/*语句*/;
}
while(/*表达式*/)
{
/*语句*/;
}
当表达式内的内容判断为真的时,执行循环程序,反之则不执行。
while循环语句的流程图:
while循环的实践
练习:在屏幕上打印1~10的值
参考代码:
#include <stdio.h>
int main()
{
int num = 0;
while (num <= 10)
{
printf("%d ", num);
num++;
}
return 0;
}
练习
输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
- 输⼊:1234,输出:4 3 2 1
- 输⼊:521,输出:1 2 5
参考代码:
#include <stdio.h>
int main()
{
//输入数字
int num = 0;
int ret = 0;
scanf_s("%d", &num);
//循环处理
while (num)
{
ret = num % 10;//求出末尾数字
printf("%d ", ret);//输出数字
num = num / 10;//将末尾数前进一位,如255->25
}
return 0;
}
for循环
for 循环的语法形式如下:
for (表达式1; 表达式2; 表达式3)
{
语句;
}
- 表达式1 ⽤于循环变量的初始化
- 表达式2 ⽤于循环结束条件的判断
- 表达式3 ⽤于循环变量的调整
for语句流程图:
for循环的实践
练习1:在屏幕上打印1~10的值
参考代码:
#include <stdio.h>
int main()
{
int num = 0;
for (num = 1; num <= 10;num++)
{
printf("%d ", num);
}
return 0;
}
练习2: 计算1~100之间3的倍数的数字之和
参考代码:
//1-100之间3倍数的和
#include <stdio.h>
int main()
{
int ia = 0;
int icount = 0;
for (ia = 1; ia <= 100; ia++)
{
//判断是否是3的倍数
if (ia % 3 ==0)
{
icount =icount + ia;
}
}
printf("%d", icount);
return 0;
}
练习3:打印1000年到2000年之间的闰年
参考代码:
//打印1000年到2000年之间的闰年
#include <stdio.h>
int main()
{
//使用循环打印出1000~2000的年份
int years = 0;
for (years = 1000; years <= 2000; years++)
{
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
//判断是否是闰年:
if ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0))
{
printf("%d是闰年\n",years);
}
}
return 0;
}
do-while循环
在循环语句中 do while 语句的使⽤最少,它的语法如下:
do
{
语句;
}while();
简单来说do-while就是先做事在判断,如果判断通过则继续做事,它至少要运行一次,而for和while循环是先判断后做事,如果判断不通过,则一次都不会运行。
do while循环的实践
在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int num = 1;
do
{
printf("%d ", num);
num++;
} while (num <= 10);
return 0;
}
练习 输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
- 输⼊:1234 输出:4
- 输⼊:12 输出:2
参考代码:
break语句和continue语句
break举例
其实和 while 循环中的 break ⼀样, for 循环中的 break 也是⽤于终⽌循环的,不管循环还需 要循环多少次,只要执⾏到了 break ,循环就彻底终⽌。
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
continue举例
上⾯的代码,如果把 break 换成 continue 会是什么结果呢?
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
goto语句
#include <stdio.h>
int main()
{
int i = 2;
again:
while (i>0)
{
printf("hehe ");
i--;
}
i=0;
goto again;
return;
}
again 是自定义名称,当我们使用goto语句时,他会跳转到again:的地方继续往下执行代码。以上代码不停的跳转,最后形成死循环。
题目练习
题目1:在屏幕上输出9*9乘法口诀表
参考代码:
//输出9*9乘法口诀表
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 1;
int product = 1;
for (num1=1;num1<=9;num1++)
{
for (num2 = 1; num2 <= 9; num2++)
{
product = num1 * num2;
printf("%d*%d=%d\n",num1,num2, product);
}
}
return 0;
}