实验题目
设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxsize 100
typedef struct node {
char name[maxsize];
char Student_ID[maxsize];
char Class[maxsize];
char Department[maxsize];
} Student_Info;
Student_Info Students[maxsize],temp[maxsize];
void wait_for_Enter() {
getchar();
getchar();
}
void copy(Student_Info *a,Student_Info *b) {
strcpy(a->name , b->name);
strcpy(a->Student_ID , b->Student_ID);
strcpy(a->Class , b->Class);
strcpy(a->Department , b->Department);
}
void merge_sort(int l,int r,int type) {
if(r-l>=1) {
int mid=(r+l)/2;
int i=l,p=l,q=mid+1;
merge_sort(l,mid,type);
merge_sort(mid+1,r,type);
while(p<=mid||q<=r) {
if(type==1) {
if(q>r||p<=mid&&strcmp(Students[p].name,Students[q].name)<=0) copy(&temp[i++],&Students[p++]);
else copy(&temp[i++],&Students[q++]);
} else if(type==2) {
if(q>r||p<=mid&&strcmp(Students[p].Student_ID,Students[q].Student_ID)<=0) copy(&temp[i++],&Students[p++]);
else copy(&temp[i++],&Students[q++]);
} else if(type==3) {
if(q>r||p<=mid&&strcmp(Students[p].Class,Students[q].Class)<=0) copy(&temp[i++],&Students[p++]);
else copy(&temp[i++],&Students[q++]);
} else {
if(q>r||p<=mid&&strcmp(Students[p].Department,Students[q].Department)<=0) copy(&temp[i++],&Students[p++]);
else copy(&temp[i++],&Students[q++]);
}
}
for(int i=l; i<=r; i++)
copy(&Students[i],&temp[i]);
}
}
void Print_Information(int students_num) {
int i;
for(i=0; i<students_num; i++) {
printf("%s %s %s %s\n",Students[i].name,Students[i].Student_ID,Students[i].Class,Students[i].Department);
}
printf("打印完成,按回车键退出");
wait_for_Enter();
}
void Find_Information(int num) {
int i, op, flag = -1;
char information[maxsize];
printf("<1>按姓名查找 <2>按学号查找 <3>按班级查找 <4>按学号查找\n");
scanf("%d", &op);
if (op == 1) {
printf("请输入该生姓名:");
scanf("%s", information);
for (i = 0; i < num; i++) {
if (strcmp(information, Students[i].name) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
}
} else if (op == 2) {
printf("请输入该生学号:");
scanf("%s", information);
for (i = 0; i < num; i++) {
if (strcmp(information, Students[i].Student_ID) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
}
} else if(op ==3) {
printf("请输入考勤班级:");
scanf("%s", information);
for (i = 0; i < num; i++) {
if (strcmp(information, Students[i].Class) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
}
} else {
printf("请输入院系:");
scanf("%s", information);
for (i = 0; i < num; i++) {
if (strcmp(information, Students[i].Department) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
}
if (flag == -1) printf("不存在此信息!\n");
}
printf("查找完成,按回车键退出");
wait_for_Enter();
}
void Information_Sort(int num) {
int type;
printf("<1>按姓名排序");
printf("<2>按学号排序");
printf("<3>按班级排序");
printf("<4>按院系排序");
scanf("%d",&type);
merge_sort(0,num-1,type);
printf("排序完成,按回车键退出");
wait_for_Enter();
}
int main() {
int i,j,n,op,type;
printf("请输入学生人数\n");
scanf("%d",&n);
printf("请输入每个学生的姓名,学号,班级,院系:\n");
for(i=0; i<n; i++) {
scanf("%s%s%s%s",Students[i].name,Students[i].Student_ID,Students[i].Class,Students[i].Department);
}
while(1) {
printf("请输入:\n");
printf("<1>查找某位同学 <2>对指定信息进行排序 <3>打印输出所有学生的信息\n");
scanf("%d",&op);
if(op==1) {
Find_Information(n);
} else if(op==2) {
Information_Sort(n);
} else {
Print_Information(n);
}
system("cls");
}
return 0;
}