编号为1,2…,n(n<=10)的n名同学玩抽卡牌游戏,每人可抽5张卡牌,其中数字卡牌的点数是1-9,字母卡牌D(Double),D卡牌的点数是最近一次抽中的卡牌的点数乘以2。请用c语言编写一个程序计算各同学抽得卡牌的总点数,输出抽得总点数最小的同学编号
时间: 2024-03-25 08:40:17 浏览: 178
好的,让我来解决这个问题。首先,我们可以定义一个结构体来存储每个同学的信息,包括编号、抽卡牌情况以及总点数。代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 10
#define MAX_CARD 5
typedef struct {
int num; // 编号
int cards[MAX_CARD]; // 抽卡牌情况
int total_score; // 总点数
} Student;
```
接下来,我们可以编写一个函数来计算每个同学的总点数。对于每个同学,我们需要遍历他抽到的每张卡牌,如果是数字卡牌,则加上相应的点数,如果是 D 卡牌,则加上最近一次抽中的卡牌的点数乘以 2。代码如下:
```c
void calc_score(Student *s) {
int last_card_score = 0; // 上一张卡牌的点数
for (int i = 0; i < MAX_CARD; i++) {
if (s->cards[i] == -1) { // 没有抽到卡牌
break;
}
if (s->cards[i] == 0) { // D 卡牌
s->total_score += last_card_score * 2;
} else { // 数字卡牌
s->total_score += s->cards[i];
last_card_score = s->cards[i];
}
}
}
```
最后,我们可以编写主函数来读入每个同学的编号和抽卡牌情况,并计算每个同学的总点数。读入过程可以使用 scanf 函数,计算过程可以使用上面编写的 calc_score 函数。同时,我们需要记录抽得总点数最小的同学编号,并在遍历完成后输出该编号。代码如下:
```c
int main() {
Student students[MAX_N];
int min_score = 10000, min_score_num = -1; // 初始化为一个较大的数
for (int i = 0; i < MAX_N; i++) {
int num;
scanf("%d", &num);
students[i].num = num;
for (int j = 0; j < MAX_CARD; j++) {
char card[3];
scanf("%s", card);
if (card[0] == 'D') {
students[i].cards[j] = 0;
} else {
students[i].cards[j] = atoi(card);
}
}
students[i].total_score = 0;
calc_score(&students[i]);
if (students[i].total_score < min_score) {
min_score = students[i].total_score;
min_score_num = students[i].num;
}
}
printf("%d\n", min_score_num);
return 0;
}
```
这样,我们就完成了这个问题的求解。完整代码如下:
阅读全文