学生成绩统计(结构体-字符串)

 

#include <stdio.h>

// 定义一个结构体来存储学生信息
typedef struct {
    char id[20]; // 学号
    char name[20]; // 姓名
    float scores[3]; // 三门课的成绩
    float average; // 平均成绩
} Student;

int main() {
    int n;
    scanf("%d", &n); // 读取学生数量

    Student students[n]; // 创建一个数组来存储所有学生的信息

    // 读取每个学生的信息
    for (int i = 0; i < n; i++) {
        scanf("%s %s %f %f %f", students[i].id, students[i].name, &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);
        students[i].average = (students[i].scores[0] + students[i].scores[1] + students[i].scores[2]) / 3; // 计算平均成绩
    }

    // 找出平均成绩最高的学生
    float maxAverage = students[0].average;
    int maxIndex = 0;
    for (int i = 1; i < n; i++) {
        if (students[i].average > maxAverage) {
            maxAverage = students[i].average;
            maxIndex = i;
        }
    }

    // 输出每个学生的信息和平均成绩
    for (int i = 0; i < n; i++) {
        printf("%d %s %.2f %.2f %.2f %.2f\n", i + 1, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].average);
    }

    // 输出最高分学生的信息
    printf("%s %.2f\n", students[maxIndex].name, maxAverage);

    return 0;
}

### C语言结构体中的字符串统计与排序 在C语言中处理结构体字符串统计和排序可以通过定义适当的数据结构来完成。下面展示了一个完整的例子,该例子基于学生信息管理系统的简化版本。 #### 定义数据结构 首先定义一个用于存储单个学生记录的`struct Stu`[^2]: ```c #define NAMELEN 40 // 名字最大长度 #define COURSE_CNT 3 // 成绩数量 typedef struct { int id; char name[NAMELEN]; float scores[COURSE_CNT]; } StudentRecord; ``` #### 创建初始化多个学生的列表 为了便于操作一组学生的信息,可以创建一个包含若干`StudentRecord`类型的数组,对其进行初始化: ```c #include <stdio.h> #include <string.h> // 假设有三个学生... void initStudents(StudentRecord students[], size_t count) { strcpy(students[0].name, "Alice"); students[0].id = 1001; strcpy(students[1].name, "Bob"); students[1].id = 1002; strcpy(students[2].name, "Charlie"); students[2].id = 1003; } ``` #### 对结构体内的字符串进行比较以支持后续排序逻辑 编写辅助函数来进行两个字符串之间的对比,这有助于之后实施冒泡或其他形式的排序算法: ```c int compareNames(const void* a, const void* b){ return strcmp(((const StudentRecord*)a)->name, ((const StudentRecord*)b)->name); } ``` #### 实现快速排序对学生名单按姓名升序排列的功能 利用标准库提供的qsort()函数对上述构建的学生集合执行排序动作: ```c size_t num_students = 3; StudentRecord studentList[num_students]; initStudents(studentList, num_students); printf("Before sorting:\n"); for (size_t i=0 ; i<num_students ; ++i) printf("%s\n",studentList[i].name ); qsort(studentList,num_students,sizeof(StudentRecord),compareNames); printf("\nAfter sorting alphabetically by names:\n"); for (size_t i=0 ; i<num_students ; ++i) printf("%s\n",studentList[i].name ); ``` 这段程序展示了如何通过自定义的比较器配合内置的`qsort()`函数实现对学生对象按照其内部保存的名字字段进行字母顺序上的重新安排[^3]。 #### 统计特定条件下的条目数目 如果想要计算满足某些条件(比如名字中含有某个字符)的学生人数,则可以在遍历整个数组的同时增加计数变量: ```c int countMatchingName(char letter, StudentRecord records[], size_t nRecords){ int matchCount = 0; for(size_t idx = 0;idx<nRecords;++idx){ if(strchr(records[idx].name,letter)){ ++matchCount; } } return matchCount; } // 使用方式如下: char targetLetter='A'; int result=countMatchingName(targetLetter,studentList,num_students); printf("Number of students whose name contains '%c': %d\n", targetLetter,result); ``` 此部分实现了基本的字符串匹配查询能力,能够帮助用户理解怎样针对具体需求设计相应的过滤机制[^1].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值