實驗題目
設計一個排序和查找系統。能夠實現對給定的一組學生的借書證信息(如:卡號、姓名、系別、班號等)進行排序和查找。
#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;
}