#include<stdio.h> #include<string.h> typedef struct date { int year; int month; int day; } DATE; typedef struct student { int num; char name[20]; DATE date; int score; } STUDENT; void inputarr(STUDENT *b, int n); void maxarr(STUDENT *b, int n); void outputarr(STUDENT *b, int n); int main() { int n; inputarr(b,n); n = maxarr(b, n); outputarr(b, n); printf("第%d个同学的成绩最高。\n", n + 1); return 0; } void inputarr(STUDENT *b, int n) { printf("请输入%d个同学的学号、姓名和成绩:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &b[i].num); getchar(); // 去除输入缓冲区中的回车符 strcpy(b[i].name, ""); DATE d; scanf("%d-%d-%d", &d.year, &d.month, &d.day); b[i].date = d; b[i].score = 0; } } void maxarr(STUDENT *b, int n) { int max_score = 0; int max_num = -1; for (int i = 0; i < n; i++) { if (b[i].score > max_score) { max_score = b[i].score; max_num = i + 1; } } b[max_num].score = max_score; } void outputarr(STUDENT *b, int n) { printf("学号\t姓名\t成绩\n"); for (int i = 0; i < n; i++) { printf("%d\t%s\t%d\n", b[i].num, b[i].name, b[i].score); } }
时间: 2024-04-05 13:35:32 浏览: 19
在这份代码中,定义了两个结构体类型:DATE 和 STUDENT,分别用于表示日期和学生信息。程序主要包含三个函数:inputarr、maxarr 和 outputarr。
inputarr 函数用于输入学生信息,函数的参数为指向 STUDENT 类型的指针变量 b 和学生人数 n。函数通过循环输入每个学生的学号、姓名和出生日期,并将成绩初始化为 0。
maxarr 函数用于查找成绩最高的学生并更新其成绩,函数的参数为指向 STUDENT 类型的指针变量 b 和学生人数 n。函数通过循环遍历每个学生的成绩,找到成绩最高的学生,并将其成绩更新为成绩最高的值。
outputarr 函数用于输出所有学生的信息,函数的参数为指向 STUDENT 类型的指针变量 b 和学生人数 n。函数通过循环输出每个学生的学号、姓名和成绩。
在 main 函数中,程序首先调用 inputarr 函数输入学生信息,然后调用 maxarr 函数查找成绩最高的学生并返回其下标,最后调用 outputarr 函数输出所有学生的信息。
然而,这份代码存在一个严重的问题,即指向 STUDENT 类型的指针变量 b 没有被分配内存空间。在调用 inputarr 函数时,应该先为 b 分配内存空间,例如:
STUDENT *b = (STUDENT*) malloc(n * sizeof(STUDENT));
另外,在 maxarr 函数中,应该返回成绩最高的学生的下标,而不是成绩最高的学生的成绩。所以,应该将 maxarr 函数的返回类型改为 int,并在函数最后返回 max_num。
相关问题
#include<stdio.h> #include<string.h> typedef struct date { int year; int month; int day; }DATE; typedef struct student { int num; char name[20]; char sex; DATE birthday; float score; }STUDENT; void input(STUDENT *s); void output(STUDENT s); /********** Begin **********/ /********** End **********/
完整代码如下所示:
```c
#include <stdio.h>
#include <string.h>
typedef struct date {
int year;
int month;
int day;
} DATE;
typedef struct student {
int num;
char name[20];
char sex;
DATE birthday;
float score;
} STUDENT;
void input(STUDENT *s);
void output(STUDENT s);
void sort(STUDENT s[], int n);
int main() {
STUDENT s[5];
int i;
for (i = 0; i < 5; i++) {
printf("请输入第%d个学生的信息:\n", i + 1);
input(&s[i]);
}
sort(s, 5);
printf("\n排序后的学生信息为:\n");
for (i = 0; i < 5; i++) {
output(s[i]);
}
return 0;
}
void input(STUDENT *s) {
printf("学号:");
scanf("%d", &s -> num);
printf("姓名:");
scanf("%s", s -> name);
printf("性别:");
scanf(" %c", &s -> sex);
printf("生日:");
scanf("%d/%d/%d", &s -> birthday.year, &s -> birthday.month, &s -> birthday.day);
printf("成绩:");
scanf("%f", &s -> score);
}
void output(STUDENT s) {
printf("学号:%d,姓名:%s,性别:%c,生日:%d/%d/%d,成绩:%.2f\n",
s.num, s.name, s.sex, s.birthday.year, s.birthday.month, s.birthday.day, s.score);
}
void sort(STUDENT s[], int n) {
int i, j;
STUDENT temp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (s[i].score < s[j].score) {
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
}
```
这段代码中,定义了一个main函数,用于程序的入口,创建了一个学生信息数组s。在main函数中,使用for循环对每个学生的信息进行输入。输入完成后,调用sort函数对学生信息数组s进行排序。最后,使用for循环对排序后的学生信息进行输出。
从键盘输入一个学生的信息,在屏幕上输出这个学生的信息,要求用函数实现学生信息的输入输出。 #include<stdio.h> #include<string.h> typedef struct date { int year; int month; int day; }DATE; typedef struct student { int num; char name[20]; char sex; DATE birthday; float score; }STUDENT; void input(STUDENT *s); void output(STUDENT s); /********** Begin **********/ /********** End **********/
下面是实现学生信息输入输出的代码:
```
#include<stdio.h>
#include<string.h>
typedef struct date {
int year;
int month;
int day;
} DATE;
typedef struct student {
int num;
char name[20];
char sex;
DATE birthday;
float score;
} STUDENT;
void input(STUDENT *s);
void output(STUDENT s);
int main() {
STUDENT s;
input(&s);
output(s);
return 0;
}
void input(STUDENT *s) {
printf("请输入学生的信息:\n");
printf("学号:");
scanf("%d", &(s->num));
printf("姓名:");
scanf("%s", s->name);
printf("性别:");
scanf(" %c", &(s->sex));
printf("生日:");
scanf("%d%d%d", &(s->birthday.year), &(s->birthday.month), &(s->birthday.day));
printf("成绩:");
scanf("%f", &(s->score));
}
void output(STUDENT s) {
printf("学生的信息如下:\n");
printf("学号:%d\n", s.num);
printf("姓名:%s\n", s.name);
printf("性别:%c\n", s.sex);
printf("生日:%d年%d月%d日\n", s.birthday.year, s.birthday.month, s.birthday.day);
printf("成绩:%.2f\n", s.score);
}
```
函数 `input` 用于输入学生信息,函数 `output` 用于输出学生信息。在 `main` 函数中,先定义一个 `STUDENT` 类型的变量 `s`,然后分别调用 `input` 和 `output` 函数进行输入和输出。注意,在输入字符串时,应该使用 `%s`,而在输入字符时,应该使用 `%c`。另外,在输入生日时,可以使用 `scanf("%d%d%d", &(s->birthday.year), &(s->birthday.month), &(s->birthday.day));` 一次性输入三个整数。输出时,使用 `%d` 输出整数,使用 `%f` 输出浮点数,并且可以使用 `%.2f` 输出两位小数。