设学生的数据信息存储在文件“
studata2.txt”中,且第一个数据为学生数。文件中数据的内容形式如下:1 张三 76 85
设n个学生数据信息(学号、姓名及多门课程的成绩等)已按存放在一个文件,以顺序表作为排序表,完成如下实验内容:
(1)直接插入排序:从文件中读取所有学生数据信息创建学生信息表,采用直接插入排序方法对该表按姓名以递增方式排序,并显示排序结果;
(2)希尔排序:从文件中读取所有学生数据信息创建学生信息表,采用希尔排序方法,将学生信息表按总成绩以递减方式排序,并显示排序结果;
打开文件后读取第一个数,获得人数,动态申请内存空间,然后逐行读取放入结构体数组
下面两个排序是比较典型的两种排序方式
运行结果:(我只在文件里写了5个数据)
先贴个拼音名字的,能看出来是按名字递增排序
下面是汉字名字的
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _student
{
int id;
char name[20];
int kc1;
int kc2;
int zcj; //总成绩
}Student;
//插入排序
void InsertSort(Student *nums,int numsSize)
{
int i,j;
Student temp;
for(i=1;i<numsSize;i++)
{
if(strcmp(nums[i].name,nums[i-1].name)<0)
{
temp=nums[i];
for(j=i-1;j>=0;j--)
{
if(strcmp(nums[j].name,temp.name)>0)
nums[j+1]=nums[j];
else
break;
}
nums[j+1]=temp;
}
}
}
//希尔排序
void shellSort(Student *a, int len)
{
int i, j, k, gap; // gap 为步长
Student tmp;
for (gap = len / 2; gap > 0; gap /= 2) { // 步长初始化为数组长度的一半,每次遍历后步长减半,
for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标
for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
tmp = a[j]; // 备份a[j]的值
k = j - gap; // j初始化为i的前一个元素(与i相差gap长度)
while (k >= 0 && a[k].zcj > tmp.zcj) {
a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
k -= gap;
}
a[k + gap] = tmp;
}
}
}
}
//显示数组
void showAll(Student* a,int n)
{
int i;
printf("--------------------------------------------------------------\n");
printf("%6s %10s %6s %6s %6s\n","学号","姓名","课程1","课程2","总成绩");
printf("--------------------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%6d %10s %6d %6d %6d\n",a[i].id,a[i].name,a[i].kc1,a[i].kc2,a[i].zcj);
}
int main()
{
int n=0,i=0;
Student* arr = 0;
FILE *fp =fopen("studata2.txt","r");
if(fp == 0)
{
printf("文件打开失败\n");
return 0;
}
fscanf(fp,"%d",&n); //得到学生总数
arr = (Student*)malloc(sizeof(Student)*n);
for(i=0;i<n && (!feof(fp));i++)
{
fscanf(fp,"%d %s %d %d %d",&arr[i].id,arr[i].name,&arr[i].kc1,&arr[i].kc2,&arr[i].zcj);
}
//插入排序
printf("按姓名递增排序:\n");
InsertSort(arr,n);
showAll(arr,n);
printf("按照总成绩递增排序:\n");
shellSort(arr,n);
showAll(arr,n);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!