数据库第一章实验.doc
针对每一项功能,有着相应的实现方法。第一项功能,实现对两个文件数据进行合并,生成新文件3.txt。调用函数Unitedfile()来实现,函数以读的方式打开1.txt文件,以写的方式打开3.txt文件,从1.txt读入一个数据并写入3.txt文件,直到遇到1.txt文件结束。关闭1.txt文件,再以读的方式打开2.txt文件,用上述方式直到遇到2.txt文件结束。关闭2.txt,3.txt文件。实现对于文件的合并。void Unitedfile()/合并1.txt和2.txt为3.txtFILE *fp,*p;Student studd;fp=fopen("1.txt","r");/以读的方式打开1.txtp=fopen("3.txt","w");/以写的方式打开3.txtwhile(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english )!=EOF)fprintf(p,"%-6s %-6s %-6d %-6d %-6dn",studd.name,studd.id,studd.chinese,studd.math,studd.english );/读取1.txt的数据进入结构体中,写入3.txt,继续读取直结束fclose(fp);/关闭文件1.txtfp=fopen("2.txt","r");/以写的方式打开2.txtwhile(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english )!=EOF)fprintf(p,"%-6s %-6s %-6d %-6d %-6dn",studd.name,studd.id,studd.chinese,studd.math,studd.english );fclose(fp);fclose(p);第二项功能,抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。调用函数findout()来实现。函数以读的方式打开3.txt文件,以写的方式打开4.txt文件。读入3.txt文件的一个数据到结构体studd中,判断学生信息中语、数和英语中是否具有不及格的,如果有,则将数据写入4.txt中,直至遇到3.txt文件结束。void findout()/抽取出三科成绩中有补考的学生并保存在一个新文件4.txtFILE *fp,*p;Student studd;fp=fopen("3.txt","r");p=fopen("4.txt","w");/从3.txt中读入学生数据进结构体,判断是否有不及格的课程,如果有,则写入文件4.txt中while(fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english )!=EOF)if(studd.chinese<60|studd.english<60|studd.math<60)fprintf(p,"%-6s %-6s %-6d %-6d %-6dn",studd.name,studd.id,studd.chinese,studd.math,studd.english );fclose(fp);fclose(p);第三项功能,对合并后的文件3.txt中的数据按总分降序排序。调用函数sortfile()来实现。函数提供了两种排序方法,通过调用函数kuaisu()来实现快速排序,通过调用函数xuanze()来实现选择排序。void sortfile()/提供两种排序方法char c;cout<<"请选择排序方法:"<<endl;cout<<"1.选择排序"<<endl;cout<<"2.快速排序"<<endl;cin>>c;switch(c)case'1':xuanze();/选择排序break;case'2':kuaisu();/快速排序break;选择排序void xuanze() /对合并后的文件3.txt中的数据按总分降序排序int j,k,max1,sum1,sum2,q;i=0;Student temp;FILE *fp;fp=fopen("3.txt","r");i=0;while(fscanf(fp,"%s%s%d%d%d",studi.name,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)i+;/从3.txt中读入数据进结构体数组stud中fclose(fp);for(j=0;j<i-1;j+)/对结构体数组中的数据进行选择排序max1=j;sum1=studj.math+studj.english+studj.chinese;for(k=j+1;k<i;k+)sum2=studk.math+studk.english+studk.chinese;if(sum1<sum2)max1=k;sum1=sum2;if(max1!=j)temp=studmax1;studmax1=studj;studj=temp;studj.sum=sum1;fp=fopen("3.txt","w");/将排序后的数据写入3.txt中for(q=0;q<i;q+)fprintf(fp,"%-8s %-8s %-8d %-8d %-8d %-8dn",studq.name,studq.id,studq.chinese,studq.math,studq.english,studq.sum );fclose(fp);快速排序int Partition(int low,int high)int pivotkey;Student temp;temp=studlow;pivotkey=studlow.sum;while(low<high)while(low<high&&studhigh.sum<=pivotkey)-high;studlow=studhigh;while(low<high&&studlow.sum>=pivotkey)+low;studhigh=studlow;studlow=temp;return low;void QSort(int low,int high)/快速排序int privotloc;if(low<high)privotloc=Partition(low,high);QSort(low,privotloc-1);QSort(privotloc+1,high);void kuaisu()/读取文件,快速排序,将结果写入3.txtint i,low,high;FILE *fp;fp=fopen("3.txt","r");i=0;while(fscanf(fp,"%s%s%d%d%d",studi.name,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)studi.sum=studi.english+studi.chinese+studi.math;i+;/从文件3.txt中读入数据进结构体数组stud中fclose(fp);low=0;high=i-1;QSort(low,high);/快速排序fp=fopen("3.txt","w");/将排序后的数据写入3.txt中for(int j=0;j<i;j+)fprintf(fp,"%-8s %-8s %-8d %-8d %-8d %-8dn",studj.name,studj.id,studj.chinese,studj.math,studj.english,studj.sum );fclose(fp);第四项功能,输入一个学生姓名后,能查找到此学生的信息并输出结果。调用函数findoutstudent()来实现。函数也提供了两种查找方法,通过调用函数derectfindoutstudent()实现从文件从3.txt中逐个读入数据,再进行查找判断,如果找到所需要的数据,则查找结束,否则继续查找直至文件结束。autofindoutstudent()在进行第三步的过程中,已经把3.txt中的学生数据读入了结构体数组当中,调用函数autofindoutstudent()直接从结构体中进行查找。void derectfindoutstudent()/输入一个学生姓名,查找到此学生的信息并输出结果char NAME30;int flag=0;FILE *fp;fp=fopen("3.txt","r");cin>>NAME;while(fscanf(fp,"%s%s%d%d%d%d",stud1.name,stud1.id,&stud1.chinese,&stud1.math,&stud1.english,&stud1.sum )!=EOF)if(strcmp(stud1.name,NAME)=0)flag=1;cout<<"-姓名-学号-语文-数学-英语-总分-"<<endl;cout<<" "<<stud1.name<<" "<<stud1.id<<" "cout<<stud1.chinese<<" "<<stud1.math<<" "<<stud1.english<<" "<<stud1.sum<<endl;break;if(flag=0)cout<<"无此学生相关信息"<<endl;fclose(fp);void autofindoutstudent()/从结构体数组中查找int n,flag=0,k;char Name30;n=i-1;cin>>Name;for(k=1;k<=n;k+)if(strcmp(studk.name,Name)=0)flag=1;cout<<"-姓名-学号-语文-数学-英语-总分-"<<endl;cout<<" "<<studk.name<<" "<<studk.id<<" "cout<<studk.chinese<<" "<<studk.math<<" "<<studk.english<<" "<<studk.sum<<endl;break; if(flag=0)cout<<"无此学生相关信息"<<endl;void findoutstudent()/提供两种查找方法char c;cout<<"请选择查找方法"<<endl;cout<<"1.从文件3中直接查找"<<endl;cout<<"2.在运行第三步的基础上查找"<<endl;cin>>c;cout<<"请输入学生姓名:"if(sign1=0&&c='2')cout<<"请执行操作3后再执行此项操作!"<<endl;return;switch(c)case'1':derectfindoutstudent();/从文件3中直接查找break;case'2':autofindoutstudent();/从结构体数据中直接查找break;第五项功能,通过调用函数exit()退出。main()Unitedfile()findoutstudent()sortfile()derectfindoutstudent()findout()exit(0)autofindoutstudent()xuanze()kuaisu()系统函数调用关系示意图:4 调试问题在调用derectfindoutstudent()实现查找的功能时,出现错误信息:原因,文件名使用错误:void derectfindoutstudent()/输入一个学生姓名,查找到此学生的信息并输出结果char NAME30;int flag=0;FILE *fp;fp=fopen("31.txt","r");cin>>NAME;while(fscanf(fp,"%s%s%d%d%d%d",stud1.name,stud1.id,&stud1.chinese,&stud1.math,&stud1.english,&stud1.sum )!=EOF)if(strcmp(stud1.name,NAME)=0)flag=1;cout<<"-姓名-学号-语文-数学-英语-总分-"<<endl;cout<<" "<<stud1.name<<" "<<stud1.id<<" "cout<<stud1.chinese<<" "<<stud1.math<<" "<<stud1.english<<" "<<stud1.sum<<endl;break;if(flag=0)cout<<"无此学生相关信息"<<endl;fclose(fp);中的31.txt文件应改为3.txt。原因,31.txt文件不存在。错误分析,手误。