1前言:这期来写一下分支和循环的进阶用法,举例时一般都会结合使用,希望这期可以帮助大家更好的理解分支和循环语句,这两种语法结构在我们日常使用中时特别常用的,用法应该是极其灵活多变的,千万不要固化思维,这对学编程是非常可怕的,大家一定要多多思考,同一个问题,想出越多种解决办法约有利于思维的锻炼,灵活的思维是一个程序员所终生受益无穷的,他将让你在众多人中脱颖而出。再有一点,代码的构造固然重要,需要大家的逻辑思维足够强大,同时代码的优化也是重中之重,当你写出了一个代码,实现了你的想法,做到了你想做的事,满足开心的同时,你有没有去思考代码的优化,这样就是最优的写法了吗,能不能有再优化一下呢,这种代码优化思维在无论是职场还是在研究中都非常重要,我们现在用的所有软件几乎没有不更新的,更新就是代码优化的体现,无论是bug修复还是功能创新,或是优化用户体验,这都是代码优化的体现。我们现在初学时由于写的代码都是小程序,本身代码量比较小,优化空间有限,但是我们一定不能养成不思考去优化这个坏习惯,其实即使很少的代码也相当有可能存在优化办法,我记得网上有个很热议的话题:求素数的多种境界,虽然代码量很小,但是思维发散开,真的是方法各有境界,所以在此建议大家平时一定要多思考,不要思维固化。
2分支
2.1 if else语句:可以嵌套,例如下代码:这里用了for循环,目的是更好的展示结果,多打印几个值。
int main()
{
for (int i = 15; i < 95; i+=15)
{
if (i > 18)
{
if (i > 30)
{
if (i > 50)
{
if (i > 80)
{
printf("长寿人\n");
}
else
{
printf("老年人\n");
}
}
else
{
printf("壮年人\n");
}
}
else
{
printf("青年人\n");
}
}
else
{
printf("未成年\n");
}
}
return 0;
}
运行结果(循环时i值为:18,33,48,63,78,93):
2.2不是每一个if语句都需要else,可以根据需求进行使用任意个if和任意个else,当然else不能比if多,不过这样用时要注意else悬空问题(参见分支循环语句基础上),其实还是养成良好习惯的问题,不要省略{}就一般不会造成else悬空。
3循环
3.1while循环括号内是判定真假,所以有无限循环的一种用法while(true)或者写为while(1)当然这个1可以是任意值,只要不是0就不为假,就会一直循环。
3.2for循环的无限循环为for(;;)。
3.3do while循环跟while一样,无限循环为do{}while(true)或do{}while(1)
3.4无限循环有很多应用场景,比如做一个简单的计算器,总不能每次算完一次就重启程序,所以就可以整体加一个无限循环,算完一次算下一次。
3.5while (getchar() != '\n') {;},利用while循环不停接收缓冲区字符,直到接收到\n也就是回车,这个循环可以用来清除缓冲区内容,比较常用,getchar()和putchar()是<string.h>中的库函数,是专门接收和打印字符串的库函数,接收和打印都是以char为单位一个一个进行的,例如asdfg在getchar()时先接收a然后b......putchar()也是如此,与<stdio.h>中的scanf()与printf()本质不同,效果展现相同。
4综合例子,这里给大家一个完整的猜数字小游戏的代码,用了很多分支和循环语句,希望可以帮助大家更好的理解分支和循环语句。当然就像我之前说的,代码越多肯顶就约有优化空间,我写的肯定不可能是最好的,也欢迎大家多思考,有什么优化建议评论区交流,或者直接找我交流。代码中有很多*是为了运行结果好看,对程序本身逻辑没任何影响。其中用了自定义函数还有很多库函数,是为了代码看起来简洁清楚,不懂也没有关系,下期就是函数的讲解啦。话不多说,例如下代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
//猜数字游戏
//定义字符ch用来做分支语句switch入口
char ch = 0;
//游戏体函数
void game()
{
int a = 0;
//利用库函数产生随机数a作为被猜数
a = rand()%100+1;
//初始化变量b用来接收输入的数
int b = 0;
printf("******************************** 请输入一个数字来开始 *********************************\n");
//死循环实现猜不对一直猜
while (1)
{
//接收输入数字存入b
scanf("%d", &b);
//输入数字比a小,提示猜小了
if (a > b)
{
printf("****************************************** 猜小啦! *****************************************\n");
}
//输入数字比a大,提示猜大了
else if (a < b)
{
printf("****************************************** 猜大啦! *****************************************\n");
}
//输入数字等于a,提示恭喜你猜对了
else
{
//系统指令清除屏幕内容
system("cls");
printf("************************************************************************************************************************\n");
printf("*************************************************** 恭喜你! **************************************************\n");
printf("****************************************** 猜对啦! *****************************************\n");
printf("************************************************************************************************************************\n\n\n\n\n");
printf("****************************************** 按enter回主菜单! *****************************************\n");
//按enter返回主菜单,通过getchar函数接收到“\n”(换行符),break跳出死循环
if (getchar() == '\n')
{
break;
}
}
}
}
//菜单函数
void menu()
{
system("cls");
printf("************************************************************************************************************************\n");
printf("**************************************** 菜单 ****************************************\n");
printf("**************************************** a.开始游戏 ****************************************\n");
printf("**************************************** b.结束游戏 ****************************************\n");
printf("************************************************************************************************************************\n");
//ch接收用户选择
ch = getchar();
//接收回车以及回车之前的所有无用字符,清空缓存区,以防止再次进入循环被ch接收到
while (getchar() != '\n')
{
;
}
}
int main()
{
//根据时间产生随机数种子seed,库函数rand会根据seed产生随机数
srand((unsigned int)time(NULL));
//do while循环用户只要不退出游戏就一直循环,while条件为(ch != 'b'),即只要用户菜单处不选择b,就不停止循环
do
{
//打印菜单
menu();
//switch循环语句,实现通过菜单选择功能
switch (ch)
{
case 'a':
{
//用户选择a,执行game函数
game();
//接收回车以及回车之前的所有无用字符,清空缓存区,以防止再次进入循环被ch接收到
while (getchar() != '\n')
{
;
}
break;
}
case 'b':
{
system("cls");
printf("************************************************************************************************************************\n");
printf("************************************************************************************************************************\n");
printf("***************************************** 游戏结束! ****************************************\n");
printf("************************************************************************************************************************\n");
printf("************************************************************************************************************************\n");
Sleep(1000);
//库函数退出程序,0表示成功
exit(0);
break;
}
default:
{
//菜单输出不是a或者b
printf("请输入正确指令!\n");
//库函数延迟1秒,单位是毫秒,1000毫秒=1秒
Sleep(1000);
break;
}
}
//ch不等于b重新循环
} while (ch != 'b');
return 0;
}
运行结果图:
5小结:关于上面代码,相信很多小伙伴对于产生随机数那里比较蒙圈,不过没关系,后面的函数期将会详细讲解,除此之外,我在代码上做了详尽的注释,如果还是有什莫不懂得也欢迎大家评论区交流,或者直接联系我,好啦,分支循环到此就结束了,如果有什莫错误欢迎指出,有什莫不懂也欢迎交流,我是小白阿g,关注我让小白不白学,下期再见啦!