C语言基础-分支与循环-04

C语言是一种结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构
我们可以使用if,switch实现选择结构,使用for,while,do while 实现循环结构 

关系操作符

>:大于  

<:小于

>=:大于等于

<=:小于等于

==:相等

!=:不相等

多个关系符不宜连用

关系表达式常用于if或while结构

条件操作符

条件操作符也叫三目操作符,形式如下

exp1 ? exp2 : exp3

 条件操作符的计算逻辑:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果

可以实现找两个数中较大值,如下

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    printf("请随机输入两个数字:\n");
    scanf("%d%d", &a, &b);
    int c =( a > b ? a : b);
    printf("两个数中较大值为:%d\n", c);
}

逻辑操作符:&&,||,!

C语言中,非0表示真,0表示假

逻辑与运算符:&&

&&:并且,两边的表达式都为真,则为真,否则为假;有一个为假,则为假

逻辑或运算符:||

||:或者,至少有一个为真,则为真,否则为假;只有两边都为假,才为假

逻辑非运算符:!

!:改变单个表达式的真假

运用上面的条件操作符来举个例子,如下

#include <stdio.h>
int main()
{
    int year = 0;
    printf("请输入年份:");
    scanf("%d", year);
    if(((yaer % 4 == 0)&&(year % 100 != 0))||(year % 400 == 0))
    {
        printf("%d是闰年\n", year);
    }
    else{
        printf("%d不是闰年\n", year);
    }
}

短路

C语言逻辑运算符还有一个特点,它总是先对左侧表达式求值,再对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为短路。

以上面的代码举例

if(month >= 3 && month <= 5)

 这种情况下,如果左边的month >= 3结果为0,右边的month <= 5就不判断,整个表达式的结果为0。

对于||的结果如下

if(month == 12 || month == 1 || month == 2)

 如果month == 12,则不用再判断month是否等于1或者2,整个表达式结果为1   

if语句

if

if的语法形式如下,当语句不长时可以这样写

if(表达式)语句

或者 

if (表达式)
    语句

长语句如下

if (表达式)
{
    语句
}

表达式为真,则语句执行,表达式为假,则语句不执行

在C语言中,0为假,1为真,即表达式结果为0不执行,为1执行

举个例子如下   判断输入的数是否为偶数

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num % 2 == 0) printf("%d是偶数", num);
}

else

就是if语句条件为假时,执行else语句,继续使用上面的例子,如下

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num % 2 == 0) 
        printf("%d是偶数", num);
    else
        printf("%d是奇数", num);
}

分支中包含多条语句

默认情况下,if和else后面只能跟一条语句,使用多条语句时,就是上面说到的长语句情况,即用{}包裹需要表达的语句

嵌套if

在if else语句中,else可以与另一个if语句连用,构成多重判断

比如:要对输入的数字进行判断,是正数还是负数还是0

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num == 0)
        printf("输入的数字是0", num)
    else 
    {
        if(num > 0) 
            printf("%d是正数", num);
        else 
            printf("%d是负数", num);
    }
}

另外几种写法

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num == 0)
        printf("输入的数字是0", num)
    else if(num > 0) 
        printf("%d是正数", num);
    else
        printf("%d是负数", num);
}
#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num >= 0)
    {
        if(num = 0)
            printf("输入的数字是0", num);
        else
            printf("%d是正数", num);
    }
    else
    {
        printf("%d是负数", num);
    }
}

写法有多种,想写哪种都行

悬空else

如果有多个if和else,else总是与最近的if匹配

举个例子

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if(b == 2)
            printf("haha\n");
    else
        printf("nihao\n");
}

上面的程序输出结果是什么呢?

结果是什么都不输出

这个else是和最近的表达式(b == 2)的if语句匹配的,但是这个if语句并没有执行,因为在它的上一层还有一个if语句,但是它的表达式为(a == 1),而全局变量a的值为0,所以这个表达式不执行,导致后面的表达式都不执行

 switch语句

switch语句是一种特殊形式的if...else结构,用于判断有多个结果的情况      结构如下

switch(expression){
    case value1: statement
    case value2: statement
    default: statement
}

 上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到,就执行default分支。

其中:switch后的expression必须是整型表达式(字符型也归类到整型);case后的值必须是整型常量表达式

if语句与switch语句的对比

例如:计算任意一个整数值除5后的余数

#include <stdio.h>
int main(){
    int a = 0;
    scanf("%d", &a);
    if(a % 5 == 0)
        printf("余数为0\n");
    else if(a % 5 == 1)
        printf("余数是1\n");
    else if(a % 5 == 2)
        printf("余数是2\n");    
    else if(a % 5 == 3)
        printf("余数是3\n");
    else
        printf("余数是4\n");
}

 如果是switch语句  如下

#include <stdio.h>
int main(){
    int a = 0;
    scanf("%d", &a);
    switch(a % 5){
        case 0:
            printf("余数为0\n");break;
        case 1:
            printf("余数为1\n");break;
        case 2:
            printf("余数为2\n");break;
        case 3:
            printf("余数为3\n");break;
        case 4:
            printf("余数为4\n");break;
    }
}

switch语句中的break

如果没有break,每个case语句都执行一遍,直到所有的case语句执行完

switch语句中的default

处理所有case不能匹配的情况

switch语句中的case与default的顺序问题

在switch语句中case语句和default语句没有顺序要求,满足实际需求即可,通常将default语句放在最后

 for循环

for循环使用的比较多,语法如下

for(表达式1;表达式2;表达式3)
    语句; // 如果有更多的语句,可以加上大括号

 表达式1:用于循环变量的初始化(初始化只执行一次)

表达式2:用于循环结束条件的判断

表达式3:用于循环变量的调整

for循环首先执行表达式1,然后是表达式2,接着执行语句部分,最后执行表达式3

举例如下 

int main(){
    int i = 0;
    for(i = 1; i <= 100; i++)
    {
        printf("%d", i);
    }
}

while循环

while是C语言三种循环中的一种,语句结构与if语句有点类似

语法如下

while(表达式1){
    语句;
    表达式2;
}

 表达式1:循环条件的判断

表达式2:循环变量的调整

与for循环不同的是,初始化部分在while前面

if和while的对比

例如 if 语句

int main(){
    int a = 5;
    if(a > 0) 
        printf("你好\n");
}

while语句如下

int main(){
    int a = 5;
    while(a > 0)
        printf("你好\n");
}

 但是while语句这种情况下会死循环,因为条件一直是满足的,所以会一直执行下方的printf,打印你好。

while语句的执行

首先判断表达式为真还是假,为真执行语句,然后返回判断表达式,判断真假。如果有一次为假,while语句结束。

do...while语句

这种语句使用较少,语法如下

do
    语句
while(表达式)

do...while语句是进入循环体,再执行while后的判断表达式,表达式为真就会进行下一次,为假就不会继续循环。也就是说至少会执行一次。

break与continue语句

在循环执行的过程中,如果发生某些状况,需要提前终止循环。C语言中提供了break和continue两个关键字应用到循环中来实现这些功能。

break:是永久终止循环,执行后跳出循环继续往后执行

continue:是跳过本次循环中continue后面的代码,在for循环和while循环中有所差异

while中的break和continue

break如下

#include <stdio.h>
int main(){
    int i = 1;
    while(i <= 10){
        if(i == 5)
            break;
        printf("%d", i);
        i = i + 1;
    }
}

如果没有break,运行结果会打印从1到10这十个数字,但是加了break后,循环就会从5终止,打印出1到4这四个数字。

continue如下

#include <stdio.h>
int main(){
    int i = 1;
    while(i <= 10){
        if(i == 5)
            continue;
        printf("%d", i);
        i = i + 1;
    }
}

加了continue后,在符合条件i==5时,跳过了printf与控制部分,此时没有改变值,控制台会打印1到4四个数字,然后不停地执行判断语句,进入死循环。

但是如果只是想跳过其中某一个数字,只需要将控制部分放到判断前面,就可以实现。

for循环中的break和continue

break举例

#include <stdio.h>
int main(){
    int i = 0;
    for(i = 1; i <= 10; i++){
        if(i == 5)
            break;
        printf("%d", i);
    }
}

结果与while一样

continue举例

#include <stdio.h>
int main(){
    int i = 0;
    for(i = 1; i <= 10; i++){
        if(i == 5)
            continue;
        printf("%d", i);
    }
}

此时控制台打印除5以外的1到10的数字,这里与while不同。这种情况也不会死循环。

 do...while中的break与continue

break举例

#include <stdio.h>
int main(){
    int i = 1;
    do
    {
        if(i == 5)
            break;
        printf("%d", i);
        i = i + 1;
    }
    while(i <= 10);
}

此时情况几乎相同,也是打印1到4

continue举例

#include <stdio.h>
int main(){
    int i = 1;
    do
    {
        if(i == 5)
            continue;
        printf("%d", i);
        i = i + 1;
    }
    while(i <= 10);
}

与while一样,打印1到4 就死循环 跳过了控制部分

循环的嵌套

通常将 for、while、do...while这三种循环嵌套在一起才能更好的解决实际问题,这就是常说的循环嵌套。 

下面举一个例子

问题是,有100元,想买100只鸡,其中公鸡五元一只,母鸡三元一只,小鸡一元三只,能买到多少只公鸡,母鸡,小鸡

 此时通常想到使用穷举法,即公鸡五元一只,那么最多20只,而母鸡三元一只,最多能买33只,小鸡就是100减去公鸡与母鸡的数量。最后再列钱的等式,结果如下

#include <stdio.h>

int main() {
    int x, y, z; // x表示公鸡的数量,y表示母鸡的数量,z表示小鸡的数量

    for (x = 0; x <= 20; x++) {
        for (y = 0; y <= 33; y++) {
            z = 100 - x - y;
            if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
                printf("公鸡:%d只,母鸡:%d只,小鸡:%d只\n", x, y, z);
            }
        }
    }

    return 0;
}

 其中的for可以换成while,想用while就可以改变一下,将变量的初始化写在前面,括号中只留下判断表达式,将调整语句放在while代码块的最后一句。这里就不列举了。

如果需要打印一些数字呢?我们应该怎么办?请看下面的例子

从1到100中出现了多少个数字9?请打印出来

这个问题首先想到的也是for循环,根据这个问题,还可以想到,使用if来判断两个条件,因为个位和十位都会出现这个数字,那么话不多说,上代码

#include <stdio.h>
int main()
{
	int num = 0, sum = 1;
	for (num = 19; num <= 100; num++) {
		if (num % 10 == 9) {
			sum++;
		}
		if (num / 10 == 9) {
			sum++;
		}
	}
	printf("%d", sum);
}

就先举两个简单的例子,希望上面的内容对你们有所帮助

  • 32
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值