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;
}