目录
分支循环语句
单分支
多分支
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");
}
此题利用的是二分查找算法,二分查找法的应用需以有序数组为前提,其核心步骤与流程如下:
- 初始化与定位:设定数组左右边界下标
left
和right
,据此计算中间元素下标mid
,以获取数组中间值。 - 比较与边界调整:将待查找元素与中间值进行比较:
- 若待查找元素大于中间值,则将左边界
left
更新为mid + 1
,缩小查找范围至数组右半部分; - 若待查找元素小于中间值,则将右边界
right
更新为mid - 1
,缩小查找范围至数组左半部分。
- 若待查找元素大于中间值,则将左边界
- 迭代与终止:在
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 为例,辗转相除法的操作步骤如下:
- 计算 m 除以 n 的余数,将这个余数赋值给变量 k。在这个例子中,24%18=6,所以 k=6。
- 判断 k 的值是否为 0。如果 k 不为 0,就把 n 的值赋给 m,把 k 的值赋给 n。在本例中,执行这一步后,m 变为 18,n 变为 6。
- 重复上述步骤,也就是持续进行 k=m%n 的计算,然后更新 m 和 n 的值(m=n;n=k),直到 k 的值为 0。
- 当 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
函数的作用是比较两个字符串的大小关系,其返回值规则如下:
- 若返回
0
:表示两个字符串完全相等(每个对应位置的字符都相同) - 若返回正数:表示第一个字符串大于第二个字符串。比较逻辑是从左到右逐个字符对比,直到找到第一个不相同的字符,此时第一个字符串中该位置字符的 ASCII 码值大于第二个字符串对应位置字符的 ASCII 码值
- 若返回负数:表示第一个字符串小于第二个字符串,原理同上,即第一个不相同字符的 ASCII 码值小于第二个字符串对应字符的 ASCII 码值
简言之,strcmp
通过逐个字符比较 ASCII 码值来判断字符串的大小关系,返回值直接体现两者的大小或相等关系
猜数字游戏
实现要求
编写一个猜数字游戏程序,让用户猜测程序随机生成的 1 - 100 之间的整数
-
开始与退出控制:程序启动后,提示用户输入指令。输入
1
开始新的一轮猜数字游戏;输入0
则直接退出程序;若输入其他非 0 非 1 的整数,提示用户重新输入 -
猜数字过程:当用户输入
1
开始游戏后,程序随机生成一个 1 - 100 之间的整数作为目标数字。用户输入猜测的数字,程序根据用户输入给出相应提示:- 若猜测的数字大于目标数字,提示 “猜大了”。
- 若猜测的数字小于目标数字,提示 “猜小了”。
- 若猜测的数字等于目标数字,提示 “猜对了”,此轮游戏结束,再次回到开始界面等待用户输入指令(
1
开始新游戏,0
退出程序等)。
-
重复游戏:在一轮游戏结束后,用户可根据自身意愿,通过输入
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");
的作用是调用系统命令来取消之前设置的关机计划,无论之前设置的是多少时间后关机,执行这行代码后,关机计划都会被取消