C语言控制语句与循环逻辑精讲

控制语句与循环逻辑

学习目标

  1. if/switch控制语句
  2. for/while循环语句
  3. 其他语句
  4. 登录控制输入案例

PART.01 if/switch控制语句

选择结构

  • 选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。
  • 示例:为了判断一个数是偶数还是奇数,执行如下操作:
    接受一个数 → 用这个数除以 2 后的余数
    • 余数为0 → 偶数
    • 余数不为0 → 奇数

C语言支持两种选择语句:

  1. if语句:单分支选择、双分支选择、多重选择
  2. Switch语句

if语句:通过条件为真还是为假来决定

常规格式:

复制代码
if (表达式) { 语句; }
  • 表达式是要判断的条件,跟在后面的是一个或一组语句
  • 在if后的语句不止一个,应用大括号{}将他们组织起来。这样的组会称为"复合语句"或"代码块"。如果只有一个语句,大括号{}可以省略,但不建议。
If语句‑单分支

语法:

c 复制代码
if(表达式){
    语句;
}
If语句‑双分支
  • 可以选择两个语句中的一个来执行
  • 语法形式:
c 复制代码
if(表达式) {
    语句‑1;
} else {
    语句‑2;
}
  • 如果 if 表达式的值为true(非0),将执行 if 语句后的语句块
  • 如果 if 表达式的值为false(0),那么控制权将交给else 后面的语句
  • else语句是可选的。仅当 if 表达式的值为false时,才会执行else后的语句或语句序列
If语句‑多分支
  • if‑else‑if语句也称为 if‑else‑if 台阶或if‑else‑if 阶梯
  • 条件的计算是自顶向下的
  • 建议书写格式:
c 复制代码
if (表达式) { 
    语句; 
} else if (表达式) 
    语句; 
else if (表达式) 
    语句; 
else 
    语句;
If语句示例1(奇偶判断)
c 复制代码
#include <stdio.h>
int main()
{ 
    //这个程序用来显示一个数是偶数还是奇数
    int num , res ;
    printf("Enter a number :");
    scanf("%d",&num);
    res = num % 2;
    if (res == 0) //if(0 == res)//赋值运算符= 和 关系运算符==注意使用
        printf("Then number is Even");
    else
        printf("The number is Odd ");
    return 0;
}
If语句示例2(多分支选择)
c 复制代码
#include <stdio.h>
#include <stdlib.h>
void main(){
    int x = 0;
    system ("cls");
    printf("Enter Choice (1 - 3) :");
    scanf("%d", &x);
    if (x == 1)
        printf ("\nChoice is 1");
    else if ( x == 2)
        printf ("\nChoice is 2");
    else if ( x == 3)
        printf ("\nChoice is 3");
    else 
        printf ("\nInvalid Choice ");
}
If语句练习题

题目:输入月收入,按以下规则计算税费(保留两位小数):

  • ≤5000元:免税
  • 5001~8000元:超过5000部分按10%计税

8000元:超过8000部分按15%计税(前3000元仍按10%)

示例输入:10000

计算说明:

(8000-5000) × 10 %+(10000-8000) × 15 %=300+300=600

c 复制代码
	int income=0;
	float x=0;
	printf("请输入您的收入:");
	scanf("%d",&income);
	if(income<=5000){
		printf("0元");
	}
	else if(income>5000&& income<=8000){
		x=(income-5000)*0.1;
		printf("个人所得税是:%.2f",x);
	}
	else{
		x=(8000-5000)*0.1+(income-8000)*0.15;
	}
嵌套If语句
  • 嵌套的 if 语句就是在 if 或 else 语句中包含另一个 if 语句
  • 在 C 语言中,else 语句通常与同一块中距离它最近且未与 else 关联的 if 语句相匹配,与书写格式无关

语法示例:

c 复制代码
if (表达式‑1)
{
    if (表达式‑2) 
        语句‑1;
    if (表达式‑3)
        语句‑2;
    else
        /*与if(表达式‑3)相匹配*/ 
        语句‑3;
}
else
    /*与if (表达式‑1)相匹配*/ 
    语句‑4;

嵌套If语句示例:

c 复制代码
#include <stdio.h>
void main (){
    int x, y;
    x = y = 0;
    printf ("Enter Choice (1 - 3) :");
    scanf ("%d", &x);
    if (x == 1){
        printf("\nEnter value for y (1 - 5) :");
        scanf ("%d", &y);
        if (y <= 5)
            printf("\nThe value for y is : %d", y);
        else
            printf("\nThe value of y exceeds 5");
    }
    else
        printf ("\nChoice entered was not 1");
}

switch语句

  • switch 语句是一种多路判定语句,它判断表达式的值是否与整数或字符常量列表中的某个值相匹配
  • 若找到了相应的匹配,就会执行与常量关联的语句
  • switchcase、和default都是关键字,语句可以是简单或复合语句。
  • switch后的表达式需要用圆括号括起来,而且switch语句的主题用{}括起来
  • 计算表达式的数据类型要与指定的case常量的数据类型匹配。
  • switch后的表达式可以包含任何变量名,也可以是常量。
  • case后面只能是常量(整型和字符型)。

通用语法:

c 复制代码
switch(a) { 
    case 常量1: 
        语句集; 
        break; 
    case 常量2: 
        语句集; 
        break;
    default: 
        语句集; 
        break; 
}

switch语句执行过程

  1. 计算表达式的值
  2. 与case的值比较
    • 匹配:执行相匹配的case标记后的语句
    • 不匹配:执行default后的语句
  3. 遇到break语句终止执行

switch语句示例:

c 复制代码
#include<stdio.h>
void main()
{
    int iBasic;
    printf("\n please enter your basic:");
    scanf("%d",&iBasic); 
    switch(iBasic)
    {
        case 300:
            printf("\n Bonus is dollar %d\n",125);
            break; 
        case 400:
            printf("\n Bonus is dollar %d\n",140);
            break; 
        case 500:
            printf("\n Bonus is dollar %d\n",175);
            break;
        default:
            printf("\n Invalid entry");
            break;
    }
}
switch语句练习题

题目:输入月份(1‑12),输出该月份所属的季节:

  • 3~5月:春季
  • 6~8月:夏季
  • 9~11月:秋季
  • 12,1,2月:冬季
    如果输入月份不在1‑12,输出"输入错误"。

输入:4

输出:春季

Switch语句和if语句对比
  • 在表达式与其中一个case标记匹配的场景,switch语句很有用
  • 不能用来判断一个值是否在指定的范围内,这种情况下还是使用if‑else 语句

条件运算符

  • 条件运算符是C语言中唯一的三目运算符
    表达式1 ? 表达式2 :表达式3
  • 条件运算符的优先级高于赋值运算,低于关系和算术运算符
  • 结合方式:从右向左

示例:

a=3, b=30;a<5?(c=6):b>20?(b=8):(c=9)

PART.02 循环逻辑控制

什么是循环

  • 循环是程序中重复执行,直到满足指定条件才停止的一段代码
  • C语言中,控制循环执行的条件在编码时用到了关系和逻辑运算符

循环结构的3种类型

  1. for 循环
  2. while 循环
  3. do...while 循环

for循环

通用语法:分号 ; 不能省略

c 复制代码
for(初始化计数 ; 条件测试 ; 再求值参数)
{ 
    语句; 
}
  • 初始化计数:一个赋值语句,它在进入循环前设置循环控制变量
  • 条件测试:一个关系表达式,它决定何时退出循环
  • 再求值参数:定义每次执行循环时,循环控制变量如何变化
  • for 循环的三个部分必须用分号 ; 隔开
  • 组成循环体的语句可以是单个语句,也可以是复合语句

要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环的条件和控制变量的更新

工作原理:

  1. 初始化计数,给循环变量赋初始值。
  2. 条件测试,求值结果为 true,就执行循环体内的代码执行。当条件变为 false时退出循环,程序将继续执行 for 循环后面的语句
  3. 循环变量变化计算
  4. 重复第二步条件测试

for循环示例1:

c 复制代码
#include <stdio.h>
int main(){ 
    int count; 
    printf("\tThis is a \n"); 
    for(count = 1; count <=6 ; count++) {
        printf("\n\t\t nice"); 
    }
    printf("\n\t\t world.\n"); 
    return 0;
}

for循环示例2(阶乘,代码存在bug):

c 复制代码
#include <stdio.h>
int main(){
    int i,n; 
    long fact=1;
    printf("Input n: "); 
    scanf("%d", &n);
    for(i=2; i<=n; i++) 
    { 
        fact*=n;
    }
    printf("%d!=%ld\n",n,fact);
}

逗号运算符

  • 格式:exprn1, exprn2 ;
  • 逗号运算符优先级最低
  • 表达式被逗号运算符隔开,从左向右求值。但只有其最右端的表达式的结果,作为整个逗号表达式的结果
  • 通过在for循环中包含多个初始化表达式或增量表达式,可以丰富for循环中表达式

逗号运算符在for循环中使用示例:

c 复制代码
#include <stdio.h> 
int main() { 
    int i, j , max; 
    printf("Please enter the maximum value \n"); 
    printf("for which a table can be printed: "); 
    scanf("%d", &max); 
    for(i = 0 , j = max ; i <=max ; i++, j--) {
        /*初始化参数是i=0,j=max,再求值(增量)参数有两个表达式组成:i++,j--*/
        printf("\n%d + %d = %d",i, j, i + j); 
    }
    return 0;
}
for循环练习题

题目1:输入整数a,b(2≤a≤b),输出a,b区间内所有素数

输入示例:10 30

输出示例:11 13 17 19 23 29

题目2:绘制界面框

for循环其他应用

  • for循环三个表达式可以部分或者全部省略:for( ;num <100;)for( ; ; ; )
  • 使用for循环可以不包含任何循环体(语句),有助于提高某些算法的效率和创建时间延迟循环
c 复制代码
for(i=0;i<xyz_value;i++);

while循环

通用语法:

c 复制代码
while ( 表达式 ) 
{
    语句 ; 
}
  • 表达式一般为关系表达式或者逻辑表达式
  • 语句可以是空语句、一个简单的语句或语句块
  • 如果while循环中包含一组语句,必须用{}括起来
  • 只要条件为真循环就会迭代

while循环示例:

c 复制代码
#include <stdio.h> 
int main() 
{ 
    int count = 1; 
    while( count <= 10) 
    { 
        printf("\n This is iteration %d\n ",count); 
        count++; 
    } 
    printf("\n The loop is completed. \n "); 
    return 0;
}

和for循环一样,while循环在执行循环前检查条件。

do...while循环

通用语法,while后面的分号不能省略

c 复制代码
do
{
    语句;
}while (条件) ;
  • do...while 循环中,循环体中的代码在条件测试执行前执行一次
  • 条件为 False 时,do while 循环终止;控制权传递给紧跟在 while 语句之后的语句

do‑while示例:

c 复制代码
#include <stdio.h> 
int main () { 
    /*接受并显示一些整数,直到输入0(零),然后退出整个循环,并打印输入的整数的个数*/ 
    int num1, num2; 
    num2 = 0; 
    do { 
        printf("\nEnter a number: "); 
        scanf("%d",&num1); 
        printf(" No. is %d ",num1); 
        num2++; 
    } while (num1 != 0); 
    printf ("\nThe total numbers entered were %d ",--num2); 
    return 0; 
}
三个循环的区别和总结
  • whilefor语句:先判断循环控制条件;循环体可能一次也不执行。
  • do‑while语句:后判断循环控制条件;循环体至少也要执行一次。
  • 三种循环可以处理同一问题,一般情况可以互相代替。

选用的一般原则:

  1. 如果循环次数在执行循环体之前就已确定,一般用for语句;
  2. 如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do‑while语句。
  3. 当循环体至少执行一次时,用do‑while语句;反之,如果循环体可能一次也不执行时,用while语句。

PART.03 其他控制语句

其他控制语句:returnbreakgotocontinueexit()

return语句

  • return 语句用于从函数中返回
  • return 语句可以带有值,该值将返回给调用程序,它使执行返回到调用函数的位置
  • 一个函数中可以使用多个return语句,但是遇到第一个return语句时返回

通用语法:

c 复制代码
return expression;

goto语句

通用语法:

c 复制代码
goto label;
  • 需要在函数中某行代码处,定义一个标签
  • goto 语句将控制权传递给C程序中同一函数内的其他语句
  • 违背严格的结构化程序设计原则;降低程序可读性、可靠性,难以维护。

break语句

通用语法:

c 复制代码
break;
  • 用于在 switch 语句中终止case
  • 也可以用于在循环中突然终止循环
  • 当循环中遇到 break 语句时,循环立即终止,控制权传递给循环之后的语句
  • 多层循环中,break只向外跳一层

break语句示例:

c 复制代码
#include <stdio.h> 
int main () 
{ 
    int count1, count2; 
    for(count1 = 1, count2 = 0;count1 <=100;count1++) 
    { 
        printf(" Enter %d count2 : ",count1); 
        scanf("%d", &count2); 
        fflush(stdin);
        if(count2 == 100) break; 
    } 
    return 0;
}

continue语句

  • continue 语句,只能在循环中使用;让封闭循环进行下一次迭代
  • 遇到该语句时,跳过循环体中剩余的语句,控制权传递给重新初始化步骤
  • while循环和do...while循环中,程序控制权传递给条件测试语句
  • for循环中,continue影响循环的增量部分,然后执行条件测试

通用语法:

c 复制代码
continue;

exit语句

通用语法:

c 复制代码
exit(int return_code);
  • exit() 用于跳出一个程序
  • 是一个标准库函数
  • 该函数的用途是立即终止程序,控制权交给操作系统

PART.04 管理系统登录验证案例

功能:

  1. 绘制界面框
  2. 绘制界面元素
  3. 光标定位到用户名输入
  4. 用户名输入结束回车跳到密码输入
  5. 密码输入星号
  6. 实现简单的用户名和密码比较,假如只存在一个用户 (admin123456),进行校验,结果显示

物流管理系统登录界面示例

复制代码
用户名:lilei
密码:
******

光标定位函数(基于WINDOW系统)

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> 
#include <string.h>
//光标定位函数 
void gotoxy(int x, int y) {
	COORD coord;
	coord.X = x;
	coord.Y = y; 
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 
}
//绘制窗口函数
void drawWin(int row,int col){
	//画首行
	int i=0,j=0;
	printf("+");
	for(j=0;j<col;j++){
		printf("--");
	}
	printf("+\n");
	
	//画中间行
	for(i=0;i<row;i++){
		printf("|");
		for(j=0;j<col;j++){
			printf("  ");
		}
		printf("|\n");		
	}
	
	//画尾行
	printf("+");
	for(j=0;j<col;j++){
		printf("--");
	}
	printf("+\n");
}
int main(int argc, char *argv[]) {
	char name[10]={0};
	char passwd[10]={0};
	int flag=1;
	do{
		//1. 绘制窗口
		drawWin(12,15);
		//2. 显示窗口元素
		gotoxy(5,3);
		printf("物流管理系统管理界面");
		gotoxy(3,5);
		printf("用户名:");
		gotoxy(3,7);
		printf("密码:");
		//3. 光标定位用户名位置,让用户输入用户名,回车	
		gotoxy(12,5);
		scanf("%s",name);
		//4. 光标定位密码输入的位置,让用户输入密码,密码显示*,按下回车
		gotoxy(12,7);
		int i=0;
		while(1){
			char ch=getch();
			if(ch=='\r'){
				break;
			}
			//控制最多输入6位密码
			if(i < 6){
				putchar('*');
				passwd[i++] = ch;
			}
		}
		
		//5. 登录校验
		
		if(strcmp(name,"admin")==0)//==不能拿来比较字符串,strcmp,string.h
		{
			//判断密码
			if(strcmp(passwd,"123456")==0){
				gotoxy(10,9);
				printf("登录成功!\n");
				flag=0;
			}
			else{
				gotoxy(10,9);
				printf("密码错误!\n");
			}
		}
		else{
			gotoxy(10,9);
			printf("用户名错了!");
		}	
		Sleep(1500);
		system("cls");
		i=0;
		memset(passwd,'\0',sizeof(passwd));
	}while(flag);
	
			
	return 0;
}
相关推荐
Dovis(誓平步青云)37 分钟前
心情日记的安全编辑流程:输入校验、删除确认与状态回收
android·运维·服务器·开发语言·windows·安全
超爱西西鸭39 分钟前
ArkTS传感器开发:加速度计与数据监听
学习·华为·harmonyos·鸿蒙
存在morning39 分钟前
【PySpark 学习笔记 六】性能优化:分区、Shuffle、缓存与数据倾斜
笔记·学习·性能优化
我爱cope1 小时前
【计算机网络 | 网络层6:IPv4 数据报格式:TTL、分片、首部校验和分别有什么用?】
网络·学习·计算机网络
math_hongfan1 小时前
鸿蒙 ArkTS 国际化:多语言支持与资源管理
学习·华为·harmonyos·鸿蒙
落魄大学生之流水线上谋生计1 小时前
Python Literal[] 类型提示详解
开发语言·python
WongKyunban1 小时前
Go语言的简洁并发编程
开发语言·后端·golang
~kiss~1 小时前
Memory Agent System 之 主动式记忆体 Proactive Memory
学习
重生之后端学习1 小时前
438. 找到字符串中所有字母异位词[中等]✅
开发语言·数据结构·算法·leetcode·职场和发展