分支语句
- if else
- switch
循环语句
- while
- for
- do while
goto语句
文章目录
- 1.什么是语句
- 2.分支语句(选择结构)
- 2.1 if语句
- 2.1.1 悬空else
- 2.1.3 练习
- 2.2 switch语句
- 2.2.1 在switch语句中的break
- 2.2.2 default子句
- 3.循环语句
- 3.1 while循环
- 3.1.1 while语句中的break和continue
- 3.2 for循环
- 3.2.1 语法
- 3.2.2 break和continue在for循环中
- 3.2.3 for语句的循环控制变量
- 3.2.4 一些for循环的变种
- 3.2.5 试题
- 3.3 do...while()循环
- 3.3.1 do...while()循环语法
- 3.3.2 执行流程
- 3.3.3 do语句的特点
- 3.3.4 do while 循环中的break和continue
- 3.4 习题
- 3.4.3 猜数字游戏
- 4.goto语句
1.什么是语句
在C语言当中语句可以分为以下5类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句符号符组成,C语言有9种控制语句:
1.条件判断语句也叫分支语句:if else 语句 switch语句
2.循环执行语句:for语句 while语句 do while语句
3.转向语句:break语句 continue语句 return语句 goto语句
2.分支语句(选择结构)
这样吧,你先在steam搜索“千恋*万花”点击购买安装好后立即运行打开千恋万花,在主页面点击开始游戏进入游戏页面,然后依次选择“说实话”、“不好说”、“觉得很可爱”、“单独行动”、“摸摸头”、“有点担心”和“安抚”进入丛雨路线
没错,galgame中的选项就是选择语句。
达成对应的条件后就进入对应的结果。
2.1 if语句
if语句的语法结构
//单分支
if(exp1)
语句;
//双分支
if(exp1)
语句1;
else
语句2;
//多分支
if(exp1)
语句1;
else if(exp2)
语句2;
else
语句3;
实例演示:
//代码1
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("已成年\n");
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("青少年\n");
}
else if(age>=18&&age<30)
{
printf("青年\n");
}
else if(age>=30&&age<60)
{
printf("中年\n");
}
else if(age>=60&&age<80)
{
printf("老年\n");
}
else
{
printf("寿星\n");
}
return 0;
}
在C语言中0表示假,非0表示真
值得注意的是:If只能管理后面一条语句,所有我们要多用{}进行匹配,防止使人误解.
{}就是一个代码块。
2.1.1 悬空else
看下面这个代码:
#include <stdio.h>
int main()
{
int a = 0;
if(a)
if(a==0)
printf("hello\n");
else
printf("hi\n");
return 0;
}
你觉得会打印什么呢?
答案是:什么都不打印,这里的else是和第二个if进行匹配的。
为了避免这种情况,我们要让代码好好对齐或者加入{}来避免误解
//代码对齐
#include <stdio.h>
int main()
{
int a = 0;
if(a)
if(a==0)
printf("hello\n");
else
printf("hi\n");
return 0;
}
//利用{}
#include <stdio.h>
int main()
{
int a = 0;
if(a)
{
if(a==0)
printf("hello\n");
else
printf("hi\n");
}
return 0;
}
else的匹配:else是和离他最近的if匹配的
2.1.3 练习
1.判断一个数是否是奇数。
2.输出1~100之间的奇数。
//1.判断一个数是否是奇数。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a%2==1)
{
printf("是奇数!\n");
}
else
{
printf("不是奇数!\n");
}
return 0;
}
//2.2.输出1~100之间的奇数。
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=100)
{
if(i%2==1)
{
printf("%d ",i);
}
++i;
}
return 0;
}
//方法2
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=100)
{
printf("%d ",i);
i+=2;
}
return 0;
}
2.2 switch语句
switch语句也是一种分支语句,常常用于多分支的情况。
switch(整型表达式)
{
case 整型常量表达式://case是整型常量表达式 也可以是char 因为底层为ASCII码也算
语句;
}
比如,让你根据数字输出对应的星期。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期日\n");
}
return 0;
}
//当我们输入5时
/*
打印结果:
星期五
星期六
星期日
*/
这是为什么呢?因为在switch中我们只有利用了break才能实现真正的分支。
2.2.1 在switch语句中的break
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
}
return 0;
}
//当我们输入5时
/*
打印结果:
星期五
*/
break语句的实际效果是把语句列表划分为不同的分支部分。
思考:如果有人在这个程序运行时输入8会怎么样?
2.2.2 default子句
答案:当输入的值与所有case都不匹配时,就直接退出switch,然后继续程序。
但是如果你不想要忽略不匹配这种情况。
你可以在语句列表中增加一个default子句。
可以写在任何一个case标签可以出现的位置,switch里面的判断可以没有顺序。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("输入错误!\n");
break;//建议加上
}
return 0;
}
switch允许嵌套使用。
3.循环语句
- while
- for
- do while
简单的循环结构
3.1 while循环
while(条件)
语句;
当条件满足时,循环就会执行下去。
while语句执行流程:
打印1-10数字
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=10)
{
printf("%d ",i);
i++;
}
return 0;
}
//打印结果
//1 2 3 4 5 6 7 8 9 10
3.1.1 while语句中的break和continue
break介绍
在循环中只要执行了break,就会直接终止循环,直接跳出循环体。
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=10)
{
if(i==5)
break;
printf("%d ",i);
i++;
}
return 0;
}
//打印结果
//1 2 3 4
continue介绍
continue是用来终止本次循环的,也就是本次循环中continue后面的代码不会执行,
而是直接跳转到while语句的判断部分。进入下一次循环。
//代码1
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=10)
{
if(i==5)
continue;
printf("%d ",i);
i++;
}
return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....
//代码2
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=10)
{
i++;
if(i==5)
continue;
printf("%d ",i);
}
return 0;
}
//打印结果
//2 3 4 6 7 8 9 10
3.2 for循环
了解完while循环后,for可以说是while的整合。
3.2.1 语法
for(expr1;expr2;expr3)
循环语句;
exp1
为初始化部分,用来初始化循环变量的。
exp2
为条件判断部分,用于判断循环终止的
exp3
为调整部分,用于循环条件的调整。
打印1-10
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1;i<=10;++i)
{
printf("%d ",i);
}
return 0;
}
//打印结果:1 2 3 4 5 6 7 8 9 10
//代码2
#include <stdio.h>
int main()
{
for(int i = 1;i<=10;++i)//在里面初始化是c++里的写法,但在c99标准后引入
{
printf("%d ",i);
}
return 0;
}
//打印结果:1 2 3 4 5 6 7 8 9 10
for执行流程图
for与while循环的对比
#include <stdio.h>
int main()
{
int i = 0;
while(i<=10)
{
printf("%d ",i);
++i;
}
for(i = 1;i<=10;++i)
{
printf("%d ",i);
}
return 0;
}
循环的3个必要条件,无论是while循环还是for都是有的,但是while的三部分比较分散。
查找修改就不够集中于方便,对此,for循环的风格更胜一筹。
3.2.2 break和continue在for循环中
可以发现的是,在for和在while循环里面是没有特别大区别的,但由于for独特的执行调整步骤和while还是略有差异
//continue在while
#include <stdio.h>
int main()
{
//利用while循环
int i = 1;
while(i<=10)
{
if(i==5)
continue;
printf("%d ",i);
i++;
}
return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....
//continue在for循环
#include <stdio.h>
int main()
{
//利用for循环
int i = 1;
for(i = 1;i<=10;++i)
{
if(i==5)
continue;
printf("%d ",i);
}
return 0;
}
//打印结果
//1 2 3 4 6 7 8 9 10
for循环里的continue在跳过本次循环时,是无法跳过for()中的调整语句的。
3.2.3 for语句的循环控制变量
建议(不是必须):
1.不要在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环变量的取值采用 前闭后开区间的写法
int i = 0;
//前闭后开
for(i = 0;i<10;++i)
{}
//前闭后闭
for(i = 0;i<=9;++i)
{}
3.2.4 一些for循环的变种
#include <stdio.h>
int main()
{
//利用for循环
int i = 1;
for(;;)//for省略判断即为判断恒为真
{
printf("hello\n");
}
//代码2
int i = 0;
int j = 0;
//打印多少个hello呢?
for(i = 0;i<10;++i)
{
for(j = 0;j<10;++j)
{
printf("hello\n");
}
}
//100个
//代码3
int i = 0;
int j = 0;
//打印多少个hello呢?
for(;i<10;++i)
{
for(;j<10;++j)
{
printf("hello\n");
}
}
//10个
//代码4
int x,y;
for(x = 0,y = 0;x<2&&y<5;++x,++y)//使用多个变量控制循环
{
printf("hello\n");
}
return 0;
}
//打印结果
//hello hello hello...
3.2.5 试题
//循环多少次
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0,k = 0;k=0;++i,++k)
k++;
return 0;
}
//0次
3.3 do…while()循环
3.3.1 do…while()循环语法
do
{
循环语句;
}while(表达式);
3.3.2 执行流程
3.3.3 do语句的特点
循环至少执行一次,使用场景有限,不常使用。
打印1-10
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
++i;
}while(i<=10);
return 0;
}
// 打印结果:
//1 2 3 4 5 6 7 8 9 10
3.3.4 do while 循环中的break和continue
//代码1
#include <stdio.h>
int main()
{
int i = 10;
do
{
if(i == 5)
break;
printf("%d ",i);
}while(i<10);
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 10;
do
{
if(i == 5)
continue;
printf("%d ",i);
}while(i<10);
return 0;
}
3.4 习题
1.计算n的阶乘
2.计算1!+2!+…+10!
3.在一个有序数组中查找具体某个数n
4.编写代码,演示多个字符从两端移动,向中间汇聚。
//1.
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
int ret = 1;
for(int i = 1;i<=n)
{
ret*=i;
}
printf("%d\n",ret);
return 0;
}
//2.1
#include <stdio.h>
int main()
{
int sum = 0;
for(int n = 1;n<=10;++n)
{
int ret = 1;
for(int i = 1;i<=n;++i)
{
ret*=i;
}
sum+=ret;
}
printf("%d\n",sum);
return 0;
}
//2.2
#include <stdio.h>
int main()
{
int sum = 0;
int ret = 1;
for(int n = 1;n<=10;++n)
{
ret *= n;
sum+=ret;
}
printf("%d\n",sum);
return 0;
}
//3.1
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int x = 0;
scanf("%d",&x);
for(int i = 0;i<10;++i)
{
if(x==arr[i])
{
printf("找到了,下标为%d\n",i);
break;
}
}
if(i==10)
{
printf("没找到!\n");
}
return 0;
}
//3.2二分查找
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int x = 0;
scanf("%d",&x);
int left = 0,right = 9;
int flag = 0;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]==x)
{
printf("找到了,下标为%d\n",mid);
flag = 1;
break;
}
else if(arr[mid]<x)
{
left = mid+1;
}
else
{
right = mid-1;
}
}
if(flag == 0)
{
printf("找不到!\n");
}
return 0;
}
//4
#include <stdio.h>
int main()
{
char arr1[] = "hello world!";
char arr2[] = "************";
int n = sizeof(arr1);
int left = 0;
int right = n - 1;
for (left = 0, right = n - 1; left <= right; ++left, --right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
}
return 0;
}
3.4.3 猜数字游戏
学以上的内容,我们可以写一个简单的猜谜游戏
#include <stdio.h>
#include <stdlib.h>//srand和rand的头文件
#include <time.h>//time的头文件
void menu()
{
printf("**********************\n");
printf("*****1.paly***********\n");
printf("*****0.exit***********\n");
printf("**********************\n");
}
void game()
{
int r = rand() % 100 + 1;//rand可以产生随机数,但因为rand的随机数是根据srand所提供的种子生成,所以我们还要使用srand,但是由由于srand所提供的种子也要输入数字才可以生成,为此我在使用了time函数生成当前时间的时间戳数来充当输入的数字,以达到rand生成随机数的效果。
int guess = 0;//玩家要猜测的数
printf("游戏开始\n");
while (1)//直到猜中
{
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜中了!\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do//进入循环
{
menu();//打印菜单
printf("请选择_>");//提示信息
scanf("%d", &input);//根据提示选择进入还是退出
//根据输入进入相应区域,用到多分支语句switch
switch (input)
{
case 1:
game();//进入游戏
break;
case 0:
printf("已退出游戏!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input);
}
4.goto语句
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上来讲goto语句是没有必要的,实际中没有goto语句也可以很容易的写成代码。
但是在某些场合下goto语句还是用的着的,最常见的用法就是终止某些深层嵌套的结构。
例如一次性跳出多层循环。
多重循环下使用break是达不到目的的,break只能从最内层循环退出到上一层循环。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
if(disaster)
//处理错误情况
大部分部分使用goto的情况是可以利用循环代替的。
//代码1
#include <stdio.h>
int main()
{
again:
//...
if(...)
{
//...
break;
}
else
{
goto again;
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
while(1)
{
if(...)
{
//...
break;
}
}
return 0;
}
完