李四 10001 1-10-1001
李三一 10012 1-10-1002
赵三四 10009 1-10-1003
钱三四 10008 1-10-1004
孙三四 10007 1-10-1005
李三四 10006 1-10-1006
西门四 10005 1-10-1008
诸葛天四 10004 1-10-1009
李二四 10003 1-10-1010
#include <stdio.h>
#include <string.h>
#define MAX 1000
struct student//学生结果
{
char xm[10];//姓名
char xh[10];//学号
char fh[10];//房号
};
struct data
{
int count;//当前学生数组中学生的个数
struct student stu[MAX];//学生数组
}dd;
// 显示主菜单
void menu()
{
printf("\n\n\n");
printf("\t\t\t *******************************\n");
printf("\t\t\t \n");
printf("\t\t\t 宿舍管理系统 \n");
printf("\t\t\t \n");
printf("\t\t\t [1] 学号排序(冒泡法) \n");
printf("\t\t\t [2] 按姓名查询(二分法) \n");
printf("\t\t\t [3] 按学号查询(二分法) \n");
printf("\t\t\t [4] 按房号查询(二分法) \n");
printf("\t\t\t [5] 显示所有记录 \n");
printf("\t\t\t [0] 退出 \n");
printf("\t\t\t *******************************\n");
printf("\t\t\t \n");
}
// 查看所有学生信息
void view_data()
{
int i;
printf("姓名\t学号\t房号");
printf("\n-------------------------------------------------------------------\n");
for (i = 0; i < dd.count; i++)
{
printf("%s\t%s\t%s\n",dd.stu[i].xm , dd.stu[i].xh , dd.stu[i].fh);
}
printf("\n");
}
void read(){
FILE *fp;
if((fp=fopen(".\\data.txt","rb"))==NULL) // 打开文件并且让fp指向 文件
{
printf("Can not open 'data.txt' file\n");
return ;
}
while(!feof(fp)) //读取一组数据后指针指向下一组数据,并且判断是否指向最后一行
{
char xm[10];//姓名
char xh[10];//学号
char fh[10];//房号
fscanf(fp,"%s %s %s",xm,xh,fh);//读文件记录给变量
strcpy(dd.stu[dd.count].xm,xm);//赋值
strcpy(dd.stu[dd.count].xh,xh);
strcpy(dd.stu[dd.count].fh,fh);
dd.count++;//前面加了记录,这里计数
}
fclose(fp); //关闭文件;
}
void sort()//学号排序
{
int i,j;/*计数变量*/
struct student temp;/*中间变量 类型为结构体*/
for(i=0;i<dd.count;i++) /*运用冒泡排序对结构体数组进行排序*/
for (j=i+1;j<dd.count;j++)
{
if(strcmp(dd.stu[i].xh,dd.stu[j].xh)<0) /*实现从大到小排序*/
{
temp=dd.stu[i];
dd.stu[i]=dd.stu[j];
dd.stu[j]=temp;
}
}
}
void search_xm()//找到则返回对应行号,找不到返回-1
{
char xm[10];
int n=-1;
printf("请输入要查询的姓名:");
scanf("%s",xm);
getchar();
int low = 1;
int high = dd.count;
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(dd.stu[mid].xm , xm)==0)
{
printf("姓名\t学号\t房号");
printf("\n-------------------------------------------------------------------\n");
printf("%s\t%s\t%s\n",dd.stu[mid].xm , dd.stu[mid].xh , dd.stu[mid].fh);
printf("\n");
return ;
}
else if (strcmp(dd.stu[mid].xm , xm)>0)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
printf("没有此记录~!");
return;
}
int main()
{
int k;//选择菜单值
dd.count=0;//数组中学生的个数初始0
read();//从文件导入数据
view_data();//显示记录
do
{
menu();//菜单
scanf("%d",&k);//接收选择
getchar();
switch(k)
{
case 1:sort();break;//排序
case 2:
search_xm();
break;
case 3:break;
case 4:break;
case 5:view_data();break;
case 0:return 0;
default:printf("\t\t\t\t\t无此功能,请重新输入!\n");break;
}
}while(1);
return 0;
}