南邮学生基本信息管理系统程序设计报告

更新时间:2023-04-08 12:43:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

程序设计报告

( 2014/2015学年第二学期)

题目:学生基本信息管理系统

专业信息管理与信息系统

组长学号姓名

组员学号姓名

指导教师

指导单位计算机软件中心

日期 2015 年 6 月 25 日

-

-

学生基本信息管理系统

一、课题内容和要求

此系统是可实现最基本功能的学生管理系统。具体的管理信息应包括:两个txt文件,其中a.txt为学生基本信息文件,应该包括学号、姓名、性别、宿舍号码、电话号码;b.txt 为学生成绩基本信息文件,应包括学号、课程编号、课程名称、学分、平实得分、实验成绩、卷面成绩、综合成绩、实得学分。

① a.txt文件不需要编程录入数据,可用文本编辑工具直接生成

②数据录入功能: 对b.txt进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。

③学生基本情况查询

1)输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。

2)输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。

④成绩查询:输入一个学号时,查询出此生的所有课程情况,

⑤删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。

⑥排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。

二、需求分析

学生基本信息管理系统的功能框架图如图2.1所示。

-

图2.1 功能框架图

本次课程设计主要利用了结构体数组、结构体指针以及与文件有关的基本操作,通过采用模块化设计的思想,首先创建好各个模块的函数,然后被主函数调用。主函数通过多次调用不同的函数实现创建文件、查询、删除学生信息模块和排序得基本功能,其总体框图如图2.1。各个模块的程序编写比较容易,各个函数的接口是否处能理好,是本次课程设计能否成功的关键。通过合理处理各函数得接口,使之能结合为一个完整的具有多功能的程序,从而顺利完成本次课程设计。

三、概要设计

3.1主函数模块

在主函数中需要输出主菜单选择界面,简单菜单的制作可利用myprint()函数实现。获取用户的输入选择,存放在choose中,接着判断用户是否继续选择,若选择,则重新获得用户输入;否则,推出程序,其流程图见图3.1。

-

-

图 3.1 主函数模块的流程图

3.2显示菜单模块

myprint()函数不需要传递参数,也不需要再定义任何变量,主要是实现输出主菜单。其函数的流程图见图

3.2.

图3.2 myprint()函数的流程图

3.3创建文件模块

3.3创建文件模块

mycreat()函数主要实现打开 b.txt文件,并通过fscanf()函数从磁盘上读取文件b.txt的学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩信息然后依据学分、平时成绩、实验成绩、卷面成绩计算得到综合成绩和实得学分并借助临时文件c.txt将综合成绩和实得学分也加到b.txt文件中。

其中第一个for循环语句主要实现计算综合成绩和实得学分的功能,通过fsanf()语句将文件 b.txt得数据一一读入,同时计算综合成绩和实得学分,并将这些数据通过fprintf语句写入临时文件c.txt。

rewind(fp)函数是将fp指示的文件位置指针置于文件开头位置,并清除文件结束标志和错误标志,以便将临时文件c.txt中的数据写入b.txt文件中。

getc与putc函数与文件指针将临时文件c.txt的信息写入b.txt文件中。其流程图见图3.3。

其流程图见图3.3。

-

图3.3 mycreat()函数流程图

3.4显示信息模块设计

本模块主要设计mydisplay(……)函数。将文件b.txt的数据通过fscanf()语句写入内存,然后通过printf()语句将读到的信息显示到屏幕上。若文件中无记录,则显示文件中没有记录。其流程图见图3.4。

-

图3.4 显示信息模块流程图

3.5查询模块的设计

本模块主要设计mysearch(……)函数、mysearchbase(……)函数、mysearchscore(……)函数、print()函数。mysearchbase(……)函数的流程图见图3.5,sch_num ()函数的流程图见图3.6, sch_name()函数的流程图见图3.7, sch_dom()函数的流程图见图3.8。

mysearch (……)函数主要是查询菜单的显示、输出你要查询的信息。查询菜单主要包括查询基本情况和查询成绩。它首先在屏幕上显示查询显示菜单,然后利用getch()与if

-

语句判断查询方式以确定需要调用的函数。

数据结构说明:学生结构体数组同3.3.

c 选择的不同方式

tempnum[10] 要查询的学号

tempname[10] 要查询的姓名

tempdom[10] 要查询的宿舍号码

-

图3.6 sch_num ()函数的流程图

图3.7 sch_name()函数的流程图

-

图3.8 sch_dom()函数的流程图

-

3.5.2查询成绩信息模块设计

本模块主要设计mysearchscore(……)函数。

mysearchscore(……)

用绩信息。其流程图见图3.9

schscore_num ()

询学生成绩。其流程图见图3.10 Array图3.9 mysearchscore()

图3.10 schscore_num()函数的流程图3.6删除信息模块设计

本模块主要设计mydelete(……)函数。

mydelete (……)函数按学号删除信息。先以只读方式打开文件,进行读取。如找到

相应的信息,结束本次循环,并将a.txt文件删除后的数据写入临时文件c.txt中,同时

-

释放文件a.txt的空间。再创建一个文件a.txt,并将临时文件c.txt中的数据一次通过fpintf()语句写到文件a.txt上。如没有找到则显示文件中无此信息。文件b.txt的删除与文件a.txt类似。mydelete()模块的流程图见图3.11。

del_num ()函数实现按学号删除学生成绩。由于任务要求在文件a.txt中删除某学生的基本信息,在文件b.txt中该生的成绩信息也相应的被删除,所以需要通过学号对文件a.txt与b.txt均进行删除操作。这是定义函数del_num ()的关键,其流程图见图3.12。(其中对b.txt的操作与对文件a.txt的操作相似,在此仅画出对文件a.txt的操作)

数据结构说明:学生结构体数组同3.3. c 选择的不同方式tempnum[10] 要删除学生的学号FILE *fp *fp1 文件指针

图3.11 mydelete()模块的流程图

-

图3.12 函数del_num ()的流程图

3.7排序模块设计

本模块主要设计mysort(……)函数、print()函数。

mysearchsort(……)函数主要是排序菜单的显示、输出排序后的信息。排序菜单主要包括按综合成绩和实得学分两种方式实现升序与降序不同方式得排序。它首先在屏幕上显示排序显示菜单,然后利用getch()与if语句判断排序方式以确定需要调用的函数,然后以只读方式打开文件,进行读取。通过插入排序法分别实现不同的排序方式。如找到相应

-

的信息,则将该信息通过调用printf()函数输出到屏幕上。所谓插入排序就是将无序序列中的各各元素依次插入到已经有序的线性表中。

mysort (……)函数的流程图见图3.13,sort_sumscore ()函数的流程图见图

图3.13 mysort (……)函数的流程图

-

四、源程序代码

#include

#include

#include

#include

#define N 100

struct student

{

char num[10];

char name[10];

char tel[11];

char sex[2];

int dom; /*宿舍*/

char cousenum[3]; /*课程编号*/

float cousecount; /*课程学分*/

char cousename[25]; /*课程名称*/

float comscore; /*平时成绩*/

signed int expscore; /*实验成绩*/

float paperscore; /*卷面成绩*/

float sumscore;/*综合成绩*/

float count; /*实得学分*/

}stu[12];

/* 以下是函数原型说明,被调函数的定义在主调函数后面时,要加此部分*/ void myprint(); /*创建主菜单*/

void mycreate(); /*创建管理系统*/

void mydisplay(); /*显示*/

void mysearchbase(); /*基本情况查询*/

/* schbase_num sch_dom与schbase_name函数被mysearchbase调用*/

void sch_num(FILE *fp);

void sch_name(FILE *fp);

void sch_dom(FILE *fp);

void mysearch(); /*查询*/

void mysearchscore(); /*成绩查询*/

-

void schscore_num(FILE *fp,FILE *f); /*成绩查询*/

void mydelete(); /*删除*/

/* del_num函数被mydelete调用*/

void del_num(FILE *fp,FILE *f);

void mysort(); /*排序*/

/* sort_sumscore与sort_count函数被mysort调用*/

void sort_sumscore();

void sort_count();

/*主函数*/

void main()

{

char choose,yes_no;

/* system("color 8e");

system("cls");*/

do

{

myprint(); /* 显示主菜单*/

printf(" ");

choose=getch();

switch(choose)

{

case '1': mycreate(); break; /* 创建*/

case '2': mydisplay(); break; /* 显示*/

case '3': mysearch(); break; /*查询*/

case '4': mydelete(); break; /* 删除*/

case '5': mysort(); break; /* 排序*/

case '0': break;

default:printf("\n %c为非法选项!\n",choose);

}

if(choose=='0')

break;

printf("\n 要继续选择吗(Y/N)?\n");

do

{

yes_no=getch();

}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');

}while(yes_no!='Y'||yes_no!='y');

}

void myprint() /* 显示菜单界面*/

{

/* clrscr(); */

printf("\n\n\n\n\n\n\n\n");

printf(" 学生管理系统\n ");

-

printf("\n");

printf(" |*************************************************************|\n");

printf(" | 请输入选项编号(0-5): |\n");

printf(" |-----------------------------------------|\n");

printf(" | 1--创建学生信息|\n");

printf(" | 2--显示学生信息|\n");

printf(" | 3--查询学生信息|\n");

printf(" | 4--删除学生信息|\n");

printf(" | 5--排序学生信息|\n");

printf(" | 0--退出|\n");

printf(" |-----------------------------------------|\n");

printf(" |*****************************************************************|\n");

printf("\n");

printf(" 欢迎进入学生管理系统——请选择要进行的操作!\n ");

}

/* 定义创建信息管理系统的函数*/

void mycreate()

{

int i,n;

FILE *fp;

fp=fopen("e:\\源程序2\\b.txt","r+");

if(fp==NULL)

{

printf("\n 打开文件失败!\n");

return;

}

rewind(fp);

printf("\n\n");

printf("\t\t\t\t请输入学生个数");

scanf("%d",&n);

for(i=0;i

{

printf("请输入学生学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩\n");

scanf("%s %s%s %f %f %d %f" ,&stu[i].num ,&stu[i].cousenum,&stu[i].cousename,&stu[i].cousecount, &stu[i].comscore,&stu[i].expscore,&stu[i].paperscore);

}

for(i=0;i

{

if( stu[i].expscore==-1)

stu[i].sumscore=stu[i].comscore*3/10+stu[i].paperscore*7/10;

-

else

stu[i].sumscore= stu[i].comscore*15/100+ stu[i].expscore*15/100+ stu[i].paperscore*7/10;

if(90

stu[i].count=stu[i].cousecount;

if(80

stu[i].count=stu[i].cousecount*8/10;

if(70

stu[i].count=stu[i].cousecount*3/4;

if(60<=stu[i].sumscore&&stu[i].sumscore<=70)

stu[i].count=stu[i].cousecount*3/5;

if(stu[i].sumscore<60)

stu[i].count=0;

fprintf(fp,"%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[i].num ,stu[i].cousenum,stu[i] .cousename,stu[i].cousecount,stu[i].comscore,stu[i].expscore,stu[i].paperscore,stu[i].sumscore,stu[i].count);

}

fclose(fp);

printf("创建成功!!\n\n");

}

/* 定义显示信息管理系统的函数*/

void mydisplay()

{ int i=0;

int n=0;

struct student temp;

FILE *fp;

fp=fopen("e:\\源程序2\\b.txt","r");

if(fp==NULL)

{

printf("\n 打开文件失败!\n");

return;

}

printf("\n学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分\n");

while(feof(fp)==0)

{

fscanf(fp,"%s%s%s%f%f%d%f%f%f\n",&stu[i].num ,&stu[i].cousenum,&stu[i].cousename,&stu[i].cous ecount,&stu[i].comscore,&stu[i].expscore,&stu[i].paperscore,&stu[i].sumscore,&stu[i].count);

printf("%-4s %-7s %-12s%-5.0f %-8.2f %-5d %-8.2f %-8.2f %-8.2f\n",stu[i].num ,stu[i].co

-

usenum,stu[i].cousename,stu[i].cousecount,stu[i].comscore,stu[i].expscore,stu[i].paperscore,stu[i].sumscore,st u[i].count);

n++;

}

if(n==0)

printf("\n 文件中无记录!\n");

else

printf("\n 文件中共有%d个记录!\n",n);

fclose(fp);

}

/* 定义查询信息的函数*/

void mysearch()

{

char c;

FILE *fp;

fp=fopen("e:\\源程序2\\a.txt","r");

if(fp==NULL)

{

printf("\n 打开文件失败!\n");

return;

}

printf("\n 查询基本信息(b),还是查询成绩(r)?");

c=getch();

if(c=='b'||c=='B')

mysearchbase(); /* 查询基本信息*/

if(c=='r'||c=='R')

mysearchscore(); /* 查询成绩*/

if(c!='b'&&c!='B'&&c!='r'&&c!='R')

printf("\n 非法字符!\n");

fclose(fp);

}

/* 定义查询信息管理系统的函数(基本情况)*/

void mysearchbase()

{

char c;

FILE *fp;

-

本文来源:https://www.bwwdw.com/article/1gxl.html

Top