南邮学生基本信息管理系统程序设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计报告
( 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.5 mysearchbase(……)函数的流程图
图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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#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<n;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<n;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].sumscore&&stu[i].sumscore<=100)
stu[i].count=stu[i].cousecount;
if(80<stu[i].sumscore&&stu[i].sumscore<=90)
stu[i].count=stu[i].cousecount*8/10;
if(70<stu[i].sumscore<=80)
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;
fp=fopen("e:\\源程序2\\a.txt","r");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
printf("\n 按学号查询(h),按姓名查询(m),还是按宿舍查询(d)?");
c=getch();
if(c=='h'||c=='H')
sch_num(fp); /* 按学号查询*/
else if(c=='m'||c=='M')
sch_name(fp); /* 按姓名查询*/
else
{
if(c=='d'||c=='D')
sch_dom(fp); /* 按宿舍查询*/
else
printf("\n 非法字符!\n");
}
fclose(fp);
}
/* 定义按学号查询信息管理系统的函数(基本情况)*/
void sch_num(FILE *fp)
{
int flag=0,n=0;
char tempnum[10];
struct student temp;
FILE *fp1;
fp1=fopen("e:\\源程序2\\a.txt","r");
printf("\n 请输入要查询的学号:");
gets(tempnum);
while(feof(fp)==0)
{
fscanf(fp,"%10s%25s%5s%8d%15s\n",&temp.num,&,&temp.sex,&temp.dom,&temp.tel);
if(strcmp(tempnum,temp.num)==0)
{
if(flag==0)
printf(" 学号姓名性别宿舍电话号码\n");
printf("%10s,%18s,%8s,%12d,%13s\n",temp.num,,temp.sex,temp.dom,temp.tel);
flag=1;
n++;
}
}
if(n==0)
printf("\n 文件中无记录!\n");
else
{if(flag==0)
printf("\n 文件中无此人!\n");
}
fclose(fp1);
}
/* 定义按姓名查询信息管理系统的函数(基本情况)*/
void sch_name(FILE *fp)
{
int flag=0,n=0;
char tempname[10];
struct student temp;
FILE *fp1;
fp1=fopen("e:\\源程序2\\a.txt","r");
printf("\n 请输入要查询记录的姓名:");
gets(tempname);
while(feof(fp)==0)
{
fscanf(fp,"%10s%25s%5s%8d%15s\n",&temp.num,&,&temp.sex,&temp.dom,&temp.tel);
if(strcmp(tempname,)==0)
{
if(flag==0)
printf(" 学号姓名性别宿舍电话号码\n");
printf("%10s,%18s,%8s,%12d,%13s\n",temp.num,,temp.sex,temp.dom,temp.tel);
flag=1;
}
n++;
}
if(n==0)
printf("\n 文件中无记录!\n");
{if(flag==0)
printf("\n 文件中无此人!\n");
}
fclose(fp1);
}
/* 定义按宿舍查询信息管理系统的函数(基本情况)*/
void sch_dom(FILE *fp)
{
int flag=0,n=0;
int i;
int tempdom;
FILE *fp1;
fp1=fopen("e:\\源程序2\\a.txt","r");
printf("\n 请输入要查询记录的宿舍:");
scanf("%d",&tempdom);
printf("\n");
for(i=0;i<4;i++)
{ while(feof(fp)==0)
{ fscanf(fp,"%10s%25s%5s%8d%15s\n",stu[i].num,stu[i].name,stu[i].sex,&stu[i].dom,stu[i].tel);
if(tempdom==stu[i].dom)
{
if(flag==0)
printf(" 学号姓名性别宿舍电话号码\n");
printf("%10s,%18s,%8s,%12d,%13s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].dom,stu[i].tel);
flag=1;
n++;
}
}
}
if(n==0)
printf("\n 文件中无记录!\n");
else
printf("\n 此宿舍有%d人!\n",n);
fclose(fp1);
}
/*定义查询信息管理系统的函数(成绩查询)*/
void mysearchscore()
{
FILE *fp,*f;
f=fopen("e:\\源程序2\\a.txt","r");
fp=fopen("e:\\源程序2\\b.txt","r");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
schscore_num(fp,f);
/* printf("\n 请输入要查询的学号");
c=getch();*/
fclose(f);
fclose(fp);
}
/* 定义按学号查询信息管理系统的函数(成绩查询)*/
void schscore_num(FILE *fp,FILE *f)
{
int n=0;
float flag=0;
char tempnum[10];
struct student temp;
printf("\n 请输入要查询的学号:");
gets(tempnum);
while(feof(f)==0){
fscanf(f,"%10s%25s%5s%8d%15s\n",&temp.num,&,&temp.sex,&temp.dom,&temp.tel);
if(strcmp(tempnum,temp.num)==0)
{
printf(" 学号姓名\n");
printf(" %10s %25s\n",temp.num,);
}
}
printf("课程编号课程名称综合成绩实得学分\n");
while(feof(fp)==0)
{
fscanf(fp,"%s%s%s%f%f%d%f%f%f\n",&temp.num,&temp.cousenum,&temp.cousename,&temp.cousec ount,&score,&temp.expscore,&temp.paperscore,&temp.sumscore,&temp.count);
if(strcmp(tempnum,temp.num)==0)
{
printf("%s%30s%20.2f%17.2f\n",temp.cousenum,temp.cousename,temp.sumscore,temp.count);
flag+=temp.count;
n++;
}
}
if(n==0)
printf("\n 文件中无记录!\n");
else
{if(flag==0)
printf("\n 文件中无此人!\n");
else
{printf("共修学科:");
printf("%d",n);
printf("\n实得总学分为:");
printf("%7.2f",flag);
printf("\n");
}
}
}
/* 定义删除信息管理系统的函数*/
void mydelete()
{
FILE *fp,*f;
f=fopen("e:\\源程序2\\b.txt","r");
fp=fopen("e:\\源程序2\\a.txt","r+");
if(fp==NULL||f==NULL)
printf("\n 打开文件失败!\n");
return;
}
del_num(fp,f);
}
/* 定义按学号删除信息管理系统的函数*/
void del_num(FILE *fp,FILE *f)
{ int t;
FILE *fp1;
char tempnum[10];
struct student temp;
printf("\n 请输入要删除记录的学号:");
gets(tempnum);
fp1=fopen("e:\\源程序2\\c.txt","w+");
//保存a.TXT删除后的数据
while(feof(fp)==0)
{
fscanf(fp,"%s%25s%5s%8d%15s\n",&temp.num,&,&temp.sex,&temp.dom,&temp.tel);
if(strcmp(tempnum,temp.num)==0) continue;
fprintf(fp1,"%5s %20s %5s %8d%15s\n",&temp.num,&,&temp.sex,&temp.dom,&temp.tel);
}
//重新删除后的数据写回a.TXT
remove("e:\\源程序2\\a.txt");
fp=fopen("e:\\源程序2\\a.txt","w+");
rewind(fp1);
t=getc(fp1);
while(!feof(fp1))
{
putc(t,fp);
t=getc(fp1);
}
fclose(fp);
//保存b.TXT删除后的数据
fp1=fopen("e:\\源程序2\\c.txt","w+");
while(feof(f)==0)
{
&score,&temp.expscore,&temp.paperscore,&temp.sumscore,&temp.count);
if(strcmp(tempnum,temp.num)==0) continue;
fprintf(fp1,"%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",temp.num ,temp.cousenum,temp.cou sename,temp.cousecount,score,temp.expscore,temp.paperscore,temp.sumscore,temp.count);
}
//重新删除后的数据写回b.TXT
f=fopen("e:\\源程序2\\b.txt","w+");
rewind(fp1);
t=getc(fp1);
while(!feof(fp1))
{
putc(t,f);
t=getc(fp1);
}
fclose(f);
fclose(fp1);
remove("e:\\源程序2\\c.txt");
}
/* 定义排序信息管理系统的函数*/
void mysort()
{
char c;
FILE *fp;
fp=fopen("e:\\源程序2\\b.txt","a+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
fclose(fp);
printf("\n 按实得学分排序(c),还是按综合成绩排序(s)?");
c=getch();
if(c=='s'||c=='S')
sort_sumscore(); /* 按综合成绩排序*/
else if(c=='c'||c=='C')
sort_count(); /* 按实得学分排序*/
printf("\n 非法字符!\n");
}
/* 定义按综合成绩排序学生管理系统的函数*/
void sort_sumscore()
{ char c;
int i=0;
int n=0;
int j,k;
FILE *fp;
float a[12];
fp=fopen("e:\\源程序2\\b.txt","r");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
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 ].cousecount,&stu[i].comscore,&stu[i].expscore,&stu[i].paperscore,&stu[i].sumscore,&stu[i].count);
a[i]=stu[i].sumscore;
i++;
}
//插入排序
for( k=1;k<12;k++)
for( j=k;(j>0)&&(a[j]<a[j-1]);j--)
{float d=a[j];
a[j]=a[j-1];
a[j-1]=d;
}
printf("\n 按升序(u),还是按降序(d)?\n\n");
c=getch();
if(c=='u'||c=='U') /* 按综合成绩的升序排列*/
for(j=0;j<12;j++)
{
for(k=0;k<12;k++)
if(a[j]==stu[k].sumscore)
{
printf("%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[k].num ,stu[k].cousenum,stu[k].couse name,stu[k].cousecount,stu[k].comscore,stu[k].expscore,stu[k].paperscore,stu[k].sumscore,stu[k].count);
break;
}
else if(c=='d'||c=='d')
for( j=11;j>=0;j--)
{
for(k=0;k<12;k++)
if(a[j]==stu[k].sumscore)
{
printf("%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[k].num ,stu[k].cousenum,stu[k].c ousename,stu[k].cousecount,stu[k].comscore,stu[k].expscore,stu[k].paperscore,stu[k].sumscore,stu[k].count);
break;
}
}
else
printf("\n 错误字符!\n");
fclose(fp);
}
/* 定义按实得学分排序学生管理系统的函数*/
void sort_count()
{
char c;
int i=0;
int n=0;
int j,k;
FILE *fp;
float a[12];
float b[12];
fp=fopen("e:\\源程序2\\b.txt","r");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
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 ].cousecount,&stu[i].comscore,&stu[i].expscore,&stu[i].paperscore,&stu[i].sumscore,&stu[i].count);
a[i]=stu[i].count;
i++;
}
for( k=1;k<12;k++)
for( j=k;(j>0)&&(a[j]<a[j-1]);j--)
{float d=a[j];
a[j]=a[j-1];
a[j-1]=d;
}
for(k=0;k<12;k++)
b[k]=stu[k].count;
printf("\n 按升序(u),还是按降序(d)?\n\n");
c=getch();
if(c=='u'||c=='U') /* 按综合成绩的升序排列*/
{
for(j=0;j<12;j++)
{
for(k=0;k<12;k++)
if(a[j]==stu[k].count)
{
printf("%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[k].num ,stu[k].cousenum,stu[k].couse name,stu[k].cousecount,stu[k].comscore,stu[k].expscore,stu[k].paperscore,stu[k].sumscore,stu[k].count);
stu[k].count=0;
break;
}
}
for(k=0;k<12;k++)stu[k].count=b[k];
}
else if(c=='d'||c=='d')
{
for( j=11;j>=0;j--)
{
for(k=0;k<12;k++)
if(a[j]==stu[k].count)
{
printf("%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[k].num ,stu[k].cousenum,stu[k].c ousename,stu[k].cousecount,stu[k].comscore,stu[k].expscore,stu[k].paperscore,stu[k].sumscore,stu[k].count);
stu[k].count=0;
break;
}
}
for(k=0;k<12;k++)stu[k].count=b[k];
}
else{
printf("\n 错误字符!\n");
}
fclose(fp);
}
五、测试数据及其结果分析
测试截图请自行完成
结果分析如下。
(1)在输入菜单选项时如果输入的内容不是0-5之间的数字,系统将继续执行等待下次正确的输入(2)在需要输入所须查找的名称处如输入名称不在系统中,系统提示错误并返回主菜单。
六、调试过程中的问题
(1)查询时输入数字三,没有反应,直接返回主菜单,多次试验后发现meun函数中调用查询函数时代码错误,没有加括号,导致运行时直接跳过这一段代码。
(2)编写创建学生信息代码时,把题目理解错误,题目要求将数据录入b.txt文件,而我们直接是在文件中读取数据。
(3)查询时总是在查询后显示查无此人,发现代码关于条件选择语句的大括号没打,导致有一段多余的代码总是会反复出现。
(4)在显示功能调试的时候,文字不能与数据不能够对齐。
解决方法:控制数据的长度,并用\t和空格调整间距。
(5)删除功能是总是不能运行,发现打开文件的代码中文件名与所建文件的名称不同,不能打开。
(6)查询功能时,不知是否是键盘问题,总是会在一个步骤处会跳过。
七、课程设计总结
本次课程设计主要利用了结构体数组、结构体指针以及文件,通过多次调用不同的函数实现创建文件、查询、删除学生信息模块和排序得基本功能。
本次课程设计主要是通过建立不同得模块,在不同的条件下主函数调用不同的函数来实现各种不同的功能,各个模块的函数比较容易,各个函数的接口是否处能理好,是本次课程设计能否成功的关键。
通过合理处理各函数得接口,使之能结合为一个完整的具有多功能的程序,从而顺利完成本次课程设计。
组长:
这次的程序编写对于初学者的我们来说是个不小的负担,加上c语言是上个学期所学,很多知识已经记得不牢固了,导致编写代码时频频出现错误,比如分号,括号之类的忘记打,造成程序运行错误。
一开始,我对于数据输入功能的理解错误,题目要求我们在程序中录入程序,而非事先打好文件,在程序中读取文件,这是理解错误。
调试是个很繁琐的工序,编写的时候还不觉得,调试的时候,语法的错误便一一呈现出来,有的错误还看不懂,所以上百度查了以后才会调试。
语法的调试还算简单,逻辑的错误更不容易解决,在和组员讨论并寻求的其他同学的帮助后,终于把程序基本完成了。
组员1:
经过这次团体编程上机课,我有种书到用时方很少的感觉,单单编写一个排序功能的代码就弄了好久还不得要领,经常遇到编译不通过,改来改去还有几十个错误的情况,最后还调试了好久,这过程中我问了很多同学,上网找了很多资料来解决问题的。
我真心感觉编程是一件很严谨的事,任何一个小错误都可能导致编译不通过,同时对人的逻辑性要求很高。
这次编程的经历让我得到了许多锻炼,锻炼了我的耐心,培养了我做事细心的品格,增强了我沟通能力,总之使我受益匪浅。
组员2:
在实验的过程中我们遇到了许多的困难,比如在语句的规范、字符的类型、语句的逻辑顺序等方面我们都遇到了问题。
这些问题看似很细小但是在一个大的程序里很难发现,一个小小的错误就会让整个程序无法运行。
在老师和同学的帮助下我们解决了这些问题成功的让程序运行了起来。
但是最开始对题目理解的错误让我们走了不少的弯路。
程序里的B文件应该是通过系统输入然后显示的,而我们理解成为了与A文件一样只是显示没有键入。
在修改键入的过程中参考了网络上的资料最终得以完成。