一、基础概念
1、语句
表达式后面加上分号,构成表达式语句。特殊情况为只有1个分号的语句,称空语句。
2、语句分类
(1)空语句:本身只有一个分号,在不需要执行任何任务,但语法要求出现一条完整的语句时使用。
(2)表达式语句:如:x=y+3;
(3)控制语句,包括选择语句和循环语句。
二、选择语句(分支语句)
分类:if语句和switch语句
1、 if语句
(1) 分类
① if(单分支);
② if(expression) …else…(双分支)
③ if … else if … (else if) …else(多分支)
if (表达式1) {
当表达式1为真(值非零)时执行的语句;
}
else if (表达式2) {
当表达式2为真(值非零)时执行的语句;
}
…
else {
当表达式1-N都不为真时执行的语句;
}
expression可以是任何能够产生整型结果的表达式,零值表示”假”,非零值表示”真”。C语言中不具备布尔类型。
if只能出现1次,else if可以出现0-N次,else可以出现0-1次。
如果{}中只有一条语句,或者一个独立的控制结构,那么可以省略该{}。
else和else if总是和最近的if配对。
(2)if语句用法
①单分支if语句
#include <stdio.h>
int main()
{
int i=0;//--i=1
if(i)//条件表达式,条件为真(非0),则执行,假(0)则不执行
{
printf("1111\n");
}
return 0;
}
②双分支if语句
#include <stdio.h>
int main()
{
int iNum=0;
while(1)//"1"为真,重复执行,非0即真
{
printf("请输入一个数\n");
scanf("%d",&iNum);
//条件判断
if(0==iNum%2)
{
printf("%d是偶数\n",iNum);
}
else
{
printf("%d是奇数\n",iNum);
}
}
return 0;
}
③多分支if语句
#include <stdio.h>
int main()
{
int i;
while(1)
{
printf("请输入成绩\n");
scanf("%d",&i);
if(i>90)
{
printf("成绩为A\n");
}
else if(i<=90 && i>80)
{
printf("成绩为B\n");
}
else if(i<=80 && i>70)
{
printf("成绩为C\n");
}
else
{
printf("成绩D\n");
}
}
return 0;
}
2、switch case 语句
(1)概念
switch 语句是一种多路判定语句,它判断表达式的值是否与整数或字符常量列表中的某个值相匹配,若找到了相应的匹配,就会执行与常量关联的语句, 遇到break语句终止执行。不符合case语句就执行default后的语句,同样遇到break语句终止执行。default子句可以出现在语句列表的任何位置,通常放在列表末尾。
执行过程:首先计算switch(表达式)中表达式的值,然后当case后不加break;时,程序执行case标签与表达式值匹配的语句,并从该条case语句开始,一直执行直至语句列表结束;当case后加上break;时,执行完case标签与表达式值匹配的语句后,程序跳到语句列表的末尾,即跳出switch语句。
(2)编写格式
switch(表达式)
{
case 1:
{
语句集;
}
break;
case 2:
{...}break;
default:
{
语句集;
}
break;
}
控制表达式被当做整数处理,可以是字符,但是不能是浮点数和字符串。常量表达式必须是常量,如:3、‘A’、2+5。不允许有重复的分支。
default不一定在最后,但是如果default出现在其它case之前,其最后的break不能省略。
一般而言所有能够使用switch-case结构的场合都可以用if-else替代。
(3)示例
根据输入成绩并输出分数等级 >90:A ; >=90>80:B ; >=80>70:C; >=70>60:D;其他:不合格
#include <stdio.h>
int main()
{
int iscore;
while(1)
{
printf("请输入成绩\n");
scanf("%d",&iscore);
switch(iscore/10)
{
case 9:
{
printf("A\n");
}
break;
case 8:
{
printf("B");
}
break;
case 7:
{
printf("C");
}
break;
case 6:
{
printf("D");
}
break;
default:
{
printf("不合格");
}
}
}
return 0;
}
(4)注解
1)计算表达式的数据类型要与指定的case常量的数据类型匹配。
2)switch后的表达式可以包含任何变量名,也可以是常量,但结果必须是整型值。
3)case后面只能是常量(整型和字符型)。
(5)If和switch区别
If:范围性判断(线判断),条件的计算是自顶向下
switch:状态性判断(点判断)
三、循环语句
分类:for循环、while循环、do…while循环
1、for语句
(1) 编写格式
for(初始值;终止值;步长)
{
语句集;
}
S1:初始值为循环变量的初始值;
S2:终止值为循环条件,若为真则执行循环体语句块,否则退出循环;
S3:步长修改/调整循环变量的值。
程序执行过程流程图:
初始值在循环最开始时执行一次,之后不再执行初始值。第一次执行完初始值后,执行for循环里面的语句,然后执行步长,接着终止值作判断,满足条件,直接执行for循环里面的语句,不满足条件则跳出for循环;然后再执行步长(调整部分),如此循环,直到终止值判断不满足条件跳出for循环。
在for语句中,continue跳过循环体的剩余部分,直接回到调整部分。continue -> 步长 -> 终止值。
在while/do-while语句中,调整部分是循环体的一部分,所以continue将会把它也跳过。continue -> 计算循环控制表达式 -> …。
(2)示例
//绘制九九乘法表
#include <stdio.h>
int main()
{
int i,j;
for(j=1;j<10;j++)
{
for(i=1;i<=j;i++)
{
printf("%d×%d=%d\t",i,j,i*j);
}
printf("\n");
}
return 0;
}
(3)注解
for嵌套使用,可以实现画界面效果。
2、while语句
(1)while(表达式)//表达式为真,才执行语句
{
语句集;
}
–重复执行,有可能执行不到
S1:计算循环控制表达式,若为真则执行循环体语句块,否则退出循环;
S2:执行循环体语句块后,执行S1。
1)如果循环控制表达式恒为真,则构成无限循环;//break,return
2)while循环的循环体可能一次都不执行。
(2)do
{
语句集;
}while(条件表达式);
–至少执行一次,条件满足继续执行,直到条件为假,结束程序。(当型循环)
S1:执行循环体语句块;
S2:计算循环控制表达式,若为真则执行S1,否则退出循环。
(3)示例
1)重复执行,按esc退出
#include <stdio.h>
int main()
{
char ch=0;
int i=0;
while(1)
{
printf("111\n");
ch=getch();
if(27==ch)//27为esc的ASCII码
{
break;//若输出为esc,则退出
}
}
return 0;
}
2)重复执行,按y再回车,进行下一步,按n退出
#include <stdio.h>
int main()
{
char ch='y';
while(ch=='y')//while中可以是常量也可以是变量也可以是表达式
{
printf("111\n");
ch=getch();
if('n'==ch) //若输入为n,则退出
{
break;
}
}
return 0;
}
3)至少执行一次,直到条件不满足结束循环。
#include <stdio.h>
int main()
{
int i=0;
do
{
printf("111");
}while(1);
return 0;
}
(4)for和while区别:
while和for语句的循环体可能一次也不执行,而do-while语句的循环体至少也要执行一次。
for:范围条件限定(循环次数)已知 while:循环条件未知
for( ;1 ;) ;相当于while(1) ;
四、其它控制语句
break; continue; goto; return;exit等
1、break语句和continue语句
(1) break语句概念
1)用于在 switch 语句中终止case,也可用于循环中突然终止循环
2)当循环中遇到 break 语句时,循环立即终止,控制权传递给循环之后的语句
3)多层循环中,break只向外跳一层
(2) continue语句概念
1)只能在循环中使用让封闭循环进行下一次迭代
2)遇到该语句时,跳过循环体中剩余的语句,控制权传递给重新初始化步骤
3)在while循环和do…while循环中,程序控制权传递给条件测试语句
4)在for循环中,continue影响循环的增量部分,然后执行条件测试
(3)示例
1)break在前,continue在后
#include <stdio.h>
int main()
{
int i;
for(i=0;i<10;i++)
{
if(i==2)
{
break; //结束for循环
}
if(i==4)
{
continue;
}
printf("%d\n",i);
}
return 0;
}//运行输出 0 1
2)continue在前,break在后
#include <stdio.h>
int main()
{
int i;
for(i=0;i<10;i++)
{
if(i==2)
{
continue;//结束当前循环,进入下一次循环
}
if(i==4)
{
break;
}
printf("%d\n",i);
}
return 0;
}//运行输出 0 1 3
break和continue两条语句中的任意一条出现在嵌套的循环内部,只会对最内层的循环起作用,无法对外层循环起作用。
2、goto语句
goto 语句将控制权传递给C程序中同一函数内的其他语句。
C语言是结构化语言,顺序较为严谨,故一般不用goto,会破坏结构体。
3、return语句
(1)编写格式:return expression;
(2)使用
1)表达式可选
2)return 语句用于从函数中返回
3)return 语句可带有值,该值将返回给调用程序,该语句使程序执行返回到调用函数的位置。
4)一个函数中可以使用多个return语句,但是遇到第一个return语句时返回
4、exit语句:结束函数
(1)编写格式:exit(int return_code);
(2)使用
1)exit() 用于跳出一个程序,是一个标准库函数
2)该函数的用途是立即终止程序,控制权交给操作系统
注:基于代码规范,各控制语句无论几行,都应加{}。
五、控制语句应用
1、输入一个合法的正整数,求出它是几位数;分别打印每一位数字,按逆序输出各位上的数字。
#include <stdio.h>
int main()
{
int i,j,x,n=0;//定义i为输入变量,n为正整数位数
while(1)
{
printf("请输入一个正整数\n");
scanf("%d",&i);//输入一个正整数
x=i; //x作为备用变量,值等于i初值
//输出正整数位数
do
{
n++;
i/=10;
}while(i>0);
printf("%d是%d位数\n",x,n);
//逆序输出
while(x!=0)
{
j=x%10;//最小位
printf("%d\n",j);//输出最小位
x/=10;
}
}
return 0;
}
2、求1到10的阶乘和。
#include <stdio.h>
int main()
{
int i,n,total=0,sum;//定义sum为阶乘变量,total为阶乘和变量
while(1)
{
printf("请输入一个正整数\n");
scanf("%d",&n);//输入一个正整数n
for(i=1,sum=1;i<=n;i++)
{
sum *= i;//递推求阶乘
total+=sum;//求阶乘和
}
printf("sum=%d\n",sum);//输出n的阶乘
printf("total=%d\n",total);//输出阶乘和
}
return 0;
}
3、密码显示
#include <stdio.h>
#include <conio.h>
int main()
{
char buf[100]={0};
char ch=0;//保存当前字符
int ilent=0;//当前字符串长度
int iMax=6;//限定输出最大长度
int type=0;//0数字 1字母
int isplant=1;//0 显示 1 隐藏
while(1)
{
ch=getch();
if(ch=='\r')//回车结束
{
buf[ilent]='\0';
break;
}
if(ch=='\b')//回删
{
if(ilent>0)//长度大于0
{
printf("\b \b");//删除
--ilent;//光标回退
buf[ilent]='\0';
}
}
if(ilent<iMax && ch!='\b')//限定输入长度
{
switch(type)
{
case 0:
{
if(ch>='0' && ch<='9')//数值型字符
{
if(isplant)
{
putchar('*');
}
else
{
putchar(ch);//打印输出
}
}
}
break;
}
buf[ilent]=ch;//存入数组
ilent++;
}
}
printf("\n");
printf("buf=%s\n",buf);//输出传入的字符串
return 0;
}
运行输出:
输入:123456
4、猜数字游戏设计
#include <stdio.h>
#include <time.h>//time的头文件
#include <stdlib.h>//rand,irand的头文件
int main()
{
int i;
int irand=0;//随机数变量
srand(time(0));//设置时间种子
while(1)
{
irand=rand()%100+1;//irand=rand();->为伪随机 i%4->:0,1,2,3,
//以上为随机生成一个0到100的数
printf("请输入一个数\n");
scanf("%d",&i);
printf("irand=%d",irand);
//以上为2、输入一个数
if(i>irand)
{
printf(" 大\n");
}
else if(i<irand)
{
printf(" 小\n");
}
else
{
printf("win\n");//以上为4.游戏结束
exit(0);//结束函数
}
//以上为判断(3种情况:大于,等于,小于)
}
return 0; //结束程序
}
输出:
编辑 2020-04-20 21:03
增改 2020-10-11 11:59 增加控制语句应用部分
修改 2021-07-02 22:32 内容结构修改
注:本文旨于作为自己的学习笔记,不作他用。