diff --git a/【实践课外】15.结构体1/6-1 选队长.c b/【实践课外】15.结构体1/6-1 选队长.c new file mode 100644 index 0000000..99c2897 --- /dev/null +++ b/【实践课外】15.结构体1/6-1 选队长.c @@ -0,0 +1,11 @@ +void showCaptain(TeamMember team[], int n) { + TeamMember res = team[0]; + + for (int i = 1; i < n; i++) { + if (team[i].ability > res.ability) { + res = team[i]; + } + } + + printf("%d %s %s %s %.2lf\n", res.id, res.lastname, res.firstname, res.sex, res.ability); +} diff --git a/【实践课外】15.结构体1/6-1 选队长.md b/【实践课外】15.结构体1/6-1 选队长.md new file mode 100644 index 0000000..a4c0a9f --- /dev/null +++ b/【实践课外】15.结构体1/6-1 选队长.md @@ -0,0 +1,60 @@ +# 6-1 选队长 + +小明最近喜欢玩一款新游戏。在该游戏中,需要组建队伍去完成任务以获取奖励。小明挑出了所有的队员(每个人能力不同),需要一个函数挑出队长(能力最强的队员)。 + +### 函数接口定义: +```c +void showCaptain(TeamMember team[], int n); +``` + +参数说明:team中从下标0开始存放n个TeamMember,n>0。 +函数功能:找出队长并输出其各项信息 + +### 裁判测试程序样例: +```c +#include +#include +#define NAME_LEN 100 +#define SEX_LEN 6 +typedef struct { +int id;//身份证号码 + char lastname[NAME_LEN+1];//姓 + char firstname[NAME_LEN+1];//名 + char sex[SEX_LEN];//性别 + double ability; +} TeamMember; + +void showCaptain(TeamMember team[], int n); +int main() +{ + TeamMember *team; + int n; + int i; + + scanf("%d",&n); + team = (TeamMember *)malloc(n*sizeof(TeamMember)); + for(i=0;i= 85) { + p[i].grade = 'A'; + } else if (p[i].score >= 70) { + p[i].grade = 'B'; + } else if (p[i].score >= 60) { + p[i].grade = 'C'; + } else { + p[i].grade = 'D'; + cnt++; + } + } + + return cnt; +} diff --git a/【实践课外】15.结构体1/6-2 按等级统计学生成绩.md b/【实践课外】15.结构体1/6-2 按等级统计学生成绩.md new file mode 100644 index 0000000..cf7f889 --- /dev/null +++ b/【实践课外】15.结构体1/6-2 按等级统计学生成绩.md @@ -0,0 +1,84 @@ +# 6-2 按等级统计学生成绩 + +本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。 + +### 函数接口定义: +```c++ +int set_grade( struct student *p, int n ); +``` +其中`p`是指向学生信息的结构体数组的指针,该结构体的定义为: +``` +struct student{ + int num; + char name[20]; + int score; + char grade; +}; +``` + +`n`是数组元素个数。学号`num`、姓名`name`和成绩`score`均是已经存储好的。`set_grade`函数需要根据学生的成绩`score`设置其等级`grade`。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,`set_grade`还需要返回不及格的人数。 + +### 裁判测试程序样例: +```c++ +#include +#define MAXN 10 + +struct student{ + int num; + char name[20]; + int score; + char grade; +}; + +int set_grade( struct student *p, int n ); + +int main() +{ struct student stu[MAXN], *ptr; + int n, i, count; + + ptr = stu; + scanf("%d\n", &n); + for(i = 0; i < n; i++){ + scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); + } + count = set_grade(ptr, n); + printf("The count for failed (<60): %d\n", count); + printf("The grades:\n"); + for(i = 0; i < n; i++) + printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); + return 0; +} + +/* 你的代码将被嵌在这里 */ +``` + +### 输入样例: +```in +10 +31001 annie 85 +31002 bonny 75 +31003 carol 70 +31004 dan 84 +31005 susan 90 +31006 paul 69 +31007 pam 60 +31008 apple 50 +31009 nancy 100 +31010 bob 78 +``` + +### 输出样例: +```out +The count for failed (<60): 1 +The grades: +31001 annie A +31002 bonny B +31003 carol B +31004 dan B +31005 susan A +31006 paul C +31007 pam C +31008 apple D +31009 nancy A +31010 bob B +``` diff --git a/【实践课外】15.结构体1/6-3 学生成绩比高低.c b/【实践课外】15.结构体1/6-3 学生成绩比高低.c new file mode 100644 index 0000000..906f2dd --- /dev/null +++ b/【实践课外】15.结构体1/6-3 学生成绩比高低.c @@ -0,0 +1,16 @@ +int compareScore(const struct Student *s1, const struct Student *s2) { + int sum1 = s1->C + s1->English, + sum2 = s2->C + s2->English; + + if (sum1 == sum2) { + if (s1->C > s2->C) return 1; + if (s1->C < s2->C) return -1; + + if (s1->English > s2->English) return 1; + if (s1->English < s2->English) return -1; + + return 0; + } + + return sum1 > sum2 ? 1 : -1; +} diff --git a/【实践课外】15.结构体1/6-3 学生成绩比高低.md b/【实践课外】15.结构体1/6-3 学生成绩比高低.md new file mode 100644 index 0000000..5166901 --- /dev/null +++ b/【实践课外】15.结构体1/6-3 学生成绩比高低.md @@ -0,0 +1,77 @@ +# 6-3 学生成绩比高低 + +学生结构体定义如下: +``` +struct Student{ + int sid; + int C; + int English; +}; +``` +其中`sid`是学号,`C`是C语言课程成绩,`English`是英语课程成绩。学生的成绩按照这样的规则比较:
+* 先比较两门课的总成绩,总成绩高的为优; +* 若总成绩相同,再比较C语言成绩,C语言成绩高的为优; +* 若C语言成绩也相同,则说明两名学生成绩相等。 + +编写函数实现成绩的比较。 +### 函数接口定义: +```c +int compareScore(const struct Student *s1, const struct Student *s2); +``` +其中`s1`和`s2`是传入的参数,分别指向两名学生的结构体变量。函数返回值为`int`型,
+* 若`s1`所指学生成绩优于`s2`所指学生,返回`1`; +* 若`s2`所指学生成绩优于`s1`所指学生,返回`-1`; +* 若两学生成绩相等,返回`0`。 + +### 裁判测试程序样例: +```c +/* 此测试程序仅为示例,实际的测试程序可能不同。 +注意:实际的测试程序可能有多组输入、进行多次比较,输入格式也有可能不同, +因此不要针对测试程序样例编写代码,而应当编写符合题目要求的函数 */ + +#include +struct Student{ + int sid; + int C; + int English; +}; +int compareScore(const struct Student *s1, const struct Student *s2); +int main(){ + struct Student zs, ls; + scanf("%d%d%d", &zs.sid, &zs.C, &zs.English); + scanf("%d%d%d", &ls.sid, &ls.C, &ls.English); + int r; + r = compareScore(&zs, &ls); + if(r < 0) printf("Less\n"); + else if(r > 0) printf("Greater\n"); + else printf("Equal\n"); + return 0; +} +/* 你所编写的函数代码将被嵌在这里 */ +``` + +### 输入样例1: +对于样例测试程序的输入格式: +```in +1 95 90 +2 90 91 +``` + +### 输出样例1: +对于样例测试程序的输出格式: +```out +Greater +``` + +### 输入样例2: +对于样例测试程序的输入格式: +```in +1 90 95 +2 95 90 +``` + +### 输出样例2: +对于样例测试程序的输出格式: +```out +Less +``` diff --git a/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.c b/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.c new file mode 100644 index 0000000..0fbe0aa --- /dev/null +++ b/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.c @@ -0,0 +1,17 @@ +p = p1; + +for (p2 = p1 + 1; p2 < pData + n; p2++) { + if (p2->score > p->score) { + p = p2; + } +} + +if (p != p1) { + num = p->num; + p->num = p1->num; + p1->num = num; + + score = p->score; + p->score = p1->score; + p1->score = score; +} diff --git a/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.md b/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.md new file mode 100644 index 0000000..e4f128c --- /dev/null +++ b/【实践课外】15.结构体1/6-4 利用“选择排序算法“对结构体数组进行排序.md @@ -0,0 +1,73 @@ +# 6-4 利用“选择排序算法“对结构体数组进行排序 + +本题:补充函数 sortByChoose()的剩余部分,其要求是利用选择排序算法根据学生成绩(score)实现对结构体数组元素降序排序。 + +### 函数接口定义: +```c++ +void sortByChoose(struct Student *pData,int n); +``` + +### 裁判测试程序样例: +```c++ +#include +#include +#define N 10 +struct Student +{ + int num; + int score; +}; + +void sortByChoose(struct Student *pData,int n); + +int main(void) +{ + struct Student data[10],*p; + int i; + + for(p=data,i=0;inum,&p->score); + p++; + } + sortByChoose(data,N); + for (p=data,i=0;inum, p->score); + p++; + } + + return 0; +} + +void sortByChoose(struct Student *pData,int n) +{ + struct Student *p1,*p2,*p; + int num, score,i,j; + for(p1=pData;p1 res->scored) { + res = &d[i]; + } + } + } + + return res; +} diff --git a/【实践课外】15.结构体1/6-5 结构体的最值.md b/【实践课外】15.结构体1/6-5 结构体的最值.md new file mode 100644 index 0000000..0049e5c --- /dev/null +++ b/【实践课外】15.结构体1/6-5 结构体的最值.md @@ -0,0 +1,66 @@ +# 6-5 结构体的最值 + +学生类型ST的定义如下: + +typedef struct student{ + char name[10],id[10]; + int gender; + int age; + double scored; +} ST; + +编写函数,返回指定学生数组中的男生或女生的最高分的地址(约定:整数0和1分别代表男和女)。 + +### 函数接口定义: +```c +ST* MaxST(ST d[],int n,int k);//k=0|1 +``` +其中 `d` 是学生数组的初地址, `n`是数组的长度, `k` 是查找的性别描述(值确保是0或1),函数须返回指定类型学生中的最高分者的地址,如果不存在,返回空地址。 + +### 裁判测试程序样例: +```c +在这里给出函数被调用进行测试的例子。例如: +#include +#include +typedef struct student{ + char name[10],id[10]; + int gender; + int age; + double scored; +} ST; +void output(ST *d){//输出一个记录 + if(d==NULL) {printf("null\n");return;} + printf("%s,%s,%d,%d,%4.2f\n",d->name,d->id,d->gender,d->age,d->scored); +} +ST* InitData(int n);//从输入设备上输入相关数据,略去不表 + +ST* MaxST(ST d[],int n,int k);//k=0|1 <--需要完成的函数:找最值 + +int main(){ + int i,n;scanf("%d\n",&n); + ST *p=InitData(n); + output(MaxST(p,n,0)); + output(MaxST(p,n,1)); + free(p); + return 0; +} +/* 请在这里填写答案 */ +``` + +### 输入样例: +第一行是记录个数,余下若干行是相关数据(以空格分隔,每行一个)。 +```in +6 +Marry.MK 20201125 0 19 92.86 +J.Mark 20201185 0 17 90.93 +rouh.M 20201102 1 18 79.51 +byi.beee 20201129 1 17 90.28 +floyd.Fd 20201150 0 17 81.16 +grdda 20201146 1 19 85.52 +``` +### 输出样例: +输出男,女同学中的最高分(只需要找出并返回其地址,输入,输出由测试程序完成)。 +```out +Marry.MK,20201125,0,19,92.86 +byi.beee,20201129,1,17,90.28 +``` diff --git a/【实践课外】15.结构体1/6-6 复数相乘运算.c b/【实践课外】15.结构体1/6-6 复数相乘运算.c new file mode 100644 index 0000000..6fbad35 --- /dev/null +++ b/【实践课外】15.结构体1/6-6 复数相乘运算.c @@ -0,0 +1,8 @@ +PLEX multi(PLEX a,PLEX b) { + PLEX c; + + c.re = a.re * b.re - a.im * b.im; + c.im = a.re * b.im + a.im * b.re; + + return c; +} diff --git a/【实践课外】15.结构体1/6-6 复数相乘运算.md b/【实践课外】15.结构体1/6-6 复数相乘运算.md new file mode 100644 index 0000000..3dc06ab --- /dev/null +++ b/【实践课外】15.结构体1/6-6 复数相乘运算.md @@ -0,0 +1,51 @@ +# 6-6 复数相乘运算 + +本题要求实现一个函数,可计算两个复数相乘的积。 + +### 函数接口定义: +```c++ +PLEX multi(PLEX a,PLEX b); +``` + +其中 `a` 和 `b` 都是复数,返回值也为复数,值为a*b的值。 + +### 裁判测试程序样例: +```c++ +#include +typedef struct +{ + float re,im; +}PLEX; + +PLEX multi(PLEX a,PLEX b); + +int main() +{ + PLEX x,y,z; + scanf("%f%f",&x.re,&x.im); + scanf("%f%f",&y.re,&y.im); + z=multi(x,y); + if(z.im>=0) + printf("%.2f+%.2fi",z.re,z.im); + else + printf("%.2f%.2fi",z.re,z.im); + return 0; +} + +/* 请在这里填写答案 */ +``` + +### 输入样例: + + +```in +1 2 +3 4 +``` + +### 输出样例: + + +```out +-5.00+10.00i +``` diff --git a/【实践课外】15.结构体1/7-5 一帮一.c b/【实践课外】15.结构体1/7-5 一帮一.c new file mode 100644 index 0000000..14a01b9 --- /dev/null +++ b/【实践课外】15.结构体1/7-5 一帮一.c @@ -0,0 +1,44 @@ +#include + +#define FEMALE (0) +#define MALE (1) + +struct student { + int gender; // 0 is female, 1 is male + char name[10]; // the problem promises that the name will not exceed 8 characters + int has_group; +}; + +int n, pos[2]; +struct student students[55]; // the problem promises that the number of students will not exceed 50 + +int main() { + scanf("%d", &n); + + pos[FEMALE] = pos[MALE] = n; + + for (int i = 0; i < n; i++) { + scanf("%d %s", &students[i].gender, students[i].name); + } + + for (int i = 0; i < n; i++) { + if (students[i].has_group) continue; + + int current_gender = students[i].gender, + target_gender = current_gender ^ 1; + + for (pos[target_gender]--; pos[target_gender] >= 0; pos[target_gender]--) { + if (students[pos[target_gender]].gender == target_gender + && !students[pos[target_gender]].has_group) { + students[pos[target_gender]].has_group = 1; + students[i].has_group = 1; + + printf("%s %s\n", students[i].name, students[pos[target_gender]].name); + + break; + } + } + } + + return 0; +} diff --git a/【实践课外】15.结构体1/7-5 一帮一.md b/【实践课外】15.结构体1/7-5 一帮一.md new file mode 100644 index 0000000..00ec891 --- /dev/null +++ b/【实践课外】15.结构体1/7-5 一帮一.md @@ -0,0 +1,32 @@ +# 7-5 一帮一 + +“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的**异性**学生分为一组。 + +### 输入格式: + +输入第一行给出正偶数`N`($$\le$$50),即全班学生的人数。此后`N`行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。 + +### 输出格式: + +每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。 + +### 输入样例: +```in +8 +0 Amy +1 Tom +1 Bill +0 Cindy +0 Maya +1 John +1 Jack +0 Linda +``` + +### 输出样例: +```out +Amy Jack +Tom Linda +Bill Maya +Cindy John +``` diff --git a/【实践课外】15.结构体1/7-6 考试座位号.c b/【实践课外】15.结构体1/7-6 考试座位号.c new file mode 100644 index 0000000..36c6685 --- /dev/null +++ b/【实践课外】15.结构体1/7-6 考试座位号.c @@ -0,0 +1,34 @@ +#include + +struct student { + char id[20]; // the problem promises that the id will not exceed 16 characters + int seat1, seat2; +}; + +int n, m; +struct student students[1005]; // the problem promises that the number of students will not exceed 1000 + +int main() { + scanf("%d", &n); + + for (int i = 0; i < n; i++) { + scanf("%s %d %d", students[i].id, &students[i].seat1, &students[i].seat2); + } + + scanf("%d", &m); + + for (int i = 0; i < m; i++) { + int seat; + scanf("%d", &seat); + + for (int j = 0; j < n; j++) { + if (students[j].seat1 == seat) { + printf("%s %d\n", students[j].id, students[j].seat2); + + break; + } + } + } + + return 0; +} diff --git a/【实践课外】15.结构体1/7-6 考试座位号.md b/【实践课外】15.结构体1/7-6 考试座位号.md new file mode 100644 index 0000000..9264b81 --- /dev/null +++ b/【实践课外】15.结构体1/7-6 考试座位号.md @@ -0,0 +1,32 @@ +# 7-6 考试座位号 + +“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的**异性**学生分为一组。 + +### 输入格式: + +输入第一行给出正偶数`N`($$\le$$50),即全班学生的人数。此后`N`行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。 + +### 输出格式: + +每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。 + +### 输入样例: +```in +8 +0 Amy +1 Tom +1 Bill +0 Cindy +0 Maya +1 John +1 Jack +0 Linda +``` + +### 输出样例: +```out +Amy Jack +Tom Linda +Bill Maya +Cindy John +```