学生信息排序(基于文件)

来源:互联网 发布:jsp中如何引用js文件 编辑:程序博客网 时间:2024/05/29 10:58
#include<stdio.h>#include<stdlib.h>typedef struct student{  char number[20];  int score;  int location;  int num;  char name[10];}student;typedef struct{   student *base;   int num;}Message;void Scan(student *p,int num){FILE *fp;int i;if ((fp=fopen("e:\\student.dat","wb"))==NULL){printf("无法打开\n");exit(1);}p++;for (i=1;i<=num;i++){scanf("%s",p->name);getchar();scanf("%s",p->number);getchar();scanf("%d",&p->score);p->location=i;p->num=0;fwrite(p,sizeof(student),1,fp);p++;}fclose(fp);}void Print(student *r,int num){    FILE *fp;int i;if ((fp=fopen("e:\\student.dat","rb"))==NULL){   printf("无法打开文件:\n");exit(1);}r++;for (i=1;i<=num;i++){fread(r,sizeof(student),1,fp);printf("原数据为:\n");printf("第%d个学生的信息是%s %s %d %d\n",r->location,r->name,r->number,r->score,r->num);r++;}fclose(fp);}void Creat(Message &s){printf("请输入学生数量:\n");scanf("%d",&s.num);     s.base=(student*)malloc((s.num+1)*sizeof(student)); printf("请按照姓名、学号、成绩输入学生信息:\n");Scan(s.base,s.num);}void Rank(Message s){int i=1,count=1,c=1;s.base[i++].num=count;    while (i<=s.num){    if (s.base[i-1].score!=s.base[i].score){count+=c;c=1;s.base[i].num=count;i++;}else{  while (i<=s.num&&s.base[i-1].score==s.base[i].score)  {  c++;s.base[i].num=s.base[i-1].num;i++;  }}}}void Sort1(Message &s){int i,j;for (i=2;i<=s.num;i++)if (s.base[i].score>s.base[i-1].score)//前i个数据已经有序,新添地往前比较,放在相应位置{   s.base[0]=s.base[i];//0位置存放当前的大元素   s.base[i]=s.base[i-1];   for (j=i-2;j>=0&&s.base[0].score>s.base[j].score;j--)//依次跟以前排好序的元素比较   s.base[j+1]=s.base[j];   s.base[j+1]=s.base[0];//插入合适位置}Rank(s);}void Sort2(Message &s){int i,j;int flag=1;for (i=1;i<s.num;i++){flag=0;for (j=s.num-1;j>=i;j--)if (s.base[j+1].score>s.base[j].score){    s.base[0]=s.base[j+1];s.base[j+1]=s.base[j];s.base[j]=s.base[0];flag=1;//在对i的循环中如果没有换位置的,就说明已经排好序了,每个相邻的元素之间都排好了}if (flag==0)   break;}Rank(s);}int Partition(Message &s,int low,int high)    //*{int pivotkey;s.base[0]=s.base[low];pivotkey=s.base[low].score;while (low<high){while (low<high&&s.base[high].score<=pivotkey) high--;//将小值放在关键值的后面s.base[low]=s.base[high];//将high更新while (low<high&&s.base[low].score>=pivotkey)low++;//将大值放在关键值的前面s.base[high]=s.base[low];//将low更新}s.base[low]=s.base[0];//保证每次返回比本次关键值的大的一个就行return low;}void Qsort(Message &s,int low,int high){int pivotloc;//位置if (low<high){   pivotloc=Partition(s,low,high);   Qsort(s,low,pivotloc-1);Qsort(s,pivotloc+1,high);}}void Sort3(Message &s){Qsort(s,1,s.num);}void Sort4(Message s){int i,k,j;for (i=1;i<s.num;i++){  k=i;  for (j=i+1;j<=s.num;j++)if (s.base[k].score<s.base[j].score)      s.base[k]=s.base[j];if (s.base[k].score!=s.base[i].score){   s.base[0]=s.base[k];   s.base[k]=s.base[i];   s.base[i]=s.base[0];}}Rank(s);}void Heapadjust(Message &s,int e,int m){//每次调整一个元素,从根开始,在已建好的堆中找到相应位置int i;student temp;temp=s.base[e];for (i=2*e;i<=m;i*=2)//注意for循环的执行,这是由树的特性来确定的{if (i<m&&s.base[i].score>s.base[i+1].score)   //左大于右i++;if (temp.score<=s.base[i].score)break;s.base[e]=s.base[i];//进行调整,用来不断比较temp的值,以此来确定temp的相应位置e=i;}s.base[e]=temp;}void Sort5(Message &s){//本来就存在一个虚拟的,混乱的堆(就是s),在其基础上进行更改int i;student temp;for (i=s.num/2;i>0;i--)Heapadjust(s,i,s.num);//弄好第一个元素,先进行一次排序,按顺序输出是个有序的数组for (i=s.num;i>1;i--){  temp=s.base[1];// 关键字最大的与序列最后一个进行交换,然后重新弄堆  s.base[1]=s.base[i];  s.base[i]=temp;  Heapadjust(s,1,i-1);}Rank(s);}void Merge(student a[],student v1[],int i,int m,int n){int j,k;for (j=m+1,k=i;i<=m&&j<=n;k++){//v1数组存放a数组合并后的序列    if (a[i].score<=a[j].score)v1[k]=a[j++];elsev1[k]=a[i++];}while (i<=m)v1[k++]=a[i++];while (j<=n)v1[k++]=a[j++];}void Msort(student b[],student v2[],int s,int t){int m;student c[100];if (s==t)v2[s]=b[s];else{    m=(s+t)/2;Msort(b,c,s,m);//先进行拆分,然后再合并Msort(b,c,m+1,t);Merge(c,v2,s,m,t);}}void Sort6(Message &s){   Msort(s.base,s.base,1,s.num);   Rank(s); }void Put(Message s){   int i;   printf("学生信息从左往右依次为学生的位置、姓名、学号、成绩、排名:\n");  for (i=1;i<=s.num;i++)printf("第%d个学生的信息是%s %s %d %d\n",s.base[i].location,s.base[i].name,s.base[i].number,s.base[i].score,s.base[i].num); }int main(){     Message s; int a; Creat(s);while (1){printf("==============================================\n");   printf("1.录入学生信息:\n2.直接插入排序:\n3.冒泡排序:\n4.快速排序:\n5.简单选择排序:\n6.堆排序:\n7.2-路归并排序:\n8.输出学生信息:\n9.退出\n");   scanf("%d",&a);   switch(a)   {   case 1:Print(s.base,s.num);break;   case 2:Sort1(s);break;   case 3:Sort2(s);break;   case 4:Sort3(s);break;   case 5:Sort4(s);break;   case 6:Sort5(s);break;   case 7:Sort6(s);break;   case 8:Put(s);break;   case 9:return 0;   }}return 0;}

0 0
原创粉丝点击