while 与 do-while 的底层逻辑对决-算平均数
需求: 让用户输入一系列的正整数,最后输入 -1 表示输入结束。然后程序计算出这些数字的平均数,输出输入的数字个数和平均数。
在这道题里,-1 并不是一个要参与计算的数据,它是一个“哨兵(Sentinel)”或者叫停止暗号。这就意味着,我们的代码逻辑必须像安检一样:在把数字放进 sum(总和)之前,必须先查验它是不是 -1。
while循环
while的核心哲学是:先检查,再放行。
因为要先检查,所以我们在到达 while 大门之前,手里必须先拿着一个数据。
intmain(){intnumber;intsum=0;intcount=0;scanf("%d",&number);while(number!=-1){sum+=number;count++;scanf("%d",&number);}printf("%f\n",1.0*sum/count);// 1.0 的妙用:强制触发浮点数运算,防止整数除法精度丢失!return0;}痛点: 被迫写了两次 scanf,看起来稍微有些啰嗦。
优点: 逻辑极其严密,绝不可能把毒药 -1 吃进肚子里。
do while循环
do-while的核心哲学是:不管三七二十一,先进门干活,出门前再查。
intmain(){intnumber;intsum=0;intcount=0;do{scanf("%d",&number);// 如果不加这个 if,-1 就会被加进 sum 里,导致全盘算错。if(number!=-1){sum+=number;count++;}}while(number!=-1);printf("平均数是: %f\n",1.0*sum/count);}return0;}痛点: 循环体内部必须硬生生塞进去一个 if 判断来做防御。
优点: 只需要写一次 scanf。
