*声明:文中给出的代码 往往 并非最佳解决方案,源于个人学习,仅供学习交流、抛砖引玉之用,请读者宽容看待,多多思考、多多突破。
*注:如遇安全性错误C4996可添加此行代码于文件头:#pragma warning(disable :4996)
一、语句等 介绍 参考(相关权益归原作者所有):
C switch 语句 | 菜鸟教程 (runoob.com)
C while 和 do while 区别 | 菜鸟教程 (runoob.com)
二、案例解决方案代码分享:
[纯if]判断一个整数是否可同时被两整数整除(if)
#include <stdio.h>
int main()
{
int a;
printf("输入一个整数?\t");
scanf("%d", &a);
if (a % 3 == 0 && a % 5 == 0) //a对3取模为0 并且 对5也为0
printf("可以被3和5同时整除\n");
else
printf("不可以被3和5同时整除\n");
return 0;
}
[if+switch]百分制成绩转等级制(if+switch)
#include <stdio.h>
int main()
{
float GRD;
printf("输入百分制成绩:\t");
scanf("%f", &GRD);
printf("此成绩");
if (GRD < 0 || GRD>100) // <0或>100时
printf("输入错误,请重新输入"); //对错误数值进行报错
else
switch ((int)(GRD / 10)) //进入switch选择函数
{
case 10: printf("优秀"); break; //100时优秀
case 9: printf("优秀"); break; //十位为9优秀
case 8: printf("良好"); break; //十位为8良好
case 7: printf("中等"); break; //十位为7中等
case 6: printf("及格"); break; //十位为6及格
default: printf("不及格"); //未选择到的 即:十位小于6都不及格
}
printf("\n\n"); //换行保持美观
return 0;
}
while、do...while主场 与 选择、判断语句
1、计算 分个人/团体的门票(while+if)
#include <stdio.h>
int main()
{
int NUM, MUN;
while (1) { //无限循环,到达出口或关闭程序才会停下
printf("输入人数\t");
scanf("%d", &NUM);
if (NUM <= 3 && NUM >= 0) { //3人以内一人200
MUN = NUM * 200;
break; //跳出循环(出口)
}
else
{
if (NUM > 3) { //大于3人一人180
MUN = NUM * 180;
break; //跳出循环(出口)
}
else
printf("输入错误请重新输入!\n"); //小于0人,报错
}
}
printf("请付款%d元\n", MUN);
return 0;
}
2、统计输入的字符串中字符类型(while+if)(循环读取输入)
#include <stdio.h>
int main()
{
int NUM = 0, Alphabet = 0, Space = 0, Others = 0;
char Input;
printf("请输入字符串:\n");
//scanf会把空格等都当作结束语,gets把回车当作结束语
while ((Input = getchar()) != '\n') {
if (Input == ' ') { //空格
Space += 1;
continue; //提前结束这次循环,并立刻开始下一次循环
}
if (Input >= '0' && Input <= '9') { //数字
NUM += 1;
continue; //提前结束这次循环,并立刻开始下一次循环
}
if (Input >= 'A' && Input <= 'Z' || Input >= 'a' && Input <= 'z') { //字母
Alphabet += 1;
continue; //提前结束这次循环,并立刻开始下一次循环
}
Others += 1; //其他
}
printf("一共有%d个数字,%d个英文字母,%d个空格,%d个其他字符。\n", NUM, Alphabet, Space, Others);
return 0;
}
3、水仙花数(while+do...while+if)
#include <stdio.h>
int main()
{
int Hundred = 1, Ten = 0, Bit = 0, NUM; //水仙花数是三位数所以拆分后从1 0 0开始
printf("所有水仙花数有:\n");
while (1){ //无限循环,到达出口或关闭程序才会停下
do {
if (Bit++ == 10) { //c++保证了包括100
Bit = 0;
if (++Ten == 10) { //个位满10进1
Ten = 0;
if (++Hundred == 10) //十位满10进1
return 0; //到1000退出(出口)
}
}
NUM = Hundred * 100 + Ten * 10 + Bit; //重组此数
} while (Hundred * Hundred * Hundred + Ten * Ten * Ten + Bit * Bit * Bit != NUM); //判断此数是否是水仙花数
printf("%d\t", NUM); //如果是则打印这个数
}
return 0;
}
for主场 与 选择、判断语句
1、输出1-36的8行顺序数字三角(for)
#include <stdio.h>
int main()
{
int j = 1;
for (int i = 0; i < 8; i++) { //行
for (int n = 0; n <= i; n++) //列
printf("%d\t", j++); //从1开始打印
printf("\n"); //这行个数满了,换行
}
return 0;
}
2、多个累加数的相加(for)(循环读取输入)
#include <stdio.h>
int main()
{
int NUM,SUM = 0, n;
printf("一共有多少个需要相加的累加数?\n");
scanf("%d", &n);
printf("分别输入它们的最后一项:\n");
for (int i = 0; i < n; i++) {
scanf("%d", &NUM);
for (int j = 1; j <= NUM; SUM += j++);
}
printf("\n累加和是%d\n", SUM);
return 0;
}
3、10人中挑5个符合身高要求者并计算身高平均值(for+if)
#include <stdio.h>
#define Chance 10 //给10个数据
#define Places 5 //选出5个符合要求的
int main()
{
int NUM = 0;
float Hight, SUM = 0;
for (int i = 0; i < Chance && NUM < Places; i++) {
printf("请输入身高:\t");
scanf("%f", &Hight);
if (Hight >= 170 && Hight <= 175) { //符合要求的身高区间
SUM += Hight; //身高相加
NUM++; //符合要求人数加一
}
else
continue; //提前结束这次循环,并立刻开始下一次循环
}
if (NUM == Places) //人数达标则输出平均身高
printf("平均身高为%.2f\n", SUM / 5);
else//不达标返回错误
printf("未能找到足够的人\n");
return 0;
}
4、分段统计学生成绩并计算平均分、优秀率、及格率(for+if+switch)
#include <stdio.h>
int main()
{
int GRD_10 = 0, GRD_9 = 0, GRD_8 = 0, GRD_7 = 0, GRD_6 = 0, GRD_NoPass = 0, Num;
float GRD, SUM = 0;
printf("请输入学生人数\t");
scanf("%d", &Num);
printf("请输入成绩\n");
for (int i = 0; i < Num; i++) //i变量为在此for循环内的局部变量
{
scanf("%f", &GRD);
if (GRD < 0 || GRD>100) {
printf("输入错误,请重输!\n");
i--; //本次循环不算,重新循环
}
else {
switch ((int)(GRD / 10)) { //进入switch选择语句
case 10:GRD_10++; break; //100分人数加一
case 9:GRD_9++; break; //十位为9人数加一
case 8:GRD_8++; break; //十位为8人数加一
case 7:GRD_7++; break; //十位为7人数加一
case 6:GRD_6++; break; //十位为6人数加一
default:GRD_NoPass++; //剩下的不及格人数加一
}
SUM += GRD; //同 SUM = SUM + GRD
}
}
printf("\t成绩分析表\n\n得分\t人数\n");
printf("100\t%d\n90-99\t%d\n80-89\t%d\n70-79\t%d\n60-69\t%d\n不及格\t%d\n", GRD_10, GRD_9, GRD_8, GRD_7, GRD_6, GRD_NoPass);
printf("\n平均分时:%.2f\n", SUM / (float)Num);
printf("优秀率为:%g%%\n", (((float)GRD_10 + (float)GRD_9) / (float)Num) * 100); //%g表示省略小数点后末尾的0并输出最多4位
printf("及格率为:%g%%\n", ((float)(GRD_10 + GRD_9 + GRD_8 + GRD_7 + GRD_6) / Num) * 100);
return 0;
}
[混合案例]1-100猜数字(do...while+for+if)
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#define Chance 6 //一共有6次机会
int main()
{
int Randon, InPut, Used = 0;
char c;
do {
printf("\n让我想想...\n");
do {
srand((unsigned)time(0)); //通过时间种子生成随机数
Randon = rand() % 100 + 1; //随机数限定到1-100范围内
} while (Randon == Used); //避免连续两次猜的数字重复
printf("来猜数字吧(一共%d次机会!)\n", Chance);
for (int i = Chance; i >= 0;) {
Used = Randon; //记录这次的数
if (i-- == 0) {
printf("\n没有猜对哦,答案是:%d,", Randon);
break; //提前结束这次循环,并跳出循环
}
printf("来猜一个1-100的整数:\t");
scanf("%d", &InPut);
if (InPut > Randon) {
printf("太大了\t你还剩%d次机会!\n", i);
continue; //提前结束这次循环,并立刻开始下一次循环
}
else {
if (InPut < Randon) {
printf("太小了\t你还剩%d次机会!\n", i);
continue; //提前结束这次循环,并立刻开始下一次循环
}
else { //不大不小就对了
printf("\n猜对啦!");
break; //提前结束这次循环,并跳出循环
}
}
}
printf("再来一次嘛?(Y/N)\n");
rewind(stdin); //重头开始输入缓冲,抛弃现有缓冲区内容
c = getchar();
} while (c == 'Y' || c == 'y');
return 0;
}
总结:
循环语句往往离不开判断,相较于if,switch语句有一定局限,合适的运用才能发挥其强大作用。循环语句方面for语句几乎可以完全替代while语句,而do...while语句有时则能发挥独特作用,合理的组织能大大降低编写难度、提高效率,但编写时要注意避免死循环,可以使用VS的断点功能辅助确定问题。感谢阅读。