您的当前位置:首页正文

学生信息管理系统设计报告

2023-05-07 来源:钮旅网


成绩

南京工程学院

课程设计说明书(论文)

题 目 学生信息管理系统

课 程 名 称 高级语言程序设计课程设计 院(系、部、中心) 通信工程学院 专 业 信息工程 班 级 信息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(;jstu[j]=stu[j+1]; //覆盖需删除的后依次前移 }

<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;iif(strcmp(ch,\"数学\")==0 && stu[i].math>=n && stu[i].math<=m) {

printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].math, stu[i].sum); }

for(i=0;iif(strcmp(ch,\"外语\")==0 && stu[i].english>=n && stu[i].english<=m) {

printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); }

for(i=0;iif(!strcmp(ch,\"C\") && stu[i].computer_C>=n && stu[i].computer_C<=m) {

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 //使用清屏函数及光标定位 #include //包含使用strcmp的头文件 void gotoxy(int x, int y);//光标定位 void Menu(); //主菜单 void Infobase(); //信息维护 void Find(); //信息查询 void InfoStat(); //成绩统计 void Comp(); //成绩排序 void Find_ID(); //以学号查找 void Find_name(); //以姓名查找 void Infobase_add(); //录入信息 void Infobase_amend(); //修改信息 void Delete(); //删除信息

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;ifprintf(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); }

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(;jstu[j]=stu[j+1]; //覆盖需删除的后依次前移 }

for(i=0;ifprintf(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); }

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;iif(strcmp(ch,\"数学\")==0 && stu[i].math>=n && stu[i].math<=m) {

printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].math, stu[i].sum); }

for(i=0;iif(strcmp(ch,\"外语\")==0 && stu[i].english>=n && stu[i].english<=m) {

printf(\"%s\%s\%d\%d\\n\ stu[i].name, stu[i].sex, stu[i].english, stu[i].sum); }

for(i=0;iif(!strcmp(ch,\"C\") && stu[i].computer_C>=n && stu[i].computer_C<=m) {

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;ifor(j=i+1;jif(stu[k].mathtemp=stu[i]; stu[i]=stu[k]; stu[k]=temp; } }

printf(\"姓名 性别 学号 数学 外语 C语言 总分 数学成绩名次\\n\");

for(i=0;iprintf(\"%-6s %s %d %d %d %d %d %d\\n\ //输出信息 stu[i].name, stu[i].sex, stu[i].ID, stu[i].math, stu[i].english,

stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } }

if(strcmp(ch,\"外语\")==0) {

for(i=0;ifor(j=i+1;jif(stu[k].englishtemp=stu[i]; stu[i]=stu[k]; stu[k]=temp; } }

printf(\"姓名 性别 学号 数学 外语 C语言 for(i=0;iprintf(\"%-6s %s %d %d %d %d %d stu[i].name, stu[i].sex, stu[i].ID, stu[i].math, stu[i].english,

stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } }

if(strcmp(ch,\"C\")==0) {

外语成绩名次\\n\"); %d\\n\ //输出信息 总分

for(i=0;ifor(j=i+1;jif(stu[k].computer_Ctemp=stu[i]; stu[i]=stu[k]; stu[k]=temp; } }

printf(\"姓名 性别 学号 for(i=0;iprintf(\"%-6s %s %d %d stu[i].name, stu[i].sex, stu[i].ID, stu[i].math, stu[i].english,

stu[i].computer_C, stu[i].sum,i+1); printf(\"\\n\\n\"); } } }

数学 外语 C语言 总分 C语言成绩名次\\n\"); %d %d %d %d\\n\ //输出信息

因篇幅问题不能全部显示,请点此查看更多更全内容