成绩
南京工程学院
课程设计说明书(论文)
题 目 学生信息管理系统
课 程 名 称 高级语言程序设计课程设计 院(系、部、中心) 通信工程学院 专 业 信息工程 班 级 信息111 学 生 姓 名 郭帅 学 号 208110816 设 计 地 点 信息楼C213 指 导 教 师 程勇
设计起止时间:2012年2月27日至2012年03月02日
目 录
1.设计目标 .................................................. 1 2.总体设计 .................................................. 1 2.1数据结构描述与定义 ...................................... 1 2.2模块设计 .................................................... 1 3.测试结果与分析 ...................................... 7 4.课程设计总结 .......................................... 8 参考文献: ....................................................... 8 附录A: 源程序清单 .................................. 8
1.设计目标
本次设计的程序名称为学生信息管理系统,利用结构体数组完成对学生基本信息的动态管理。利用本系统可以对学生的基本信息进行添加、查询、编辑、删除等操作,方便教务处的统筹管理。学生和教师等都能通过本系统准确无误地获取相关信息。
2.总体设计
2.1数据结构描述与定义
首先,要明确系统的具体功能。本系统要实现学生信息的管理,例如要能够添加学生的联系方式、地址、考试成绩等,并要求能够计算出学生的总成绩、具体排名,以及输出这些信息等。故用结构体数组定义学生,利于信息的添加、修改、删除、排名等。
2.2模块设计
系统共分4个大模块,分别是信息维护、信息查询、成绩统计、成绩排序。 1.系统模块图(模块划分)
学生信息管理系统
信息维护 信息查询 成绩统计 成绩排序
<1>开始画面
界面显示为“欢迎使用本管理系统”。汉字显示位置通过gotoxy()函数使光标移动到了界面中央,因考虑到观看者的视觉停留,故将该界面显示延迟了3秒,用到了Sleep()函数。
C语言语句如下: gotoxy(10,5);
printf(\"**************************************************************\");
gotoxy(30,6);
printf(\" 欢迎使用本管理系统\"); gotoxy(10,7);
printf(\"**************************************************************\");
gotoxy(35,10);
printf(\"作者:郭帅 \"); Sleep(3000); system(\"cls\");
其运行效果如下:
在停留3秒后,执行清屏函数system(\"cls\"),换面转换至主界面,即主菜单。
运行效果如下:
<2>信息维护
信息维护模块分为添加学生信息、修改学生信息、删除学生信息三个小模块,以及一个返回主菜单的选项。
在主菜单中选择1并按下回车后,执行清屏函数,自动识别用户的选项,并显示信息维护模块的菜单。此处用到switch()语句,其程序如下:
while(chg)
{
Menu();
scanf(\"%d\ switch(n) {
case 1:
Infobase(); //信息维护 system(\"cls\"); break; case 2:
Find(); //信息查询 system(\"cls\");
break; case 3:
InfoStat(); //成绩统计 break; case 4:
Comp(); //成绩排序 break; case 0:
chg=0; //退出菜单 system(\"cls\");
printf(\"/t/t谢谢使用!再见\\n\"); break; default:
printf(\"/t/t选择错误(0~4)?请重新输入\\n\"); system(\"cls\"); }
运行效果如下:
添加学生信息:
系统运用结构体数组,依次将学生信息储存,并使用追加方式读取文本“学生信息.txt”,将其信息按照固定格式存入该文本中,保证了数据信息不会丢失。
修改学生信息:
系统使用指针打开存储学生信息的文本“学生信息.txt”,根据输入的学生姓名找到相应的学生信息,使用新输入的信息覆盖原信息并储存到“学生信息.txt”,实现了信息的修改。
删除学生信息:
系统根据用户输入的学生姓名,在“学生信息.txt”找到对应的信息,将其删除。并将指针移动到开头,覆盖需要删除的信息,之后的信息依次前移。其程序如下:
rewind(fp); //指针移动到开头 for(;j <3>信息查询 信息查询模块分为按学号查询和按姓名查询2个模块,以及返回菜单选项。此处依旧用到switch()语句(此处省略)。 以按学号查询为例: 系统通过指针将文本“学生信息.txt”打开,使用if语句,将用户输入的学号和已经储存的学号对比,用以判断是否为所查找的学生。如果是所查找的学生,则系统会输出该学生的全部信息。 其程序如下: if(stu[i].ID==n) //判断是否需查找学生 <4>成绩统计 系统提供按照学科及其分数段查看学生信息的统计结果,其程序为: FILE* fp=NULL; //声明文件指针 fp=fopen(\"学生信息.txt\ //以只读方式打开 system(\"cls\"); printf(\"输入课程名(数学 外语 C)和分数段(格式:数学 x1-x2)\\n\"); scanf(\"%s\ //接收输入课程名 scanf(\"%d-%d\ //接收输入分数段 printf(\"姓名 \性别 \%s \总分\\n\ for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].math, stu[i].sum); } for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); } for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); } } <5>成绩排序 由用户输入一门学科的名称,系统在“学生信息.txt”中自动查找,并按照该成绩由高到低的顺序,将学生信息输出到显示器上。(此处省略程序) 2.模块流程图 开始 所有学生信息 添加学生信息 修改学生信息 删除学生信息 存储学生信息 成绩查询 成绩统计 成绩排序 退出 3.测试结果与分析 该系统实现了预期的功能。在实现过程中,遇到了无法删除学生信息的问题, 但经过修改,已经实现了对学生信息的删除。至此,该系统已经完全实现了对学生的基本信息进行添加、查询、编辑、删除等操作,方便教务处的统筹管理。学生和教师等都能通过本系统准确无误地获取相关信息。极大方便了对学生信息的整理和查询。 4.课程设计总结 本次课程设计实践极大地提高了我们C语言使用的熟练程度,加强了我们对C语言各部分知识的理解,与此同时增强了我们编程方面的创新能力,以及在编程和编译时对于错误的处理分析能力,为我们将来的程序设计做好铺垫,极大得提高了我们在编程方面的兴趣,也加强了我们学好编程语言的决心和信心。 参考文献: 1、c语言程序设计(第三版) 谭浩强(著) 2、c语言程序设计基础实验教程 廖雷 罗代忠 主编 附录A: 源程序清单 #include #include typedef struct //重命名学生信息结构体 { char name[10]; //姓名 char sex[3]; //性别 int age; //年龄 char birthday[40]; //生日 int ID; //学号 char tel[40]; //联系方式 char ad[50]; //地址 char mail[50]; //邮箱 int math; //数学成绩 int english; //英语成绩 int computer_C; //计算机C语言成绩 int sum; //成绩总和 }Student; void main() { int chg=1,n; gotoxy(10,5); printf(\"**************************************************************\"); gotoxy(30,6); printf(\" 欢迎使用本管理系统\"); gotoxy(10,7); printf(\"**************************************************************\"); gotoxy(35,10); printf(\"作者:郭帅 \"); Sleep(3000);//停留3秒 system(\"cls\");//清屏 while(chg) { Menu(); scanf(\"%d\ switch(n) { case 1: Infobase(); //信息维护 system(\"cls\"); break; case 2: Find(); //信息查询 system(\"cls\"); break; case 3: InfoStat(); //成绩统计 break; case 4: Comp(); //成绩排序 break; case 0: chg=0; //退出菜单 system(\"cls\"); printf(\"/t/t谢谢使用!再见\\n\"); break; default: printf(\"/t/t选择错误(0~4)?请重新输入\\n\"); system(\"cls\"); } } getch(); } /************************************主菜单画***********************************************/ void Menu() { printf(\"\┌──────────────────────────────┐\\n\"); printf(\"\│ 主菜单 │\\n\"); printf(\"\├─────┬──────┬─────┬─────┬─────┤\\n\"); printf(\"\│1 信息维护│2 信息查询 │3 成绩统计│4 成绩排序│0 退出菜单│\\n\"); printf(\"\└─────┴──────┴─────┴─────┴─────┘\\n\"); } /*************************************信息维***********************************************/ void Infobase() { int n,chg=1; while(chg) { system(\"cls\"); printf(\"\1 添加学生信息 2 修改学生信息 3 删除学生信息 0 回到主菜单\\n\"); scanf(\"%d\ switch(n) { case 1: Infobase_add(); //录入信息 break; case 2: 面 护 Infobase_amend(); //修改信息 break; case 3: Delete(); //删除信息 case 0: chg=0; //退回主菜单 break; default : printf(\"\ 选择错误请重新输入\\n:\"); } } } /****************************光标定位函数*******************************/ void gotoxy(int x,int y) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; HANDLE hConsoleOut; hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo); csbiInfo.dwCursorPosition.X = x; csbiInfo.dwCursorPosition.Y = y; SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition); } /*******************************录入信息*****************************************************/ void Infobase_add() { Student stu[1]; //定义Student型数组变量 FILE* fp=NULL; //声明文件指针 fp=fopen(\"学生信息.txt\ //以追加方式打开 system(\"cls\"); printf(\" 输入姓名 性别 年龄 出生年月 学号 电话 地址 邮箱 成绩(数学 外语 C语言)\\n\"); scanf(\"%s%s%d%s%d%s%s%s%d%d%d\ //接收输入 stu[0].name, stu[0].sex, &stu[0].age, stu[0].birthday, &stu[0].ID, stu[0].tel, stu[0].ad, stu[0].mail, &stu[0].math, &stu[0].english, &stu[0].computer_C); printf(\"\\n\\n\"); stu[0].sum=stu[0].english+stu[0].computer_C+stu[0].math;//计算总分 if(fprintf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \\n\写入磁盘防错处理 stu[0].name, stu[0].sex, stu[0].age, stu[0].birthday, stu[0].ID, stu[0].tel, stu[0].ad, stu[0].mail, stu[0].math, stu[0].english, stu[0].computer_C, stu[0].sum)==0) { printf(\"写入失败\"); } fclose(fp); //关闭文件指针 } /*********************************修改信***************************************************/ void Infobase_amend() { int i,j; char ch[10]; //声明字符数组以保存需修改的姓名 Student stu[50]; //声明Student型数组 FILE* fp=NULL; //声明文件指针 system(\"cls\"); printf(\" 输入需修改学生的名字\");//提示输入 scanf(\"%s\ //接收输入姓名 fp=fopen(\"学生信息.txt\以可读写方式打开 for(i=0;;i++) { fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \从磁盘读入内存 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, 息 &stu[i].math, &stu[i].english, &stu[i].computer_C, &stu[i].sum); if(strcmp(stu[i].name,ch)==0) //判断是否查找所需 { rewind(fp); //指针移到文件开头 system(\"cls\"); printf(\" 输入修改姓名 性别 年龄 出生年月 学号 电话 地址 邮箱 成绩(数学 外语 C语言)\\n\"); scanf(\"%s%s%d%s%d%s%s%s%d%d%d\ //接收输入 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, &stu[i].english, &stu[i].computer_C); printf(\"\\n\\n\"); j=i; stu[i].sum=stu[i].english+stu[i].computer_C+stu[i].math; for(i=0;i stu[i].computer_C, stu[i].sum); } fprintf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \将修改数据写入磁盘 stu[i].name, stu[i].sex, stu[i].age, stu[i].birthday, stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, stu[i].math, stu[i].english, stu[i].computer_C, stu[i].sum); fclose(fp); //关闭文件指针 break; } } } /**************************************删除********************************************/ void Delete() { int i,j,k=0; char ch[10]; //声明字符数组以保存需删除的姓名 Student stu[50]; //声明Student型数组 FILE* fp=NULL,*fp1=NULL; //声明文件指针 system(\"cls\"); printf(\" 输入需删除学生的名字\"); //提示输入 scanf(\"%s\ //接收输入姓名 fp=fopen(\"学生信息.txt\ //以可读写方式打开 for(i=0;!feof(fp);i++) { fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \从磁盘读入内存 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, &stu[i].english, &stu[i].computer_C, &stu[i].sum); if(strcmp(stu[i].name,ch)==0) //判断是否查找所需 j=i; 信息 } rewind(fp); //指针移动到开头 for(;j for(i=0;i stu[i].computer_C, stu[i].sum); } fclose(fp); /***************************************信***********************************************/ void Find() { int n,chg=1; //声明chg变量用以循环 while(chg) { printf(\"\\1 按学号查询 2 按姓名查询 0 退回主菜单\\n\"); scanf(\"%d\ switch(n) { case 1: Find_ID(); //调用以学号查找的函数 break; case 2: Find_name(); //调用以姓名查找的函数 break; case 0: chg=0; //退回主菜单 break; default :printf(\"\\n 选择错误请重新输入\\n\"); } 息查询 } } /*********************************按学号查找***************************************************/ void Find_ID() { int n,i; Student stu[50]; //声明Student型数组变量 FILE* fp=NULL; //声明文件指针 system(\"cls\"); printf(\"请输入学号\\n\"); //提示接收输入 scanf(\"%d\ //接收输入学号 fp=fopen(\"学生信息.txt\ //以只读方式打开 for(i=0;!feof(fp);i++) { if(fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \\n\防止读入内存失败 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, &stu[i].english, &stu[i].computer_C, &stu[i].sum)==0) printf(\"读取失败\"); if(stu[i].ID==n) //判断是否需查找学生 { printf(\"查找到:%s 性别%s 年龄%d 出生日期%s 学号%d 电话%s \\n\ 地址%s 邮箱%s 数学%d 外语%d C语言%d 总分%d\\n\输出查找目标 stu[i].name, stu[i].sex, stu[i].age, stu[i].birthday, stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, stu[i].math, stu[i].english, stu[i].computer_C, stu[i].sum); printf(\"\\n\\n\"); break; } if(feof(fp)) //处理未找到情况 { system(\"cls\"); printf(\"无此学生信息\\n\"); } }fclose(fp); //关闭文件指针 } /******************************按姓名查找*****************************************************/ void Find_name() { int i; char ch[10]; //声明字符数组以储存查找姓名 Student stu[50]; //声明Student型数组变量 FILE* fp=NULL; //声明文件指针 system(\"cls\"); printf(\"请输入姓名\\n\"); //提示输入 scanf(\"%s\ //接收输入姓名 fp=fopen(\"学生信息.txt\ //以只读方式打开 for(i=0;!feof(fp);i++) //循环,以文件指针到末尾结束循环 { fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \从磁盘读入内存 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, &stu[i].english, &stu[i].computer_C, &stu[i].sum); if(strcmp(stu[i].name,ch)==0) //判断是否查找学生 { printf(\"查找到:%s 性别%s 年龄%d 出生日期%s 学号%d 电话%s \\n\ 地址%s 邮箱%s 数学%d 外语%d C语言%d 总分%d\\n\输出查找目标 stu[i].name, stu[i].sex, stu[i].age, stu[i].birthday, stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, stu[i].math, stu[i].english, stu[i].computer_C, stu[i].sum); printf(\"\\n\\n\"); break; } if(feof(fp)) //处理未找到情况 { printf(\"无此学生信息\\n\"); } }fclose(fp); //关闭文件指针 } /*********************************信息统*****************************************************/ void InfoStat() { int n,m,i,count=0; char ch[15]; //声明字符数组保存课程名 Student stu[60]; //声明Student型数组变量 FILE* fp=NULL; //声明文件指针 fp=fopen(\"学生信息.txt\ //以只读方式打开 system(\"cls\"); printf(\"输入课程名(数学 外语 C)和分数段(格式:数学 x1-x2)\\n\"); scanf(\"%s\ //接收输入课程名 scanf(\"%d-%d\ //接收输入分数段 for(i=0;!feof(fp);i++) //以文件指针到文件末尾结束循环 { if(fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \\n\防止读入内存失败 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, 计 &stu[i].english, &stu[i].computer_C, &stu[i].sum)==0) printf(\"读取失败\"); count++; } fclose(fp); //关闭文件指针 /****************************以下输出查找目**********************************************/ system(\"cls\"); printf(\"姓名 \性别 \%s \总分\\n\ for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].math, stu[i].sum); } for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); } for(i=0;i printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); } } /******************************成绩排*******************************************************/ void Comp() 标 序 { int i,k,j,count=0; char ch[15]; //声明字符数组保存课程名 Student stu[50],temp; //声明Student型变量 FILE *fp=NULL; //声明文件指针 system(\"cls\"); printf(\"请输入需要排序的课程名\\n\"); //提示输入 scanf(\"%s\ //接收输入的课程名 fp=fopen(\"学生信息.txt\ //以读方式打开文件 for(i=0;!feof(fp);i++) //以文件指针到末尾结束循环 { if(fscanf(fp,\" %s %s %d %s %d %s %s %s %d %d %d %d \\n\防止读入内存失败 stu[i].name, stu[i].sex, &stu[i].age, stu[i].birthday, &stu[i].ID, stu[i].tel, stu[i].ad, stu[i].mail, &stu[i].math, &stu[i].english, &stu[i].computer_C, &stu[i].sum)==0) printf(\"读取失败\"); count++; //记录文件内学生人数 } fclose(fp); //关闭文件指针 if(strcmp(ch,\"数学\")==0) { for(i=0;i printf(\"姓名 性别 学号 数学 外语 C语言 总分 数学成绩名次\\n\"); for(i=0;i stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } } if(strcmp(ch,\"外语\")==0) { for(i=0;i printf(\"姓名 性别 学号 数学 外语 C语言 for(i=0;i stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } } if(strcmp(ch,\"C\")==0) { 外语成绩名次\\n\"); %d\\n\ //输出信息 总分 for(i=0;i printf(\"姓名 性别 学号 for(i=0;i stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } } } 数学 外语 C语言 总分 C语言成绩名次\\n\"); %d %d %d %d\\n\ //输出信息 因篇幅问题不能全部显示,请点此查看更多更全内容