//有3个学生,每个学生有3门课程成绩,从键盘输入以上数据(学号,姓名,3门课程成绩),计算出平均成绩,并按平均成绩升序排序。
//将排序后的数据放到stu_list中。
#include<stdio.h>
#include<stdlib.h>
#define N 3
struct student{
int id;
char name[20];
int score[3];
double aver;
};
void Input(struct student st[],int n){ //输入学生信息
int i,j;
for(i=0;i<N;i++){
printf("\n请输入第%d位学生的信息:\n",i+1);
printf("\n学号:");
scanf("%d",&st[i].id);
fflush(stdin); //清空输入缓冲区。否则第一次的回车会被第二次操作捕捉。
printf("\n姓名:");
gets(st[i].name);
printf("\n三门成绩:");
for(j=0;j<3;j++){
scanf("%d",&st[i].score[j]);
}
}
}
void Aver(struct student st[],int n){ //求3门成绩平均值
int i,j;
for(i=0;i<N;i++){
printf("第%d个学生的平均分为:",i+1);
int s=0;
for(j=0;j<3;j++){
s=s+st[i].score[j];
}
st[i].aver=s/3.0;
printf("%.2lf\n",st[i].aver);
}
}
void Sort(struct student st[],int n){ //利用冒泡排序进行升序排序
int i,j;
struct student t;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(st[i].aver>st[j].aver){
t=st[i];
st[i]=st[j];
st[j]=t;
}
}
printf("%d %s %d %d %d %.2lf\n",st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].aver);
}
}
void Save(struct student st[],int n){ //将数据保存到stu_list.txt文件中
FILE *fp;
int i,j;
fp=fopen("d:\\src\\stu_list.txt","wt");
if(fp==NULL){
printf("找不到该文件!");
exit(1);
}
for(i=0;i<N;i++){
fprintf(fp,"%d %s %d %d %d %.2lf\n",st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].aver); //写一个结构体数组元素
}
fclose(fp);
}
int main(){
struct student st[N];
printf("\n请输入要保存的N名学生的信息:\n");
Input(st,N);
printf("\n输出所有学生的平均分:\n");
Aver(st,N);
printf("\n输出排序后的学生信息:\n");
Sort(st,N);
printf("\n将数据保存到stu_list文件中.");
Save(st,N);
}
//将12.10题已排序的学生成绩文件进行插入处理,插入一个学生3门课程的成绩,先计算新插入学生的平均成绩,然后按升序插入,插入后建立一个新文件,将数据存到新文件中。
//先读取stu_sort的数据,再将待插入学生的平均分与数据比较,排序后存入新文件中。
#include<stdio.h>
#include<stdlib.h>
#define N 4
struct student{
int id;
char name[20];
int score[3];
double aver;
};
void Aver(struct student st[],int n){
int i,j;
for(i=0;i<n;i++){
printf("第%d个学生的平均分为:",i+1);
int s=0;
for(j=0;j<3;j++){
s=s+st[i].score[j];
}
st[i].aver=s/3.0;
printf("%.2lf\n",st[i].aver);
}
}
void Read(struct student st[]){
int i;
FILE *fp;
fp=fopen("d:\\src\\stu_list.txt","rt");
if(fp==NULL){
printf("未找到该文件!");
exit(1);
}
i=0;
while(fscanf(fp,"%d %s %d %d %d %lf",&st[i].id,st[i].name,&st[i].score[0],&st[i].score[1],&st[i].score[2],&st[i].aver)!=EOF){ //读一个结构体数组元素
printf("%d %s %d %d %d %.2lf\n",st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].aver);
i++;
}
fclose;
}
void Insert(struct student st[],struct student stu,int n){ //输入一条数据用stu结构体数组接收,与原先排好序的st[]结构体数组比较,总共有n条数据.
int i,j,k;
printf("\n学号:");
scanf("%d",&stu.id);
fflush(stdin); //清空输入缓冲区。否则第一次的回车会被第二次操作捕捉。
printf("\n姓名:");
gets(stu.name);
printf("\n三门成绩:");
for(j=0;j<3;j++){
scanf("%d",&stu.score[j]);
}
Aver(&stu,1); //要加地址符,与形参一致。
for(i=0;i<3;i++){
if(st[i].aver>stu.aver){ //找到第一个比stu[3].aver大的值,即为stu[3]一条数据的插入位置 ,从这个位置后的数据都要后移一条。
break;
}
}
k=i; //记录i的位置
for(j=2;j>=k;j--){ //从后向前循环
st[j+1]=st[j]; //各往后移一位
}
st[k]=stu; //把结构体变量st(插入的学生信息)插入到stu[i]的位置.
printf("\n插入一条信息后的数据:\n");
for(i=0;i<n;i++){ //输出插入一条学生信息后的数据
printf("%d %s %d %d %d %.2lf\n",st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].aver);
}
}
void Save(struct student st[],int n){
FILE *fp;
int i,j;
fp=fopen("d:\\src\\stu_insert.txt","wt");
if(fp==NULL){
printf("找不到该文件!");
exit(1);
}
for(i=0;i<n;i++){
fprintf(fp,"%d %s %d %d %d %.2lf\n",st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].aver);
}
fclose(fp);
}
int main(){
struct student st[N],stu;
printf("读取原文件数据:\n");
Read(st);
printf("\n插入一条学生信息:\n");
Insert(st,stu,N);
printf("\n将数据存到stu_insert.txt文件中!");
Save(st,N);
}