Skip to content

丁逸群 17 #101

@DingYiQunsmile

Description

@DingYiQunsmile
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define MAXSIZE 100
typedef struct {
	char cardnum[30];
	char id[25];
	char name[30];
	char specialty[30];
	char classnum[30];
}stu;
typedef struct{
	stu r[MAXSIZE];
	int length;
}table;

void create(table *tab,char *filename)
{
	int i;
	FILE *fp;
	fp=fopen(filename,"r");
	printf("输入学生个数:\n");
	if(fp)
	{
		fscanf(fp,"%d",&tab->length);
		for(i=1;i<=tab->length;i++)
		{
			fscanf(fp,"%s",tab->r[i].cardnum);
			fscanf(fp,"%s",tab->r[i].specialty);
			fscanf(fp,"%s",tab->r[i].name);
			fscanf(fp,"%s",tab->r[i].classnum);
			fscanf(fp,"%s",tab->r[i].id);						
		}
		printf("学生信息读入成功!\n");
	}
	else
		printf("学生信息读入失败!\n");
}
void print(table *tab)
{
	int i;
	if (tab->length!= 0)
	{
		printf("输出所有的学生信息:\n");
		printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
		for(i = 1;i<=tab->length; i++)
			printf("%20s%20s%10s%20s%20s\n", tab->r[i].cardnum, tab->r[i].specialty, tab->r[i].name, tab->r[i].classnum, tab->r[i].id);
	}
	else
		printf("借书证系统还没有借书记录!!\n");
}
void cardnumsort(table *tab)//二分法排序
{
	int i,j,left,right,mid;
	for(i=2;i<=tab->length;i++)
	{
		tab->r[0]=tab->r[i];
		left=1;
		right=i-1;
		while(left<=right)
		{
			mid=(left+right)/2;
			if(strcmp(tab->r[i].cardnum,tab->r[mid].cardnum)<0)
				right=mid-1;
			else
				left=mid+1;
		}
		for(j=i-1;j>=left;j--)
			tab->r[j+1]=tab->r[j];
		tab->r[left]=tab->r[0];
	}
}
void classnumsort(table *tab)//二分法排序
{
	int i,j,left,right,mid;
	for(i=2;i<=tab->length;i++)
	{
		tab->r[0]=tab->r[i];
		left=1;
		right=i-1;
		while(left<=right)
		{
			mid=(left+right)/2;
			if(strcmp(tab->r[i].classnum,tab->r[mid].classnum)<0)
				right=mid-1;
			else
				left=mid+1;
		}
		for(j=i-1;j>=left;j--)
			tab->r[j+1]=tab->r[j];
		tab->r[left]=tab->r[0];
	}
}
void specialtysort(table *tab)//shell排序
{
	int i,j,d;
	d=tab->length/2;
	while(d>=1)
	{
		for(i=d+1;i<=tab->length;i++)
		{
			tab->r[0]=tab->r[i];
			j=i-d;
			while(j>0&&tab->r[0].specialty<tab->r[i].specialty)
			{
				tab->r[j+d]=tab->r[j];
				j=j-d;
			}
			tab->r[j+d]=tab->r[0];
		}
		d=d/2;
	}
}
void idsort(table *tab)//shell排序
{
	int i,j,d;
	d=tab->length/2;
	while(d>=1)
	{
		for(i=d+1;i<=tab->length;i++)
		{
			tab->r[0]=tab->r[i];
			j=i-d;
			while(j>0&&tab->r[0].id<tab->r[i].id)
			{
				tab->r[j+d]=tab->r[j];
				j=j-d;
			}
			tab->r[j+d]=tab->r[0];
		}
		d=d/2;
	}
}
/*int namesearch(table *tab,char *key)//二分法检索(需要有序)
{
	int low=1,high=tab->length,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(strcmp(tab->r[mid].name,key)==0)
			return mid;
		else if(strcmp(tab->r[mid].name,key)>0)
			high=mid-1;
		else
			low=mid+1;
	}
	return -1;
}*/
int cardnumsearch(table *tab,char *key)//二分法检索
{
	int low=1,high=tab->length,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(strcmp(tab->r[mid].cardnum,key)==0)
			return mid;
		else if(strcmp(tab->r[mid].cardnum,key)>0)
			high=mid-1;
		else
			low=mid+1;
	}
	return -1;
}
void sort()
{
	printf("1.对卡号排序并输出\n");
    printf("2.对学号排序并输出\n");
	printf("3.对班级排序并输出\n");
	printf("4.对学院排序并输出\n");
	printf("5.输出指定卡号\n");
	printf("6.输出指定姓名\n");
	printf("7.输出指定班号\n");
	printf("8.输出指定学院\n");
}
void menu(table *tab)
{
	int i=1,c;
	char key1[30],key2[30],key3[30],key4[30];
	int result1, result2;
	printf("输入操作选项:\n");
	scanf("%d",&c);
	switch(c)
	{
		case 1:
		{
			cardnumsort(tab);
			print(tab);
			menu(tab);
		}
		break;
	case 2:
		{
			idsort(tab);
			print(tab);
			menu(tab);
		}
		break;
	case 3:
		{
			classnumsort(tab);
			print(tab);
			menu(tab);
		}
		break;
	case 4:
		{
			specialtysort(tab);
			print(tab);
			menu(tab);
		}
		break;
	case 5:
		{
			printf("输入要查找的卡号:\n");
			scanf("%s",&key1);
			result1=cardnumsearch(tab,key1);
			if(result1!=-1)
			{
				printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
				printf("%20s%20s%10s%20s%20s\n", tab->r[result1].cardnum, tab->r[result1].specialty,tab->r[result1].name, tab->r[result1].classnum, tab->r[result1].id);
			}
			else
				printf("没有找到该借书证信息!\n");
			menu(tab);
		}
		break;
	case 6:
		{
			printf("输入要查找的姓名:\n");
			scanf("%s",&key2);
			printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
			while(i<=tab->length&&i>=1)
			{
				if (strcmp(tab->r[i].name,key3) == 0)
				{
					printf("%20s%20s%10s%20s%20s\n", tab->r[i].cardnum, tab->r[i].specialty,
						tab->r[i].name, tab->r[i].classnum, tab->r[i].id);
				}
				i++;
			}
			menu(tab);
		}
		break;
	case 7:
		{
			printf("输入要查找的班级:\n");
			scanf("%s",&key3);
			printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
			while(i<=tab->length&&i>=1)
			{
				if (strcmp(tab->r[i].classnum,key3) == 0)
				{
					printf("%20s%20s%10s%20s%20s\n", tab->r[i].cardnum, tab->r[i].specialty,
						tab->r[i].name, tab->r[i].classnum, tab->r[i].id);
				}
				i++;
			}
			menu(tab);
		}
		break;
	case 8:
		{
			printf("输入要查找的学院:\n");
			scanf("%s",&key4);
			printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
			while(i<=tab->length&&i>=1)
			{
				if (strcmp(tab->r[i].specialty,key4) == 0)
				{
					printf("%20s%20s%10s%20s%20s\n", tab->r[i].cardnum, tab->r[i].specialty,
						tab->r[i].name, tab->r[i].classnum, tab->r[i].id);
				}
				i++;
			}
			menu(tab);
		}
		break;
	default:
		printf("已退出!\n");
		exit(0);
		break;
	}
}

int main()
{
	table tab;
	char filename[]="D:\\7.txt";
	create(&tab,filename);
	print(&tab);
	sort();
	menu(&tab);
	return 0;
}

image1

image2

image3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions