当前位置: 首页 > news >正文

C语言 ——— 分支循环语句

目录

分支循环语句

单分支

多分支

switch 分支语句

牛刀小试

判断一个数是否是奇数

输出 1-100之间 的奇数

计算 n 的阶乘 

计算 1! + 2! + 3! ... + n!

在一个有序数组中查找具体的某一个数字 

打印 100-200 之间的素数

求两个整数的最大公约数

getchar函数 和 putchar函数

getchar 函数

putchar 函数

代码模拟实现用户创建密码场景

代码模拟实现用户登录账号场景,并且只能登录三次 

猜数字游戏

实现要求

代码实现

代码解析

goto 语句

利用 goto语句 写一个电脑关机程序


分支循环语句

单分支

单 if 语句:

int age = 0;
scanf("&d", &age);if (age >0 && age < 18)printf("未成年\n");

单 if else 语句:

int age = 0;
scanf("&d", &age);if (age >0 && age < 18)printf("未成年\n");
elseprintf("成年\n");

多分支

int age = 0;
scanf("&d", &age);if (age > 0 && age < 18)printf("青少年\n");
else if (age >= 18 && age < 30)printf("青年\n");
else if (age >= 30 && age < 50)printf("中年\n");
else if (age >= 50 && age < 70)printf("中老年\n");
else if (age >= 70 && age < 90)printf("老年\n");
elseprintf("老寿星\n");

注意:当条件判断语句里是多条语句时,需要用大括号括起来

switch 分支语句

代码演示:

int day = 0;
scanf("%d", &day);switch (day)
{
case 1:printf("星期一\n");break;
case 2:printf("星期二\n");break;
case 3:printf("星期三\n");break;
case 4:printf("星期四\n");break;
case 5:printf("星期五\n");break;
case 6:printf("星期六\n");break;
case 7:printf("星期七\n");break;
default:printf("输入错误");break;
}return 0;

switch 的括号中只能是整型变量表达式,case 后面只能跟整型常量

每一个 case 下面的代码执行完成后最好加上 break,否则就会一直往下执行

default 类比 if else 语句中的 else ,当所有 case 都不匹配的时候就会执行 default 下面的代码


牛刀小试

判断一个数是否是奇数

代码演示:

int input = 0;
scanf("%d", &input);if (input % 2 == 1)printf("是奇数\n");
elseprintf("不是奇数\n");

任意一个奇数除以 2 之后的余数都是 1,所以利用 % 取模上 2 判断余数是否为 1,是 1 就是奇数,否则就不是 

输出 1-100之间 的奇数

代码演示(方法1):

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

同样是通过 % 取模关键字来判断

代码演示(方法2): 

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

在 for 循环的条件中直接控制变量 i 只输出奇数,这样就不用 if 判断 

计算 n 的阶乘 

代码演示:

int n = 0;
scanf("%d", &n);int factorial = 1;for (int i = 1; i <= n; i++)
{factorial = factorial * i;
}printf("%d! = %d\n",n, factorial);

通过循环列举出 1-n 的值,并把它们的乘积累计到 factorial 变量中,最后 factorial 变量就是 n 的阶乘

代码验证:

计算 1! + 2! + 3! ... + n!

代码演示:

int n = 0;
scanf("%d", &n);int factorial = 1;
int sum = 0;for (int i = 1; i <= n; i++)
{factorial = factorial * i;sum = sum + factorial;
}printf("%d\n", sum);

把每个数的阶乘累加在一起,就是 1! + 2! + 3! ... + n!

代码验证:

在一个有序数组中查找具体的某一个数字 

代码演示:

int arr[] = { 1,3,4,6,8,9,11,24,33,54,66 };printf("请输入要查找的数:");
int input = 0;
scanf("%d", &input);int right = sizeof(arr) / sizeof(arr[0]) - 1;
int left = 0;while (left <= right)
{int mid = (right + left) / 2;if (input > arr[mid]){left = mid + 1;}else if (input < arr[mid]){right = mid - 1;}else{printf("找到了,下标是:%d\n", mid);break;}
}if (left > right)
{printf("查找的数不存在\n");
}

此题利用的是二分查找算法,二分查找法的应用需以有序数组为前提,其核心步骤与流程如下:

  1. 初始化与定位:设定数组左右边界下标leftright,据此计算中间元素下标mid,以获取数组中间值。
  2. 比较与边界调整:将待查找元素与中间值进行比较:
    • 若待查找元素大于中间值,则将左边界left更新为mid + 1,缩小查找范围至数组右半部分;
    • 若待查找元素小于中间值,则将右边界right更新为mid - 1,缩小查找范围至数组左半部分。
  3. 迭代与终止:在left <= right的循环条件下,持续更新mid,并重复比较操作。当找到目标元素时,循环终止;若循环条件不再满足,即left > right,则表明数组中不存在目标元素,查找结束。

打印 100-200 之间的素数

代码演示:

int main()
{for (int i = 101; i <= 200; i+=2){int flag = 1;for (int j = 2; j < sqrt(i); j++){if (i % j == 0){flag = 0;break;}}if (flag)printf("%d ", i);}return 0;
}

代码解析:

素数又称质数,它的特征是只能被 1 和它本身整除。例如 11,只能被 1 和 11 整除,2 到 10 都无法整除它。 由于偶数除了能被 1 和自身整除外,还能被 2 整除,所以偶数一定不是素数(2 除外,但本题范围不涉及 2)

若要找出 100 到 200 之间的素数,可先排除偶数,使用 for 循环从 101 开始遍历,每次递增 2,以此避免对偶数进行判断。 判断一个数是否为素数时,可采用以下方法:在外部 for 循环遍历每个待判断的数,对每个数再用一个内部 for 循环来检查它是否能被其他数整除

以判断 102 为例,在内部 for 循环中,让 102 依次对 2 到 100 之间的数取模。若存在一个数取模结果为 0,就表明 102 不是素数;若所有取模结果都不为 0,则 102 是素数。为方便判断,可定义一个变量 flag 并初始化为 1,若取模结果为 0,就将 flag 赋值为 0 并跳出内部循环。当内部循环结束后,只需判断 flag 的值,若为 1 则该数是素数,直接打印;若为 0 则不是素数

此外,内部 for 循环的范围可优化。不需要从 2 遍历到待判断的数减 1,只需从 2 遍历到该数平方根(sqrt 函数用于计算平方根)即可。因为若一个数 x 能写成 x = m * n 的形式,那么 m 和 n 中至少有一个小于等于 sqrt(x)。这样能减少不必要的计算,提高效率

求两个整数的最大公约数

代码演示:

int main()
{int m = 0;int n = 0;scanf("%d %d", &m, &n);int k = 0;while (k = m % n){m = n;n = k;}printf("%d\n", n);return 0;
}

代码解析:

要求两个整数的最大公约数,可以使用辗转相除法,这种方法高效且原理巧妙。下面详细解释其计算过程

以两个整数 m=24 和 n=18 为例,辗转相除法的操作步骤如下:

  1. 计算 m 除以 n 的余数,将这个余数赋值给变量 k。在这个例子中,24%18=6,所以 k=6。
  2. 判断 k 的值是否为 0。如果 k 不为 0,就把 n 的值赋给 m,把 k 的值赋给 n。在本例中,执行这一步后,m 变为 18,n 变为 6。
  3. 重复上述步骤,也就是持续进行 k=m%n 的计算,然后更新 m 和 n 的值(m=n;n=k),直到 k 的值为 0。
  4. 当 k 为 0 时,此时 n 的值就是 m 和 n 的最大公约数

辗转相除法是一种非常实用的算法,它的核心在于巧妙地利用了余数的性质。每次用较大数除以较小数取余,再用除数和余数继续这个过程,不断缩小问题的规模。这样一来,原本复杂的求最大公约数问题,就通过不断迭代转化为一个简单的问题,避免了对大量可能的公约数进行逐一尝试,从而显著提高了计算效率。而且,这种算法逻辑清晰、代码实现简单,在实际应用中十分高效 


getchar函数 和 putchar函数

getchar 函数

getchar 函数的作用是从键盘上接收一个字符,当接收成功后的返回值是字符的 ASCLII 码值,接收失败就会返回 EOF

putchar 函数

putchar 函数的作用是把传递的参数打印在屏幕上,比如 putchar('w'); 那么屏幕上就会出现 w 字符

代码模拟实现用户创建密码场景

char password[20] = { 0 };printf("请输入密码:");
scanf("%s", password);// 清空缓冲区
while (getchar() != '\n');char input = 0;
printf("请确认密码(Y/N):");
scanf("%c", &input);if (input == 'Y')printf("确认成功\n");
else if (input == 'N')printf("退出确认\n");
elseprintf("确认失败\n");return 0;

scanf 函数和 getchar 之类的接收数据函数,并不是从键盘上直接接收数据,而是从输入缓冲区中拿数据,而从键盘上输入的数据没有被拿之前都是被存放在输入缓冲区的

而 scanf 函数只会拿 '\n' 或者空格之前的字符,所以要利用 getchar 把缓冲区中多余的字符清理掉

代码模拟实现用户登录账号场景,并且只能登录三次 

实现要求:

编写代码实现模拟用户登录账号场景,并且只能登录三次,只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序

代码演示:

char password[] = "123456";
char input_password[] = "      ";int chance = 0;while (chance < 3)
{printf("请输入密码:");scanf("%s", input_password);if (strcmp(input_password, password) == 0){printf("登录成功\n");break;}else{printf("密码错误\n");chance++;}
}if (chance == 3)printf("登录失败,退出程序\n");return 0;

strcmp 函数的作用是比较两个字符串的大小关系,其返回值规则如下:

  1. 若返回 0:表示两个字符串完全相等(每个对应位置的字符都相同)
  2. 若返回正数:表示第一个字符串大于第二个字符串。比较逻辑是从左到右逐个字符对比,直到找到第一个不相同的字符,此时第一个字符串中该位置字符的 ASCII 码值大于第二个字符串对应位置字符的 ASCII 码值
  3. 若返回负数:表示第一个字符串小于第二个字符串,原理同上,即第一个不相同字符的 ASCII 码值小于第二个字符串对应字符的 ASCII 码值

简言之,strcmp 通过逐个字符比较 ASCII 码值来判断字符串的大小关系,返回值直接体现两者的大小或相等关系


猜数字游戏

实现要求

编写一个猜数字游戏程序,让用户猜测程序随机生成的 1 - 100 之间的整数

  1. 开始与退出控制:程序启动后,提示用户输入指令。输入 1 开始新的一轮猜数字游戏;输入 0 则直接退出程序;若输入其他非 0 非 1 的整数,提示用户重新输入

  2. 猜数字过程:当用户输入 1 开始游戏后,程序随机生成一个 1 - 100 之间的整数作为目标数字。用户输入猜测的数字,程序根据用户输入给出相应提示:

    • 若猜测的数字大于目标数字,提示 “猜大了”。
    • 若猜测的数字小于目标数字,提示 “猜小了”。
    • 若猜测的数字等于目标数字,提示 “猜对了”,此轮游戏结束,再次回到开始界面等待用户输入指令(1 开始新游戏,0 退出程序等)。
  3. 重复游戏:在一轮游戏结束后,用户可根据自身意愿,通过输入 1 继续开启新的一轮游戏,或输入 0 退出程序。

代码实现

void menu()
{printf("**********************************************\n");printf("*****     1. play            0. nxit     *****\n");printf("**********************************************\n");
}void game()
{printf("\n-----------   猜数字游戏开始   -----------\n");int input = 0;int Random_number = rand() % 100 + 1;while (1){printf("请输入你猜的数字:");int ret = scanf("%d", &input);if (input > Random_number){printf("猜大了\n");}else if (input < Random_number){printf("猜小了\n");}else{printf("恭喜你,猜中了!!!\n");break;}}printf("-----------   猜数字游戏结束   -----------\n\n");}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("\n请输入(1 or 0):");scanf("%d", &input);if (input == 1){game();}else if(input == 0){printf("退出游戏\n");}else{printf("输入错误,请重新输入\n");}} while (input);return 0;
}

代码解析

代码 1:srand((unsigned int)time(NULL));

srand 函数用于初始化随机数生成器的种子。在 C 语言里,若不设定种子,rand 函数每次运行程序时产生的随机数序列都是相同的

time(NULL) 会返回当前的时间戳,即从特定起始时间到现在所经过的秒数。由于时间是持续变化的,将 time(NULL) 的返回值强制转换为 unsigned int 类型后作为 srand 函数的参数,就可以让随机数生成器的种子在每次运行程序时都不同

这样,后续调用 rand 函数就能生成不同的随机数序列,实现真正意义上的 “随机”

代码 2:int Random_number = rand() % 100 + 1;

rand 函数用于生成随机整数。不过,它默认生成的是一个较大范围的随机数,且每次运行程序时的随机数序列依赖于 srand 函数设定的种子。若要生成 1 到 100 之间的随机整数,可以通过取模运算和加法运算来实现

rand() % 100 会对 rand 函数生成的随机数取模 100,得到的结果范围是 0 到 99。在此基础上再加 1,最终得到的随机数范围就是 1 到 100。代码将这个 1 到 100 之间的随机数赋值给整型变量 Random_number


goto 语句

goto 语句介绍:

在C语言里,`goto` 语句能让程序执行流程跳转到指定的标签处。使用时,要先定义一个标签,格式为“标签名:”,接着就能用 `goto` 标签名; 来跳转。不过,滥用 `goto` 会使代码逻辑混乱、可读性变差。所以仅在处理深度嵌套跳出等特殊情况时使用

goto 语句可以使用的场景: 

int main()
{for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){for (int k = 0; k < 10; k++){goto error;}}}error:return 0;
}

能直接跳出深度嵌套的情况

利用 goto语句 写一个电脑关机程序

int main()
{char password[20] = { 0 };system("shutdown -s -t 60");printf("请注意,你的电脑将在1分钟内关机,如果输入“我是猪”三个字,就取消关机。\n请输入:");again:scanf("%s", password);if (strcmp(password, "我是猪") == 0){system("shutdown -a");printf("正确输入,已取消关机\n");}else{printf("输入错误,请再次输入:");goto again;}return 0;
}

system("shutdown -s -t 60"); 代码解释:

  • system 是 C 语言标准库 <stdlib.h> 中的函数,它的作用是调用操作系统的命令行接口来执行特定的系统命令。
  • "shutdown -s -t 60" 是传递给 system 函数的系统命令字符串。其中,shutdown 是 Windows 操作系统中用于关机、重启、注销等操作的命令。
    • -s 表示关机操作,即让计算机在指定时间后关闭。
    • -t 60 表示设置关机的倒计时时间,-t 是指定时间的参数,60 代表 60 秒。

综合起来,system("shutdown -s -t 60"); 的作用是让程序调用系统命令,使计算机在 60 秒后自动关机。

system("shutdown -a"); 代码解释:

  • 同样,system 函数调用系统命令行接口。
  • "shutdown -a" 是传递给 system 函数的命令字符串。其中,shutdown 是 Windows 系统用于关机等操作的命令,-a 是取消关机操作的参数。

所以,system("shutdown -a"); 的作用是调用系统命令来取消之前设置的关机计划,无论之前设置的是多少时间后关机,执行这行代码后,关机计划都会被取消

相关文章:

  • 第51讲:AI在农业政策支持系统中的应用——用人工智能点亮科学决策的新范式
  • 绿色森林人文生活纪实摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?
  • Android 回显
  • Ubuntu 20.04 安装Docker 全过程
  • (2025最新版)CUDA安装及环境配置
  • java记忆手册(2)
  • 深入理解XGBoost(何龙 著)学习笔记(一)
  • 基于RabbitMQ实现订单超时自动处理
  • LeetCode热题100--283.移动零--简单
  • 【开源】STM32HAL库驱动ST7789_240×240(硬件SPI+软件SPI)
  • Postman设置了Cookies但是请求不携带Cookie
  • 2025年04月23日Github流行趋势
  • Sentinel源码—9.限流算法的实现对比一
  • QT项目----电子相册(4)
  • gem5-gpu教程05 内存建模
  • gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词不知道该如何翻译所以没有汉化)
  • 结构型模式:适配器模式
  • Java 中 String 转 Integer 的方法与底层原理详解
  • Netty是如何实现零拷贝的?
  • “雷公”起诉人贩子王浩文案开庭:庭审中不承认拐走川川
  • 生态环境部谈拿手持式仪器到海边测辐射:不能测量水中放射性核素含量
  • 青岛:今年计划新增城镇住房约5.77万套,推动房地产市场回稳
  • 印尼塔劳群岛发生6.2级地震,震源深度140千米
  • 广电总局加快布局超高清视听产业链,多项成果亮相
  • 民政部:从未设立或批准设立“一脉养老”“惠民工程”项目,有关App涉嫌诈骗