1.c语言中的语句分类
(1)表达式语句;(2)函数调用语句;(3)控制语句;(4)复合语句;(5)空语句。
2.c语言是结构化的程序语言通常分为
(1)顺序结构;(2)选择结构;(3)循环结构。
3.控制语句
用于控制程序的执行流程,以实现程序各种各样的结构方式,他们通常由特定的语句定义符组成,c语言共有九种控制语句,控制语句可分为以下三类:
(1)条件判断语句(或分支语句):if语句,switch语句;
if语句
//语法结构
//(1)
//if(表达式)
// 语句1;
//
//(2)
//if(表达式)
// 语句1;
//else
// 语句2;
//
//(3)
//if(表达式)
// 语句1;
//else if
// 语句2;
// …………
//else
// 语句n;
例子:
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d",a);
if(a >= 1 && a < 18) //if 或 else后默认只能控制一条语句,当条件成立需要执行多条语句的时候需要加{ },一对{ }括起来的也就一个代码块
{
printf("未成年");
printf("禁止饮酒");
}
else if(a >= 18 && a <= 28)
printf("青年");
else if(a > 28 && a <= 50)
printf("中年");
else if(a > 50 && a <= 60)
printf("壮年");
else
printf("老年");
return 0;
}
//悬空else
int main()
{
int a = 1;
int b = 2;
if(0 == a)
if(2 == b)
printf("hello");
else //else是和他最近的if匹配的
printf("see you");
return 0;
} //这个程序什么都不会打印
switch语句
switch(整型表达式)
{
语句项;
}
//语句项是一些case语句
case 整型常量表达式:
语句;
例子
#include<stdio.h>
//(1)
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期一");
break; //break操作符为跳出switch语句
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
}
return 0;
}
//(2)
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday");
break;
case 6:
case 7:
printf("weekend");
break;
default:
printf("输入有错误,请输入1-7之间的数字");
break;
}
return 0;
}
注:default子句的用法,当switch表达式的值并不匹配所有的case标签的值时,这个default子句后面的语句就会执行,并且每个switch语句中只能出现一条default子句。
(2)循环执行语句:do …while语句,while语句,for语句;
while语句:当条件满足的情况下,if语句后的语句执行,否则不执行;但在当条件满足的情况下if语句只会执行一次,然而while语句则会循环执行,直到条件为假跳出循环。
while(表达式)
{
循环语句;
}
例子
#include<stdio.h>
//(1)
int main()
{
int a = 1;
while(a <= 10)
{
printf("%d\t", a);
a++;
}
return 0;
}
//(2)
int main()
{
int a = 1;
while(a <= 10)
{
if(6 == a)
break;
printf("%d\t", a);
a++;
}
return 0;
}
//(3)
int main()
{
int a = 1;
while(a <= 10)
{
if(6 == a)
continue;
printf("%d\t", a);
a++;
}
return 0;
} //结果为1 2 3 4 5死循环
//(4)
int main()
{
int a = 1;
while(a <= 10)
{
a++;
if(6 == a)
continue;
printf("%d\t", a);
}
return 0;
} //结果为2 3 4 5 7 8 9 10 11
注:break在while中的作用是终止整个循环;continue执行的时候会跳过本次循环continue后面的代码,直接进入下一次的条件判断。
小练习:
#include<stdio.h>
int main()
{
int ch = getchar();
printf("%c\n", ch); //(1) 打印的是ch存储的字符
putchar(ch); //(2) 打印的也是ch存储的字符
return 0;
}
//getcahr函数的意思是获取一个字符,但是他是以ASCII值存储起来的所以存储类型为int类型
//(1)和(2)是两种不同的打印方式
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
{
putchar(a);
}
return 0;
}//这是一个无限循环的打印,如果想想停止打印ctrl+z即可
//检查这个程序时可以简单的表明putchar在打印的时候打印了两次,那是因为getchar获取字
//符时是在缓冲区获取的,也就是说getchar和键盘之间存在一个缓冲区,当我们输入一个字
//符时敲击以下回车就是字符+\n同时存入了缓冲区,当putchar拿去字符时第一次拿的是字符第二次拿
//的是\n,所以才会在打印的时候自动换行
//确认输入的密码是否正确
int main()
{
char password[20] = { 0 };
scanf("请输入密码:%s", password);
int ch = 0;
while ((ch = getchar()) != '\n') //这个循环的作用是清除缓存区中的内容
{
;
}
printf("请确认密码(Y/N):");
int ret = getchar();
if (ret == 'Y')
printf("输入正确");
else
printf("输入错误");
return 0;
}
//只打印数字字符
int main()
{
char ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue; //当打印字符的ASCII值在if的这个条件下时执行continue直接跳过,不在这个范围内时打印
putchar(ch);
printf("\n");
}
return 0;
}
for 语句:while语句进行循环的时候初始化,判断,调整三个部分的编写比较分散,然而for循环使得这三部分整合到了一起。
//语法
for(表达式1;表达式2;表达式3)
循环语句;
注:表达式1为初始化部分 ,用于初始化循环变量;表达式2为条件判断部分,用于判断循环时候终止;表达式3为调整部分,用于循环条件的调整。
例子
#include<stdio.h>
//(1)
int main()
{
int a = 0;
for (a = 1; a <= 10; a++)
{
printf("%d\n", a);
printf("打印的第%d次\n",a);
}
return 0;
}
//(2)
int main()
{
int a = 0;
for (a = 1; a <= 10; a++)
{
if(5 == a)
break;
printf("%d\n", a);
}
return 0;
} //打印结果为1 2 3 4,因为break为停掉当前整个循环
//(3)
int main()
{
int a = 0;
for (a = 1; a <= 10; a++)
{
if(5 == a)
continue;
printf("%d\n", a);
}
return 0;
}//打印结果为1 2 3 4 6 7 8 9 10,因为continue为停掉满足这个条件的当下这一次continue后面的循环
注:不可再for循环体内修改循环变量,防止for循环失去控制;建议for语句的循环控制变量的采取值采用前闭后开区间写法,如下:
int i = 0;
//前闭后开
for(i = 1; i < 10; i++) //这里可以说明进行了10次循环
{}
int i = 0;
//前闭后闭
for(i = 0; i <= 9; i++)
{}
一些for循环的变种:
#include<stdio.h>
int main()
{
for(;;)
{
printf("welcome\n");
}
return 0;
} //for循环的初始化部分,判断部分和调整部分是可以忽略的, 但像这个程序这样写就是一个死循环,因为for循环的判断部分省略意味着程序会恒成立
//判断下列两个程序各自这行几次
//(1)
int main()
{
int a = 0;
int b = 0;
for(a = 0; a < 5; a++)
{
for(b = 0; b < 5; b++)
{
printf("welcome\n");
}
}
return 0;
}
//(2)
int main()
{
int a = 0;
int b = 0;
for(; a < 5; a++)
{
for(; b < 5; b++)
{
printf("welcome\n");
}
}
return 0;
}
//答案在最后
//for采用多个变量来控制
int x, y;
for(x = 0, y = 0; x < 10 && y > 5; x++, y++)
{
printf("welcome")
}
do……while语句:至少循环一次。
do
循环语句;
while(表达式);
执行流程:
例子:
#include<stdio.h>
int main()
{
int a = 0;
do
{
printf("%d\n",a);
a++;
}
while(a <= 10);
return 0;
}
//break
int main()
{
int a = 0;
do
{
if(a == 6)
break;
printf("%d\n",a);
a++;
}
while(a <= 10);
return 0;
} //打印 1 2 3 4 5
//continue
int main()
{
int a = 0;
do
{
if(a == 6)
continue;
printf("%d\n",a);
a++;
}
while(a <= 10);
return 0;
} //打印 1 2 3 4 5死循环
int main()
{
int a = 0;
do
{
a++;
if(a == 6)
continue;
printf("%d\n",a);
}
while(a <= 10);
return 0;
} //打印 1 2 3 4 5 7 8 9 10 11
(3)转向语句:break语句,goto语句,continue语句,return语句。
goto语句:到指定位置去,当有多层包含的时候要比back好用。
again:
printf("…………")
goto again;
例子:
#include<stdio.h>
#include<stdlib.h> //是strcmp的头文件
#include<windows.h> //是system的头文件
int main()
{
char input[30] = { 0 };
system("shutdown -s -t 120"); //system为调用windows执行的库函数,shutdown -s -t 120是windows的一个关机命令,shutdown -s为关机指令,-t 120表示120后关机
again:
printf("请注意吗,马上关机,如需不要关机,请输入:你好\n");
scanf("%s", input);
if(strcmp(input, "你好") == 0) //两个字符串比较时用strcmp库函数
{
printf("输入正确");
system("shutdown -a"); //shutdown -a为取消这次关机
}
else
{
printf("输入错误,如需不关机请重新输入");
goto again;
}
return 0;
}