C语言初步(第五周)与悍匠招新学习

目录

一:数据类型

 1.整数类型

 2.浮点类型

​编辑

3.字符类型 

4.类型转换

5.逻辑类型

二:悍匠招新试题及学习 

1;理论试题部分

理论试题1:麦克纳姆轮

理论试题2:开闭环控制系统 

理论试题3:PID

​编辑

理论试题4:有关单片机  及通讯协议

二:编程题 

第一题(略)

第二题:

 第三题:

第一小题的代码:

第二小题的代码:(初用数组) 


一:数据类型

 1.整数类型

 2.浮点类型

 

3.字符类型 

 

4.类型转换

5.逻辑类型

 

二:悍匠招新试题及学习 

1;理论试题部分

理论试题1:麦克纳姆轮

理论试题2:开闭环控制系统 

理论试题3:PID

理论试题4:有关单片机  及通讯协议

UARTI2CSPI的优缺点和区别

协议

UART

SPI

IIC

总线

3RXTXGND

4CSCLKMOSIMISO

4VCCGNDSCLSDA

/异步

异步

同步

同步

/半双工

全双工

全双工

半双工

传输速度

应用场景

板内/间

板内(不同芯片之间)

板内

模式

一对一

一对多

一对多/多对多

一主多从实现

X

CS

地址

二:编程题 

第一题(略)

第二题:

  1. RoboMaster比赛的车里有各种各样的通讯协议,现有一个这样的通讯协议:
        1. 每次通讯发送100以内的非负整型
        2. 如果发送的报文不是一百以内的非负整型,主控底层逻辑出现故障。
        3. 为了避免通讯失准,每个报文重复发送10次
        4. 有三种报文,它们是33,66,99,主控接收到他们之后,就会进入“紧急状态”,进入“紧急状态“后,主控不再接收报文,打印出error,终止程序。
        5. 在非紧急状态下,主控返回报文内容,即打印输入的报文

请实现此协议,并且保证主控底层逻辑不出故障(请写一个保护程序,如输入不是100内的非负整型则忽略这次输入)。

样例输入:

1

101

33

输出:

1

1

1

1

1

1

1

1

1

1

error

代码:

#include<stdio.h>
int main()
{
	int n=0;
	while (n != 33 && n != 66 && n != 99) {  //能够一直发通讯,直到进入紧急状态!
		printf("请发送报文(为100内的非负整数):");
		//用户先输入100以内的非负整数,否则忽略用户的输入:
		do {
			scanf_s("%d", &n);
			if (n >= 0 && n <= 100 && n != 33 && n != 66 && n != 99) {
				for (int i = 1; i <= 10; i++) {
					printf("%d\n", n);
				}//每个报文重复发送10次(非紧急状态)
			}
			else if (n == 33 || n == 66 || n == 99) {
				printf("error\n");
			}//进入紧急状态
			else {
				printf("您输入的数不是100以内的非负整数,请重新输入一个符合范围的数:");
			}
		} while (n < 0 || n>100);
	}
	return 0;
}

 第三题:

由于RoboMaster机甲大师赛具有备赛时间长的特点,进入备赛后期后,队员们会出现疲惫、厌倦等情绪;此外,队员们旷工、怠工、不注意实验室卫生等问题都是运营组所需要管理的。现在运营组希望电控组能为其编写一个用于队员管理的软件,运营组所提出的需求如下:

  1. 每名队员对应一个分数,在每个月的月初时分数重置为50分。
  2. 这个月内的最终分数由队员们的贡献和负贡献决定的。
  3. 贡献加分细则:
  4. 负贡献扣分细则:
  5. 队员们最终的分数将会在月底进行清算,不同的分数会有不同的奖励或惩罚。细则如下:
  6. 若该月所有队员平均分数>75分,举行一次团建活动。

编号

行为

加分值

1

扫地

2

2

整合开源资料

4

3

完成部分赛季规划/中期评审/完整形态考核任务

8

编号

行为

扣分值

1

乱丢垃圾

2

2

玩游戏

4

3

违反实验室安全守则

8

分数

奖惩措施

≤0

退队

<20

整理全队物资

<40

扫地

≥60

获得队内周边

≥80

获得大疆200元以内RM周边

≥100

获得大疆绝版RM周边

题目:

  1. 实验室人数固定5人(编号为1~5),请用C语言实现上述管理软件功能。
  2. (附加题) 实验室人数变化,请在上述功能的基础上实现新人入队后增加新人信息,人员离队后减少人员信息的功能。(新队员所分配的编号为最小的未绑定队员的编号,老队员离开队伍后,其他队员编号不变)

输入格式:

队员编号(1~10)

贡献行为编号      该月完成该贡献的次数

贡献行为编号      该月完成该贡献的次数

0(表示贡献行为输入结束)

负贡献行为编号   该月完成该负贡献的次数

负贡献行为编号   该月完成该负贡献的次数

0(表示贡献行为输入结束)

该队员奖惩情况

样例:(蓝色字体为电脑输出,红色字体为电脑输入)

请输入队员编号:

1

分别输入贡献行为编号和次数,用空格隔开:

2 3

分别输入贡献行为编号和次数,用空格隔开:

1 1

分别输入贡献行为编号和次数,用空格隔开:

0

分别输入负贡献行为编号和次数,用空格隔开:

2 1

分别输入负贡献行为编号和次数,用空格隔开:

0

该队员1清算分数为60分,获得奖励:队内周边

请输入队员编号:

……

该队员X清算分数为36分,获得惩罚:扫地

请输入队员编号:

0

退出程序

请输入操作(0:退出程序;1:增加队员;2:减少队员;3:清算分数):

1

欢迎新队员,分配编号为13;

请输入操作(0:退出程序;1:增加队员;2:减少队员;3:清算分数):

2

请输入减少队员编号:

7

该队员7已踢出队伍,其他队员编号不变。

请输入操作(0:退出程序;1:增加队员;2:减少队员;3:清算分数):

3

请输入队员编号:

7

该队员暂不存在。

请输入队员编号:

(见第一题样例)

……

该队员X清算分数为19分,获得惩罚:整理全队物资

请输入队员编号:

0

由于该月平均清算分数大于75分,获得奖励:团建一次。

请输入操作(0:退出程序;1:增加队员;2:减少队员;3:清算分数):

0

退出程序

第一小题的代码:

#include<stdio.h>
int main()
{
	int n;//n表示队员编号,当输入的n的值为0时,退出程序
	printf("请输入队员编号:");
	scanf_s("%d",&n);
	while (n != 0) {
		int score = 50;//score表示一位队员的得分情况(每月初有50的基础分)
		int a = 1;//用a表示贡献行为的编号,当a为0时退出有关“贡献行为编号和次数”的循环
		int b = 1;//b和a作用相同,但用在有关”负贡献行为编号和次数”的循环上
		int c = 0;//用c表示单个编号的执行次数
		while (a != 0) {
			printf("分别输入贡献行为编号和次数,用空格隔开:");
			scanf_s("%d %d", &a, &c);//要想退出该循环,应当输入“0 0”而不能只输入一个0
			switch (a) {
			case 1:
				score += 2 * c;
				break;
			case 2:
				score += 4 * c;
				break;
			case 3:
				score += 8 * c;
				break;
			}
		}
		while (b != 0) {
			printf("分别输入负贡献行为编号和次数,用空格隔开:");
			scanf_s("%d %d", &b, &c);//要想退出该循环,应当输入“0 0”而不能只输入一个0
			switch (b) {
			case 1:
				score -= 2 * c;
				break;
			case 2:
				score -= 2 * c;
				break;
			case 3:
				score -= 8 * c;
				break;
			}
		}
		//算出得分后就要进行奖惩措施的判断了
		if (score <= 0)
			printf("该队员%d清算分数为%d分,获得惩罚:退队\n",n,score);
		else if (score > 0 && score < 20)
			printf("该队员%d清算分数为%d分,获得惩罚:整理全队物资\n", n, score);
		else if (score >= 20 && score < 40)
			printf("该队员%d清算分数为%d分,获得惩罚:扫地\n", n, score);
		else if (score >= 60 && score < 80)
			printf("该队员%d清算分数为%d分,获得奖励:队内周边\n",n, score);
		else if (score >= 80 && score < 100)
			printf("该队员%d清算分数为%d分,获得奖励:大疆200元以内RM周边\n", n, score);
		else if (score >= 100)
			printf("该队员%d清算分数为%d分,获得奖励:大疆绝版RM周边\n", n, score);
		else
			printf("无\n");
		printf("请输入队员编号:\n");//重新输入n,以达到反复查询队员奖惩情况的目的,或输入0退出程序
		scanf_s("%d", &n);
	}
	printf("退出程序");
	return 0;
}

第二小题的代码:(初用数组) 

#include<stdio.h>
int main()
{
	int x;//用x来进行操作指令的存储
	int n;//n表示队员编号
	int number[1000];//用number存入队员的人数与编号
	int delect;//用delect表示要删去的队员的编号
	double sum = 0;//用sum表示已经进行了分数结算的成员的分数总和(默认:当在“清算分数”中输入0并退出该循环时,全队成绩均已结算,将会自动结算平均分)
	double average = 0;//用average表示全队平均分
	int cnt = 0;//用cnt表示已经进行了结算的成员的个数
	for (n= 1; n <= 12; n++) { //根据3.2题样例中给出的第一次加入的新成员的编号为13猜测,现在对内成员有12位?
		number[n] = n;
	}
	do {
		printf("请输入操作(0:退出程序;1:增加队员;2:减少队员;3:清算分数):\n");
		scanf_s("%d", &x);
		switch (x) {
		case 1:
			n = 1;
			do {
				if (n != number[n]) {
					number[n] = n;
					break;
				}
				n++;
			} while (n == number[n]);
			printf("欢迎新队员,分配编号为%d;\n", n);
			number[n] = n;
			break;
		case 2:
			printf("请输入减少队员编号:");
			scanf_s("%d", &delect);
			n = 1;
			do {
				if (delect == n) {
					number[n] = 0;
					break;
				}
				n++;
			} while (n == number[n]);
			printf("该队员%d已移除队伍,其他队员编号不变。\n",delect);
			break;
		case 3:
			printf("请输入队员编号:");
			scanf_s("%d", &n);
			while (n != 0) {
				int e = 1; //先用e来判断队员编号是否有效
				for (e = 1; e < n; e++) {
				}
				if (e != number[n]) {
					printf("该队员暂不存在。\n");
					printf("请输入队员编号:");
					scanf_s("%d", &n);
					continue;//当队员编号无效时,让用户重新输入一个编号
				}
				int score = 50;//score表示一位队员的得分情况(每月初有50的基础分)
				int a = 1;//用a表示贡献行为的编号,当a为0时退出有关“贡献行为编号和次数”的循环
				int b = 1;//b和a作用相同,但用在有关”负贡献行为编号和次数”的循环上
				int c = 0;//用c表示单个编号的执行次数
				while (a != 0) {
					printf("分别输入贡献行为编号和次数,用空格隔开:");
					scanf_s("%d %d", &a, &c);//要想退出该循环,应当输入“0 0”而不能只输入一个0
					switch (a) {
					case 1:
						score += 2 * c;
						break;
					case 2:
						score += 4 * c;
						break;
					case 3:
						score += 8 * c;
						break;
					}
				}
				while (b != 0) {
					printf("分别输入负贡献行为编号和次数,用空格隔开:");
					scanf_s("%d %d", &b, &c);//要想退出该循环,应当输入“0 0”而不能只输入一个0
					switch (b) {
					case 1:
						score -= 2 * c;
						break;
					case 2:
						score -= 2 * c;
						break;
					case 3:
						score -= 8 * c;
						break;
					}
				}
				//算出得分后就要进行奖惩措施的判断了
				if (score <= 0) {
					printf("该队员%d清算分数为%d分,获得惩罚:退队\n", n, score);
					int N = n;//用N表示要退队的队员的编号
					n = 1;
					do { //执行退队操作
						if (N == n) {
							number[n] = 0;
							break;
						}
						n++;
					} while (n == number[n]);

				}
				else if (score > 0 && score < 20)
					printf("该队员%d清算分数为%d分,获得惩罚:整理全队物资\n", n, score);
				else if (score >= 20 && score < 40)
					printf("该队员%d清算分数为%d分,获得惩罚:扫地\n", n, score);
				else if (score >= 60 && score < 80)
					printf("该队员%d清算分数为%d分,获得奖励:队内周边\n", n, score);
				else if (score >= 80 && score < 100)
					printf("该队员%d清算分数为%d分,获得奖励:大疆200元以内RM周边\n", n, score);
				else if (score >= 100)
					printf("该队员%d清算分数为%d分,获得奖励:大疆绝版RM周边\n", n, score);
				else
					printf("无\n");
				sum += score;
				cnt++;
				printf("请输入队员编号:\n");//重新输入n,以达到反复查询队员奖惩情况的目的,或输入0退出程序
				scanf_s("%d", &n);
			}
			average = sum / cnt;
			if (average > 75) {
				printf("由于该月平均清算分数大于75分,获得奖励:团建一次。\n");
			}
		}
	} while (x != 0);
	printf("退出程序");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值