一、实验题目:模仿EXCEL中的自动筛选,设计学生信息的自动筛选程序。
二、实验要求
1)自定义班级学生信息结构体,结构体的数据项超过5个(包含5个)。
2)输入班级的全部数据。
3)对每个数据项根据数据项的值进行筛选。
4)实现模糊筛选,例如可将姓名中包含“张”或姓“张”的学生列出。
5)输出筛选的结果。
6)可以进行自定义的筛选。
7)班级的全部数据能够以文件方式保存。
8)筛选之后的数据可以根据需要以文件方式保存。
9)提示语言清晰明确,界面美观适用。
三、
个人感受:人生就像打电话,不是你先挂,就是我先挂,这道题目一到手,我发现我应该挂了吧,模糊算法,啥是模糊算法呢?就是那个算法很模糊呗!在博览群网群书群人后才知道不过就是字符串匹配,不过具体的代码确实不容易呀,代码貌似很多很多,不过细心的你会发现,其实很多都是一样的重复代码,i'm lovin' it。
四、代码
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{char no[10];
char name[20];
int age;
int score;
int n;
}stu[100];
int total=0;
void add()
{char c;
do
{printf("/n/n/t/t/t输入学生的学号:");
scanf("%s",stu[total].no);
printf("/t/t/t输入学生的姓名:");
scanf("%s",stu[total].name);
printf("/t/t/t输入学生的年龄:");
scanf("%d",&stu[total].age);
printf("/t/t/t输入成绩:");
scanf("%d",&stu[total].score);
system("cls");
stu[total].n=0;
total++;
printf("/t/t/t是否继续输入?(按y继续,其他退出)");
c=getch();
printf("/n");
}while(c=='y'||c=='Y');
printf("/t/t/t成功输入数据.../n");
}
void save_filt()
{int i;
FILE *fp;
if((fp=fopen("filter.txt","r"))==NULL)
{printf("cannot open file");
exit(0);
}
for(i=0;i<total;i++)
{fread(&stu[i],sizeof(struct node),1,fp);
if(stu[i].n==0)
printf("%s/t %s/t %d/t %d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
}
fclose(fp);
}
int show()
{int i,flag;
FILE *fp;
printf("/t/t/t是否以文件方式保存0.否 1.是:");
scanf("%d",&flag);
if(flag)
{if((fp=fopen("filter.txt","w"))==NULL)
{printf("cannot open file");}
for(i=0;i<total;i++)
if(fwrite(&stu[i],sizeof(struct node),1,fp)!=1)
printf("file write error/n");
fclose(fp);
printf("/t/t/t已经以文件形式保存...");
printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<=total;i++)
if(stu[i].n==1)
{printf("%s/t %s/t %d/t %d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
stu[i].n=0; }
return 1;
}
else
{printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<=total;i++)
if(stu[i].n==1)
{printf("%s/t %s/t %d/t %d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
stu[i].n=0;
}
return 0;
}
}
void filt_age()
{int i,j,t;
printf("/t/t/t请输入要筛选的年龄:/n");
scanf("%d",&j);
for(i=0;i<total;i++)
if(stu[i].age==j)
stu[i].n=1;
t=show();
if(t)
save_filt();
}
void filt_name()
{int i,t;
char name[20];
printf("/t/t/t请输入要筛选的名字:/n");
scanf("%s",name);
for(i=0;i<total;i++)
if(strcmp(stu[i].name,name)==0)
stu[i].n=1;
t=show();
if(t)
save_filt();
}
void filt_no()
{int i,t;
char no[10];
printf("/t/t/t请输入要筛选的学号:");
scanf("%s",no);
for(i=0;i<total;i++)
if(!strcmp(stu[i].no,no))
stu[i].n=1;
t=show();
if(t)
save_filt();
}
void filt_grade()
{int i,t,score;
printf("/t/t/t请输入要筛选的成绩:/n");
scanf("%d",&score);
for(i=0;i<total;i++)
if(stu[i].score==score)
stu[i].n=1;
t=show();
if(t)
save_filt();
}
void filter()
{int i;
system("cls");
do
{printf("/n/n/n/t/t***************common filter****************/n/n");
printf("/t/t/t1 filter the numeber/n");
printf("/t/t/t2 filter the name/n");
printf("/t/t/t3 filter the age/n");
printf("/t/t/t4 filter the grade/n");
printf("/t/t/t0 exit the filter/n");
printf("/t/t********************************************/n");
printf("/t/t/tplease input a num:");
scanf("%d",&i);
switch(i)
{case 1:filt_no();break;
case 2:filt_name();break;
case 3:filt_age();break;
case 4:filt_grade();break;
}
}while(i!=0);
}
void blur_filt()
{ int i;
char name[20];
printf("请输入要筛选的姓名:/n");
scanf("%s",name);
for(i=0;i<=total;i++)
{if(strstr(stu[i].name,name)!=NULL)
stu[i].n=1;
}
show();
}
void filt_age2()
{int i,j,flag;
struct node t;
printf("/t/t/tplease select 0.down 1.up:");
scanf("%d",&flag);
if(flag)
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(stu[i].age>stu[j].age)
{t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
else
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(stu[i].age<stu[j].age)
{t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<total;i++)
printf("%s/t%s/t%d/t%d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
}
void filt_name2()
{int i,j,flag;
struct node t;
printf("/t/t/tplease select 0.down 1.up:");
scanf("%d",&flag);
if(flag)
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(strcmp(stu[i].name,stu[j].name)>0)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
else
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(strcmp(stu[i].name,stu[j].name)<0)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<total;i++)
printf("%s/t%s/t%d/t%d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
}
void filt_no2()
{
int i,j,flag;
struct node t;
printf("/t/t/tplease select 0.down 1.up:");
scanf("%d",&flag);
if(flag)
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(strcmp(stu[i].no,stu[j].no)>0)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
else
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(strcmp(stu[i].no,stu[j].no)<0)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<total;i++)
printf("%s/t%s/t%d/t%d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
}
void filt_grade2()
{int i,j,flag;
struct node t;
printf("/t/t/tplease select 0.down 1.up:");
scanf("%d",&flag);
if(flag)
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(stu[i].score>stu[j].score)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
else
{for(i=0;i<total;i++)
for(j=i+1;j<total;j++)
if(stu[i].score<stu[j].score)
{t=stu[i];stu[i]=stu[j];stu[j]=t;}
}
printf("学号/t姓名/t年龄/t总分/n");
for(i=0;i<total;i++)
printf("%s/t %s/t %d/t %d/n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);
}
void filter2()
{int i;
system("cls");
do
{printf("/n/n/n/t/t***************define filter****************/n/n");
printf("/t/t/t1 filter num define/n");
printf("/t/t/t2 filter name define/n");
printf("/t/t/t3 filter age define/n");
printf("/t/t/t4 filter grade define/n");
printf("/t/t/t0 exit filter define/n");
printf("/t/t********************************************/n");
printf("/t/t/tplease input a num:");
scanf("%d",&i);
switch(i)
{case 1:filt_no2();break;
case 2:filt_name2();break;
case 3:filt_age2();break;
case 4:filt_grade2();break;
}
}while(i!=0);
}
void save()
{int i; FILE *fp;
for(i=0;i<total;i++)
if((fp=fopen("filename.txt","w"))==NULL)
{printf("cannot open file");
exit(0);
}
for(i=0;i<total;i++)
if(fwrite(&stu[i],sizeof(struct node),1,fp)!=1)
printf("file write error/n");
fclose(fp);
return;
}
main()
{int i;
system("cls");
do
{printf("/n/n/t/t*********************************************/n");
printf("/t/t/t the class filter system/n");
printf("/t/t*********************************************/n/n");
printf("/t/t/t 1 add/n");
printf("/t/t/t 2 common filter/n");
printf("/t/t/t 3 blur filter/n");
printf("/t/t/t 4 define filter/n");
printf("/t/t/t 5 save the info/n");
printf("/t/t/t 6 exit/n");
printf("/t/t*********************************************/n");
printf("/t/t/tplease input a num:");
scanf("%d",&i);
switch(i)
{case 1:add();break;
case 2:filter();break;
case 3:blur_filt();break;
case 4:filter2();break;
case 5:save();break;
}
}while(i!=6);
return 1;
}
五、部分截图