设计并实现一个成绩分析系统,能够实现录入、保存一个班级学生多门课程的成绩、并对成绩进行分析等功能.具体要求如下: (1)定义一个菜单,方便用户实现下述操作.要求菜单筒沾、易操作、界而美观• (2)建立破盘文件input. dat,用于保存学生及其成绩信息.惮细内容参见表1M. (3)读取磁盘文件input. dat中的数据,并进行处理.要求实现如下功能: •按各门课程成绩排序,将排序的结果保存到磁盘文件中. •计算每人的平均成绩,按平均成绩排序,将排序的结果保存到破盘文件中. •能够统计各门课程的平均成绩、最高分、最低分、不及格人数、60〜69分人数、70〜 79分人数、80〜89分人数、90分以上人数. •根据学生姓名或学号查询其各门课成绩,需考虑重名情况的处理. 用C语言实现

时间: 2024-03-07 10:54:04 浏览: 27
好的,我理解了你的要求。下面是一个简单的成绩分析系统的C语言实现,根据你的要求进行了设计和开发。 首先是程序的主要代码部分: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 #define MAX_RECORDS 100 #define MAX_COURSES 5 typedef struct { char name[MAX_NAME_LEN]; int id; int scores[MAX_COURSES]; float avg_score; } student_t; typedef struct { char name[MAX_NAME_LEN]; float avg_score; float max_score; float min_score; int fail_num; int sixty_num; int seventy_num; int eighty_num; int ninety_num; } course_t; student_t records[MAX_RECORDS]; int record_count = 0; course_t courses[MAX_COURSES]; int course_count = 0; void display_menu(); void add_record(); void save_records(); void load_records(); void sort_scores(); void sort_avg_scores(); void analyze_scores(); void query_scores(); int main() { load_records(); display_menu(); return 0; } void display_menu() { int choice = 0; do { printf("\nPlease choose an option:\n"); printf("1. Add record\n"); printf("2. Save records\n"); printf("3. Load records\n"); printf("4. Sort scores\n"); printf("5. Sort average scores\n"); printf("6. Analyze scores\n"); printf("7. Query scores\n"); printf("8. Exit\n"); printf("Enter your choice (1-8): "); scanf("%d", &choice); switch (choice) { case 1: add_record(); break; case 2: save_records(); break; case 3: load_records(); break; case 4: sort_scores(); break; case 5: sort_avg_scores(); break; case 6: analyze_scores(); break; case 7: query_scores(); break; case 8: printf("\nGoodbye!\n"); break; default: printf("\nInvalid choice. Please try again.\n"); break; } } while (choice != 8); } void add_record() { if (record_count == MAX_RECORDS) { printf("\nError: Maximum number of records reached.\n"); return; } student_t new_record; printf("\nEnter student name: "); scanf("%s", new_record.name); printf("Enter student ID: "); scanf("%d", &new_record.id); for (int i = 0; i < course_count; i++) { printf("Enter score for course %s: ", courses[i].name); scanf("%d", &new_record.scores[i]); } records[record_count++] = new_record; printf("\nRecord added successfully.\n"); } void save_records() { FILE *fp = fopen("input.dat", "wb"); if (fp == NULL) { printf("\nError: Failed to open file.\n"); return; } fwrite(&record_count, sizeof(record_count), 1, fp); fwrite(records, sizeof(student_t), record_count, fp); fclose(fp); printf("\nRecords saved successfully.\n"); } void load_records() { FILE *fp = fopen("input.dat", "rb"); if (fp == NULL) { printf("\nError: Failed to open file.\n"); return; } fread(&record_count, sizeof(record_count), 1, fp); fread(records, sizeof(student_t), record_count, fp); fclose(fp); printf("\nRecords loaded successfully.\n"); } void sort_scores() { int course_index = 0; printf("\nEnter course index (0-%d): ", course_count - 1); scanf("%d", &course_index); if (course_index < 0 || course_index >= course_count) { printf("\nError: Invalid course index.\n"); return; } for (int i = 0; i < record_count - 1; i++) { for (int j = i + 1; j < record_count; j++) { if (records[i].scores[course_index] < records[j].scores[course_index]) { student_t temp = records[i]; records[i] = records[j]; records[j] = temp; } } } save_records(); printf("\nScores sorted by course %s.\n", courses[course_index].name); } void sort_avg_scores() { for (int i = 0; i < record_count; i++) { float total_score = 0; for (int j = 0; j < course_count; j++) { total_score += records[i].scores[j]; } records[i].avg_score = total_score / course_count; } for (int i = 0; i < record_count - 1; i++) { for (int j = i + 1; j < record_count; j++) { if (records[i].avg_score < records[j].avg_score) { student_t temp = records[i]; records[i] = records[j]; records[j] = temp; } } } save_records(); printf("\nRecords sorted by average score.\n"); } void analyze_scores() { for (int i = 0; i < course_count; i++) { float total_score = 0; float max_score = 0; float min_score = 100; int fail_num = 0; int sixty_num = 0; int seventy_num = 0; int eighty_num = 0; int ninety_num = 0; for (int j = 0; j < record_count; j++) { total_score += records[j].scores[i]; if (records[j].scores[i] > max_score) { max_score = records[j].scores[i]; } if (records[j].scores[i] < min_score) { min_score = records[j].scores[i]; } if (records[j].scores[i] < 60) { fail_num++; } else if (records[j].scores[i] >= 60 && records[j].scores[i] < 70) { sixty_num++; } else if (records[j].scores[i] >= 70 && records[j].scores[i] < 80) { seventy_num++; } else if (records[j].scores[i] >= 80 && records[j].scores[i] < 90) { eighty_num++; } else { ninety_num++; } } courses[i].avg_score = total_score / record_count; courses[i].max_score = max_score; courses[i].min_score = min_score; courses[i].fail_num = fail_num; courses[i].sixty_num = sixty_num; courses[i].seventy_num = seventy_num; courses[i].eighty_num = eighty_num; courses[i].ninety_num = ninety_num; } printf("\nScore analysis completed.\n"); } void query_scores() { int choice = 0; do { printf("\nPlease choose a query option:\n"); printf("1. Query by name\n"); printf("2. Query by ID\n"); printf("3. Return to main menu\n"); printf("Enter your choice (1-3): "); scanf("%d", &choice); switch (choice) { case 1: { char name[MAX_NAME_LEN]; printf("\nEnter student name: "); scanf("%s", name); int found_count = 0; for (int i = 0; i < record_count; i++) { if (strcmp(records[i].name, name) == 0) { found_count++; printf("\nRecord found:\n"); printf("Name: %s\n", records[i].name); printf("ID: %d\n", records[i].id); for (int j = 0; j < course_count; j++) { printf("Score for course %s: %d\n", courses[j].name, records[i].scores[j]); } } } if (found_count == 0) { printf("\nNo record found.\n"); } break; } case 2: { int id = 0; printf("\nEnter student ID: "); scanf("%d", &id); int found_count = 0; for (int i = 0; i < record_count; i++) { if (records[i].id == id) { found_count++; printf("\nRecord found:\n"); printf("Name: %s\n", records[i].name); printf("ID: %d\n", records[i].id); for (int j = 0; j < course_count; j++) { printf("Score for course %s: %d\n", courses[j].name, records[i].scores[j]); } } } if (found_count == 0) { printf("\nNo record found.\n"); } break; } case 3: printf("\nReturning to main menu.\n"); break; default: printf("\nInvalid choice. Please try again.\n"); break; } } while (choice != 3); } ``` 上述代码中,定义了两个结构体,student_t表示学生信息,course_t表示课程信息。同时定义了两个全局数组,records存储学生信息,courses存储课程信息。主函数中首先调用load_records函数从磁盘文件中读取记录,然后显示菜单,根据用户的选择执行相应的操作。 下面是各个操作的具体实现: - add_record: 添加一条学生记录,包括姓名、学号和多门课程的成绩。 - save_records: 将所有学生记录保存到磁盘文件input.dat中。 - load_records: 从磁盘文件input.dat中读取所有学生记录。 - sort_scores: 按指定的课程成绩从高到低排序,然后将排序结果保存到磁盘文件中。 - sort_avg_scores: 计算每个学生的平均成绩,然后按平均成绩从高到低排序,最后将排序结果保存到磁盘文件中。 - analyze_scores: 统计各门课程的平均成绩、最高分、最低分、不及格人数、60~69分人数、70~79分人数、80~89分人数、90分以上人数。 - query_scores: 根据学生姓名或学号查询其各门课成绩,需考虑重名情况的处理。 程序中使用了文件读写操作、排序算法和简单的统计分析,可以满足你的要求。不过需要注意的是,由于本程序没有进行输入数据的验证,如果输入了错误的数据可能会导致程序崩溃或者输出错误的结果。

相关推荐

最新推荐

recommend-type

用汇编语言实现学生成绩统计分析

用汇编语言实现学生成绩统计分析,实验内容:编制一个程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成...
recommend-type

只有两个字段用一个sql语句查询出某个学生的姓名、成绩以及在表中的排名

主要介绍了只有两个字段用一个sql语句查询出某个学生的姓名、成绩以及在表中的排名,需要的朋友可以参考下
recommend-type

数据姐公综合课设统计成绩.docx

1.问题描述: ...对学生的考试成绩进行有关统计,并打印统计表。 2.基本要求: (1)按总数高低次序,打印名次表,分数相同的为同一名次; (2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。
recommend-type

设计一个学生类(CStudent)

设计一个学生类(CStudent),它具有的私有数据成员是注册号、...然后通过主函数从键盘对学生对象的数组(全班学生信息)进行输入,而后求出每一个学生的总成绩、平均成绩,并显示全班学生总成绩最高的同学的全部数据信
recommend-type

中文翻译Introduction to Linear Algebra, 5th Edition 2.1节

中文翻译Introduction to Linear Algebra, 5th Edition 2.1节 线性代数的核心问题是求解方程组。这些方程都是线性的,即未知数仅与数相乘——我们绝不会 遇见 x 乘以 y。我们的第一个线性方程组较小。接下来你来看看它引申出多远: 两个方程 两个未知数 x − 2y = 1 3x + 2y = 11 (1) 我们一次从一个行开始。第一个方程 x − 2y = 1 得出了 xy 平面的一条直线。由于点 x = 1, y = 0 解 出该方程,因此它在这条直线上。因为 3 − 2 = 1,所以点 x = 3, y = 1 也在这条直线上。若我们选择 x = 101,那我们求出 y = 50。 这条特定直线的斜率是 12,是因为当 x 变化 2 时 y 增加 1。斜率在微积分中很重要,然而这是线 性代数! 图 2.1 将展示第一条直线 x − 2y = 1。此“行图”中的第二条直线来自第二个方程 3x + 2y = 11。你 不能错过两条线的交点 x = 3, y = 1。点 (3, 1) 位于两条线上并且解出两个方程。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

识别MATLAB微分方程求解中的混沌行为:分析非线性方程混沌行为的实用技巧

![matlab求解微分方程](https://img-blog.csdnimg.cn/2021062810300367.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTQ3OTY3OA==,size_16,color_FFFFFF,t_70) # 1. MATLAB微分方程求解概述 微分方程是描述物理、工程和金融等领域中动态系统的数学模型。MATLAB提供了强大的工具来求解微分方程,包括内置求解器和自定义函数
recommend-type

physon如何做ERP系统

作为一个AI语言模型,我可以给您提供一些基本的建议和思路: 1.明确需求和目标:在开始开发ERP系统之前,需要明确您的业务需求和目标,了解您的业务流程、流程数据、员工角色和权限、财务管理等方面的要求,这样才能更好的设计和开发ERP系统。 2.选择技术框架和开发工具:选择合适的技术框架和开发工具是ERP系统开发的关键。选择一种流行的技术框架和工具可以提高开发效率和质量。 3.设计数据库:ERP系统需要一个功能强大的数据库来存储数据。设计数据库需要考虑数据的完整性、安全性和可扩展性。 4.设计系统架构:系统架构是ERP系统的骨架,需要考虑系统的可扩展性、可维护性和性能。 5.开发和测试:
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依