资源描述
C语言程序设计报告
目录
———学生成绩管理程系
题目要求 ·············· 3
需求分析 ·············· 3
总体设计 ·············· 4
详细设计 ·············· 4
上机操作 ·············· 11
源程序 ·············· 13
总结 ·············· 19
学生成绩管理程序
一. 题目要求
1. 问题描述:
对在校学生几门课程的考试成绩进行统一管理.每个学生记录包括学号,姓名,年龄,数学,英语,物理成绩,默认以学号为序存放.
2. 要求:
(1):一个文件按以班为单位存储学生记录.
(2)将允许的操作分为四种,以A,B ,C,D,E,F为标志:
A:插入一个学生记录;
B:修改学生记录;
C:删除一个学生记录;
D:查找一个学生记录;
E:浏览学生成绩:
F:退出
3. 计算学生的总成绩.
4. 按学号排序输出全班学生成绩表.
二. 需求分析
根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.
三. 总体设计
根据上面的需求分析,可以将这个系统分为以下模块:输入模块,修改模块,删除模块,查找模块,显示模块.
学生成绩管理系统
数据输入
数据显示
数据修改
数据删除
数据查找
四. 详细设计
1. 主函数:
主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择.
流程图:
显示一系列功能模块
N
输入n,判断n是否是A--F
Y
根据n的值调用各功能模块函数
[程序]:
main()
{
while(1)
{
clrscr();
printf("*************welcome to use student manage******************\n");
printf("*************************menu********************************\n");
printf("* ========================================================= * \n");
printf("* A>shuru B>xiugai * \n");
printf("* C>shanchu D>chazhao * \n");
printf("*E>xianshi F>exit * \n");
printf("* * \n");
printf("* --------------------------------------------------------- * \n");
printf(" Please input which you want(A-F):");
ch=getch();
switch(ch)
{
case 'A':shuru();break;
case 'B':xiugai(); break;
case 'C':shanchu(); break;
case 'D':chazhao(); break;
case 'E':xianshi(); break;
case 'F':exit(0);
default: continue;
}
}
}
2. 输入模块:
[分析]:
单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数,采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.
如果要存放若干学生信息就用结构体数组:
struct score /*结构体score*/
{
int mingci;
char xuehao[8];
char mingzi[20];
char nianling[3];
float score[6];
}data,info[1000];
int i,j,k=0;
char temp[20],ch;
FILE *fp,*fp1;
[程序]:
void shuru()
{
if((fp=fopen("s_score.txt","ab+"))==NULL) /*以读写方式打开名为s_score的文件*/
{
printf("cannot open this file.\n");
getch();exit(0);
}
for(i=0;i<=1000;i++)
{
printf("\nPlease shuru xuehao:");
gets(data.xuehao);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("please shuru nianling:");
gets(data.nianling);
printf("Please shuru shuxue score:");
gets(temp);data.score[0]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[1]=atof(temp);
printf("Please shuru wuli score:");
gets(temp);data.score[2]=atof(temp);
data.score[3]=data.score[0]+data.score[1]+data.score[2];
fwrite(&data,sizeof(data),1,fp);
printf("another?y/n");
ch=getch();
if(ch=='n'||ch=='N')
break;
} fclose(fp);
}
3. 修改模块:
[分析]:用户输入要修改学生的学号,根据学生的学号查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息.
[流程图]:
输入要修改的学号
找到?
Y N
提示没有找到
显示记录,调用修改函数
返回主菜单
继续?
Y
N
[程序]:
void xiugai()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*检查是否出错*/
{
printf("Cannot open this file.\n");
exit(0);
}
printf("\nPLease shuru xiugai xuehao:");
scanf("%d",&i); getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("Please shuru shuxue score:");
gets(temp);data.score[0]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[1]=atof(temp);
printf("Please input wuli score:");
gets(temp);data.score[2]=atof(temp);
data.score[3]=data.score[0]+data.score[1]+data.score[2];
} fwrite(&data,sizeof(data),1,fp1);
}
fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/
fseek(fp1,0L,0);
while((fread(&data,sizeof(data),1,fp1))==1)
{
fwrite(&data,sizeof(data),1,fp);
}
fclose(fp);
fclose(fp1);
}
4. 删除模块:
[分析]:
该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并删除.
[流程图]:
输入要删除的学号
找到?
Y N
提示没有找到
显示记录,调用删除函数
返回主菜单
继续?
Y
N
[程序]:
void shanchu()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL)
{
printf("\nopen score.txt was failed!");
getch();
exit(0);
}
printf("\nPlease input ID which you want to del:");
scanf("%d",&i);getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("Anykey will delet it.\n");
getch();
continue;
}
fwrite(&data,sizeof(data),1,fp1);
}
fclose(fp);
fclose(fp1);
remove("s_score.txt");
rename("temp.txt","s_score.txt");
printf("Data delet was succesful!\n");
printf("Anykey will return to main.");
getch();
}
5. 查找模块:
[需求分析]:
该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后,显示相应的学生信息.
[流程图]:
输入学生学号
返回主菜单
询问是否继续
提示没有找到
显示找到的记录
是否找到学生记录
Y N
N
Y
[程序]:
void chazhao()
{
if((fp=fopen("s_score.txt","rb"))==NULL)
{
printf("\nCannot open this file.\n");
exit(0);
}
printf("\nPLease shuru xuehao chakan:");
scanf("%d",&i);
while(fread(&data,sizeof(data),1,fp)==1)
{
j=atoi(data.xuehao);
if(i==j)
{
printf("xuehao:%s mingzi:%s\n nianling:%s\n shuxue:%f\n yingyu:%f\n wuli:%f\n zongfen:%f\n",data.xuehao,data.mingzi,data.nianling,data.score[0],data.score[1],data.score[2],data.score[3]);
}getch();
}
}
6. 显示模块:
[需求分析]:
该模块的功能是显示所有学生记录信息.
[程序]:
void xianshi()
{
float s;int n;
if((fp=fopen("s_score.txt","rb+"))==NULL) /*以读写方式打开名为s_score的文件*/
{
printf("Cannot reading this file.\n"); /*先检查打开的操作是否出错*/
exit(0);
}
for(i=0;i<=1000;i++)
{
if((fread(&info[i],sizeof(info[i]),1,fp))!=1) /*检查是否出错*/
break; /*指针 要读写字节数 要读写size字节的数据项 文件型指针*/
}
printf("\nxuehao mingzi nianling shuxue yingyu wuli zongfen\n");
for(j=0,k=1;j<i;j++,k++)
{
info[j].mingci=k;
printf("%6s %8s %3s %3.1f %3.1f %3.1f %3.1f \n",info[j].xuehao,info[j].mingzi,info[j].nianling,info[j].score[0],info[j].score[1],info[j].score[2],info[j].score[3]);
}
getch();
fclose(fp);
}
五. 上机操作
下面是各个模块的界面图:
(1): 主菜单函数:
(2): 输入模块:
(3): 显示模块:(包含了按学号排序功能)
(4): 删除模块:
(5): 查找模块:
(6): 修改模块:
六. 源程序
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
struct score /*结构体score*/
{
int mingci;
char xuehao[8];
char mingzi[20];
char nianling[3];
float score[6];
}data,info[1000];
int i,j,k=0;
char temp[20],ch;
FILE *fp,*fp1;
void shuru()
{
if((fp=fopen("s_score.txt","ab+"))==NULL) /*以读写方式打开名为s_score的文件*/
{
printf("cannot open this file.\n");
getch();exit(0);
}
for(i=0;i<=1000;i++)
{
printf("\nPlease shuru xuehao:");
gets(data.xuehao);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("please shuru nianling:");
gets(data.nianling);
printf("Please shuru shuxue score:");
gets(temp);data.score[0]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[1]=atof(temp);
printf("Please shuru wuli score:");
gets(temp);data.score[2]=atof(temp);
data.score[3]=data.score[0]+data.score[1]+data.score[2];
fwrite(&data,sizeof(data),1,fp);
printf("another?y/n");
ch=getch();
if(ch=='n'||ch=='N')
break;
} fclose(fp); /*读文件结束*/
}
void xianshi()
{
float s;int n;
if((fp=fopen("s_score.txt","rb+"))==NULL) /*以读写方式打开名为s_score的文件*/
{
printf("Cannot reading this file.\n"); /*先检查打开的操作是否出错*/
exit(0);
}
for(i=0;i<=1000;i++)
{
if((fread(&info[i],sizeof(info[i]),1,fp))!=1) /*检查是否出错*/
break; /*指针 要读写字节数 要读写size字节的数据项 文件型指针*/
}
printf("\nxuehao mingzi nianling shuxue yingyu wuli zongfen\n");
for(j=0,k=1;j<i;j++,k++)
{
info[j].mingci=k;
printf("%6s %8s %3s %3.1f %3.1f %3.1f %3.1f \n",info[j].xuehao,info[j].mingzi,info[j].nianling,info[j].score[0],info[j].score[1],info[j].score[2],info[j].score[3]);
}
getch();
fclose(fp);
}
void xiugai()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*检查是否出错*/
{
printf("Cannot open this file.\n");
exit(0);
}
printf("\nPLease shuru xiugai xuehao:");
scanf("%d",&i); getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("Please shuru shuxue score:");
gets(temp);data.score[0]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[1]=atof(temp);
printf("Please input wuli score:");
gets(temp);data.score[2]=atof(temp);
data.score[3]=data.score[0]+data.score[1]+data.score[2];
} fwrite(&data,sizeof(data),1,fp1);
}
fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/
fseek(fp1,0L,0);
while((fread(&data,sizeof(data),1,fp1))==1)
{
fwrite(&data,sizeof(data),1,fp);
}
fclose(fp);
fclose(fp1);
}
void chazhao()
{
if((fp=fopen("s_score.txt","rb"))==NULL)
{
printf("\nCannot open this file.\n");
exit(0);
}
printf("\nPLease shuru xuehao chakan:");
scanf("%d",&i);
while(fread(&data,sizeof(data),1,fp)==1)
{
j=atoi(data.xuehao);
if(i==j)
{
printf("xuehao:%s mingzi:%s\n nianling:%s\n shuxue:%f\n yingyu:%f\n wuli:%f\n zongfen:%f\n",data.xuehao,data.mingzi,data.nianling,data.score[0],data.score[1],data.score[2],data.score[3]);
}getch();
}
}
void shanchu()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL)
{
printf("\nopen score.txt was failed!");
getch();
exit(0);
}
printf("\nPlease input ID which you want to del:");
scanf("%d",&i);getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("Anykey will delet it.\n");
getch();
continue;
}
fwrite(&data,sizeof(data),1,fp1);
}
fclose(fp);
fclose(fp1);
remove("s_score.txt");
rename("temp.txt","s_score.txt");
printf("Data delet was succesful!\n");
printf("Anykey will return to main.");
getch();
}
main()
{
while(1)
{
clrscr();
printf("*************welcome to use student manage******************\n");
printf("*************************menu********************************\n");
printf("* ========================================================= * \n");
printf("* A>shuru B>xiugai * \n");
printf("* C>shanchu D>chazhao * \n");
printf("*E>xianshi F>exit * \n");
printf("* * \n");
printf("* --------------------------------------------------------- * \n");
printf(" Please input which you want(A-F):");
ch=getch();
switch(ch)
{
case 'A':shuru();break;
case 'B':xiugai(); break;
case 'C':shanchu(); break;
case 'D':chazhao(); break;
case 'E':xianshi(); break;
case 'F':exit(0);
default: continue;
}
}
}
···············································································
☆ ⊙
18
展开阅读全文