流程控制——控制类语句(选择判断语句&循环语句)

3.1 流程控制—if语句

#include <stdio.h>

// if判断语句,if()括号内的判断条件,会转换成0,1,也就是true(1)或者 false(0)
// 当是true时,才会执行大括号中的语句

int main()
{
	// int atHomeYesOrNot;
	// puts("在家扣1,不在家扣2");
	// scanf("%d",&atHomeYesOrNot);
	// if(atHomeYesOrNot == 1){
		// puts("在家进来喝杯咖啡吧!");
	// }
	
	
	int money;
	printf("存款多少?!\n");
	scanf("%d",&money);
	//超过5000就是有款
	if(money > 5000){
		printf("大款打劫\n");
	}
	puts("中彩票了,中了500万");
	printf("测试结果:%d\n",money > 5000);
	
	
	return 0;
}

if_else的有关例子

(1)

#include <stdio.h>

int main()
{
	int healthGorB;
	int richYorN;
	int handsomeYorN;
	int generosityYorN;
	
	puts("你的身体好吗?,Yes(1) or NO(0)");
	scanf("%d",&healthGorB);
	
	if(healthGorB == 1){
		puts("那你长得如何?有钱吗?tips:输入两个判断条件Y(1) or N(0)");
		scanf("%d%d",&handsomeYorN,&richYorN);
		if(handsomeYorN == 1 && richYorN == 1){
			puts("我们可以先了解一下彼此,你愿意对我好吗?Yes(1) or No(0)");
			scanf("%d",&generosityYorN);
			if(generosityYorN == 1){
				puts("我们再约~");
			}else{
				puts("拜拜,拉黑了!");
			}
		}else{
			puts("不好意思,我首先需要肉体的共鸣,并且没有物质的爱情就像一盘散沙~");
		}
	}else{
		puts("不好意思,我不能和你在一起");
	}
	
	return 0;
}

(2)

#include <stdio.h>
#include <ctype.h>

int main()
{
	char letter;
	
	// 1.输入一个字母
	    //提示输入
	printf("请输入一个字母:\n");		
		//获取输入
	scanf("%c",&letter);
		
	// 2.判断这个字母是不是小写字母
	if(letter >= 97 && letter <= 122){  // 判断小写字母
	    //直接输出
		printf("你输入的字母是:%c\n",letter);
	}else if(letter >=65 && letter <= 90){
		
		//转换成小写字母
		printf("大写字母转化成小写字母%c\n",letter+32);	
	}else{
		puts("请输入正确的字母");
	}
	
    // 3.程序结束
	puts("程序完成done!");
	
	return 0;
}

(3)数字交换

#include <stdio.h>

int main()
{
	int data1;
	int data2;
	int dataTemp;
	
	printf("请输入两个数\n");
	scanf("%d%d",&data1,&data2);
	
	// if(data1 > data2){
		// printf("data较大的数是%d\n",data1);
		// printf("data较小的数是%d\n",data2);
	// }
	// if(data1 < data2){
		// printf("data较大的数是%d\n",data2);
		
	// }
	
	//按数字从小到大的顺序排列
	
	if(data1 > data2){ // 形象化举例,有三个杯子A,B,C,
	                  // 先将A的水倒入C(C=A),再将B的水倒入A(A=B),C中的水倒入B(B=C=A(最初的A))
		//交换
		puts("=====交换数字=====");
		dataTemp = data1;
		data1 = data2;
		data2 = dataTemp;
	}
	
	printf("data从小到大排列:data1=%d data2=%d\n",data1,data2);
	
	return 0;
}

(4)逻辑运算符&&,||,!

#include <stdio.h>

/* | 和 || 是完全不同的两种运算符:
   (1) |(按位或)
   (2)||(逻辑或)
   详细区别自查,仅在此做个标注
   
   逻辑运算符&&(与),||(或),!(非):
       a&&b:如果a和b都为真,则结果为真,否则为假
	   a||b:如果a和b有一个为真,则结果为真,二者都为假时,结果为假
	   !a:如果a为假,则!a为真,反之!a为假
	
*/

int main()
{
	// int a;
	// int b;
	
	// printf("请输入a,b两个数:\n");
	// scanf("%d%d",&a,&b);
	
	// if(a == 1 && b == 0){
		// printf("逻辑与成功\n");
	// }
	
	// if(a == 1 || b == 0){
		// printf("逻辑或成功\n");
	// }
	
	// if( !a ){
		// printf("逻辑非\n");
	// }
	int haveMoneyYesOrNot;
	int handsomeYesOrNot;
	int TallYesOrNot;
	
	puts("家里是否资产?不是扣1,是扣0");
	scanf("%d",&TallYesOrNot);
	if( !TallYesOrNot ){ //条件是"真"时才会执行大括号的内容
		puts("能周游世界");
		return -1; // 无资产时提前终止程序,下面的代码不会执行
	}
	
	puts("有钱有自由?有扣1,没有扣0");
	scanf("%d",&haveMoneyYesOrNot);
	
	puts("英俊不?俊扣1,没有扣0");
	scanf("%d",&handsomeYesOrNot);
	
	if(haveMoneyYesOrNot == 1 && handsomeYesOrNot == 1){
		puts("有钱又有颜");
	}else{
		printf("年轻就是资本!\n");
	}
	
	printf("相亲结束\n");
	
	return 0;
}

3.2 switch-case

(1)

#include <stdio.h>

/*
  一、switch-case 和 if-else 的区别
    1.语法结构
     (1)switch-case:
	    只能基于固定值(整型、字符型、枚举)进行分支判断。
		case 后的值必须是常量,不能是变量或表达式。
	 (2)if-else:
	    支持任意布尔表达式(范围判断、逻辑运算、变量比较等)。
	    条件可以是动态的、复杂的逻辑组合。
    2.执行机制
	(1)switch-case:
	   通过跳转表直接定位到匹配的 case,时间复杂度为 O(1)。
	  适合处理多分支离散值(如菜单选项、状态码)。
	  如果没有 break,会“穿透”(fall-through)到下一个 case。

   (2)if-else:
      按顺序逐个检查条件,时间复杂度为 O(n)。
     适合处理范围判断(如 x > 10)或复杂逻辑(如 x && y)。
	 
  二、
    switch-case:适合处理多分支离散值,代码高效且结构清晰。
    if-else:适合动态条件、范围判断或复杂逻辑。
	根据具体场景选择工具,可以显著提升代码质量和可维护性。

*/

int main()
{
	int data;
	char cdata;
	
	printf("测试,请输入一个数字\n");
	scanf("%d",&data);
	
	// switch 语句会按顺序执行所有匹配的 case 分支,直到遇到 break 或结束。
    // 如果不写 break,代码会继续执行下一个 case 的代码块(即使不匹配条件)
	
	switch(data){
		case 1:
		case 2:
		case 3:
		case 5:
		   puts("满足条件1,2,3,5");
		   break;
		case 4:
		   puts("满足条件4");
		   break;
		default:
		    puts("其他条件");
			getchar();
			break;
	}
	
	printf("测试,请输入一个字符\n");
	getchar();
	scanf("%c",&cdata);
	
	switch(cdata){
		case 'a':
		case 'b':
		case 'c':
		case 'd':
		   puts("满足条件a,b,c,d");
		   break;
		case 'e':
		   puts("满足条件e");
		   break;
		default:
		    puts("其他条件");
			break;
	}
	
	
	return 0;
}

(2)相关例子example

#include <stdio.h>

int main()
{
	int discount;
	int distance;
	int price;
	int weight;
	
	puts("请输入路程");
	scanf("%d",&distance);
	
	// if(distance < 245){
		// discount = 0;
	// }else if(distance >= 245 && distance <= 500){
		// discount = 2;
	// }else if(distance >= 500 && distance <= 1000){
		// discount = 5;
	// }else if(distance >= 1000 && distance <= 2000){
		// discount = 8;
	// }else if(distance >= 2000 && distance <= 3000){
		// discount = 10;
	// }else{
		// discount = 15;
	// }
	
	switch(distance/245){
		case 0:
		   discount = 0;
		   break;
		case 1:
		   discount = 2;
		   break;
		case 2:
		case 3:
		   discount = 5;
		   break;   
		case 4:
		case 5:
		case 6:
		case 7:
		   discount = 8;
		   break;
		case 8:
		   discount = 10;
		   break;
	}
	
	printf("折扣是:%.2f\n",(float)discount/100);
	
	return 0;
}

3.3 while循环语句

(1)

#include <stdio.h>

int main()
{
	// int times = 0;
	
	// //循环遍历0,1,2,3,4,5,6,7,8,9
	// while(times < 10){  // 只要条件为真,就一直执行,而if只执行一次
		                // // 为避免死循环(占用内存),提供循环条件,除c51单片机
	    // puts("这是一个循环");
		// printf("times = %d\n",times);
		// times++;
	// }
	
	// 计算1-100的和
	int sum = 0; // 初始化
	int data = 1;
    
    while(data <= 100){
		printf("data=%d\n",data);
		sum = sum + data;  // 0+1+2+3+...+100
		data++;          // 自增
		
	}	
	printf("0-100的和:%d\n",sum);
	
	return 0;
}

(2)do-while

#include <stdio.h>

/*
  
特性:        while 循环	                      do-while 循环
语法:	      while (条件) { 循环体 }	          do { 循环体 } while (条件);
执行顺序:	  先判断条件,条件为真才执行循环体	  先执行循环体,再判断条件是否继续循环
最少执行次数:0 次(若初始条件为假)	          1 次(无论条件是否满足)
*/

int main()
{
	int i = 5;
    while (i < 5) {  // 条件为假,直接跳过
    printf("这段代码不会执行");
   }
   
   
   do {
    printf("这段代码会执行一次");  // 先执行一次
   } while (i < 5);  // 后判断条件为假,退出
	
	
	return 0;
}

3.4 for循环语句

#include <stdio.h>

int main()
{
	int data;
	 // 条件赋初值  判断临界值  条件改变
	for(data = 0;data < 10; data++){ // 判断,执行循环体,条件改变
		printf("%d",data);
	}
	
	// for (;;) {  // 死循环
    // // 代码
    // }
	
	// while (1) {  // 无限循环
    // // 代码
    // }
	
	return 0;
}

/*
   已知循环次数 → for
   未知循环次数 → while
   需要局部变量 → for(C99+)

*/

3.4.1 for嵌套循环举例

#include <stdio.h>

// 输出i*j的数列矩阵
/*
  1  2  3  4  5
  2  4  6  8  10
  3  6  9  12  15
  4  8  12  16  20

*/

int main()
{
	int i;
	int j;
	
	for(i = 1;i <= 4;i++){
		for(j = 1;j <= 5;j++){
			
			printf("%d  ",i*j);
		}
		
		printf("\n");
	}
	
	return 0;
}

3.5 break和continue的编码分析

#include <stdio.h>

int main()
{

	int numOfPerson;
	int totalMoney = 0;
	int money;
	
	numOfPerson = 1;
	while(numOfPerson <= 1000){
	// for(numOfPerson = 1;numOfPerson <= 1000;numOfPerson++){
		
		printf("请输入捐款的数目:\n");
		scanf("%d",&money);
		totalMoney = totalMoney + money;
		if(totalMoney >= 100000){
			puts("已达到10万元");
			break;     // 结束整个循环,跳出循环体
		}
		numOfPerson++;
	}
	
	printf("总捐款人数:%d\n",numOfPerson);
	printf("每个人的平均捐款数据:%f\n",(float)totalMoney / numOfPerson);
	
	
	
	int data;
	data = 10;
	
	for(data = 100;data <= 200;data++){
		if(data % 3 != 0){
			continue;       // 如果3不能被整除,跳出本次循环,进行下一次循环
		}
		printf("%d ",data);
	}
	
	
	return 0;
}

3.6.1 task1:

#include <stdio.h>

// task1:输入两个正整数m和n,计算最大公约数与最小公倍数

int main()
{
	int m, n, data, a, b;
	
	// 输入两个正整数
	printf("输入两个正整数(空格隔开)\n");
	scanf("%d %d",&m,&n);
	
	// 计算最大公约数(GCD),约数:能够整除一个整数的数
	a = m;
	b = n;
	while(b != 0){ // 较大数除以较小数,取余数,直到余数为0,
	               // 此时最后一步的除数就是GCD,即最后一个非0的余数
		data = a % b;
		a = b;     // a最终会等于最后一步的非0余数
		b = data;	
	}
	
	int gcd = a;
	
	// 计算最小公倍数(LCM)
	int lcm = m * n / gcd;    //最小公倍数(LCM)的计算方法(公式法)
	                         // LCM(m,n) = |m*n| / GCD(m,n)
	// 输出结果
	printf("最大公约数:%d\n",gcd);
	printf("最小公倍数:%d\n",lcm);
	
	
	return 0;
}

3.6.2 task2:

判断水仙花数

#include <stdio.h>
#include <math.h> // 需要数学库支持pow函数(计算指定次幂)

// 水仙花数的判断

int main()
{
	int num;
	int original; // 原始值
	int sum;      // 每个位上的数字的N次幂之和
	int digits;   // 位数
	
	// 输入要验证的数字
	printf("输入要验证的数字(N>=3)\n");
	scanf("%d ",&num);
	
	// 判断是否为水仙花数,
	// 一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
	// 如 153 = 1^3 + 5^3 + 3^3
	// 初始化
	original = num;
	sum = 0; 
	digits = 0;
	
	// 计算输入数字的位数
	int temp = original;  // 创建临时变量避免修改原始值
	while(temp != 0){     // temp非0时循环
		digits++;         // 每次循环位数加1
		temp /= 10;       // 去掉最后一位(如153→15→1→0)
	}
	
	// 计算各位数字的digits次方之和
    temp = original;     // 重置temp为原始值
    while (temp != 0) {  
        int digit = temp % 10;              // 取最后一位数字(如153%10=3)
        sum += pow(digit, digits);          // 计算digit^digits并累加到sum
        temp /= 10;                         // 去掉最后一位(如153→15→1→0)
    }
	
	// 判断是否为水仙花数并输出结果
    if (sum == original) {                   // 如果各位幂次和等于原始值
        printf("%d 是水仙花数\n", original);  
    } else {
        printf("%d 不是水仙花数\n", original); 
    }
	
	// 输出所有三位水仙花数(100到999)
    printf("\n三位水仙花数:\n"); 
    for (int i = 100; i < 1000; i++) {       // 遍历所有三位数
        int current = i;                     // 备份当前数值
        int current_sum = 0;                 // 初始化
        int current_digits = 3;              // 固定位数为3(三位数)
        
        // 计算各位立方和
        while (current != 0) {               // 分解每一位数字
            int digit = current % 10;        // 取最后一位数字
            current_sum += pow(digit, current_digits); // 计算立方并累加
            current /= 10;                  
        }
        
        // 判断是否为水仙花数并输出
        if (current_sum == i) {              // 如果立方和等于原数
            printf("%d ", i);           
        }
    }
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值