#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define Path "D:\\dos\\studata.txt"
typedef struct Student{
char Num[MAX] ; // 序号
int Sumofscore ; // 成绩总和
int Chinese ;
int Math ;
int English ;
int science ;
}Stu;
int main()
{
int n ,i = 0, j;
Stu *p[MAX] ; // p 是一个 指针数组 ,他是个数组,只是数组的每一个元素
// 用来存储指针 ;
Stu t ;
Stu a[MAX] ; // 定义一个结构体数组,每一个元素都是一个结构体变量
FILE *fp ;
if((fp =fopen(Path,"r"))==NULL)
{
printf("cannot open this file\n");
exit(0 );
}
while(!feof(fp)) // 只要没读取到文件最后,就一直循环
{
//
fscanf(fp,"%s %d %d %d %d %d",a[i].Num ,&a[i].Sumofscore ,&a[i].Chinese ,&a[i].Math ,&a[i].English ,&a[i].science);
// 从文件中分别 读取 文件中的 第一个赋给 a[i].Num ,第二个赋值给a[i].Sumscore 。。。。
p[i] = &a[i] ;
/* p[0] 存储 a[0]的地址 ,也就是我们常说的 p[0] 指向 a[0],p[1] = a[1] p[1] 存储 a[1]的地址...
*/
i++;
}
n = i ;
rewind(fp);// 将文件指针定位到文件开头 ,因为一开始读取完 文件里的数据 ,文件指针会指向文件末尾
/*
j = 0;
printf("学号\t总分\t语文\t数学\t英语\t理综\n"); // 简单的ui界面
while(j<i)
{
// 开始输出
printf("%s\t%d\t%d\t%d\t%d\t%d\n",a[j].Num ,a[j].Sumofscore ,a[j].Chinese ,a[j].Math ,a[j].English ,a[j].science);
j++;
}*/
// 先对总分进行排序;
for(i = 0 ;i<n-1 ;i++)
{
for(j = 0 ;j<n-1-i ;j++)
{
if(p[j]->Sumofscore < p[j+1]->Sumofscore )
{
t = a[j] ;
a[j] = a[j+1 ] ;
a[j+1] =t ;
}
}
}
/*
排序前
学号 总分 语文 数学 英语 理综
001 505 113 115 112 165
002 520 105 115 120 180
003 505 113 117 100 175
004 515 114 117 120 164
005 511 120 105 111 175
排序后 (总分从大到小)
002 520 105 115 120 180
004 515 114 117 120 164
005 511 120 105 111 175
001 505 113 115 112 165
003 505 113 117 100 175
*/
for (i = 0 ; i < n-1 ; i++ )
{
// 对结构体数组进行n-1次的排序
if((p[i]->Sumofscore == p[i+1]->Sumofscore ))
{
// 如果 成绩总分相等执行下面语句
if((p[i]->Chinese != p[i+1]->Chinese ) &&(p[i]->Chinese < p[i+1]->Chinese) )
{
// 如果总分相等并且 语文不相等 并且前面一位的语文成绩要小于后面一位的语文成绩
// 则将这两个人的位置互换
// t 是一个中间变量;
// 类似于冒泡排序
t = a[i] ;
a[i] = a[i+1];
a[i+1] = t ;
}
else if (p[i]->Chinese == p[i+1]->Chinese)
{
// 如果语文成绩也相等 执行下面语句
if((p[i]->Math != p[i+1]->Math )&& (p[i]->Math < p[i+1]->Math) )
{
// 如果数学成绩 前一位的数学成绩不等于后一位同学的数学成绩,并且前一位的
// 数学成绩比后一位得数学成绩小 ,则互换位置
t = a[i] ;
a[i] = a[i+1];
a[i+1] = t ;
}
else if (p[i]->Math == p[i]->Math)
{
// 如果数学成绩也一样执行下面
if( ( p[i]->English != p[i+1]->Math)&& ( p[i]->English < p[i+1]->Math ) )
{
// 分析和上面一样
t = a[i] ;
a[i] = a[i+1];
a[i+1] = t ;
}
else if ( p[i]->English == p[i+1]->English)
{
if( p[i]->science < p[i+1]->science )
{
t = a[i] ;
a[i] = a[i+1];
a[i+1] = t ;
}
}
}
}
}
}
j = 0;
while(j<n)
{
printf("%s\n",a[j].Num);
j++;
}
return 0 ;
}
多关键字排序(高考分数录取)
原创
©著作权归作者所有:来自51CTO博客作者不想悲伤到天明的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章