[C]if/switch语句 与 while/do...while/for循环语句入门案例

*声明:文中给出的代码 往往 并非最佳解决方案,源于个人学习,仅供学习交流、抛砖引玉之用,请读者宽容看待,多多思考、多多突破。

*注:如遇安全性错误C4996可添加此行代码于文件头:#pragma warning(disable :4996)

一、语句等 介绍 参考(相关权益归原作者所有):

C if 语句 | 菜鸟教程 (runoob.com)

C switch 语句 | 菜鸟教程 (runoob.com)

C while 和 do while 区别 | 菜鸟教程 (runoob.com)

C for 循环 | 菜鸟教程 (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的断点功能辅助确定问题。感谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值