?**源代码:
#include<stdio.h>
#include<stdlib.h>
#define num 7// 宏定义学生人数
int tot1[10], tot2[10], tot3[10];// 各个分数段的人数
double ave[10];
double sum[10];// 储存所有学生同一科目的总分以计算每个课程平均分
char enter = '\n';// 换行 方便使用
struct student{// 每个学生都要输入的信息
char name[10][5];
char ID[30];// 不能太短,否则会影响文件中的打印格式
double grade1, grade2, grade3;// 三个学科的成绩
double average;// 学生平均分
int rank;
}stu[num+1];
void Add_Student();// 输入学生信息并计算平均分
void sort();// 把平均分排序
void Grade_tot();// 统计各个分数段的学生数
void Same_();// 处理平均分相同的情况
void Student_Data();// 存储学生信息
void Average_Grade();// 计算每科平均分
void Save_Average();// 将平均分存入d:/average.txt文件 over!
void Add_Student(){
for(int i = 1; i <= num; i++){
printf(" 快输入学生信息哟~ \n");
printf(" \t请输入第%d位学生的信息: \n",i);
printf("<姓名>:"); scanf("%s",stu[i].name);
printf("<学号>:"); scanf("%s",stu[i].ID);
printf("<课程1的成绩>:"); scanf("%lf",&stu[i].grade1);
printf("<课程2的成绩>:"); scanf("%lf",&stu[i].grade2);
printf("<课程3的成绩>:"); scanf("%lf",&stu[i].grade3);
stu[i].average = (stu[i].grade1 + stu[i].grade2 + stu[i].grade3) / 3.0;// 计算所有学生的平均分
}
}
void sort(int l, int r){// 这里用了快排排序将平均分按从大到小排列(处理的数据更多)
if(l >= r) return ;
int i = l, j = r;
struct student key = stu[i];
while(i < j){
while(i < j && stu[j].average <= key.average) j--;
stu[i] = stu[j];
while(i < j && stu[i].average >= key.average) i++;
stu[j] = stu[i];
}
stu[i] = key;
sort(l, i - 1);
sort(i + 1, r);
// for(int i = 1; i < num; i++){
// for(int j = 1; j < num; j++){
// if(stu[j].average < stu[j + 1].average){
// struct student t = stu[j];
// stu[j] = stu[j + 1];
// stu[j + 1] = t;
// }
// }
// }// 冒泡排序的方法也可以
}
void Grade_tot(){// 统计各个分数段的学生数
for(int i = 1; i <= num; i++){
if(stu[i].grade1 < 60) tot1[0]++;
if(stu[i].grade1 >= 60 && stu[i].grade1 < 70) tot1[1]++;
if(stu[i].grade1 >= 70 && stu[i].grade1 < 80) tot1[2]++;
if(stu[i].grade1 >= 80 && stu[i].grade1 < 90) tot1[3]++;
if(stu[i].grade1 >= 90) tot1[4]++;// 课程一
if(stu[i].grade2 < 60) tot2[0]++;
if(stu[i].grade2 >= 60 && stu[i].grade2 < 70) tot2[1]++;
if(stu[i].grade2 >= 70 && stu[i].grade2 < 80) tot2[2]++;
if(stu[i].grade2 >= 80 && stu[i].grade2 < 90) tot2[3]++;
if(stu[i].grade2 >= 90) tot2[4]++;// 课程二
if(stu[i].grade3 < 60) tot3[0]++;
if(stu[i].grade3 >= 60 && stu[i].grade3 < 70) tot3[1]++;
if(stu[i].grade3 >= 70 && stu[i].grade3 < 80) tot3[2]++;
if(stu[i].grade3 >= 80 && stu[i].grade3 < 90) tot3[3]++;
if(stu[i].grade3 >= 90) tot3[4]++;// 课程三
}
}
void Same_(){// 处理平均分相同的情况
int m = num;
int Rank = 1;
for(int i = 1; i <= num; i++){// 此时平均分已经排好序了
if(stu[i].average == stu[i + 1].average){
stu[i].rank = Rank;
continue;
}
stu[i].rank = Rank;
Rank++;
}
}
void Student_Data(){// 存储学生信息
FILE *fp;
fp = fopen("d://st.txt", "wt+");// 读写一个二进制文件
fprintf(fp, "\t\t\t\t\t\t\t 成绩单 \t\t\t\t\t%c", enter);
fprintf(fp, "\t排名\t\t学生姓名\t\t学生学号\t\t课程一成绩\t课程二成绩\t课程三成绩\t平均分\t%c", enter);
for(int i = 1; i <= num; i++){
fprintf(fp, "\t%4d\t\t%7s\t %15s \t%10.1f\t\t%10.1f\t\t%10.1f\t %10.1f\t%c", stu[i].rank, stu[i].name, stu[i].ID,stu[i].grade1, stu[i].grade2, stu[i].grade3, stu[i].average, enter);
}// 尤其注意打印格式
printf("<学生信息已存入d:/st.txt文件中>\n");
fclose(fp);
}
void Average_Grade(){// 计算每科平均分
for(int i = 1; i <= num; i++){
sum[1] = sum[1] + stu[i].grade1;
sum[2] = sum[2] + stu[i].grade2;
sum[3] = sum[3] + stu[i].grade3;
}
for(int i = 1; i < 4; i++){
ave[i] = sum[i] / (double)num;
}
}
void Save_Average(){// 将计算完成的数据存入d:/average.txt文件
FILE *fp;
fp = fopen("d://average.txt", "wt+");
fprintf(fp, "\t\t\t\t\t 各课程平均分情况 \t\t%c",enter);
fprintf(fp, "\t\t\t\t 课程一平均分\t课程二平均分\t课程三平均分\t%c",enter);
fprintf(fp, "\t\t\t\t%10.1lf\t\t%10.1lf\t\t%10.1lf\t%c",ave[1],ave[2],ave[3],enter);
printf("<平均分计算完成,已将数据存储到d:/average.txt文件中>%c", enter);
fprintf(fp, "\t\t\t\t 各课程分数段分布情况 \t%c",enter);
fprintf(fp, "\t课程一人数分布情况\t90分以上:%d人\t80~90分:%d人\t70~80分:%d人\t60~70分:%d人\t60分以下:%d人\t\t%c",tot1[4],tot1[3],tot1[2],tot1[1],tot1[0],enter);
fprintf(fp, "\t课程二人数分布情况\t90分以上:%d人\t80~90分:%d人\t70~80分:%d人\t60~70分:%d人\t60分以下:%d人\t\t%c",tot2[4],tot2[3],tot2[2],tot2[1],tot2[0],enter);
fprintf(fp, "\t课程三人数分布情况\t90分以上:%d人\t80~90分:%d人\t70~80分:%d人\t60~70分:%d人\t60分以下:%d人\t\t%c",tot3[4],tot3[3],tot3[2],tot3[1],tot3[0],enter);
printf("<各科分数段人数统计完成,已将数据存入d:/average.txt文件中>%c", enter);
fclose(fp);
}
int main()
{
FILE *fp;
printf("*****************这里是学生成绩管理系统*********************\n");
printf(" <请录入本班学生信息> \n");
printf(" <请分别输入本班学生的姓名、学号及三门考试成绩> \n");
printf(" <系统将按平均分排名的信息导入d:\\st.txt文件中> \n");
printf(" <本系统将自动将平均分等级导入d:\\average.txt文件中> \n");
printf("******************下面请依次输入学生信息********************\n");// 开场白hhh
Add_Student();// 输入学生信息并计算平均分
sort(1, num);// 把平均分排序
Grade_tot();// 统计各个分数段的学生数
Same_();// 处理平均分相同的情况
Student_Data();// 存储学生信息
Average_Grade();// 计算每科平均分
Save_Average();// 将平均分存入d:/average.txt文件 over!
return 0;
}
***这是借鉴csdn一篇博客所写,但我现在找不到那篇了。。。T_T
|