1ˎ问题描述
科研项目:科研项目编号,项目名称,项目来源,审定类别(结题,验收,鉴定),完成人姓名,排名,完成时间,获奖情况( 一等、二等、三等、无)。
设计程序,实现项目信息的录入(保存到文件),浏览,更改,删除,统计,排序,查询等功能。
2ˎ功能要求
1).科研项目的信息用结构体project来表示。
struct project{
int id; //科研项目编号
char name[20]; //科研项目名称
char type[10]; //科研审定类别
….
}
2).能够录入科研项目信息。
3).能够按项目名称、审定类别、完成人姓名查询,可以查询获奖情况是一等的项目信息。查询方式可以自己补充。
4).能够按完成时间统计的每年项目数量。
5).能够计算完成人科研分总分,按科研分高低顺序显示。
一个项目100分(第一名40%,第二名20%,第三名15%,第四名12%,第五名8%,第六名5%)。如果获奖,三等奖则120分,二等奖则150分,三等奖则200分。如果一个项目完成人不足6人,平分后面人员的科研分给前面项目完成人。
6).能够删除、修改科研项目的信息。
7).系统的各个功能模块要求用函数的形式实现。
8).科研项目信息保存在文件里(保存、读取、文件复制)。
3ˎ功能实现
1)
struct project //定义结构体
{ int id;
char name[20];
char type[20];
char wname[20][6];
int renshu;
int time;
int huojiang;
};project w[N];
定义结构体数组,每个结构体分为 w[i].id; w[i].name;w[i].type;w[i].wname;w[i].renshu; w[i].time;w[i].huojiang; 七部分,并且在每个函数中定义FILE类型指针变量fp,fp=fopen(“project.dat”,“ab+”)通过fp指向结构体变量w[i]而访问定义的文件project.dat。
2)录入函数
while(1)
{ cin>>w[i].id;
cin>>w[i].name;
cin>>w[i].type;
cin>>w[i].renshu;
for(k=0;k<w[i].renshu;k++)
{cin>>w[i].wname[k];}
cin>>w[i].time;
cin>>w[i].huojiang;
i++;}
for(q=0;q<i;q++)
fwrite(&w[q],sizeof(project),1,fp);
重新录入以ab+方式打开文件,分别将七个部分赋值给结构体数组,再将结构体数组内容用一个for循环顺序写入文件。
3)浏览函数
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i; //输入项目个数
for(i=0;i<=q;i++) //依次输出每个结构体
{cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}
以ab+方式打开文件,从文件中读取数据放到结构体数组w[i]中,用for循环依次输出每个结构体内容。
4)查找函数(以项目名查找为例)
cin>>y;
for(i=0;i<=q;i++)
{ if(strcmp(y,w[i].name)==0) //字符比较,相同输出
{
cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++) //依次输出成员姓名
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(6)<<w[i].huojiang;
cout<<endl;} }
共分四部分,分别为项目名称查找,鉴定类别查找,完成人姓名查找,获奖情况查找,(以项目名查找为例)选定项目名称查找,输入项目名称用strcmp函数与w[i].name比较,相同即输出此结构体。
5)统计函数
cin>>n;
for(k=0;k<=q;k++) //依次比较,相同本年项目数加1
{if(n==w[k].time)
s++;}
输入年份,定义整数s=0用for循环strcmp函数将输入年份与w[i].time比较,相同s=s+1。
s为本年的项目总数。
6)分数排序函数
if(w[i].huojiang==0) //判断所获奖项,并将对应总分传递给分数计算函数
{fenshu(100,i);}
else if(w[i].huojiang==1)
{fenshu(200,i);}
else if(w[i].huojiang==2)
{fenshu(150,i);}
else if(w[i].huojiang==3)
{fenshu(120,i);}
{ if(j==1) //判断小组人数
cout<<h<<endl;
else if(j==2)
cout<<h*0.6<<" "<<h*0.4<<endl;
else if(j==3)
cout<<h*(0.4+0.25/3)<<" "<<h*(0.2+0.25/3)<<" "<<h*(0.15+0.25/3)<<endl;
else if(j==4)
cout<<h*(0.4+0.13/4)<<" "<<h*(0.2+0.13/4)<<" "<<h*(0.15+0.13/4)<<" "<<h*(0.12+0.13/4)<<endl;
else if(j==5)
cout<<h*0.41<<" "<<h*0.21<<" "<<h*0.16<<" "<<h*0.13<<" "<<h*0.09<<endl;
else if(j==6)
cout<<h*0.4<<" "<<h*0.2<<" "<<h*0.15<<" "<<h*0.12<<" "<<h*0.08<<" "<<h*0.05<<endl;
}
主要有两个问题,一个是判断获奖情况,所得奖项不同科研总分不同;另一个是判断小组人数,人数不同,分数比例不同。所以设计为嵌套函数,由w[i].huojiang判断获奖情况,根据获奖情况不同,选择不同的总分,同时调用并将相对应的总分这个参数传递到分数计算函数中,在分数计算函数中,设置总分形参h,需要排序的项目序号t,先由w[t].renshu判断每小组人数,利用人数不同,选择不同比例计算个人分数。
7)修改函数
cout<<"请输入:要修改的科研项目编号:"<<endl;
cin>>z;
for(i=0;i<=q;i++)
if(w[i].id==z)
k=i;
打开文件,输入需要修改的项目编号,显示包含此项目编号的项目信息。
{ cin>>w[k].name;} //对需修改的信息重新赋值
选择要修改的内容,重新赋值,其他不变,修改之后重新写入文件中。
8)删除函数
打开文件,输入需删除的项目编号Z,在for循环中用strcmp将输入项目编号与w[i].id比较。
cout<<"请选择要删除的项目编号:";
cin>>z;
for(i=0;i<=q;i++)
{ if(w[i].id==z)
k=i;}
相同将此结构体标记,将除此之外的其他数据依次重新写入文件。
for(i=0;i<k;i++)
fwrite(&w[i],sizeof(project),1,fp);
for(i=k+1;i<=q;i++)
fwrite(&w[i],sizeof(project),1,fp);
4ˎ源代码及注释说明
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>
using namespace std;
#define N 100
char y[20];
int z,p,g,l;
struct project //定义结构体
{
int id;
char name[20];
char type[20];
char wname[20][6];
int renshu;
int time;
int huojiang;
};project w[N]; //定义结构体数组
void luru() //录入函数
{
FILE *fp;
int i=0,n,q,k,j,r;
if((fp=fopen("project.dat","ab+"))==NULL)
{
cout<<"此文件打不开"<<endl;
exit(0);
}
while(1)
{
cout<<"请输入科研项目编号:"<<endl;
cin>>w[i].id;
cout<<"请输入科研项目名称:"<<endl;
cin>>w[i].name;
cout<<"请输入科研审定类别:"<<endl;
cin>>w[i].type;
cout<<"请输入成员人数"<<endl;
cin>>w[i].renshu;
cout<<"请输入完成人姓名:"<<endl;
for(k=0;k<w[i].renshu;k++)
{cin>>w[i].wname[k];}
cout<<"请输入完成时间:"<<endl;
cin>>w[i].time;
cout<<"请输入获奖情况(一二三等奖分别为123,无则为0):"<<endl;
cin>>w[i].huojiang;
i++;
cout<<"1.继续录入;0.退出录入"<<endl;
cin>>n;
if(n==0)
{cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
break;}
}
for(q=0;q<i;q++)
fwrite(&w[q],sizeof(project),1,fp); //将数据写入文件
fclose(fp);
}
void liulan() //浏览函数
{
int i,n,q,k;
FILE *fp;
if((fp=fopen("project.dat","rb"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i; //输入个数
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
for(i=0;i<=q;i++) //依次输出每个结构体
{cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
}
void chazhao() //查找函数
{
int i,n,q,k;
FILE *fp;
if((fp=fopen("project.dat","rb"))==NULL)
{
cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
cout<<"请选择查找方式:0-退出查找;1-项目名称;2-审定类别;3-完成人姓名;4-获奖情况"<<endl;
while(1)
{
cin>>n;
if(n<0||n>4)
{ cout<<"输入错误,请重新输入"<<endl;
break; }
if(n==0) //项目名称查找
{cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
break;}
else if(n==1)
{cout<<"请输入项目名称:"<<endl;
cin>>y;
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
for(i=0;i<=q;i++)
{
if(strcmp(y,w[i].name)==0) //字符比较,相同输出
{
cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++) //依次输出成员姓名
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(6)<<w[i].huojiang;
cout<<endl;}
}
cout<<endl;
cout<<"请选择查找方式:0-退出查找;1-项目名称;2-审定类别;3-完成人姓名;4-获奖情况"<<endl;}
else if(n==2) //类别查找
{cout<<"请输入审定类别:"<<endl;
cin>>y;
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
for(i=0;i<=q;i++)
if(strcmp(y,w[i].type)==0)
{
cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}
cout<<endl;
cout<<"请选择查找方式:0-退出查找;1-项目名称;2-审定类别;3-完成人姓名;4-获奖情况"<<endl;}
else if(n==3) //姓名查找
{cout<<"请输入完成人姓名:"<<endl;
cin>>y;
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
for(i=0;i<=q;i++)
{for(k=0;k<6;k++)
if(strcmp(y,w[i].wname[k])==0)
{
cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;
}
}
cout<<endl;
cout<<"请选择查找方式:0-退出查找;1-项目名称;2-审定类别;3-完成人姓名;4-获奖情况"<<endl;
}
else if(n==4) //获奖查找
{cout<<"请输入获奖情况:"<<endl;
cin>>z;
cout<<"序号"<<setw(6)<<"编号"<<setw(9)<<"项目"<<setw(9)<<"类别"<<setw(12)<<"完成人"<<setw(50)<<"时间"<<setw(9)<<"获奖"<<endl;
for(i=0;i<=q;i++)
if(z==w[i].huojiang)
{
cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}
cout<<endl;
cout<<"请选择查找方式:0-退出查找;1-项目名称;2-审定类别;3-完成人姓名;4-获奖情况"<<endl;
}
}
}
void xiangmu() //年项目数量函数
{ int i,q,k;
int n;
int s=0;
FILE *fp;
if((fp=fopen("project.dat","rb"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
cout<<"完成时间:"<<endl;
cin>>n;
for(k=0;k<=q;k++) //依次比较,相同本年项目数加1
{if(n==w[k].time)
s++;}
cout<<"第"<<n<<"年,共完成"<<s<<"个项目"<<endl;
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
}
void fenshu(double h,int t) //分数计算函数,设置形参
{
int k,j,q,i;
FILE *fp;
project w[N];
if((fp=fopen("project.dat","rb"))==NULL)
{ cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
cout<<setiosflags(ios::fixed);
cout.precision(2); //使输出的分数保留两位小数
for(k=0;k<=q;k++)
fread(&w[k],sizeof(project),1,fp);
{j=w[t].renshu;
cout<<"共"<<j<<"人,分数分别为:"; //人数不同,分数比例不同
if(j==1) //判断小组人数
cout<<h<<endl;
else if(j==2)
cout<<h*0.6<<" "<<h*0.4<<endl;
else if(j==3)
cout<<h*(0.4+0.25/3)<<" "<<h*(0.2+0.25/3)<<" "<<h*(0.15+0.25/3)<<endl;
else if(j==4)
cout<<h*(0.4+0.13/4)<<" "<<h*(0.2+0.13/4)<<" "<<h*(0.15+0.13/4)<<" "<<h*(0.12+0.13/4)<<endl;
else if(j==5)
cout<<h*0.41<<" "<<h*0.21<<" "<<h*0.16<<" "<<h*0.13<<" "<<h*0.09<<endl;
else if(j==6)
cout<<h*0.4<<" "<<h*0.2<<" "<<h*0.15<<" "<<h*0.12<<" "<<h*0.08<<" "<<h*0.05<<endl;
}
cout<<endl;
}
void paixu() //分数排序函数
{
int i,j=0,n,r,q,x,g,k,h;
int t[10],M;
FILE *fp;
project w[N];
if((fp=fopen("project.dat","rb"))==NULL)
{ cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
cout<<"请选择项目序号:";
cin>>i;
i=i-1; //第i个项目对应w[i-1]
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
{cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}
fread(&w[k],sizeof(project),1,fp);
if(w[i].huojiang==0) //判断所获奖项,并将对应总分传递给分数计算函数
{fenshu(100,i);}
else if(w[i].huojiang==1)
{fenshu(200,i);}
else if(w[i].huojiang==2)
{fenshu(150,i);}
else if(w[i].huojiang==3)
{fenshu(120,i);}
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
}
void xiugai() //修改信息函数
{ int i,j,n,r,q,k;
double s=0;
double t[10];
FILE *fp;
if((fp=fopen("project.dat","rb"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
cout<<"项目编号:";
for(i=0;i<=q;i++)
cout<<w[i].id<<setw(9);
cout<<endl;
while(2)
{
cout<<"1.修改;0.退出!"<<endl;
cin>>r;
if(r==0)
{break;}
else
{cout<<"请输入:要修改的科研项目编号:"<<endl;
cin>>z;
for(i=0;i<=q;i++)
if(w[i].id==z)
{ k=i; //标记此结构体
cout<<"序号"<<setw(4)<<"编号"<<setw(7)<<"项目"<<setw(7)<<"类别"<<setw(10)<<"完成人"<<setw(38)<<"时间"<<setw(7)<<"获奖"<<endl;
{cout<<i+1<<setw(6)<<w[i].id<<setw(8)<<w[i].name<<setw(7)<<w[i].type;
for(k=0;k<6;k++)
{cout<<setw(7)<<w[i].wname[k];}
cout<<setw(6)<<w[i].time<<setw(4)<<w[i].huojiang;
cout<<endl;}}
cout<<"请选择修改信息内容"<<endl;
cout<<"0-退出函数"<<endl;
cout<<"1-项目名称"<<endl;
cout<<"2-审定类别"<<endl;
cout<<"3-完成人姓名"<<endl;
cout<<"4-完成时间"<<endl;
cout<<"5-获奖情况"<<endl;
cin>>p;
if(p==0)
{cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
break;}
else if(p==1)
{cout<<"更改为:"<<endl;
cin>>w[k].name;cout<<"修改成功!"<<endl;} //对需修改的信息重新赋值
else if(p==2)
{cout<<"更改为:"<<endl;
cin>>w[k].type;cout<<"修改成功!"<<endl;}
else if(p==3)
{cout<<"更改为:"<<endl;
for(i=0;i<6;i++)
cin>>w[k].wname[i];cout<<"修改成功!"<<endl;}
else if(p==4)
{cout<<"更改为:"<<endl;
cin>>w[k].time;cout<<"修改成功!"<<endl;}
else if(p==5)
{cout<<"更改为:"<<endl;
cin>>w[k].huojiang;cout<<"修改成功!"<<endl;}
}}
if((fp=fopen("project.dat","wb+"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;i<=q;i++) //将更改后的数据重新写入文件
fwrite(&w[i],sizeof(project),1,fp);
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
fclose(fp);
}
void shanchu() //删除项目函数
{ int i,j,n,r,q,k;
double s=0;
double t[10];
FILE *fp;
if((fp=fopen("project.dat","rb"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;fread(&w[i],sizeof(project),1,fp)!=0;i++)
q=i;
while(2)
{
for(i=0;i<=q;i++)
cout<<w[i].id<<setw(9);
cout<<endl;
cout<<"请选择要删除的项目编号:";
cin>>z;
for(i=0;i<=q;i++)
if(w[i].id==z)
k=i;
cout<<"按0确认删除"<<endl;
cin>>p;
if((fp=fopen("project.dat","wb+"))==NULL)
{cout<<"此文件打不开"<<endl;
exit(0);}
for(i=0;i<k;i++) //将所选项目之前的项目信息重新写入文件
fwrite(&w[i],sizeof(project),1,fp);
for(i=k+1;i<=q;i++) //将所选项目之前的项目信息重新写入文件
fwrite(&w[i],sizeof(project),1,fp);
if(p==0)
{cout<<"删除成功!"<<endl;
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
break;}}
fclose(fp);
}
int main() //连接函数 主函数
{int a;
cout<<" ***欢迎进入高校科研项目管理系统*** "<<endl;
cout<<"请选择:\n 0-退出系统; \n 1-录入; \n 2-查找; \n 3-年项目数量; \n 4-分数排序; \n 5-修改; \n 6-删除; \n 7-浏览"<<endl;
while(1) //实现各个模块之间的链接
{
while(1)
{cin>>a;
if(a<0||a>7)
{cout<<"输入错误,请重新输入"<<endl;
break;}
if(a==0)
{cout<<"谢谢使用本系统!"<<endl; exit(0);}
else if(a==1)luru();
else if(a==2)chazhao();
else if(a==3)xiangmu();
else if(a==4)paixu();
else if(a==5)xiugai();
else if(a==6)shanchu();
else if(a==7)liulan();}
}
return 0;
}