C语言 -- 选择与循环


一、选择与循环

C语言是【结构化】的程序语言

  • 顺序结构

  • 选择结构

    ​ if - else
    ​ switch - case

  • 循环结构
    while
    do - while
    for

​C中的语句主要分为五类:

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句

1. 分支语句

​ 在C语言中实现分支或者选择的语句是if-else或者switch语句

1.1:if-else语句

int main()
{
	if(type)
		printf("如果条件满足你将看到这句话")else
		printf("否则你将看到这句话");
	return 0;
}

悬空else

int main()
{
	int a = 0;
	int b = 0;
	if(a == 1)
		if(b == 2)
			printf("hehe\n");
	else//else匹配的是最近的if,与代码的缩进无关
		printf("haha\n")
    return 0;
    //此代码无输出
}

​ 为了避免由于代码缩进导致的coder的误解,所以一个好的代码风格是非常有必要的

if书写形式的对比

//代码1
if(condition){
	return x;
}
return y;

//代码2
if(condition)
{
	return x;
}
else
{
	return y;
}

​两段代码是一样的意思,但代码1很容易造成歧义,因此代码2相较于代码1是更好的一种代码风格

//代码3
int num = 1;
if(num == 5)
{
	printf("hehe\n");
}

//代码4
int num = 1;
if(5 == num)
{
	printf("hehe\n");
}

​ 当常量与变量判断是否相等时,可以将常量放在等式左边,变量放在右边,这样如果将少打一个等号的错误直接暴露在编译阶段.

练习

//判断是否为奇数
int main()
{
    int n = 0;
    scanf("%d",&n);
    if(n % 2 == 1)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }
    return 0;
}


//判断一个数是否为素数
int main()
{
    int n = 0;//需要被判断的数
    int i;
    scanf("%d", &n);
    //由数学知识可知循环到根号n即可判断出是否为素数
    for (i = 2; i < sqrt(n); i++)
    {
        if (n % i == 0)
        {
            break;//一旦有n被整除的数,则跳出循环
        }
    }
    if (i <= sqrt(n))
    //当i<=sqrt(n)时,说明for循环没有被完整遍历就被跳出,说明有n被整除的数
    {
        printf("no\n");
    }
    else
    {
        printf("yes\n");
    }
    return 0;
}

1.2:switch语句

当条件分支太过于繁琐时,使用嵌套的if-else语句,常常不利于代码阅读和后期维护,因此引入switch-case语句,常常用于多分支语句,case决定入口,break决定出口,case里面可以没有break,根据需求来增减break,switch语句是可以嵌套的,且break只会跳出一层switch

switch(整形表达式)
{
	语句项
}
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;
}

default子句

​ 当所有的case都不是我们需要的时候,可以通过default语句来输出我们所表达的

default:
	printf("输出错误\n");
	break;

2. 循环语句

在C语言中实现循环的语句有:

2.1:while循环

int main()
{
    int line = 0;
    while(line<20000)
    {
        printf("写代码:%d\n",line);
            line++;
    }
    if(line>=20000)
    {
        printf("学的不错");
    }
    else
    {
        printf("代码量太少,同志仍需努力");
    }
    return 0;
}

while循环中的break和continue

//break
int main()
{
	int n = 1;
	while(n <= 10)
	{
		if(n == 5)
		{
			break;//只要遇到break,就停止后期的所有的循环,直接终止循环
		}
		printf("%d", n);
		n++;
	}
	return 0;
}

//continue
int main()
{
	int n = 1;
	while(n <= 10)
	{
		if(n == 5)
		{
			continue;
			//跳过本次循环continue后面的代码,直接去判断后面的while循环的判断部分
		}
		printf("%d", n);
		n++;
	}
	return 0;
}

2.2:do-while循环

do
    循环语句;
while(表达式);
//特点:循环至少循环一次
int main()
{
    int i = 1; 
    do
    {
        printf("%d", i);
        i++;
    }while(i<=10);
    return 0;
}

do-while中的break和continue

//代码1:
//输出:1 2 3 4
do
{
    if(5==i)
    {
        break;
    }
    printf("%d", i);
    i++;
}while(i<=10);
//代码2:
//输出:1 2 3 4...死循环
do
{
    if(5==i)
    {
        continue;
    }
    printf("%d", i);
    i++;
}while(i<=10);

2.3:for循环

int main()
{
    int i = 1;//影响循环的第一个条件,循环起点,即初始化
    while(i <= 10)//影响循环的第二个条件,循环终点,即判断
    {
        printf("%d", i);
    	i++;//影响循环的第三个条件,循环变化,即循环变量的调整
    }
    return 0;
}

当代码量增多时,三个影响循环的条件可能相距太远,因此引入 for循环

for(表达式1; 表达式2; 表达式3)
{    
    循环语句;
}
表达式1:
    循环变量的初始化
表达式2:
    循环变量的判断
表达式3:
    循环变量的调整
int main()
{
    int i =0 ;
    for(i = 1; i<=10; i++)
    {
        printf("%d", i);
    }
    return 0;
}

for循环中的break和continue

int main()
{
	int i = 0;
	for(i = 1; i <= 10; i++)
	{
		if(5 == i)
		{
			break;//当遇到break时,直接跳出循环
        }
		printf("%d", i);
	}
}

for循环中控制调整变量

​ 1.不可在for循环体中调整循环变量,防止for循环失去控制
​ 2.建议for语句中控制循环变量的取值采用"前闭后开"的写法

for循环的变种

//变种1:
//初始化和调整部分省略,就是初始化和调整什么都不做
//判断部分省略,表示判断恒为真,即一直执行,死循环
int main()
{
	for( ; ; )
	{
		printf("zxm\n");
	}
	
//变种2:
//嵌套的for循环,多用于打印列表
//输出16个zxm
	for(i = 0; i<4; i++)
    {
        for(j = 0; j<4; j++)
        {
            printf("zxm\n");
        }
    }
    
//变种3:
//输出4个zxm,只执行一轮,因为当执行到第二轮时,j依旧保留上一轮的4,不满足内层for的判断条件,因此不再执行
    for(; i<4; i++)
    {
        for(; j<4; j++)
        {
            printf("zxm\n");
        }
    }
    
//变种4:
//for循环内是可以初始化两个变量的
	for(x = 0 , y = 0; x<3 && y<5; ++x,++y)
	{
    	printf("zxm\n");
	}

for循环练习

//练习1:
//判断循环执行几次
    int main()
    {
        int i = 0;
        int j = 0;
        for(i = 0,k = 0; k=0; i++,k++)
        {
            k++;
        }
        return 0;
    }
    
//练习2:
//求1~n的阶乘的和
    //代码1:
    int main()
    {
		for()
    }
    //代码2:
    int main()
    {

    }
    
//练习3:
//在一个有序数组中查找具体的某个数组n
    //代码1:
    int main()
    {
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        int k = 0;
        scanf("%d",&k);
        for(int i = 0; i<10; i++)
        {
            if(arr[i] == k)
            {
                printf("Yes");
            }
        }
    }
    //代码2:
    int main()
    {
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        int k = 0;
        scanf("%d",&k);
        int left = 0;//左下标 
        int right = sizeof(arr)/sizeof(arr[0])-1;//右下表
        int mid = (left+right);//中间元素的下标
        int flag = 0;//标记值

        while(left <= right)
        {
            if(arr[mid] == k)
            {
                printf("找到了,下标是 %d\n",mid);
                flag = 1;
                break;
            }
            //更改下标时,注意左+右-
            else if(arr[mid] < k)
            {
                left = mid + 1;//更改新的左下标
            }
            else
            {
                right = mid - 1;//更改新的右下标
            }
        }
        if(flag == 0)
        {
            printf("没找到\n");
        }
        return 0;
    }
    
//练习4:
//演示多个字符从两端移动向中间汇集
//eg:
//welcome to bit!!!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//...
//welcome to bit!!!!!
    int main()
    {
        char arr1[] = "welcome to bit!!!!!";
        char arr2[] = "###################";
        int left = 0;//左下标
        int right = strlen(arr1)-1;//右下标
        //strlen需要包含头文件<string.h>

        while(left <= right)
        {
            arr2[left] = arr1[left];
            arr2[right] = arr2[right];
            printf("%s\n",arr2);
            Sleep(1000);//休眠函数,包含在<windows.h>头文件中,单位是毫秒
            system("cls");//system函数可以执行系统命令,cls是清理屏幕的命令
            left++;
            right--;
        }
        printf("%s\n",arr2);
        return 0;
    }
    
//练习5:
//模拟用户登录情景,并且只能登录三次(只能输三次密码,)
	int main()
    {
        char rightpassword[20] = {0};
        scanf("%s",rightpassword);
        char password[20] = {0};
        int i = 0;
        for(i = 0; i < 3; i++)
        {
            printf("请输入密码:>");
            scanf("%s",password);
            //判断密码是否正确
            //两个字符串比较相等是不能使用 == 的
            //可以选自strcmp库函数
            //strcmp返回0表示两个字符串相等
            //strcmp返回>0的数字,表示第一个字符串大于第二个
            //strcmp返回<0的数字,表示第一个字符串小于第二个
            //原理:比较两个字符串对应位置上的ASCII码值
            if(strcmp(password,rightpassword) == 0)
            {
                printf("登陆成功\n");
                break;
            }
            else
            {
                printf("密码错误\n");
            }
        }
        if(i == 3)
        {
            printf("登陆失败\n");
        }
        return 0;
    }

2.4:goto语句

​ 注:goto语句只能在一个函数内部跳转,不可跨函数跳转

goto语句的应用

//关机程序
//1.程序运行起来后,1分钟内关机
//2.如果输入,zxm,就取消关机
//代码1(goto版):
int main()
{
    char input[20] = {0};
    //程序倒计时关机
    //关机:shutdown -s -t 1
    //取消关机:shutdown -a
    system("shutdown -s -t 60");
    again:
    printf("请注意,你的电脑将在1分钟后关机,输入 zxm 取消关机")scanf("%s", input);//输入
    if(strcmp(input,"zxm") == 0)
    {
        system("shutdown -a");
    }
    else
    {
        goto again;//again只是一个标志词,可替换
    }
    return 0;
}
//代码2(循环版):
int main()
{
    char input[20] = {0};
    //程序倒计时关机
    //关机:shutdown -s -t 1
    //取消关机:shutdown -a
    system("shutdown -s -t 60");
    while(1)
    {
        printf("请注意,你的电脑将在1分钟后关机,输入 zxm 取消关机")scanf("%s", input);//输入
        if(strcmp(input,"zxm") == 0)
        {
            system("shutdown -a");
            break;
        }
    }
    return 0;
}

总结

选择与循环结构是C语言中的重中之重,希望大家能够将本章的知识烂熟于心,并能运用至实践当中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小张a_3168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值