
控制语句与循环逻辑
学习目标
- if/switch控制语句
- for/while循环语句
- 其他语句
- 登录控制输入案例
PART.01 if/switch控制语句
选择结构
- 选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。
- 示例:为了判断一个数是偶数还是奇数,执行如下操作:
接受一个数 → 用这个数除以 2 后的余数- 余数为0 → 偶数
- 余数不为0 → 奇数
C语言支持两种选择语句:
- if语句:单分支选择、双分支选择、多重选择
- 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 语句是一种多路判定语句,它判断表达式的值是否与整数或字符常量列表中的某个值相匹配
- 若找到了相应的匹配,就会执行与常量关联的语句
switch、case、和default都是关键字,语句可以是简单或复合语句。- switch后的表达式需要用圆括号括起来,而且switch语句的主题用
{}括起来 - 计算表达式的数据类型要与指定的case常量的数据类型匹配。
- switch后的表达式可以包含任何变量名,也可以是常量。
- case后面只能是常量(整型和字符型)。
通用语法:
c
switch(a) {
case 常量1:
语句集;
break;
case 常量2:
语句集;
break;
default:
语句集;
break;
}
switch语句执行过程
- 计算表达式的值
- 与case的值比较
- 匹配:执行相匹配的case标记后的语句
- 不匹配:执行default后的语句
- 遇到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种类型
- for 循环
- while 循环
- do...while 循环
for循环
通用语法:分号 ; 不能省略
c
for(初始化计数 ; 条件测试 ; 再求值参数)
{
语句;
}
- 初始化计数:一个赋值语句,它在进入循环前设置循环控制变量
- 条件测试:一个关系表达式,它决定何时退出循环
- 再求值参数:定义每次执行循环时,循环控制变量如何变化
- for 循环的三个部分必须用分号
;隔开 - 组成循环体的语句可以是单个语句,也可以是复合语句
要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环的条件和控制变量的更新。
工作原理:
- 初始化计数,给循环变量赋初始值。
- 条件测试,求值结果为 true,就执行循环体内的代码执行。当条件变为 false时退出循环,程序将继续执行 for 循环后面的语句
- 循环变量变化计算
- 重复第二步条件测试
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;
}
三个循环的区别和总结
while和for语句:先判断循环控制条件;循环体可能一次也不执行。do‑while语句:后判断循环控制条件;循环体至少也要执行一次。- 三种循环可以处理同一问题,一般情况可以互相代替。
选用的一般原则:
- 如果循环次数在执行循环体之前就已确定,一般用
for语句; - 如果循环次数是根据循环体的执行情况确定的,一般用
while语句或者do‑while语句。 - 当循环体至少执行一次时,用
do‑while语句;反之,如果循环体可能一次也不执行时,用while语句。
PART.03 其他控制语句
其他控制语句:return、break、goto、continue、exit()
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 管理系统登录验证案例
功能:
- 绘制界面框
- 绘制界面元素
- 光标定位到用户名输入
- 用户名输入结束回车跳到密码输入
- 密码输入星号
- 实现简单的用户名和密码比较,假如只存在一个用户 (
admin,123456),进行校验,结果显示
物流管理系统登录界面示例
用户名: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;
}