C语言初阶(3)——分支和循环

目录

1.if语句

2.关系操作符

3.条件操作符

4.逻辑操作符

5.switch语句

6.while循环

7.for循环

8.do while循环

9.continue和break

10.循环的嵌套

11.goto语句


1.if语句

(1)非0表示真,0表示假

(2)if与else同时使用表示选择;

(3)当分支中包含多条语句时if和else对应的语句都要加上大括号;

(4)悬空else问题:else总是与最近的if匹配:

#include <stdio.h>
int main()
{
     int a = 0;
     int b = 2;
     if(a == 1)
         if(b == 2)
         printf("hehe\n");
     else//此处的else与更近的if(b==2)匹配
         printf("haha\n");
    //因为此时if...else语句都是嵌套在第一个if语句下的,当a!=1时不会执行语句
    //故无输出结果
     return 0;
}
2.关系操作符

(1)C语言中用于比较的表达式叫“关系表达式”,里面使用的运算符叫“关系运算符”

> ⼤于运算符

< ⼩于运算符

>= ⼤于等于运算符

<= ⼩于等于运算符

== 相等运算符        = 赋值运算符(注意区分二者)

!= 不相等运算符

关系表达式通常返回0(假)或1(真);

(2)多个关系运算符不宜连用,若要实现连用则可采用&&或||等操作符来表示;

3.条件操作符
exp1?exp2:exp3

(1)表达式1为真,则表达式2计算,表达式3不算:表达式2的结果是整个表达式的结果;

(2)表达式1为假,则表达式2不算,表达式3计算:表达式3的结果是整个表达式的结果

4.逻辑操作符

(1)基本介绍:

! :逻辑取反运算符(改变单个表达式的真假); 同时还有变量falg可实现效果;

&& :与运算符,就是并且的意思(两侧⾄少有⼀个表达式为假,则为假,否则为真);

|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假);

练习:闰年的判断

//判断规则:
//1.能被4整除且不能被100整除
//2.能被400整除
#include<stdio.h>
int main()
{
    int year = 0;
    scanf("%d",&year);
    if((year%4==0 && year%100!=0) || (year%400==0))
    printf("是闰年\n");

    return 0;
}

(2)短路求值

&&:a为0,右边不再计算;

||:a为真,右边不再计算;

5.switch语句

(1)是一种特殊的if...else结构,用于判断有多个结果的情况;根据表达式的不同值执行对应的case分支,找不到对应值则执行default分支;

(2)switch后的表达式必须是整型表达式;

(3)case后的值,必须是整型常量表达式;

char ch="w";
scanf("%c",&ch);//字符是以ASCII码值的形式进行存储的,而ASCII值为整数,字符属于整型家族
switch(ch);//此处无问题

(4)case与后面的数字间必须有空格;

(5)每一个case语句中的代码执行完毕以后,需要加上break才能跳出去;

(6)switch语句中的case语句和default语句是没有顺序要求的,但是通常会将default语句放在最后执行;

6.while循环
//输入一个正的整数,逆序打印它的每一位
//例如:输入1234,输出:4 3 2 1
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    while(n)
    {
        printf("%d ", n%10);//利用n%10得到的余数就是n的最低位
        n /= 10;//利用n/10去掉最低位,得到倒数第二位  
    }
    return 0;
}
7.for循环

(1)初始化、判断、循环三个部分都可以省略;

(2)省略判断部分表示判断部分恒为真;

for(表达式1;表达式2;表达式3)
//表达式1:循环变量的初始化(只执行一次)
//表达式2:循环结束条件的判断
//表达式3:循环变量的调整
//计算1~100之间3的倍数
#include<stdio.h>
int main()
{
    int i = 0;
    int sum = 0;
    for(i=1; i<=100; i++)
    {
        if(i % 3 == 0)
        {
            sum += i;
        }
    }
    printf("%d\n", sum);
    return 0;
}

//优化:直接产生3的倍数就可以省去多余的循环和判断
int main()
{
    int i = 0;
    int sum = 0;
    for(i=3; i<=100; i+=3)
    {
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

while和for循环都是先判断,满足循环就进入,不满足就跳出。

8.do while循环

do while循环是直接进入循环,至少执行一次再执行while循环语句;

//输入一个正整数,计算该正整数为几位数
//例如:输入:1234,输出:4
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    do
    {
        count++;
        n=n/10;
    }while(n);
    printf("%d\n", count);
    return 0;
}
//此题非常适用于do while循环,因为哪怕数字0也是一位数,要进行位数的统计
9.continue和break

(1)break:用于永久地终止循环,一旦执行,直接跳出循环,继续往后执行;

(2)continue:跳过本次循环continue之后的代码:

1>while循环中:

#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
    {
         if(i == 5)
         continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
         printf("%d ", i);
         i = i+1;
    }
return 0;
}

//变式:改变i+1的位置
int main()
{
     int i = 1;
     i = i+1;
//打印结果:i从2开始,到11结束
     while(i<=10)
    {
         if(i == 5)
         continue;
         printf("%d ", i);
    }
return 0;
}

2>for循环中:跳过continue后面的代码,直接来到for循环的调整部分

#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;
}

3>do while中:和while循环中的类似

#include <stdio.h>
int main()
{
     int i = 1;
     do
     {
         if(i == 5)
         continue;
//当i=5时碰到continue跳过后面这一节到while处执行语句
//i=5满足i<=10故返回至do--if语句,最后发生死循环
         printf("%d ", i);
         i = i + 1;
     }while(i<=10);
return 0;
}
10.循环的嵌套
//找出100~200之间的素数,并打印在屏幕上
//素数又称质数,只能被1和本⾝整除的数字

#include <stdio.h>
int main()
{
     int i = 0;
//循环产⽣100~200的数字
     for(i=100; i<=200; i++)
     {
//判断i是否为素数
//循环产⽣2~i-1之间的数字
         int j = 0;
         int flag = 1;//假设i是素数
         for(j=2; j<i; j++)
         {
             if(i % j == 0)
             {
                 flag = 0;//此时出现了能将i整除的数
                 break;//跳出循环
             }
        }
     if(flag == 1)//循环结束时未出现能将i整除的数,说明i为素数;故flag未改变
     printf("%d ", i);
    }
return 0;
}

//优化1:

#include <stdio.h>
int main()
{
     int i = 0;
     int count = 0;
     for(i=101; i<=200; i+=2)//偶数绝不为素数(可被2整除);故此时的优化产生均为奇数
     {
         int j = 0;
         int flag = 1;
         for(j=2; j<i; j++)
         {
             if(i % j == 0)
             {
                 flag = 0;
                 break;
             }
        }
        if(flag == 1)
        {
            printf("%d ", i);
            count++;
        }
    }
     printf("\n count= %d\n", count);
return 0;
}

//优化2:大大减少了试除的次数

#include <stdio.h>
#include<math.h>//sqrt函数的头文件
int main()
{
     int i = 0;
     int count = 0;
     for(i=101; i<=200; i+=2)
     {
         int j = 0;
         int flag = 1;
//n=a*b,则a与b至少有一个<=(n)^2
//例如:16=2*8=4*4,至少一个因子<=(16)^2=4
         for(j=2; j<=sqrt(i); j++)
         {
             if(i % j == 0)
             {
                 flag = 0;
                 break;
             }
        }
         if(flag == 1)
         {
            printf("%d ", i);
            count++;
         }
    }
     printf("\n count= %d\n", count);
return 0;
}
11.goto语句

goto语句可以在同一个函数内跳转到设置好的标号处:

#include <stdio.h>
int main()
{
     printf("hehe\n");
     goto next://执行到此处就跳到"next"处,造成死循环
     printf("haha\n");
 
     next:
     printf("跳过了haha的打印\n"); 
return 0;
}

练习:

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for(i=0; i<5; i++)
    {
        for(j=0; j<5; j++)
        {
            printf("hehe\n");//此时输出结果为25个hehe
        }
    }
    return 0;
}

//变式:将i=0、j=0都忽略:
int main()
{
    int i = 0;
    int j = 0;
    for(; i<5; i++)
    {
        for(; j<5; j++)
        {
            printf("hehe\n");//此时输出结果为5个hehe
//原因:循环至i=1时,进入j循环时由于j未被重新初始化,保留值j=5,导致后续无法再进入j循环
        }
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值