学生信息排序(基于文件)
来源:互联网 发布: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
- 学生信息排序(基于文件)
- 基于学生信息录入排序分割实验的总结
- 学生信息排序
- 学生信息排序
- 学生信息排序
- 学生信息排序
- 结构体--学生信息排序
- 第十六周-学生信息排序
- 第十六周 学生信息排序
- 学生信息记录文件中
- 用文件保存学生信息
- 文件二进制读写学生信息
- 保存学生信息到文件(数组内元素排序, io操作)
- POJ 3719 qsort学生信息排序
- 数据结构上机题目3--学生信息排序
- YTU 2878: 结构体--学生信息排序
- Problem F: 结构体--学生信息排序
- YTU:结构体--学生信息排序
- ASM算法学习
- Android四大组件Activity、 Service、 BoardcastReceiver、ContentProvider的配置
- python pillow模块
- [LeetCode]023-Merge K Sorted Lists
- <meta name="format-detection" content="telephone=no">
- 学生信息排序(基于文件)
- 扫雷
- Java 学习之集合框架---Set
- 剑指offer,面试题一:赋值运算符函数
- 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
- 更改oracle字符集
- ORMLiteDatabase的简单使用并且与其他的表相互联系
- 李世民问唐僧:你成功靠的是什么?
- wayland应用程序中touch事件的实现