分支语句和循环语句

分支语句

  • if
  • switch

循环语句

  • while
  • for
  • do while

goto语句

1. 什么是语句

C语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,C语言有九种控制语句。

可分为以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句;

C语言是结构化的语言,分为三类:顺序结构、选择结构、循环结构。

2. 分支语句(选择结构)

2.1 if语句

语法结构:
//单分支
if(表达式)
    语句;

//双分支
if(表达式)
    语句1;
else
    语句2;

//多分支
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

C语言中0表示假,非零表示真。

如果条件成立,要执行多条语句,则应该使用代码块。(即大括号)

#include 
int main()
{
    if(表达式)
    {
        表达列表1;
    }
    else
    {
        表达列表2;
    }
    return 0;
}

if(num==5) 可以通过写成 if(5==num) 的方式,防止出现 if(num=5) 的错误。

2.2 switch语句

2.2.1 语法结构

switch(整形表达式)
{
    语句项;
}

什么是语句项

是一些case语句:
case 整型常量表达式
     语句;
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:						//整型常量表达式
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期7\n");
		break;
	}
	return 0;
}

2.2.2 default子句

如果表达的值与所有的case值都不符合,default子句后面的语句就会执行。所以,每个switch语句中只会出现一条default子句。

3. 循环语句(循环结构)

3.1 while语句

语法结构:
while(表达式)
    循环语句;
int main()
{
	int i = 0;
	while (i < 10)
	{
		if (5 == i) break;		//等于五的时候直接跳出循环,不打印5
		printf("%d hehe\n",i);
		i++;
	}
	return 0;
}

break直接跳出本循环,不会影响if语句。

int main()
{
	int i2 = 0;
	while (i2 < 10)
	{
		i2++;
		if (i2 == 5) continue;        //跳过本轮循环继续下一次循环
		printf("%d hehe\n", i2);
	}
	return 0;
}

continue跳过本轮循环继续后续循环。

int main()
{
	//举个例子
	//假设密码是一个字符串
	char password[20] = { 0 };
	printf("请输入密码");
	scanf("%s", password);            //password前不加&
	int ch3 = 0;
	while ((ch3=getchar())!='\n')
	{
		continue;
	}
	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if ('Y' == ret)
		printf("YES\n");
	else
		printf("N\n");

	return 0;
}

在使用scanf和getchar获取输入字符串时,会从输入缓冲区中获取,当scanf获取密码时,缓冲区中会留下\n没有被取走,下一次的getchar会直接获取\n。

所以需要通过while循环将输入缓冲区中的字符清空。

当字符以int类型储存到变量中时,是以ASCII码值的方式储存的。当int类型以char类型打印时,也是以ASCII码表转换后打印出来的。

字符类型可以通过比较ASCII大小的方式比较大小。

scanf("%4d%2d%2d", &year,&month,&day);                  //scanf输入中,%2d表示获取两位整数

printf("month=%02d\n", month);                          //printf输出中,%02d表示输出两位整数,不满两位前面会用0扩充

printf("NO.%d is %.2f,%.2f,%.2f", id, c, math, eng);    //%.2f表示输出的浮点数小数点后保留两位

scanf("%d;%f,%f,%f", &id, &c, &math, &eng);             //以分号、逗号、逗号、逗号的方式隔开输入的四个字符

3.2 for语句

语法结构:
for(表达式1;表达式2;表达式3)
    循环语句;

表达式1为初始化部分,用于初始化循环变量的。

表达式2为条件判断部分,用于判断循环时候终止。

表达式3为调整部分,用于循环条件的调整。

int main()
{
	for (int i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;			//i等于5的时候跳出循环,不会打印5
		printf("%d ", i);
	}
	return 0;
}

建议:

  1. 不可在for循环体内修改循环变量,防止for循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i=0;

//前闭后开写法
for(i=0;i<10:i++)
{}

//前闭后闭写法
for(i=0;i<=9;i++)
{}

for(int i=0;i<10;i++){} 的写法可能不支持C99的编译器会报错。

3.3 do while语句

语法结构:
do
    循环语句;
while(表达式);

循环至少执行一次,使用的场景有限,所以不是经常使用。

3.4 练习

//打印阶乘
#include

int main()
{
	int n = 0;
	scanf("%d", &n);            //输入整型
	int ret = 1;                //输出的阶乘
	for (int i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);

	return 0;
}
//打印阶乘之和
#include

int main()
{
	int n = 0;
	scanf("%d", &n);                //输入整型
	int sum = 0;                    //输出和
	int ret = 1;                    //输出阶乘
	for (int i = 1; i <= n; i++) 
    {
		ret = 1;                    //注意:阶乘记得初始成1
		for (int j = 1; j <= i; j++)
		{
			ret *= j;               //阶乘计算
		}
		sum += ret;                 //阶乘之和计算
	}
	printf("%d\n", sum);

	return 0;
}
//打印阶乘之和2
#include

int main()
{
	int n = 0;
	scanf("%d", &n);            //输入整型
	int ret2 = 1;               //输出阶乘
	int sum2 = 0;               //输出和
	for (int i = 1; i <= n; i++)
	{
		ret2 *= i;              //阶乘计算
		sum2 += ret2;           //阶乘之和计算
	}
	printf("%d\n", sum2);
	return 0;
}
#include

int main()
{
	//二分查找
    int arr[] = { 1,2,3,4,5,6,7,8,9 };    //查找数组
	int k = 6;                            //查找数字
	int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
	int left = 0;                         //左编号
	int right = sz - 1;                   //右编号
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}
//字幕两边滚动
#include
#include    //vs2022可省略
#include     //vs2022可省略

int main()
{
	char arr1[] = "welcome to bit!!!!";
    char arr2[] = "##################";
    int n1 = 0;
    while (n1 <= (strlen(arr1)-1) / 2)		//字符串用sizeof结尾会多算一个\0,所以此处用strlen
    {
	    arr2[n1] = arr1[n1];
	    arr2[strlen(arr1)-1 - n1] = arr1[strlen(arr1)-1 - n1];
	    printf("%s\n", arr2);
	    Sleep(1000);						//延后1000毫秒
	    system("cls");						//system是一个库函数,可以执行系统命令,这里执行的是cls清空屏幕的命令
	    n1++;
    }
    printf("%s\n", arr2);
    return 0;
}
#include
#include    //vs2022可省略

int main()
{
	//模拟用户登录,最多输错三次
	//比较两个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
	//如果返回值是0,表示2个字符串相等
	int i = 0;
	char password[20] = { 0 };
	printf("请输入密码\n");
	for (i = 0; i < 3; i3++)
	{
		scanf("%s", password);            //数组本身就是地址,不需要加&
		if (strcmp(password, "abcdef") == 0)
		{
			printf("登陆成功\n");
			break;
		}
		printf("输入错误\n");
	}
	if (i >= 3)
	{
		printf("输入三次,登陆失败");
	}
	return 0;
}
//猜数字游戏
#include
#include
#include

void Menu()
{
	printf("********************************\n");
	printf("**********   1.play   **********\n");
	printf("**********   0.exit   **********\n");
	printf("********************************\n");
}

void Game()
{
	int guess = 0;
	int ret = rand()%100+1;			//设置随机数 因为rand函数生成的随机数范围是0~RAND_MAX,这里是0~32767,通过模100的方式转换成0~99的数字
	while (guess != -1)             //输入非-1的数字时循环猜数字
	{
		printf("请猜数字");
		scanf("%d", &guess);
		if (guess < ret&&guess>0)
		{
			printf("猜小了\n");
		}
		else if (guess > ret&&guess<101)
		{
			printf("猜大了\n");
		}
		else if (guess == ret)
		{
			printf("恭喜!猜对了\n");
			Sleep(2000);
			for (int i = 0; i < 5; i++)
			{
				Sleep(100);
				printf("********************************\n");
			}
			system("cls");
			break;
		}
		else
		{
			printf("请输入1~100的数字\n");
		}
	}
}

int main()
{
	srand((unsigned int)time(NULL));	//设置随机数种子,输入的(unsigned int)time(NULL)是转换成unsigned int类型的时间戳
	int a = 0;
	do                                  //循环询问是否开始游戏,输入0退出
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &a);
		switch (a)
		{
		case 0:
			printf("游戏结束\n");
			break;
		case 1:
			system("cls");
			printf("游戏开始\n");
			Game();
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (a!=0);
	return 0;
}

3.5 goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。

理论上goto语句没有必要,但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构处理过程。

例如:一次跳出两层或多层循环。

注意:goto不能跨函数跳跃。

#include

int main()
{
again:						//标签
	printf("hehe\n");
	printf("haha\n");
	goto again;				//跳转到again的地方
	return 0;
}
//关机跳转
#include
#include
#include

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");        //调用系统关机功能,60秒后关机
again:
	printf("请注意,你的电脑在60秒后关机,如果输入:我是猪。就取消关机\n");
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");          //取消系统关机功能
	}
	else
	{
		goto again;
	}

	return 0;
}

此代码慎用!

将工具栏中debug调整成release,再运行一次会编成release版本。保存的文件夹中会有应用程序。

你可能感兴趣的:(c语言)