读入文档未完成,是个败点
/******************************************************
File name:学生信息管理系统 // 文件名
Author: Sno:1508010317 class:软工1503
Date:2017.3.19 // 作者及完成日期
Description:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
提高要求:
可将程序中的不足(如数据验证)等根据自己的能力与理解完成。
Function List: // 主要函数及其功能
1、menu(); //界面函数
2、insert(STUDENTS t[]); //输入函数
3、list(STUDENTS t[],int n); //显示函数
4、search(STUDENTS t[],int n);//查询函数
5、del(STUDENTS t[],int n); //删除函数
6、save(STUDENTS t[],int n); //保存函数
7、modify(STUDENTS t[],int n);//修改函数
8、load(STUDENTS t[]); //加载函数
9、help(); //帮助函数
10、find_name(STUDENTS t[],int n,char *s); //姓名查找函数
11、find_code(STUDENTS t[],int n,char *no);//学号查找函数
12、sort(STUDENTS t[],int n); //排序函数
History: // 历史修改记录
<author> <time> <desc>
2017.3.19 增加加载函数失败
不能实现读取文件信息
2017.3.19 增加排序函数,成功实现
*************************************************/
#include <stdio.h> /**I/O函数**/
#include <stdlib.h> /**标准库函数**/
#include <string.h> /**字符串函数**/
#define N 50 /**最大学生人数**/
typedef struct
{
char code[20]; /**学号**/
char name[20]; /**姓名**/
char sex[5]; /**性别**/
int age; /**年龄**/
float score0; /**C语言成绩**/
float score1; /**高数成绩**/
float score2; /**英语成绩**/
} STUDENTS;/**定义数据结构**/
/*****以下所有函数******/
int menu(); /**界面函数**/
int insert(STUDENTS t[]); /**输入函数**/
void list(STUDENTS t[],int n); /**显示函数**/
void search(STUDENTS t[],int n);/**查询函数**/
int del(STUDENTS t[],int n); /**删除函数**/
void save(STUDENTS t[],int n); /**保存函数**/
void modify(STUDENTS t[],int n);/**修改函数**/
int load(STUDENTS t[]); /**加载函数**/
void help(); /**帮助函数**/
int find_name(STUDENTS t[],int n,char *s); /**姓名查找函数**/
int find_code(STUDENTS t[],int n,char *no);/**学号查找函数**/
void sort(STUDENTS t[],int n); /**排序函数**/
/********界面函数********/
int menu()
{
int c;
printf(" ******************************************************\n");
printf(" * 学生信息管理系统 *\n");
printf(" ******************************************************\n");
printf(" *******************系统功能菜单***********************\n");
printf(" ---------------------- ------------------------- \n");
printf(" ********************************************* \n");
printf(" * 0.系统帮助及说明 * * 1.加载学生信息 * \n");
printf(" ********************************************* \n");
printf(" * 2.查询学生信息 * * 3.修改学生信息 * \n");
printf(" ********************************************* \n");
printf(" * 4.增加学生信息 * * 5.按学号删除信息 * \n");
printf(" ********************************************* \n");
printf(" * 6.显示当前信息 * * 7.保存信息到文件 * \n");
printf(" ********************************************* \n");
printf(" * 8.退出系统 * * 9.按学号排序 * \n");
printf(" ********************************************* \n");
printf(" ---------------------- ------------------------ \n");
do{
printf("\n 输入您的菜单选项编号(0-9):");
scanf("%d",&c);
}while(c<0 || c>9);
return c;
}
/********帮助函数********/
void help()
{
system("cls"); /**清屏**/
printf("\n0.欢迎使用系统帮助!\n");
printf("\n1.初次进入系统后,请先选择 4 增加学生信息;\n");
printf("\n2.按照菜单提示键入数字代号;\n");
printf("\n3.增加学生信息后,切记按 7 保存;\n");
printf("\n4.谢谢您的使用!\n");
getchar();
}
/*******增加函数********/
int insert(STUDENTS t[])
{
int i,n;
system("cls");/**清屏**/
printf("\n 请输入待增加学生人数:\n");
scanf("%d",&n);
printf("请输入学生记录:\n");
printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n");
printf("....................................................................\n");
for(i=0;i<n;i++)
{
scanf("%s",t[i].code); /**输入学号**/
scanf("%s",t[i].name); /**输入姓名**/
scanf("%s",t[i].sex); /**输入性别**/
scanf("%d",&t[i].age); /**输入年龄**/
scanf("%f",&t[i].score0); /**C语言成绩**/
scanf("%f",&t[i].score1); /**高数成绩**/
scanf("%f",&t[i].score2); /**英语成绩**/
}
getchar();
return n;
}
/**查找函数**/
void search(STUDENTS t[],int n)
{
char s[21]; /**以姓名和学号最长长度+1为准**/
system("cls"); /**清屏**/
int i,item;
printf("----------------------\n");
printf("-----1.按学号查询-----\n");
printf("-----2.按姓名查询-----\n");
printf("-----3.退出本菜单-----\n");
printf("----------------------\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
switch(item)
{
case 1:
printf("请输入查找的学号:\n"); /**学号查找**/
scanf("%s",s);
getchar();
i=find_code(t,n,s); /**将学号查找函数返回值赋给i**/
if(i>n-1)
printf("没有学号为%s的学生! \n",s);
else
{
printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n");
printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",
t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);
}
break;
case 2:
printf("请输入查找的姓名:\n"); /**姓名查找**/
scanf("%s",s);
getchar();
i=find_name(t,n,s); /**将姓名查找函数返回值赋给i**/
if(i>n-1)
printf("没有姓名为%s的学生! \n",s);
else
{
printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n");
printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",
t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);
}
break;
case 3:return; /**返回界面函数**/
default:printf("请在1-3之间选择\n");
}
}
}
/**按姓名查找函数,参数为学生数组和学生总数以及姓名s**/
int find_name(STUDENTS t[],int n,char *s)
{
int i;
for(i=0;i<n;i++)
{
if(strcmp(s,t[i].name)==0) /**比较两者是否相等,相等则返回0**/
return i;
}
return i;
}
/**按学号查找函数,参数为学生数组和学生总数以及学号no**/
int find_code(STUDENTS t[],int n,char *no)
{
int i;
for(i=0;i<n;i++)
{
if(strcmp(no,t[i].code)==0) /**比较两者是否相等,相等则返回0**/
return i;
}
return i;
}
/**修改学生信息函数**/
void modify(STUDENTS t[],int n)
{
char s1[21]; /**以姓名和学号最长长度+1为准**/
int ch=0;
int i,item;
system("cls"); /**清屏**/
printf("请输入要修改的学生学号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(t[i].code,s1)!=0)
{
printf("没有找到学号为%s的学生!\n",s1);
}
else
{
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改C语言成绩\n");
printf("5.修改高等数学成绩\n");
printf("6.修改大学英语成绩\n");
printf("7.退出本菜单\n");
printf("------------------\n");
printf("学号为%s的学生修改前:\n",s1);
printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n");
printf("%6s %7s %6s %6d %9.1f %10.1f %10.1f\n",
t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
switch(item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",t[i].name);
break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d",&t[i].age);
break;
case 3:
printf("请输入新的性别:\n");
scanf("%s",t[i].sex);
break;
case 4:
printf("请输入新的C语言成绩:\n");/**C语言成绩**/
scanf("%f",&t[i].score0);
break;
case 5:
printf("请输入新的高等数学成绩:\n"); /**高数成绩**/
scanf("%f",&t[i].score1);
break;
case 6:
printf("请输入新的大学英语成绩:\n");/**英语成绩**/
scanf("%f",&t[i].score2);
break;
case 7: return;
getchar();
default:printf("请在1-7之间选择\n");
}
}
}
}
/**删除函数,参数是结构体数组,记录数**/
int del(STUDENTS t[],int n)
{
char s[21];
int ch=0;
int i;
system("cls"); /**清屏**/
printf("请输入要删除的学生学号:\n");
scanf("%s",s);
getchar();
i=find_code(t,n,s);
if(i==n)
printf("没有学号为%s的学生! \n",s);
else
{
printf("正在删除中! \n");
for(;i<n;i++)
{
strcpy(t[i].name,t[i+1].name);
strcpy(t[i].code,t[i+1].code);
strcpy(t[i].sex,t[i+1].sex);
t[i].age=t[i+1].age;
t[i].score0=t[i+1].score0;
t[i].score1=t[i+1].score1;
t[i].score2=t[i+1].score2;
}
n--;
printf("删除成功! \n");
}
getchar();
return n;
}
/**显示信息,参数为记录数组和总人数**/
void list(STUDENTS t[],int n)
{
int i;
system("cls");
printf("****************************学生清单********************************\n");
printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",
t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);
}
printf("--------------------------------------------------------------------\n");
getchar();
}
/****保存函数,参数为结构体数组和总人数****/
void save(STUDENTS t[],int n)
{
int i;
FILE * fp ; /**指向文件的指针**/
system("cls");
if((fp=fopen("017.txt","w"))==NULL) /**打开文件,并判断打开是否正常**/
{
printf("无法打开学生记录文件! \n"); /**打开失败**/
exit(1); /**退出**/
}
printf("\n正在保存中\n");
fprintf(fp,"%d",n); /**将记录数写入文件**/
fprintf(fp,"\r\n"); /**将换行符号写入文件**/
for(i=0;i<n;i++)
{
fprintf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f",
t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);
fprintf(fp,"\r\n"); /**将换行符号写入文件**/
}
fclose(fp); /**关闭文件**/
getchar();
printf("--------保存成功---------\n"); /**显示保存成功**/
}
/**加载函数,读入参数,参数为结构体数组**/
int load(STUDENTS t[])
{
int i,n;
system("cls");
FILE * fp;
if((fp=fopen("017.txt","r"))==NULL) /**打开文件**/
{
printf("无法打开学生信息文件! \n"); /**打开失败**/
exit(1); /**退出**/
}
fscanf(fp,"%d",&n); /**读入记录数**/
for(i=0;i<n;i++)
{/**按格式读入记录**/
fscanf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f",
t[i].code,t[i].name,t[i].sex,&t[i].age,&t[i].score0,&t[i].score1,&t[i].score2);
}
fclose(fp); /**关闭文件**/
printf("已经成功加载学生信息文件! \n"); /**显示保存成功**/
getchar();
return n;
}
/**排序函数**/
void sort(STUDENTS t[],int n)
{
int i,j,p1,p2,p3,p4;
system("cls");
STUDENTS temp;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
if((strcmp(t[j-1].code,t[j].code))>0) /**比较学号大小**/
{
/**交换学号**/
strcpy(temp.code,t[j-1].code);
strcpy(t[j-1].code,t[j].code);
strcpy(t[j].code,temp.code);
/**交换姓名**/
strcpy(temp.name,t[j-1].name);
strcpy(t[j-1].name,t[j].name);
strcpy(t[j].name,temp.name);
/**交换性别**/
strcpy(temp.sex,t[j-1].sex);
strcpy(t[j-1].sex,t[j].sex);
strcpy(t[j].sex,temp.sex);
/**交换年龄**/
p1=t[j-1].age;
t[j-1].age=t[j].age;
t[j].age=p1;
/**交换C成绩**/
p2=t[j-1].score0;
t[j-1].score0=t[j].score0;
t[j].score0=p2;
/**交换高数成绩**/
p3=t[j-1].score1;
t[j-1].score1=t[j].score1;
t[j].score1=p2;
/**交换英语成绩**/
p4=t[j-1].score2;
t[j-1].score2=t[j].score2;
t[j].score2=p2;
}
}
printf("排序成功! \n");
getchar();
}
/******主函数******/
int main()
{
STUDENTS stu[N]; /**定义结构体数组**/
int length; /**定义学号姓名等长度**/
for(;;) /**无限循环**/
{
switch(menu()) /**调用界面函数,返回值作为开关语句的条件**/
{
case 0:help();break; /**显示操作步骤**/
case 1:load(stu);break; /**加载到内存**/
case 2:search(stu,length);break; /**按姓名查找记录**/
case 3:modify(stu,length);break; /**按学号修改记录**/
case 4:length=insert(stu);break; /**输入记录**/
case 5:length=del(stu,length);break; /**按姓名删除记录**/
case 6:list(stu,length);break; /**显示全部记录**/
case 7:save(stu,length);break; /**保存文件**/
case 8:exit(0); /**程序结束**/
case 9:sort(stu,length);break; /**排序**/
}
getchar();
printf("按回车键返回主菜单...\n"); /**提示信息**/
}
return 0;
}