结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。
结构体类型不是由系统定义好的,而是需要程序设计者自己定义的,这就为表示一体不同类型数据提供了很大便利。
题目要求:利用结构体表示学生信息,(学生人数不定可自定义为n,n为整数)其中学生信息有学号、姓名、计算机成绩、数学成绩。
要求构造input函数 输入学生信息,output函数输出学生信息,avg函数输出学生平均成绩,pass函数统计及格和不及格学生人数,maxc函数查找计算机成绩最高的学生。
因为学生人数不定那么我们可以利用结构体数组来表示学生信息,每一个结构体数组的元素即为一个学生信息。
可表示如下
struct Student{
long num; // 学号(学号过长可以使用字符串表示)
char name[20]; // 姓名
float score[2]; // 数学计算机成绩
float aver; // 平均成绩
};
这里用long来定义学生学号主要是防止学号过长导致数据溢出问题,如果学号超过9223372036854775807 (long长整型表示最大的数)可以使用char型数组来表示学号接下来就是像遍历常规数组一样对数组的元素进行 *** 作,只不过这个数组元素是一个结构体罢了,为了更直观理解,函数实现部分写在了注释里。
🌟代码实现
#include
#define STUDENTS_NUMBER 3
struct Student{
long num;
char name[20];
float score[2];
float aver;
};
struct Student* input(struct Student students[]);
void output(struct Student *p1);
void avg(struct Student *p1);
void pass(struct Student *p1);
void maxc(struct Student student[]);
int main(void)
{
struct Student students[STUDENTS_NUMBER];
struct Student *p = students, *p1;
p1 = input(p);
output(p1);
avg(p1);
pass(p1);
maxc(students);
return 0;
}
struct Student* input(struct Student students[])
{
int i;
printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
printf("在此开始输入:");
for (i = 0; i < STUDENTS_NUMBER; i++){
scanf("%ld %s %f %f",
&students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
students[i].aver = (students[i].score[0] + students[i].score[1]) / 2;
}
return students;
}
void output(struct Student *p1)
{
int i;
for (i = 0; i < STUDENTS_NUMBER; i++){
printf("==========第%d位学生成绩==========\n", i+1);
printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
}
}
void avg(struct Student *p1)
{
int i;
for (i = 0; i < STUDENTS_NUMBER; i++){
printf("==========第%d位学生的平均分==========\n", i+1);
printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
}
}
void pass(struct Student *p1)
{
int pass = 0, i;
for (i = 0; i < STUDENTS_NUMBER; i++){
if (p1->score[0] >= 60 && p1->score[1] >= 60) {
pass++;
}
}
printf("\n");
printf("两门课都及格的人数有:%d人\n", pass);
printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
printf("\n");
}
void maxc(struct Student students[])
{
int i, max = 0;
for (i = 0; i < STUDENTS_NUMBER; i++) {
if (students[i].aver > students[max].aver) {
max = i;
}
}
printf("*****计算机成绩最高学生*****\n");
printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
}
✏代码注释
#include
#define STUDENTS_NUMBER 3 // 学生总人数
struct Student{
long num; // 学号(学号过长可以使用字符串表示)
char name[20]; // 姓名
float score[2]; // 数学计算机成绩
float aver; // 平均成绩
};
// 构造函数声明
struct Student* input(struct Student students[]); // input函数用于输入并返回学生信息
void output(struct Student *p1); // output函数用于输出学生信息
void avg(struct Student *p1); // avg函数用于输出学生平均成绩
void pass(struct Student *p1); // pass函数用于统计及格学生人数
void maxc(struct Student student[]); // maxc用于查找计算机成绩最高学生
int main(void)
{
struct Student students[STUDENTS_NUMBER]; // 定义结构体数组
struct Student *p = students, *p1; // 将指针p指向结构体数组
p1 = input(p); // 调用input函数输入学生信息并返回获取到的学生信息p1(指针)
output(p1); // output输出学生信息
avg(p1); // 输出学生平均值
pass(p1); // 输出及格学生人数
maxc(students); // 查找计算机成绩最高学生
return 0;
}
struct Student* input(struct Student students[])
{
int i;
printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
printf("在此开始输入:");
for (i = 0; i < STUDENTS_NUMBER; i++){ // 循环遍历结构体数组,依次输入每名学生成绩
scanf("%ld %s %f %f", // 类似变量输入加上取地址符,&students[i].num,但是students[i].name不许要加因为name为数字students[i].name即为地址
&students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
students[i].aver = (students[i].score[0] + students[i].score[1]) / 2; // 在学生数据输入时即计算学生成绩
}
return students; // 返回学生数据(结构体)
}
void output(struct Student *p1)
{
int i;
for (i = 0; i < STUDENTS_NUMBER; i++){ // 遍历结构体数组即每位学生信息,输出对应信息
printf("==========第%d位学生成绩==========\n", i+1);
printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
}
}
void avg(struct Student *p1)
{
int i;
for (i = 0; i < STUDENTS_NUMBER; i++){ // 遍历结构体数组即每位学生信息,输出学生平均成绩
printf("==========第%d位学生的平均分==========\n", i+1);
printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
}
}
void pass(struct Student *p1)
{
int pass = 0, i;
for (i = 0; i < STUDENTS_NUMBER; i++){ // // 遍历结构体数组即每位学生信息,找出及格人数
if (p1->score[0] >= 60 && p1->score[1] >= 60) {
pass++;
}
}
printf("\n");
printf("两门课都及格的人数有:%d人\n", pass);
printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
printf("\n");
}
void maxc(struct Student students[])
{
int i, max = 0;
for (i = 0; i < STUDENTS_NUMBER; i++) { // 遍历结构体数组即每位学生信息,找出计算机成绩最高学生
if (students[i].aver > students[max].aver) {
max = i;
}
}
printf("*****计算机成绩最高学生*****\n");
printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
}
输入:
输出:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)