L1D4 C语言控制语句

C语言控制语句

引言:从程序流程的角度看,C语言语句可分为三种基本结构:顺序结构、分支结构、循环结构。顺序结构就是逐条执行各条语句。分支语句会进行判断,选择支路执行语句。循环语句在没有满足终止条件时,会重复某段内容。

一、分支语句

1.1 if-else语句

if else语句分三种形式,分别是简化形式,阶梯形式,嵌套形式,用代码演示3种情况,实现分数判断分类,90-100为A,80-90为B,50-80为C,0-50为D。如下代码所示:

/*
 * @Description: 演示三种类型if-else语句
 * @Author: 余红祥
 * @Date: 2022-07-01 21:18:58
 * @LastEditTime: 2022-07-01 21:28:18
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int grade = 0;
    printf("please enter grade:\n");
    scanf("%d", &grade);
    /*演示1:简化形式演示*/
    if (grade > 100)
        printf("error grade !\n");

    /*演示2 阶梯形式演示*/
    if (grade >= 0 && grade <50)
    {
        printf("D\n");
    }
    else if (grade >= 50 && grade <80)
    {
        printf("C\n");
    }
    else if (grade >= 80 && grade <90)
    {
        printf("B\n");
    }
    else
    {
        printf("A\n");
    }

    /*演示3 嵌套形式演示*/
    if (grade >= 50 && grade < 100)
    {
        if (grade >= 80 && grade <100)
        {
            if (grade >= 90 && grade <100)
            {
                printf("A\n");
            }
            else
                printf("B\n");
        }
        else
        {
            printf("C\n");
        }
    }
    else
    {
        printf("D\n");
    }
    return 0;
}

在这里插入图片描述
如上图所示,演示3的代码明显质量要高一点,利用二分查找方式,程序执行效率提高一倍。

1.2 switch-case语句

switch case语法:
switch(表达式) //表达式需要是整型、字符型表达式、枚举(实质就是整型)
{
case 常量表达式1:语句块1;break;
……
default : 语句块n;break; //此处不需要break,因为后面没东西了
}

见如下代码,实现学生成绩简单评级。

#include<stdio.h>
#define ERROR 1
int main(int grgc, char *argv[])
{
	float sorce = 0;
	puts("please input sorce:\r\n");
	scanf("%f",&sorce);
	if(sorce > 100 || sorce < 0)
	{
	printf("bad input!\r\n");
	return -ERROR;
	}
	switch((int)sorce/10)		//强转为int  因为switch关键字后面必须是整型或者字符型值
	{
		case 9 : printf("A\r\n"); break;
		case 8 : printf("B\r\n"); break;
		case 7 : printf("C\r\n"); break;
		case 6 : printf("D\r\n"); break;
		default :printf("E\r\n"); 
	}

	return 0;
}

在这里插入图片描述

如果没有特殊的意图,建议把default放在最后,养成写default的习惯。

二、循环语句

2.1while和do-while

while(i<10){ /*code*/}		//代表只要i小于10就执行code部分
do {/*code*/} while(i<10); //代表直到i大于等于10就停止code的循环

例子,求1到100的和,代码如下:

#include<stdio.h>

int main(int grgc, char *argv[])
{
	int i = 1,sum = 0;
	while(i <= 100)		/*只要型*/
	{
		sum += i;
		i++;
	}
	printf("1+2+3+4+...+100=%d\r\n",sum);
	return 0;
}
int main(int grgc, char *argv[])
{
	int i = 1,sum = 0;
	do
	{
		sum += i;
		i++;
	} while (i<=100);
	
	printf("1+2+3+4+...+100=%d\r\n",sum);
	return 0;
}

在这里插入图片描述

2.2 for

for(表达式1;表达式2;表达式3)
{
	步骤;
}
//先执行表达式1.然后执行表达式2,若为真,则执行循环,然后执行表达式3;若为假,执行for循环外的语句

例子,求1到100的和,代码如下:

#include<stdio.h>

int main(int grgc, char *argv[])
{
	int sum = 0;
	for(int i = 0;i <= 100;i++)
	{
		sum += i;
	}
	printf("1+2+3+4+...+100=%d\r\n",sum);
	return 0;
}

在这里插入图片描述

2.3 goto

goto语句在底层驱动开发很常见,有大量的释放工作和退出工作都是用goto完成。
如当函数有很多个出口,**使用goto把这些出口集中到一处是很方便的,**特别是函数中有许多重复的清理工作的时候。
理由是:
-无条件跳转易于理解
-可以减少嵌套
-可以避免那种忘记更新某一个出口点的问题
-算是帮助编译器做了代码优化

可以给大家看一段代码,参考下goto在底层中的常用性。

	if (card->ext_csd.max_packed_writes >= 3 &&
	    card->ext_csd.max_packed_reads >= 5 &&
	    host->caps2 & MMC_CAP2_PACKED_CMD) {
		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
				EXT_CSD_EXP_EVENTS_CTRL,
				EXT_CSD_PACKED_EVENT_EN,
				card->ext_csd.generic_cmd6_time);
		if (err && err != -EBADMSG)
			goto free_card;
		if (err) {
			pr_warn("%s: Enabling packed event failed\n",
				mmc_hostname(card->host));
			card->ext_csd.packed_event_en = 0;
			err = 0;
		} else {
			card->ext_csd.packed_event_en = 1;
		}
	}

	if (!oldcard)
		host->card = card;

	mmc_free_ext_csd(ext_csd);
	return 0;

free_card:
	if (!oldcard)
		mmc_remove_card(card);

上一段代码是我从内核源码出随便摘的一端,可以看到goto一般用于错误的统一跳转。
例子:用goto实现1到100的和,代码如下:

#include<stdio.h>
int main(int grgc, char *argv[])
{
	int i = 1,sum = 0;
loop:
	if(i <= 100)
	{
	sum += i;
	i++;
	goto loop;
}
	printf("1+2+3+4+...+100=%d\r\n",sum);
	return 0;
}

在这里插入图片描述

三、转向语句

3.1 break

break用在从循环内跳出循环体,提前结束一层循环。(break只能用于循环体内或者switch语句中)

用如下代码演示,实现前n个数的和大于2000则跳出循环,并打印最后一个数及加的结果。

#include<stdio.h>

int main(int grgc, char *argv[])
{
	int sum = 0;
	int i = 0;
	for(i = 0;i <= 100;i++)
	{
		sum += i;
		if(sum > 2000)
			break;
	}
	printf("i is %d  sum is %d\r\n",i,sum);
	return 0;
}

在这里插入图片描述

3.2 cpntinue

continue语句用于结束本次循环,接着判定下一次是否执行循环,continue是直接结束本次循环,而break是跳出循环。
比如一个佛如循环需要进行一百次,当使用break时,直接退出该循环,而使用continue只会结束某一次循环。

3.3 return

return (<表达式>)

主要用于终止包含它的函数的执行
若终止的为主函数,则主程序结束,和exit(0)一个作用。

四、综合实例

1、判断2000-2500年中每一年是否为闰年,将闰年次数累计,并将累计结果输出。
提示:闰年的条件为:能被4整除,但不能被100整除的年份;能被100整除,不能被400整除的年份
答:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int year = 2000 , sum = 0;
    while (year <= 2500)
    {
        if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
            sum++;
        year++;
    }
    printf("total: %d\n", sum);
    return 0;
}

在这里插入图片描述
2、用for循环打印99乘法表
答:

#include<stdio.h>

int main(int grgc, char *argv[])
{
	int sum = 0;
	for(int col = 1 ; col <= 9 ; col++)
	{
		for(int row = 1 ; row <= col ; row++)
		{
			sum = row*col;
			printf("%d*%d=%d\t",row,col,sum);
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
3、用for循环打印如下图案:
F
_FE
__FED
___FEDC
____FEDCB
_____FEDCBA

答:

#include<stdio.h>

int main(int grgc, char *argv[])
{
	char ch = 'F';
	printf("please input a char:\r\n");
	scanf(" %c",&ch);
	for(int i = 0 ; i <= ch - 'A' ; i++)
	{
		for(int z = 0 ; z < i ; z++)
			putchar('_');
		for(int j = 0 ; j <= i ; j++)
		{
			putchar(ch - j);
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
4、打印出所有的“水仙花”数。所谓“水仙花”数是指一个3位数,其各个位数字立方和等于该数本身。
答:

#include<stdio.h>
#include<math.h>

int main(int grgc, char *argv[])
{
	unsigned int a = 0,b = 0,c = 0;
	unsigned int number = 100;	//水仙花是三位数  在这里初值设置为100
	while(number <= 999)
	{	
		a = number/100;
		b = (number - (a*100))/10;
		c = number%10;
		if((pow(a,3) + pow(b,3) + pow(c,3)) == number)
		{
			printf("%d^3+%d^3+%d^3 = %d\r\n",a,b,c,number);
		}
		number++;
	}
	return 0;
}

编译时需要链接动态库:gcc -Wall xxx.c -o xxx -lm
在这里插入图片描述

5、已知三个数,a,b,c,找出最大值放入max中

ps:欢迎大佬指正,共同学习进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: L1自适应控制是一种常用的控制算法,通常用于系统控制中。它的设计目标是通过实时调整控制器参数,以适应不断变化的系统性能和环境条件。在L1自适应控制中,常使用C语言进行编程实现。下面将从理论和实践两个方面简要介绍L1自适应控制。 理论上,L1自适应控制的基本思想是结合最优控制和自适应控制的特点,通过对系统的输出信号进行实时的观测和分析,动态调整控制器的参数,以使系统能够快速、准确地响应外部干扰和内部变化。这种方法可以通过计算误差信号的一阶导数来实现,其中误差信号表示系统输出与期望输出之间的差异。 在实践中,使用C语言编写L1自适应控制程序是非常常见的。首先,需要定义和初始化控制器的参数和状态变量。然后,在每个控制周期内,通过测量系统输出和期望输出,计算误差信号。接下来,根据误差信号的一阶导数和事先定义的调整规则,更新控制器的参数。最后,将根据最新参数计算出的控制信号应用于系统中。 C语言作为一种常用的编程语言,具有高效性和灵活性,非常适合于实现L1自适应控制算法。通过合理地设计和编写C代码,可以实现对控制器参数和状态变量的高效更新,从而提高系统的性能和稳定性。 总而言之,L1自适应控制是一种重要的控制算法,通过C语言的编程实现,可以实时地调整控制器参数以适应不断变化的系统性能和环境条件。它具有较高的灵活性和可靠性,在实际工程中有着广泛的应用。 ### 回答2: L1自适应控制是一种在实时控制系统中使用的算法。它使用传感器数据和目标值来自动调整系统的控制参数,以保持系统的稳定性和性能。L1自适应控制的实现可以使用C语言编程。 在C语言中实现L1自适应控制,首先需要定义系统的状态和关键参数。这些参数可以是传感器读数,目标值,控制器增益等。接下来,需要编写一个算法来计算控制参数的变化。这个算法可以根据一定的规则或公式来调整参数,以使系统的误差逐渐减小。 在实际编程中,可以使用循环和条件语句来实现L1自适应控制。循环用于实时检测系统状态和更新控制参数,条件语句用于判断参数的变化方向和幅度。此外,还可以使用数学函数库来进行数值计算和运算符号。 在编程中,还需要考虑系统的稳定性和性能。为了保持系统的稳定性,需要设置合适的控制增益和参数变化规则。而为了提高系统的性能,可以进一步优化控制参数的调整算法,使其更快地逼近目标值。 总之,使用C语言编程实现L1自适应控制需要定义系统参数、编写参数调整算法,并综合考虑稳定性和性能。通过合理的编程实现,可以实现对系统的自适应控制,提高系统的稳定性和性能。 ### 回答3: L1自适应控制是一种在C语言中实现的控制算法。该算法通过持续监测系统的输出和参考输入之间的差异来调整控制器的参数,以实现系统的最优控制L1自适应控制算法的关键是一个递归估计器,它根据差异的历史数据来估计系统的误差模型。这个误差模型反映了系统的动态变化,从而能够用来调整控制器的参数。估计器使用了最小二乘法来建立误差模型,并基于误差模型来计算控制器的参数更新量。 在C语言中实现L1自适应控制算法可以按照以下步骤进行: 1. 定义一个结构体来存储控制器的参数和误差模型的估计结果。 2. 初始化结构体中的参数和估计结果。 3. 利用传感器读取系统的输出和参考输入,并计算出差异。 4. 使用最小二乘法来更新误差模型。 5. 根据误差模型计算出控制器的参数更新量。 6. 更新控制器的参数。 7. 重复步骤3到6,实现持续的自适应调整。 在实际应用中,L1自适应控制算法可以用于各种系统,如机械、电子、通信等。通过使用C语言来实现,可以使得算法更加高效和灵活,并方便与其他部分的代码进行集成。 总而言之,L1自适应控制算法是一种在C语言中实现的控制算法,通过持续监测系统的输出和参考输入之间的差异来调整控制器的参数,以实现系统的最优控制。实现L1自适应控制算法可以按照一定的步骤进行,在实际应用中可以用于各种系统,并便于与其他代码进行集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值