第1个回答 2014-12-14
#这是我曾经的一份实验报告,你想要得前三个功能都有,只需改一下提示信息就行了
#include <stdio.h>
#define NUM 50
typedef struct _stu //定义结构体类型
{
char no[11]; //学号
char name[10]; //姓名
char birthday[11]; //出生日期
char sex[3]; //性别
char nation[10]; //民族
char department[20]; //院系
char major[20]; //专业
char province[20]; //省份
int score; //卷面成绩
int add; //加分
int total; //总分=卷面成绩+加分
}STU;
int menu();
int enter(STU s[]);
void print(STU s[], int n);
void search(STU s[], int n);
int insert(STU s[], int n);
int del(STU s[], int n);
void save(STU s[], int n);
int load(STU s[]);
void sort(STU s[], int n);
void modify(STU st[], int n);
void printone(STU s);
void back();
void reinput();
void enterone(STU *s);
void copystu(const STU *a, STU *b);
int main(){
STU stu[NUM];
int num=0;
while(1){
switch(menu()){
case 1: num += enter(stu); break;
case 2: search(stu,num); break;
case 3: num += insert(stu,num); break;
case 4: num -= del(stu, num); break;
case 5: save(stu, num); break;
case 6: num=load(stu); break;
case 7: sort(stu, num); break;
case 8: modify(stu, num); break;
case 9: print(stu, num); break;
case 10: return 0;
default: printf(" >>> Unknown Command!!!\n");
}
}
return 0;
}
int menu(){
int in = -1;
printf("\n\n*****************************************************************\n\n"
" 学生档案库\n\n"
"菜单:\n\n"
" 1.输入记录 2.查找记录 3.插入记录 4.删除记录\n\n"
" 5.保存数据 6.加载数据 7.排序记录 8.修改记录\n\n"
" 9.打印数据 10.退出程序\n\n"
"*****************************************************************\n"
"Please input command: ");
scanf("%2d",&in);
while(getchar()!='\n');
return in;
}
int enter(STU s[]){
int n, f, ok=0, i;
printf("输入要添加的记录数目: ");
do{
f=scanf("%2d", &n);
if(f==0 || n>=NUM){
if(n>=NUM) printf("最多能存储%d条记录!",NUM);
reinput();
}else ok=1;
}while(!ok);
for(i=0; i<n; i++){
printf("你开始输入第%d位学生的信息\n\n",i+1);
enterone(s+i);
printf("第%d位学生的信息输入完毕\n\n");
}
printf("全部输入完毕!\n\n");
return n;
}
void print(STU s[], int n){
int i;
printf("\n以下为所有学生的档案\n");
for(i=0; i<n; i++){
printf("\n序号 %d :\n",i+1);
printone(s[i]);
printf(">>> 按Enter键显示下一个\n");
getchar();
}
printf("已打印所有条目\n");
back();
}
void search(STU s[],int n){
char name[10];
int i,j=0;
printf("输入要查找的姓名(目前仅提供姓名检索)\n ");
while(scanf("%9s",name)==0) reinput();
while(getchar()!='\n');
for(i=0;i<n;i++){
if(!strcmp(s[i].name, name)){
printone(s[i]);
j++;
}
}
if(!j) printf("未找到相关记录\n");
back();
}
int insert(STU s[], int n){
STU in,temp;
int i,j;
char no[11];
if(n>=NUM){
printf("容量不足,无法插入新记录!\n");
back();
return 0;
}
enterone(&in);
printf("输入完毕!\n现在输入某个记录的学号,新记录将插在这个指定记录之前:\n");
while(scanf("%10s", no)==0) reinput();
for(i=0;i<n;i++){
if(!strcmp(s[i].no, no)){
for(j=n-1;j>=i;j--){
copystu(s+j,s+j+1);
}
copystu(&in,s+i);
printf("新记录已插入到指定位置\n");
back();
return 1;
}
}
printf("没有找到与指定学号匹配的记录,已自动将新记录添加到末尾\n");
copystu(&in,s+n);
back();
return 1;
}
int del(STU s[], int n){
char no[11];
int i,j;
printf("输入要删除的记录的学号:\n");
while(scanf("%10s",&no)==0) reinput();
for(i=0;i<n;i++){
if(!strcmp(s[i].no, no)){
for(j=i;j<n;j++){
copystu(s+j+1,s+j);
}
printf("记录已删除\n");
back();
return 1;
}
}
printf("没有找到指定记录\n");
back();
return 0;
}
void save(STU s[], int n){
char nm[50];
FILE* f;
int i;
printf("输入文件路径名称: \n");
while(scanf("%49s",nm)==0) reinput();
if((f=fopen(nm,"a"))==NULL){
if((f=fopen(nm,"w"))==NULL){
printf("文件打开或创建失败");
back();
return;
}
}
fprintf(f,"%d\n",n);
for(i=0; i<n; i++){
fprintf(f,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n",
s[i].no, s[i].name, s[i].birthday, s[i].sex, s[i].nation,
s[i].department,s[i].major,s[i].province,s[i].score,s[i].add,s[i].total);
}
fclose(f);
printf("文件已保存在: %s\n",nm);
}
int load(STU s[]){
char nm[50];
FILE* f;
int i, n=0;
printf("输入文件路径名称: \n");
while(scanf("%49s",nm)==0) reinput();
if((f=fopen(nm,"r"))==NULL){
printf("文件打开失败");
back();
return 0;
}
fscanf(f,"%d",&n);
if(n>NUM) n=NUM;
for(i=0; i<n; i++){
fscanf(f,"%s %s %s %s %s %s %s %s %d %d %d",
&s[i].no, &s[i].name, &s[i].birthday, &s[i].sex, &s[i].nation,
&s[i].department,&s[i].major,&s[i].province,&s[i].score,&s[i].add,&s[i].total);
}
fclose(f);
printf("记录加载完毕\n");
back();
return n;
}
void sort(STU s[], int n){
STU temp;
int i, j;
for(i=0; i<n-1; i++)
for(j=0;j<n-1-i;j++)
if(s[j].total<s[j+1].total){
copystu(s+j+1,&temp);
copystu(s+j,s+j+1);
copystu(&temp,s+j);
}
printf("已按学生总分从高到低进行排序\n");
back();
}
void modify(STU st[], int n){
STU *s=NULL;
char no[11];
int i,j, c;
char item[10][10]={"学号","姓名","出生日期","性别","民族","院系",
"专业","省份","卷面成绩","加分"};
printf("输入要修改的记录的学号:\n");
while(scanf("%10s",&no)==0) reinput();
while(getchar()!='\n');
for(i=0;i<n;i++){
if(!strcmp(st[i].no, no)){
s=st+i;
for(j=0;j<10;j++){
printf("修改 %s ?(确定输入’y‘)\n",item[j]);
if((c=getchar())=='y' || c=='Y')
switch(j){
case 0:
while(scanf("%10s",s->no)==0) reinput(); break;
case 1:
while(scanf("%9s",s->name)==0) reinput(); break;
case 2:
while(scanf("%10s",s->birthday)==0) reinput(); break;
case 3:
while(scanf("%2s",s->sex)==0) reinput(); break;
case 4:
while(scanf("%9s",s->nation)==0) reinput(); break;
case 5:
while(scanf("%19s",s->department)==0) reinput(); break;
case 6:
while(scanf("%19s",s->major)==0) reinput(); break;
case 7:
while(scanf("%19s",s->province)==0) reinput(); break;
case 8:
while(scanf("%d",&(s->score))==0 || s->score<0) reinput(); break;
case 9:
while(scanf("%d",&(s->add))==0 ) reinput(); break;
}
while(getchar()!='\n');
}
s->total=s->score+s->add;
printf("修改完成\n");
back();
return;
}
}
printf("没有找到指定记录\n");
back();
}
void printone(STU s){
printf(" 学号: %s\n"
" 姓名: %s\n"
" 出生日期: %s\n"
" 性别: %s\n"
" 民族: %s\n"
" 院系: %s\n"
" 专业: %s\n"
" 省份: %s\n"
" 卷面成绩: %d\n"
" 加分: %d\n"
" 总分: %d\n",
s.no, s.name,s.birthday,s.sex,s.nation,
s.department,s.major,s.province,s.score,s.add,s.total);
}
void back(){
printf("\n按Enter键返回主菜单\n");
getchar();
}
void reinput(){
printf("输入不合法,重新输入:\n ");
while(getchar()!='\n');
}
void enterone(STU *s){
printf("学号:\n ");
while(scanf("%10s",s->no)==0) reinput();
while(getchar()!='\n');
printf("姓名:\n ");
while(scanf("%9s",s->name)==0) reinput();
while(getchar()!='\n');
printf("出生日期(年.月.日):\n ");
while(scanf("%10s",s->birthday)==0) reinput();
while(getchar()!='\n');
printf("性别:\n ");
while(scanf("%2s",s->sex)==0) reinput();
while(getchar()!='\n');
printf("民族:\n ");
while(scanf("%9s",s->nation)==0) reinput();
while(getchar()!='\n');
printf("院系:\n ");
while(scanf("%19s",s->department)==0) reinput();
while(getchar()!='\n');
printf("专业:\n ");
while(scanf("%19s",s->major)==0) reinput();
while(getchar()!='\n');
printf("省份:\n ");
while(scanf("%19s",s->province)==0) reinput();
while(getchar()!='\n');
printf("卷面成绩:\n ");
while(scanf("%d",&(s->score))==0 || s->score<0) reinput();
while(getchar()!='\n');
printf("加分:\n ");
while(scanf("%d",&(s->add))==0 ) reinput();
while(getchar()!='\n');
s->total=s->score+s->add;
}
void copystu(const STU *a, STU *b){
strcpy(b->no, a->no);
strcpy(b->name, a->name);
strcpy(b->birthday, a->birthday);
strcpy(b->sex, a->sex);
strcpy(b->nation, a->nation);
strcpy(b->department, a->department);
strcpy(b->major, a->major);
strcpy(b->province, a->province);
b->score=a->score;
b->add=a->add;
b->total=a->total;
}