超详细最全C语言个人笔记【第二章节-控制流】

二路分支

  • 逻辑:程序中某段代码需要在满足某个条件时才能运行
  • 形式:
    1. if语句:表达一种 如果-则的条件执行关系
    2. if-else语句:表达一种 如果-否则 的互斥分支关系
  • 举例:
// if语句 a = 1
if(a%2 == 0)
{
    printf("a 是偶数\n");
}
// if-else 语句9
if(a%2 == 0)
{
    printf("a 是偶数\n");
}
else
{
    printf("a 是奇数\n");
}
if(表达式1)// 如果为真执行复合语句1
{
    复合语句1}
else if(表达式2)//如果表达式1,2同时满足,则只会执行语句1
{
    复合语句2}
else if(表达式3)
{
     复合语句3;
}
else // 以上3个都不满足的时候执行此语句
{
     复合语句4}
if(表达式1)// 如果为真,执行复合语句1
{
    if(表达式11)
    {
        复合语句1}
}
else if(表达式2)
{
    复合语句2
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int money;
    printf("请输入余额 : ");
    scanf("%d",&money);
    if(money < 5)
    {
        printf("余额不足,请充值\n");
    }
    else if(money >= 5 && money < 10)
    {
        printf("余额较少,只能点白米饭\n");
    }
    else if(money >= 10 && money < 20)
    {
        printf("只能点一荤一素\n");
    }
    else if(money >= 20)
    {
         printf("最少点两素一荤\n");
    }
    else
    {
        
    }
    return 0;
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int work;
    printf("1:流水线 2:销售 3:程序员 4:公务员\n");
    scanf("%d",&work);
	
    //if(1<work<3) // 错误的写法
    //if(1<work && work < 3) // 正确
    if(work == 1)
    {
        printf("一天工作15个小时,月薪7200\n");
    }
    else if(work == 2)
    {
        printf("一天工作8小时,月薪3000\n");
    }
    else if(work == 3)
    {
        printf("一天10个小时,月薪20000\n");
    }
    else if(work == 4)
    {
        printf("一天6小时,月4000\n");
    }
    else
    {
        printf("待业游民\n");
    }
    return 0;
}

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int work;
    printf("1:流水线 2:销售 3:程序员 4:公务员\n");
    scanf("%d",&work);

    if(work == 1)
    {
        // lv是局部变量作用范围是if{}
        int lv;
        printf("流水线等级: ");
        scanf("%d",&lv);
        if(lv == 1)
        {
            printf("1级流水线工资2000\n");
        }
        else if(lv == 2)
        {
            printf("2级流水线工资4000\n");
        }
        else if(lv == 3)
        {
            printf("3级流水线工资7000\n");
        }
    }
    else if(work == 2)
    {
        printf("一天工作8小时,月薪3000\n");
    }
    else if(work == 3)
    {
        // lv是局部变量作用范围是if{}
        int lv;
        printf("程序员等级: ");
        scanf("%d",&lv);
        if(lv == 2)
        {
            printf("初级程序员一天15个小时,月薪10000\n");
        }
        else if(lv = 5)
        {
            printf("初级程序员一天8个小时,月薪20000\n");
        }
        else if(lv = 10)
        {
            printf("高级程序员一天5个小时,月薪100000\n");
        }
        
    }
    else if(work == 4)
    {
        printf("一天6小时,月4000\n");
    }
    else
    {
        printf("待业游民\n");
    }

    return 0;
}

  • 注意:

    1. 只要表达式的值为真(非0),则执行{}复合语句
    2. if语句可以单独使用,else语句不可以,else语句必须根if语句配套使用
    3. 不管是if语句还是else语句,代码块都必须使用大括号{}括起来,否则只有首句有效
    4. 如果只有一条执行语句,可以这样写:
    if(表达式)
        执行语句xxx;如果表达式为真,那么执行该语句
    

    5.编程规范,写完if或else后,不管后面又没有语句,先写{}圈定为它的范围,然后再到{}里面补充语句,请用4个格缩进

作业1:制作一个简单的打分系统(满分制:100),使用switch…case方法,分数需整数

​ 60分以下:评级为D

​ 60-80分 : 评级为C

​ 80-90分 : 评级为B

​ 90-100分: 评级为A

​ 不在0-100范围内:错误

#include <stdio.h>

int main(int argc, char const *argv[])
{
    double score;
    printf("请输入成绩: ");
    int ret = scanf("%lf",&score);
    printf("ret : %d\n",ret);
    // score拿不到数据
    if(ret != 1)
    {
        printf("输入有误\n");
        return -1;
    }

    if(score == -1)
    {
        printf("实在不好意思,你卷子丢了,明年再来\n");
    }
    else if(score >= 0 && score < 60)
    {
        printf("要加油了,评级为D\n");
    }
    else if(score >= 60 && score < 80)
    {
        printf("还得加油, 评级为C\n");
    }
    else if(score >= 80 && score < 90)
    {
        printf("还行继续加油,评级为B\n");
    }
    else if(score >= 90 && score <=100)
    {
        printf("优秀继续保持,评级为A\n");
    }
    return 0;
}

多路分支

  • 辑:根据不同的条件执行不同的代码片段
  • 语法:
switch(n)//条件
{
    case 1:
       printf("one\n");
   	   break;
    case 2:
   		printf("two\n");
   		break;
  
	case 3:
   		printf("three\n");
   		break;
  
	default:
    	printf("其他数字\n"); 
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int score;
    scanf("%d",&score);
    switch (score)
    {
    case -1:
        printf("实在不好意思,你卷子丢了,明年再来\n");
        break;
    // 0-60范围,注意格式
    case 0 ... 60:
        printf("要加油了,评级为D\n");
        // 如果没有break,会一直执行以下语句
        break;

    case 61 ... 80:
        printf("还得加油, 评级为C\n");
        break;

    // 以上条件不满足则执行
    default:
        printf("other\n");
        break;
    }
    return 0;
}

  • 要点解析
    1. switch(n)语句中的n必须是一个整型表达式,即switch判断的数据必须是整型或者字符
    2. case语句只能带整型常量,包括普通整型或字符,不包括const型数据
    3. break语句的作用是跳出整一个switch结构,没有break程序会略过case往下执行
    4. default语句不是必须的,一般放在最后面(因此不需要break)

练习2:计算加盟费

​ 小张加盟一家餐饮企业,在每个季度结束后,小张必须向总部缴纳加盟费,加盟费与营业额的提成关系如下:

​ 营业额 提成系数

​ 0<=n<10w 0.1

​ 10<=n<20w 0.075

​ 20<=n<40w 0.05

​ 40<=n<60w 0.03

​ 60<=n<100w 0.015

​ n >= 100w 0.01

​ 请输入小张的营业额,然后求出它需要的提交的加盟费

#include <stdio.h>

int main(int argc, char const *argv[])
{
    double money,val;
    int flage;
    printf("请输入营业额(万元): ");
    scanf("%lf",&money);
    if(money >= 0 && money < 10) flage = 1;
    else if(money >= 10 && money < 20) flage = 2;
    else if(money >= 20 && money < 40) flage = 3;
    else if(money >= 40 && money < 60) flage = 4;
    else if(money >= 60 && money < 100) flage = 5;
    else if(money >= 100) flage = 6;

    switch (flage)
    {
    case 1: val = 0.1; break;
    case 2: val = 0.075; break;
    case 3: val = 0.05; break;
    case 4: val = 0.03; break;   
    case 5: val = 0.015; break;  
    case 6: val = 0.01; break;
    }
    // 输出加盟费
    printf("加盟费: %.3lf元\n",money * val * 10000);

    return 0;
}

const

  • 逻辑:使一个变量不可修饰
  • 作用:
    • 修饰普通变量,使之不可修改
    • 修饰指针变量,使之不可修改或者使其指向的目标不可修改
  • 示例:
int const a = 100; // 定义了一个不可修改的变量a
const int b = 200; // 定义了一个不可修改的变量b

a = 101; // 错误
b = 202; // 错误

while与do…while循环

  • 逻辑:使得程序中每一段代码可以重复循环的运行

  • 形式:

    • while循环:先判断,再循环
    while(表达式)// 表达式的值为真的时候进入循环体,为假退出
    {
        
    }
    while(1)// 死循环 等价于 while(1);
    {
        
    }
    如果循环体内只有一条语句,那么{}可以省略
    while(1)
        printf("11\n");
    

**while循环
**在这里插入图片描述

while循环:入口判断

// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
while(a <= 100)
{
    printf("%d\n", a);
    a++;
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 打印1...10
    int i = 0;
    // 如果while()内的表达式为真则一直重复
    // 运行while{}内的内容,直到while()内的表达式为
    // 假则退出while{}
    while(i != 10)
    {
        printf("%d\n",++i);
    }
    return 0;
}
  • do-while循环:先循环,再判断
格式
do
{
	循环体;
}while(表达式)

do-while循环
在这里插入图片描述

do-while循环:出口判断

// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
do
{
    printf("%d\n", a);
    a++;
}while(a <= 100);
  • 语法点:
    • while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
    • do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
    • do-while 循环中的 while 语句后面有分号;

练习3:

1.使用while实现1+2+...+100的和
2.使用do...while实现1+2+...+100的和
    
int num = 1;
int val = 0;
do
{
    val += num;
} while (num++ != 100);
printf("val = %d\n",val);

在这里插入图片描述

#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 方法1
    int a = 1;
    int max;
    while (1)
    {
        max = a;
        a <<= 1;
        a |= 1;
        // 如果a溢出退出
        if(a < 0)
            break; 
    }
    printf("int最大值为:%d\n",max);

    // 方法2
    max = 0;
    max = ~(0x01 << sizeof(int)*8-1);
    printf("int最大值为:%d\n",max);
    return 0;
}

for循环

  • 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
for(初始表达式1;判断表达式2;循环操作表达式3)
{
    循环体;
}
// 第一条表达式只执行一遍i = 0只执行一遍
// 然后执行表达式2,判断i 是否小于等于5,如果为真则执行{}里面的内容
// 最后执行表达式3,i++
// 然后一次循环完成再重新执行表达式2,判断i是否小于5,如果为真会执行
// {}里面的内容,最后执行表达式3,i++,依次类推,直到表达式2为假
// 则退出循环体
for(int i = 0; i <= 5; i++)
{
    printf("i:%d\n",i);
}
// 死循环
for(;;)
{
    
}
或者
for(;;);
//多变量
for(int i = 0,j = 0; i < 5; i++,j++)
{
    printf("i:%d j:%d\n",i,j);
}
  • 示例:
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
    printf("%d\n", a);
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i = 1;
    while(i < 10)
    {
        printf("%d\n",i);
        i++;
    }  

    for(int i = 1; i < 10; i++)
    {
        printf("%d\n",i);
    }

    // 如果我们不能确定程序什么时候能退出则使用while
    while(1) // while循环为死循环
    {
        printf("hello world\n");
    }

    // 如果我们能确定程序什么时候能退出则使用for
    for(;;) // for循环为死循环
    {
        printf("hello world\n");
    }
    return 0;
}

  • for嵌套
int main(int argc, char const *argv[])
{
    for(int i = 0; i < 5; i++)// 外循环
    {
        for(int j = 0; j < 4; j++)// 内循环
        {
            printf("i:%d j:%d\n",i,j);
        }
    }
    return 0;
}

练习4:使用for循环实现1+2+…+100的和

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int max = 0;
    for(int i = 1; i <= 100; i++)
        max += i;

    printf("%d\n",max);
    
    return 0;
}

  • 语法点:

    • 循环的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
    • 表达式1一般用来初始化循环控制变量
    • 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环
    • 表达式3一般用来更新循环控制变量
    • 三个表达式均可以省略,但分号不能省略
    • while注重循环条件,for注重循环次数

break(退出)与continue(继续)

  • 运用场景与特点
    • break关键字只能用于循环(while for do…while)和switch语句中,表示结束循环或者跳出switch语句
    • break关键字只能跳出最近一层的循环,也就是说,如果有多重循环,只能跳出最靠近break语句那层循环
    • break关键字 不能 单独用于 if语句中,除非if语句外面包含了循环
  • 逻辑:
    • continue关键字只能用于循环体中(while do…while for),用于提前结束当前循环体后,又从最近一层循环体开始执行
    • continue关键字不能 单独用于 if语句或者switch 语句中,除非外面包含了循环
    • break:① 跳出 switch 语句; ② 跳出当层循环体
    • continue:结束当次循环,进入下次循环
  • 举例:
switch(n)
{
case 1:
    printf("one\n");
    break;  // 跳出 switch 语句
case 2:
    printf("two\n");
    break;        
}

while(1)
{
    int n = scanf("%d", &a);
    if(n == 0)
        break; // 跳出当层 while 循环体
}

for(int i=1; i<=100; i++)
{
    if(i%7 == 0)
        continue; // 跳过所有能被7整除的数
     
    printf("%d\n", i);       
}

作业0:将今天的内容进行回顾,把今天写的所有代码,自己写一遍或者多遍

作业1:每次判断输入的单个字符,如果是字符a~z或者A-Z,则打印yes,否则打印no。如果输入的是’#‘ 则退出程序

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char ch;
    // getchar等待键盘输入
    while((ch = getchar()) != '#')
    {
        if(ch >= 'A' && ch <= 'Z' 
            || ch >= 'a' && ch <= 'z')
        {
            printf("yes\n");
        }
        else if(ch != '\n') // 处理\n
        {
            printf("no\n");
        }
    } 
    return 0;
}

一些相关的题目很简单帮助新学习的同志们理解练习 :

在这里插入图片描述


goto语句

  • 逻辑:无条件跳转
  • 格式
goto 语句标号;//程序会直接跳转到语句标号的地方执行

语句标号:
  • 示例:
int main()
{
    printf("%d\n", __LINE__); // 打印第3行 
    
    // 无条件跳转到label处 
    goto label;
    printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:  
    printf("%d\n", __LINE__); // 打印第9行
}
  • 语法:
    • goto语句直接跳转到本代码块中的标签处
    • 标签指的是以冒号结尾的标识符
  • 作用:
    • goto语句的无条件跳转不利于程序的可读性,一般不建议使用
    • goto语句常被用在程序的错误处理中
#include <stdio.h>

int main(int argc, char const *argv[])
{
// 注意:千万不要使用goto语句实现死循环,程序
// 无法退出    
// lable:
//     printf("当前在第:%d 行\n",__LINE__);
//     goto lable;

// goto 的唯一使用场景为跳转到出错处理
    printf("请输入字符:");
    int ch = getchar();
    if(ch == '#')
    {
        goto error;
    }
    printf("当前在第:%d 行\n",__LINE__);

// 出错处理标签一定是在程序的末尾
// 程序正常退出还是异常退出最终还是得要执行error标签的语句
error:
    printf("process exit\n");
    return 0;
}

使用场景

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int data;
    while (1)
    {
        int ret = scanf("%d",&data);
        if(ret != 1)
        {
            // goto一般的使用场景是跳转到异常处理
            goto error;
        }
        printf("data = %d\n",data);
    }

error:
    printf("输入异常\n");

    return 0;
}

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值