|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- //数据结构定义
- #define MAX_STU_NUM 30//最大学生人数
- #define MAX_SUB_NUM 6//最大科目数
- #define MAX 100
- char *subject_name[MAX_SUB_NUM];//储存课程的名称
- typedef struct {
- int num;//学号
- char name[MAX];//姓名
- int score[MAX_SUB_NUM];//成绩
- int sum;//各科成绩总分
- int des_score_rank;//降序按总分排序的名次
- int aec_score_rank;//升序按总分排序的名次
- int aec_num_rank;//升序按学号排序的名次
- int name_rank;//按名字字典顺序排序的名次
- } STUDENT;
- typedef struct {
- int A;//优秀
- int B;//良好
- int C;//中等
- int D;//及格
- int F;//不及格
- double Arate;
- double Brate;
- double Crate;
- double Drate;
- double Frate;
- } EvaluateCourse[MAX_SUB_NUM];
- //函数原型
- void InputRecord(STUDENT stu[], int *num, int *subnum);//录入学生的学号、姓名和各科考试成绩
- void CalculateCourse(STUDENT stu[], int num, int subnum, int course_sum[], double course_average[]);//计算每门课程的总分和平均分
- void CalculateStudent(STUDENT stu[], int num, int subnum, double stu_course_ave[]);//计算每个学生的总分和平均分
- void DesSortScore(STUDENT stu[], int num, int subnum);//按每个学生的总分由高到低排出名次表
- void AscSortScore(STUDENT stu[], int num, int subnum);//按每个学生的总分由低到高排出名次表
- void AesSortNum(STUDENT stu[], int num, int subnum);//按学号由小到大排出成绩表
- void SortName(STUDENT stu[], int num, int subnum);//按姓名的字典顺序排出成绩表
- void NumSearch(STUDENT stu[], int num, int subnum);//按学号查询学生排名及其考试成绩
- void NameSearch(STUDENT stu[], int num, int subnum);//按姓名查询学生排名及其考试成绩
- void JudgeScore(STUDENT stu[], int num,
- int subnum);//按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比
- void OutputStuInfo(STUDENT stu[], int num, int subnum, int course_sum[],
- double course_average[]);//输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
- void WriteToFile(STUDENT stu[], int num, int subnum,int course_sum[],double course_average[]);//将每个学生的记录信息写入文件
- void ReadFromFile(STUDENT stu[], int *num, int *subnum);//从文件中读出每个学生的记录信息并显示
- int main() {
- int cmd;
- int num, subnum;
- int course_sum[MAX_SUB_NUM]={-1};
- double course_average[MAX_SUB_NUM]={-1};
- double stu_course_ave[MAX_STU_NUM]={-1};
- STUDENT stu[MAX_STU_NUM];
- FILE *fp;
- do {
- printf("1.Input record\n"
- "2.Calculate total and average score of every course\n"
- "3.Calculate total and average score of every student\n"
- "4.Sort in descending order by total score of every student\n"
- "5.Sort in ascending order by total score of every student\n"
- "6.Sort in ascending order by number\n"
- "7.Sort in dictionary order by name\n"
- "8.Search by number\n"
- "9.Search by name\n"
- "10.Statistic analysis for every course\n"
- "11.List record\n"
- "12.Write to a file\n"
- "13.Read from a file\n"
- "0.Exit\n"
- "Please enter your choice:");
- scanf("%d", &cmd);
- switch (cmd) {
- case 0:
- printf("退出系统成功!\n");
- break;
- case 1:
- InputRecord(stu, &num, &subnum);
- break;
- case 2:
- CalculateCourse(stu, num, subnum, course_sum, course_average);
- break;
- case 3:
- CalculateStudent(stu, num, subnum, stu_course_ave);
- break;
- case 4:
- DesSortScore(stu, num, subnum);
- break;
- case 5:
- AscSortScore(stu, num, subnum);
- break;
- case 6:
- AesSortNum(stu, num, subnum);
- break;
- case 7:
- SortName(stu, num, subnum);
- break;
- case 8:
- NumSearch(stu, num, subnum);
- break;
- case 9:
- NameSearch(stu, num, subnum);
- break;
- case 10:
- JudgeScore(stu, num, subnum);
- break;
- case 11:
- OutputStuInfo(stu, num, subnum, course_sum, course_average);
- break;
- case 12:
- WriteToFile(stu, num, subnum,course_sum,course_average);
- break;
- case 13:
- ReadFromFile(stu, &num, &subnum);
- break;
- default:
- printf("输入的数字不正确,请重新输入!\n");
- }
- } while (cmd != 0);
- return 0;
- }
- void WriteToFile(STUDENT stu[], int num, int subnum,int course_sum[],double course_average[]) {
- int i,j;
- FILE *fp;
- fp = fopen("output.txt", "w");
- if (!fp) {
- printf("打开文件失败!\n");
- exit(-1);
- }
- printf("向文件中写入学生信息成功!\n");
- fprintf(fp,"%-10s%-10s","学号","姓名");
- for(i=0;i<subnum;i++)
- {
- fprintf(fp,"%-10s",subject_name[i]);
- }
- fprintf(fp,"\n");
- for (i = 0; i < num; i++) {
- fprintf(fp,"%-10d", stu[i].num);
- fprintf(fp,"%-10s", stu[i].name);
- for (j = 0; j < subnum; j++) {
- fprintf(fp,"%-10d", stu[i].score[j]);
- }
- fprintf(fp,"\n");
- }
- if(course_sum[0]==-1)
- {
- fprintf(fp,"还没有计算课程总分及均分!\n");
- return;
- }
- else {
- fprintf(fp,"每门课程的总分和均分为:\n");
- fprintf(fp,"%-10s%-10s%-10s\n","学科","总分","均分");
- for (i = 0; i < subnum; i++) {
- fprintf(fp,"%-9s%-9d%-10.1lf\n", subject_name[i], course_sum[i],course_average[i]);
- }
- }
- fclose(fp);
- }
- void ReadFromFile(STUDENT stu[], int *num, int *subnum) {
- FILE *fp;
- fp = fopen("data.txt", "r");
- if (!fp) {
- printf("打开文件失败!\n");
- exit(-1);
- }
- printf("从文件中读取学生信息成功!\n");
- int i, j;
- fscanf(fp, "%d%d", num, subnum);
- for (i = 0; i < *subnum; i++) {
- subject_name[i] = (char *) malloc(MAX * sizeof(char));
- fscanf(fp, "%s", subject_name[i]);
- }
- for (i = 0; i < *num; i++) {
- stu[i].des_score_rank = stu[i].aec_score_rank = stu[i].aec_num_rank = stu[i].name_rank = 0;//初始化排名
- fscanf(fp, "%d", &stu[i].num);
- fscanf(fp, "%s", stu[i].name);
- for (j = 0; j < *subnum; j++) {
- fscanf(fp, "%d", &stu[i].score[j]);
- }
- }
- printf("从文件中读取的学生信息如下:\n");
- printf("%-10s%-10s","学号","姓名");
- for(i=0;i<*subnum;i++)
- {
- printf("%-10s",subject_name[i]);
- }
- putchar('\n');
- for (i = 0; i < *num; i++) {
- printf("%-10d", stu[i].num);
- printf("%-10s", stu[i].name);
- for (j = 0; j < *subnum; j++) {
- printf("%-10d", stu[i].score[j]);
- }
- putchar('\n');
- }
- fclose(fp);
- }
复制代码 |
|