C语言:20250714笔记

目录


内容提要

  • 流程控制

    • 数据的输入与输出
  • 分支结构

    • 条件判断

    • 用if语句实现分支结构

    • 用switch语句实现分支结构

流程控制

数据的输入与输出

复杂的输入与输出

输入数据格式控制

整型格式说明符

  • 十进制形式(0~9)
说明符 说明 数据类型
%d 用于基本整型 int
%ld 用于长整型 long
%u 用于无符号基本整型 unsigned int
%lu 用于无符号长整型 unsigned long
  • 八进制形式(0~7)
说明符 说明 数据类型
%o 用于基本整型 int
%lo 用于长整型 long
  • 十六进制形式(0~F)
说明符 说明 数据类型
%x 用于基本整型 int
%lx 用于长整型 long

总结:

① 用于输入与输出整型数据的格式说明符是完全一致的。

② 与输出情形一样,对于八进制与十六进制的输入格式,主要用于输入无符号的整型数据。

浮点型格式说明符

说明符 说明 数据类型
%f或者%e 用于单精度浮点型 float
%lf 用于双精度浮点型 double

总结:

① 与输出不同,输入时无论是单精度还是双精度浮点型,都不能用m.n来指定输出的宽度和小数点后保留的位数。

② 可以指定输入数据所占的列数,系统自动按它截取所需的数据,如:

复制代码
 scanf("%3d%3d",&a, &b);

输入测试数据:1234567

结果:a=123,b=456

解释:从输入的数据1234567中,截取前3列(123)赋值给a,再截取3列(456)赋值给b,剩余的7舍弃

③ 若在%后有一个*和一个数字,表示跳过指定的列数,如:

复制代码
 scanf("%2d%*3d%3d",&a, &b);

输入测试数据:12345678

结果:a=12,b=678

解释:从输入的数据12345678中,截取前2列(12)赋值给a,再跳过3列(345),然后截取3列(678)赋值给b

案例:

复制代码
 /*************************************************************************
   > File Name:    demo01.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月14日 星期一 09时19分51秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     int a, b;
     printf("通过控制台输入一个数:\n");
     // 这里的m不是列宽,是截取的列数,%3d,就是截取输入内容的前3个字符
     scanf("%3d%3d",&a, &b);
     printf("%d,%d\n",a,b);
 ​
     // 这里的%*跳过,%*3d,跳过3列  12345678
     printf("通过控制台输入一个数:\n");
     // scanf("%2d%*3d%3d",&a, &b);
     scanf("%2d%*d%3d",&a, &b);
     printf("%d,%d\n",a,b);
 ​
     return 0;
 }
 ​

说明

当用于输入整型数据的格式说明符中没有宽度说明时,则在具体输入数据时分为以下两种情况:

① 如果各格式说明符之间没有其它字符,则在输入数据时,两个数据 之间用"空格"、或"Tab"、或"回车"来分隔。

② 如果各格式说明符之间包含其它字符,则在输入数据时,应输入与 这些字符相同的字符作为间隔。

例如,设有如下说明

复制代码
int a,b;

float c,d;

现要利用格式输入函数输入a=12,b=78,c=12.5,d=7.6。 采用不同的格式说明,其输入数据的形式也是不同的。分别说明如下:

  • 若输入语句为 scanf("%d%d%f%f",&a,&b,&c,&d); (即格式说明符中没有宽度说明,各格式说明符之间也没有其他字符。)

    则输入数据的形式应为 12 78 12.5 7.6↲ (两个数据之间用空格来分隔,当然也可用"Tab"或"回车"来分隔。)

  • 若输入语句为 scanf("%d,%d,%f,%f",&a,&b,&c,&d);(格式说明符中没有宽度说明,但各格式说明符之间有其它字符,即逗号)

    则输入数据的形式应为 12,78,12.5,7.6↲ (即在输入的两个数据之间同时要输入逗号。)

  • 若输入语句 scanf("a=%d,b=%d,c=%f,d=%f",&a,&b,&c,&d); (即格式说明符中没有宽度说明,但各格式说明符之间有其它字符。)

    输入数据的形式应为 a=12,b=78,c=12.5,d=7.6↲ (即在输入的两个数据之间同时要输入这些非格式说明符的字符。)

  • 在用于输入的实型格式说明符中不能用m.n来指定输入的宽度和小数点后的位数(这是与输出的不同之处)。

    例如:

复制代码
  scanf("%7.2f",&a); × 此用法是错误的
  • 为了便于程序执行过程中从键盘输入数据,在一个C程序开始执行时,系统就在计算机内存中开辟了一个输入缓冲区,用于暂存从键盘输入的数据。开始时该输入缓冲区是空的。当执行到一个输入函数时,就检查输入缓冲区中是否有数据;

补充

说明符 含义 示例
%n 已读取的字符数 scanf("%d%n", &num, &count);

案例:

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo02.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 09时37分24秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         int num,count; // count,用来保存输入数据列宽(统计输入的字符个数)
         printf("请输入一个数据:\n");
         scanf("%d%n",&num,&count);
         printf("num=%d,count=%d\n",num,count);
     ​
         return 0;
     }
     ​

分支结构

条件判断

条件判断:根据某个条件成立与否,决定是否执行指定的操作。

条件判断的结果是逻辑值 。其结果为 (写代码的时候可以用非0,C语言给我们返回使用1)或者为(0)

面试题:

① C语言中,条件表达式 (作为分支或者循环条件的表达式称之为条件表达式)支持任意类型的表达式,包括如关系、逻辑、赋值、算术等表达式,但实质上有意义的表达式只有关系表达式和逻辑表达式。

② C语言中,条件表达式的结果是逻辑值,使用非0表示真,使用0表示假,但是底层是使用1和0来表示真假。

关系运算符及其表达式

问题抛出

我们在程序设计往往会遇到如下问题,也就是我们必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言实现分支结构主要使用if。

其中的条件需要用关系表达式来表示:x!=0 就是一种关系表达式。

关系运算符及其优先级次序

关系运算符是用来进行比较的符号,C语言提供了6种关系运算符:

举例:

复制代码
 int a = 5, b = 6;
 printf("%d\n", a > 5 != b > 5);// 1 解释:a > 5的结果和 b > 5的结果进行比较

关系表达式

关系表达式 = 关系运算符 + 表达式(操作数)

逻辑运算符及其表达式

问题抛出

有时,只用一个简单的关系表达式无法完整的表达一个条件,其中的条件需要用到逻辑表达式来表示:x!=0 && a!=0就是一种逻辑表达式。

逻辑运算符及其优先级

  • 逻辑运算符是构成复杂的复合条件的运算符。

C语言中提供了三种逻辑运算符:

符号 名称 分类 说明
&& 逻辑与 双目运算符 两个量都为真时为真(1),否则为假(0)
|| 逻辑或 双目运算符 两个量中只要有一个为真即为真(1),只有两个量都为假时才为假(0)
! 逻辑非 单目运算符 运算量真时变为假(0),假时变为真(1)

逻辑表达式

a b !a !b a&&b a||b
1 1 0 0 1 1
1 0 0 1 0 1
0 1 1 0 0 1
0 0 1 1 0 0

**定义:**用逻辑运算符将关系表达式或者逻辑表达式链接起来的构造有意义的算式称作逻辑表达式。

逻辑表达式中各种运算符的优先级顺序如下:

复制代码
①!(逻辑非)

②算数运算符(*,/,%(高) +,-(低))

③关系运算符(>,>=,<,<=(高) !=,==(低))

④逻辑运算符(&&,||)

⑤赋值运算符(=,+=,-=,*=,/=,%=)

面试题:

① 使用表达式表示一个数num在0~100之间:num >= 0 && num <=100

② 使用表达式表示一个数比0小,比100大:num < 0 || num > 100

注意:这里的①和②属于真假判断。

C编译系统在表示逻辑运算符运算结果时,返回的也是逻辑值:用1表示真,用0表示假。

案例

假设a = 4, b = 5 则:

表达式 结果 说明
!a 0 这里是对非0取反
a && b 1 &&左右两侧都是非0
a || b 1 触发短路效果,|| 左侧为非0,右侧不执行
!a || b 1 ||右侧是非0
4 && 0 || 2 1 同级别运算,从左往右

小贴士:

实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0,而且也可以是字符型、实型和指针型等。系统最终是以0和非0来判定他们的真假的,例如:

'c' && 'd' 结果为1

用if语句实现分支结构

单分支:if..

语法:

复制代码
 if (条件表达式)
 {
     语句;
 }
 ​
 //如果是单语句,可以省略{},以下两种写法完全等价
 if (条件表达式) 语句;
     
 if (条件表达式)
     语句;

流程图:

面试题:

复制代码
 if (条件表达式) 语句1; 语句2; 
 请选择与上面代码完全一致的写法( A )
 A. if (条件表达式) {语句1;} 语句2;  
 B. if (条件表达式) {语句1; 语句2;} 

功能:

  • 若表达式值为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后的其他语句。

  • 若表达式值为假(0),则不执行表达式后面的语句而直接执行if语句后面的其他的语句。

说明:

  • 如果表达式后面的是复合语句(语句超过1条),则需要使用一对{}括起来。

案例:

  • 需求:计算并输出下列分段函数的值
  • 代码:

    复制代码
     
    复制代码
    /*************************************************************************
       > File Name:    demo03.c
       > Author:       阮
       > Description:  单分支 
       > Created Time: 2025年07月14日 星期一 11时39分58秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建两个变量x,y 存储数据
         int x, y = -2;
     ​
         // 通过控制台给x赋值
         printf("请输入一个整数:");
         scanf("%d", &x);
     ​
         // 判断
         if (x >= 0) y = 2; 
     ​
         // 测试输出
         printf("x=%d,y=%d\n", x, y);
     ​
         return 0;
     }

案例

  • 需求:有a,b,c三个数,要求从控制台输入,并求出它们中最大数和最小数。

  • 分析:

    ① 首先创建5个变量,其中a,b,c用来接受控制台输入,max和min分别用来保存最大和最小。

    ② 默认a是max和min

    ③ 让max分别和b,c比较,如果b,c比max大,就将b,c的值赋值给max

    ④ 让min分别和b,c比较。如果b,c比min小,就将b,c的值赋值给min

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo04.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 11时53分23秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建5个变量,a, b,c接受控制台输入,max和min分别存储最大和最小
         int a,b,c,max,min;
     ​
         // 从控制台输入
         printf("请输入三个整数:\n");
         scanf("%d%d%d",&a, &b, &c);
     ​
         // 将赋值后的a作为max和min的初始值
         max = min = a; // 链式操作,从右往左
     ​
         // 最大值
         if (max < b) max = b;
         if (max < c) max = c;
         // 最小值
         if (min > b) min = b;
         if (min > c) min = c;
     ​
         printf("%d,%d,%d中的最大值是%d,最小值是%d\n",a,b,c,max,min);
     ​
         return 0;
     }
  • 有可能产生的问题:

    • 在变量赋值前使用变量,导致运算结果错误,因为变量未赋值之前,系统会给变量分配随机值。

小贴士:

建议的书写规范:

复制代码
if(flag == 1)建议写:if(flag)

if(flag == 0)建议写:if(!flag)

双分支: if..else..

语法:

复制代码
 
复制代码
①
 if(条件表达式)
 {
     语句1;
 }
 else
 {
     语句2;
 }
 //如果是但语句,可以省略{},以下两种写法等价
 ②
 if (条件表达式)
     语句1;
 else
     语句2;
 ​
 ③   
 if(条件表达式)
 {
     语句1;
     语句2;
 }
 else
     语句2;
复制代码
   

注意:else语句本身不能单独存在,必须和距离自己最近的未配对的if配对

  • 流程图:

    功能:

    若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立,都要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。

    说明:

    if..else..结构可以实现双分支选择结构。C语言允许if..else..结构嵌套。即在语句1与语句2中又可以包含完整的if语句或者if..else..语句,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过3~4层)。利用if..else..结构的嵌套,可以实现多分支结构。

    案例:

复制代码
 
复制代码
/*************************************************************************
   > File Name:    demo05.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月14日 星期一 14时44分32秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     //创建两个变量x,y
     int x ,y;
     printf("请输入一个整数:\n");
     scanf("%d",&x);
 ​
     if (x<0) y = -2;
     else y= 2;
     printf("x=%d,y=%d\n",x,y);
 ​
     return 0;
 }

案例:

  • 需求:通过控制台,输入一个年份,判断这个年份是闰年还是平年

  • 分析:

    • 判断条件:(year%4 == 0&&year % 100!=0 || year %400==0)
  • 代码:

    /*************************************************************************
    > File Name: demo06.c
    > Author: 阮
    > Description:
    > Created Time: 2025年07月14日 星期一 14时55分35秒
    ************************************************************************/

    #include <stdio.h>

    int main(int argc,char *argv[])
    {
    //创建一个变量,用来存储年份
    int year;

    //通过控制台赋值
    printf("请输入一个年份:");
    scanf("%d",&year);

    //校验
    if(year % 4 == 0 && year % 100 != 0 || year % 400 ==0)
    printf("%d年是润年! \n",year);
    else
    printf("%d年是平年! \n",year);

    return 0;
    }

复制代码
 ​

双分支:三目运算符

三目运算符,又被称作三元运算符。

语法:

复制代码
 表达式1 ?表达式2 :表达式3;

说明:

① 如果表达式1的结果为真,就执行表达式2;否则执行表达式3。(表达式2和表达式3只能满足一个)

② 三目运算符的写法实际上就是单语句的双分支if的简写。

案例:

复制代码
 
复制代码
/*************************************************************************
   > File Name:    demo05.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月14日 星期一 14时44分32秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     //创建两个变量x,y
     int x ,y;
     printf("请输入一个整数:\n");
     scanf("%d",&x);
 ​
    y = x < 0 ? -2 : 2;
 ​
     printf("x=%d,y=%d\n",x,y);
 ​
     return 0;
 }

案例:

  • 需求:通过控制台输入a,b,c三个数,求出最大值

  • 代码:

复制代码
 
复制代码
/*************************************************************************
   > File Name:    demo04.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月14日 星期一 11时53分23秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 创建5个变量,a, b,c接受控制台输入,max和min分别存储最大和最小
     int a,b,c,max,min;
 ​
     // 从控制台输入
     printf("请输入三个整数:\n");
     scanf("%d%d%d",&a, &b, &c);
 ​
     // 最大值
     max = (a > b) ? (a > c ? a : c) : (b > c ? b : c);
     // 最小值
     min = (a < b) ? (a < c ? a : c) : (b < c ? b : c);
 ​
     printf("%d,%d,%d中的最大值是%d,最小值是%d\n",a,b,c,max,min);
 ​
     return 0;
 }

课堂练习

需求:从键盘录入一个整数,判断这个数是偶数还是奇数。

要求:分别使用单分支if、双分支if、三目运算符实现。

多分支: if..else if....else..

语法:

复制代码
// 写法1: 嵌套 if..else..(不推荐)
 if (表达式1) 语句1;
 else
     if (表达式2) 语句2;
     else
         ...
         else 
             if (表达式n) 语句n;
             else 语句n + 1;
 ​
 // 写法2: 并列 if..else if....else..(推荐)
 if (表达式1) 语句1;
 else if (表达式2) 语句2;
 ...
 else if (表达式n) 语句n; // 根据需求,可选
 else 语句n+1;           // 根据需求,可选
 ​
 // 如果是复合语句,{}不能省略
复制代码
 

注意:多分支中else是可选的,根据自己的需求决定要不要写。

多分支:

注意:多分支中,同一时刻只能满足一个分支。

案例:

  • 需求:根据学生的成绩,对学生进行评级:

    • 成绩 >= 90 A

    • 成绩 >= 80 B

    • 成绩 >= 60 C

    • 成绩 < 60 D

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo09.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 16时41分01秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     /**
      * 方式1: 借助于顺序执行,减少判断条件(顺序一旦打乱,程序执行就会出错)
      */ 
     int if_test1()
     {
         // 创建一个变量,存储成绩
         int score;
     ​
         // 通过控制台输入成绩
         printf("请输入一个成绩:");
         scanf("%d", &score);
     ​
         // 根据成绩评级
         if (score >= 90) printf("A级\n");
         else if (score >= 80) printf("B级\n");
         else if (score >= 60) printf("C级\n");
         else printf("D级\n");
     ​
         return 0;
     }
     ​
     /**
      * 方式2: 不借助于顺序执行,增加判断条件(顺序一旦打乱,程序执行不受影响)
      */ 
     int if_test2()
     {
         // 创建一个变量,存储成绩
         int score;
     ​
         // 通过控制台输入成绩
         printf("请输入一个成绩:");
         scanf("%d", &score);
     ​
         // 根据成绩评级
         if (score < 60) printf("D级\n");
         else if (score >= 60 && score < 80) printf("C级\n");
         else if (score >= 80 && score < 90) printf("B级\n");
         else printf("A级\n");
     ​
         return 0;
     }
     ​
     int main(int argc,char *argv[])
     {
         if_test1();
         if_test2();
     ​
         return 0;
     }
    复制代码
     

if..else结构注意点

  • if..else结构中的语句1和语句2都可以是复合语句。

  • 在if..else结构中,语句1和语句2都可以是空语句。举例:if(..);else;

课堂练习

要求:计算并输出下列分段函数值,其中x从键盘录入。

if语句的嵌套

语法:

复制代码
 if (..)
     if (..) 语句1;
     else 语句2;    
 else
     if (..) 语句3;
     else 语句4;

流程图:

注意:

① else总是与前面最近的未配对的if配对使用

② 可通过增加{}来确定配对关系

③ 只要if中包含if,都属于是if语句的嵌套

案例

  • 需求:根据学生的成绩,对学生进行评级:

    • 成绩 >= 90 A

    • 成绩 >= 80 B

    • 成绩 >= 60 C

    • 成绩 < 60 D

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo09.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 16时41分01秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     /**
      * 方式1: 借助于顺序执行,减少判断条件(顺序一旦打乱,程序执行就会出错)
      */ 
     int if_test1()
     {
         // 创建一个变量,存储成绩
         int score;
     ​
         // 通过控制台输入成绩
         printf("请输入一个成绩:");
         scanf("%d", &score);
     ​
         // 第一层校验:输入的合法性校验
         if (score >= 0 && score <= 100)
         {
             // 第二层校验:成绩的等级校验
             // 根据成绩评级
             if (score >= 90) printf("A级\n");
             else if (score >= 80) printf("B级\n");
             else if (score >= 60) printf("C级\n");
             else printf("D级\n"); 
         }
         else
         {
             printf("请输入0~100之间的整数!\n");
         }
     ​
     ​
         return 0;
     }
     ​
     /**
      * 方式2: 不借助于顺序执行,增加判断条件(顺序一旦打乱,程序执行不受影响)
      */ 
     int if_test2()
     {
         // 创建一个变量,存储成绩
         int score;
     ​
         // 通过控制台输入成绩
         printf("请输入一个成绩:");
         scanf("%d", &score);
     ​
         // 根据成绩评级
         if (score < 0 || score > 100) printf("请输入0~100之间的整数!\n");
         else if (score < 60) printf("D级\n");
         else if (score >= 60 && score < 80) printf("C级\n");
         else if (score >= 80 && score < 90) printf("B级\n");
         else printf("A级\n");
     ​
         return 0;
     }
     ​
     int main(int argc,char *argv[])
     {
         if_test1();
         if_test2();
     ​
         return 0;
     }
    复制代码
     ​

课后思考

  1. 如何拆分一个整数的个位、十位、百位...上的数?

举例:123

拆个位:123 % 10 = 3

拆十位:123 / 10 % 10 = 2

拆百位:123 / 10 / 10 = 1

  1. 什么是水仙花数?

用switch语句实现分支结构

我们也可以使用switch实现多分支选择结构(多分支也被称作多路分支)

语法:

复制代码
 switch (表达式) // 表达式返回结果最好是 字符或者整型
 {
     case 常量表达式1:   // 这里一般使用字面量、符号常量、枚举
         语句1;
         break;
     case 常量表达式2:   // 这里一般使用字面量、符号常量、枚举
         语句2;
         break;   
     ...
     [case 常量表达式n:   // 这里一般使用字面量、符号常量、枚举
         语句n;
         break;
     default:   
         语句n+1;
         break;]  
 }
 // switch的{}不能省略

流程图:

说明:

① switch后括号内的表达式可以是任意类型的表达式,要求结果是整型、字符型。

② 若表达式的值与某个常量表达式的值相等时,执行case后面的语句;若没有相等的值时,执行default后面的语句。

③ 每个case后面的常量表达式的值必须不相同,否则出现矛盾。

④ 各个case出现的次序不影响执行结果。

⑤ case后面的语句中如果没有break语句,则执行完本case后的语句后会接着执行下面的case,直到遇到下一个break或者switch执行完毕为止,演示:

复制代码
 int num = 1;
 switch(num)
 {
     case 1:
         printf("A\n");//注意:这里没有break,会继续执行下一个case,直到遇到break或者执行结束(break穿透)
     case 2:
         printf("B\n");
         break;
     case 3:
         printf("C\n");
         break;
 }
 ​
 运行结果:
 A
 B
⑥ 多个case公用一组语句,演示:

 // 需求:根据月份判断季节
 // 分析:
 //    春季:2~4
 //    夏季:5~7
 //    秋季:8~11
 //    冬季:12~1
 int month = 3; // 月份
 switch (month)
 {
     case 2: // 2月份
     case 3: // 3月份
     case 4: // 4月份
         printf("春季\n");
         break;
     ...
 }

案例

  • 需求:按照考试成绩的等级输出百分制分数段

  • 分析:

    • A级:85~100段

    • B级:70~84段

    • C级:60~69段

    • D级:< 60段

    • 其他:错误

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo09.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 17时38分01秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main()
     {
         // 创建一个变量,用来存放等级
         char grade;
     ​
         // 通过键盘录入等级
         printf("请输入一个英文字符:\n");
         scanf("%c", &grade);
         getchar(); // 清空缓冲区
     ​
         // 校验
         switch(grade)
         {
             case 'A':
                 printf("85~100段\n");
                 break;
             case 'B':
                 printf("70~84段\n");
                 break;
             case 'C':
                 printf("60~69段\n");
                 break;
             case 'D':
                 printf("< 60段\n");
                 break;
             default:
                 printf("错误\n");
                 break;// 如果default出现在所有case的最下面,break可以省略;如果default出现在case的上面,break一定不能省略。
         }
         return 0;
     }

    注意: 如果default出现在所有case的最下面,break可以省略;如果default出现在case的上面,break一定不能省略。

案例

  • 需求:按照百分制考试分数输出等级。

  • 分析:

    • 若分段原则如下:

      • 90~100 A级

      • 80~89 B级

      • 70~79 C级

      • 60~69 D级

      • 其他 E级

  • 解析:

    • case score >=90 && score <= 100 在switch中是错误的写法,判断结果异常

    • 改造判断条件:90~100的数 / 10 = 9|1080~89的数 / 10 = 8,依次类推

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo09.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年05月08日 星期四 17时45分52秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建一个变量,用来保存成绩
         int score;
     ​
         // 通过控制台输入一个成绩
         printf("请输入一个整数:");
         scanf("%d",&score);
     ​
         // 非法校验
         if (score < 0 || score > 100)
         {
             printf("Error\n");
         }
         else
         {
             switch (score / 10)
             {
                 default:
                     printf("E级\n");
                     break;// 此处break不能省略
                 case 10: // 100
                 case 9:  // 90~99
                     printf("A级\n");
                     break;
                 case 8:  // 80~89
                     printf("B级\n");
                     break;
                 case 7:  // 70~79
                     printf("C级\n");
                     break;
                 case 6:  // 60~69
                     printf("D级\n");
                     break; // 此时的break可以省略
             }
         }
     ​
         return 0;
     }

案例

  • 需求:设计一个简易计算器,要求能够实现简单的减减乘除运算

  • 代码:

    复制代码
     /*************************************************************************
       > File Name:    demo10.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月14日 星期一 17时51分44秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         char op; //  保存运算符
         double num1,num2; // 保存运算数
     ​
         // 设置头
         printf("--------------------\n");
         printf("|  简易计算器 v1.0 |\n");
         printf("--------------------\n");
     ​
         printf("请输入两个运算数:\n");
         scanf("%lf,%lf", &num1,&num2);
         printf("请输入运算符(+、-、*、/):");
         getchar();// 清理缓存
         scanf("%c",&op);
     ​
         // 计算
         switch (op)
         {
             case '+':
                 printf("%.2lf + %.2lf = %.2lf\n",num1, num2, num1 + num2);
                 break;
             case '-':
                 printf("%.2lf - %.2lf = %.2lf\n",num1, num2, num1 - num2);
                 break;
             case '*':
                 printf("%.2lf * %.2lf = %.2lf\n",num1, num2, num1 * num2);
                 break;
             case '/':
                 if (num2 != 0)
                     printf("%.2lf / %.2lf = %.2lf\n",num1, num2, num1 / num2);
                 else
                     printf("错误,除数不能为0!\n");
                 break;
             default:
                 printf("错误,无效的运算符!\n");
         }
     ​
         return 0;
     }
    复制代码
     

章节作业

**作业1:**输入你的身高和体重,测试你的健康状况。

计算bmi的值, bmi = (体重(kg)/身高(m)的平方) 如果bmi 小于18.5,则显示"偏瘦,注意加强营养" 如果bmi 在18.5和23.9之间,则显示"体重指数良好,注意保持" 如果bmi值大于23.9 ,则显示"你有点偏胖,注意锻炼"

**作业2:**西安市对安装"一户一表"的居民用户按阶梯式累进电价进行计收电费,具体方案是:

月用电量低于50千瓦时部分,电价不调整,仍为0.538元/千瓦时; 51~200千瓦时部分, 单价为0.568元/千瓦时; 超过200千瓦时部分,电价为0.638元/千瓦时。 市区徐某家4月份 的用电量为96千瓦时,其电费计算如下: 基本电费部分: 96千瓦时×0.538元/千瓦时=51.65元; 超出50千瓦时的调价电费:(96~50)千瓦时×0.03元/千瓦时=1.38元;电费合计51.65+1.38=53.03元 。 "阶梯式电价"机制可有效地抑制电力浪费现象,引导居民节约用电,合理用电,比纯粹"口号倡导型" 节约用电更加有效。 编写一个程序根据输入的用电量,计算电费。

**作业3:**设计一个计算个人所得税的软件

应纳税所得额 = 工资收入金额 - 各项社会保险费(650元) - 起征点(3500元) 应纳税额 = 应纳税所得额 x 税率 - 速算扣除数

通过输入工资总额和社保费用计算应纳税额

**作业4:**设计TVM(地铁自动售票机)机软件。

输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。 输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别面额:100,50,20,10,5,1

**作业5:**出租车费计算程序,起步公里数3公里,车费8元,超出3公里,每公里1.8元,不足一公里,按照1公里计算。 如果输入一个钱数,计算最多能坐多少公里,该如何实现?

**作业6:**通过键入输入一个年份和月份,输出显示该月有多少天。(考虑润年情况)

闰年计算规则:(year % 400==0) || (year % 4 == 0 && year % 100 != 0)

**作业7:**实现一个简单的计算器,要求根据输入的运算符实现相应的运算。

**作业8:**三角形类型判断程序

题目要求:输入三个整数作为三角形的三条边长,判断并输出该三角形的类型:

  • 如果三条边能构成等边三角形,输出"等边三角形";

  • 如果三条边能构成等腰三角形,输出"等腰三角形";

  • 如果三条边能构成普通三角形,输出"普通三角形";

  • 如果不能构成三角形,输出"不是三角形"。

提示:

  • 构成三角形的条件:任意两边之和大于第三边。

  • 等腰三角形的条件:两条边相等。

  • 等边三角形的条件:三条边均相等。

示例输入:c

复制代码
   请输入三条边长:3 4 5

示例输出:

复制代码
   普通三角形c
相关推荐
charlie1145141913 小时前
现代C++工程实践——WeakPtr 第二关:核心骨架与控制块
开发语言·c++
ttod_qzstudio4 小时前
【软考算法】软件设计师下午第四题之动态规划:0-1 背包与最长公共子序列的“填表艺术“
算法·动态规划·软考
ttwuai4 小时前
Go 后台接口 401/403 排查:JWT 过期、刷新请求和权限码怎么定位
开发语言·golang·状态模式
柒和远方4 小时前
LeetCode 139. 单词拆分 —— 从暴力回溯到 DP 完全背包
javascript·python·算法
漫随流水5 小时前
Java——springboot web案例
java·开发语言·spring boot
从此以后自律5 小时前
Java Object 类常用方法全讲解
java·开发语言
岑梓铭5 小时前
《考研408数据结构》第六章(6.3 图的遍历)复习笔记
数据结构·笔记·考研··拓扑排序·408
XH华5 小时前
C++语言第二章类和对象(下)
开发语言·c++
he_wen_jian5 小时前
【无标题】
笔记
从零开始的代码生活_5 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法