程序写的很烂,但希望对你有用!!!
做了点小修改(添加学生先校验是否已存在,另外实现了学生信息修改及删除功能),链接点这里http://blog.csdn.net/linan_nwu/article/details/7883882
/*
**学生成绩管理系统
**俺就是俗人一个,不过看到在博客中贴上我敲的这些小程序,访问人数有增加哦^-^,我挺开心的。
**当然也是本着这个“小程序”的初衷,常见的,经典的,所以,“学生成绩管理系统”光荣入选了。
**另外我的code越敲越有feel了,加油!!!我相信敲完1000行代码,10000行代码后或多或少都会有收获。
**预告一下,接下来会推出链表,指针系列,会整理专门的文章,主要是敲程序(号码簿管理,停车库等,都很耳熟吧,嘻嘻^-^)。
**当然这些知识点现在的代码中就要用到,但知识就是要使用才能掌握,用完后再回过头看看理论,才可以巩固,正是应了老古人的“熟能生巧”。
*/
/*程序功能说明:
**1.学生信息的添加,删除;
**==>删除的功能没有实现,因为这个程序是把信息保存在文件中的,对文件的操作我还不熟,怎么从文件中删除信息呢?
**==>为了保证这个程序是在一天内完成的,今天就先到这里吧,过几天回头再改
**2.学生成绩的统计(总成绩,平均分);
**3.信息的查询(按学号,姓名,成绩范围)==>按'成绩范围'查询和按'学号','姓名'方法差不多,所以这里就不写了;
*/
#include"StuManageSys.h"
//用"a+"权限来打开“学生信息”记录表
//这里我这么写是为了以“追加”的方式(即不覆盖之前的数据信息),把用户添加的学生添加到“学生信息”记录表中
void aOpenFile()
{
fp=fopen(fileName,"a+");//fileName定义为全局变量,在整个程序运行过程中,保存着上次用户创建或正确打开文件的名称
if(NULL==fp)
{
printf("\n文件以'a+'模式打开失败\n");
}
}
//用"r"权限来打开“学生信息”记录表
void rOpenFile()
{
fp=fopen(fileName,"r");
if(NULL==fp)
{
printf("\n文件以'r'模式打开失败\n");
}
}
//系统初始化
void initSys()
{
bool flag = true;
printf("请输入学生信息记录表的名称(filename.txt):");
scanf("%s",fileName);
//printf("用户输入的信息记录表名称是:%s",fileName);
//fopen 函数定义: FILE *fopen( const char *fname, const char *mode );
/*功能说明: fopen()函数打开由fname(文件名)指定的文件, 并返回一个关联该文件的流.
**如果发生错误, fopen()返回NULL. mode(方式)是用于决定文件的用途(例如 用于输入,输出,等等)
**Point 1:是"r",不是'',我一开始在这里犯错啦~~
**Point 2:和fclose配合使用哈^^
*/
fp=fopen(fileName,"r");
if(NULL==fp){
printf("\n文件打开失败\n");
printf("1.文件名输入有误,重新输入;\n");
printf("2.以该文件名创建新文件;\n");
while(flag)
{
int choose = 0;
choose = getchar();
//printf("choose = %d",choose);
switch(choose)
{
case 10:
break;
case 49:
printf("请输入学生信息记录表的名称(filename.txt):");
scanf("%s",fileName);
fp = fopen(fileName,"r");
if(NULL!=fp)
flag = false;
else
{
printf("\n文件打开失败\n");
printf("1.文件名输入有误,重新输入;\n");
printf("2.以该文件名创建新文件;\n");
}
break;
case 50:
fp = fopen(fileName,"a+");
flag = false;
break;
default:
printf("输入有误,请键入1或2重新选择\n");
break;
}//end of switch
}//end of while
}
else
{
printf("文件打开成功!\n");
}
}
//将学生信息写入文件
void saveStu(stu *stu)
{
fprintf(fp,"%s\n",stu->stuName);
fprintf(fp,"%d\n",stu->stuID);
for(int i=0;istuScore[i]);
fprintf(fp,"%d\n",stu->totalScore);
fprintf(fp,"%d\n",stu->aveScore);
}
int addStu()
{
int num = 0;
bool flag = true;
while(flag)
{
printf("\n请输入要添加的学生人数:\n");
scanf("%d",&num);
if(num <= 0)
printf("输入人数<0,无效,请重新输入\n");
else if(num > 50)
printf("输入人数>50,为保证有效,建议分批次录入学生信息\n");
else
flag = false;
}
printf("用户想要添加%d个学生",num);
stu *p = (stu *)malloc(sizeof(stu));
aOpenFile();
for(int i=0;istuName);
printf("\n学号:");
scanf("%d",&(p->stuID));
p->totalScore = 0;//help to init it;
for(int j=0;jstuScore[j]));
p->totalScore += p->stuScore[j];
}
p->aveScore = p->totalScore/STU_SCORE_NUM;
saveStu(p);
}
fclose(fp);
return 0;
}
void printStuInfo(stu *stu)
{
printf("\n姓名:%s",stu->stuName);
printf("\n学号:%d",stu->stuID);
for(int i=0;istuScore[i]);
}
printf("\n总分数是%d",stu->totalScore);
printf("\n平均分是%d\n",stu->aveScore);
}
int getStuInfo(stu *p)
{
char buf[STU_SIZE_BUFF];
if(fscanf(fp,"%s",buf)!=1)
return 0;
strncpy(p->stuName,buf,STU_NAME_LEN);
fscanf(fp,"%d",&(p->stuID));
p->totalScore = 0;//Help to init it;
for(int i=0;istuScore[i]));
}
fscanf(fp,"%d",&(p->totalScore));
fscanf(fp,"%d",&(p->aveScore));
return 1;
}
void printAllStuInfo(stu *p)
{
rOpenFile();
printf("\n系统中所有学生信息如下:");
while(getStuInfo(p)!=0)
{
printStuInfo(p);
}
fclose(fp);
}
int getAllStuNum(stu *p)
{
int num =0;
while(getStuInfo(p)!=0)
{
num++;
}
return num;
}
int deleteStu()
{
return 0;
}
bool getStuByName(stu *p,char *name)
{
bool flag = false;
rOpenFile();
while(getStuInfo(p)!=0)
{
//printf("\nCheck Loop times,p->stuName=%s,name=%s",p->stuName,name);
if(!strcmp(p->stuName,name))
{
//printf("\np->stuName=%s,name=%s",p->stuName,name);
printf("\n查询到学生信息如下:");
printStuInfo(p);
flag = true;
}
}
fclose(fp);
return flag;
}
bool getStuByID(stu *p,int id)
{
bool flag = false;
rOpenFile();
while(getStuInfo(p)!=0)
{
//printf("\nCheck Loop times,p->stuID=%d, id=%d",p->stuID,id);
if(p->stuID==id)
{
//printf("\np->stuID=%d,id=%d",p->stuID,id);
printf("\n查询到学生信息如下:");
printStuInfo(p);
flag = true;
}
}
fclose(fp);
return flag;
}
void mainMenu()
{
stu p;
int choose;
bool flag = true,result=false;
while(flag)
{
printf("\n\t\t****************************\n");
printf("\t\t“学生成绩管理系统”功能列表:\n");
printf("\t\t1.添加学生;\n");
printf("\t\t2.按学生姓名查找;\n");
printf("\t\t3.按学号查询;\n");
printf("\t\t4.打印所有学生成绩信息;\n");
printf("\t\t5.退出;\n");
printf("\t\t****************************\n");
printf("\t\t请键入功能编号:\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
addStu();
break;
case 2:
char name[STU_NAME_LEN];
printf("\n请输入学生姓名:\n");
scanf("%s",name);
result = getStuByName(&p,name);
if(!result)
printf("\n未查询到该学生信息\n");
break;
case 3:
int id;
printf("\n请输入学生学号:\n");
scanf("%d",&id);
result = getStuByID(&p,id);
if(!result)
printf("\n未查询到该学生信息\n");
break;
case 4:
printAllStuInfo(&p);
break;
case 5:
exit(0);
flag = false;
break;
default:
printf("\n您的输入有误,请重新输入\n");
break;
}
}
}
int main(void)
{
initSys();
mainMenu();
if(NULL==fp)
fclose(fp);
return 0;
}
#include
#include
#include
#define STU_NAME_LEN 20
#define STU_SCORE_NUM 3
#define STU_INT_LEN 4
#define STU_SIZE_BUFF 44 //这个Buffer的大小需要和sizeof(stu)相同,用来从文件中读取学生信息,这里我处理的不好,有better method 吗?
//用结构体定义学生信息(姓名,学号,各门学科的成绩)
typedef struct student{
char stuName[STU_NAME_LEN];
int stuID;
int stuScore[STU_SCORE_NUM];
int totalScore;
int aveScore;
}stu;
//FILE *stufilept;
FILE *fp;
char fileName[20];
void aOpenFile();//用"a+"权限来打开“学生信息”记录表
void rOpenFile();//用"r"权限来打开“学生信息”记录表
void initSys();//系统初始化
void saveStu(stu *stu);//将学生信息写入文件
void printStuInfo(stu *stu);
void printAllStuInfo(stu *p);
int getStuInfo(stu *p);
int getAllStuNum(stu *p);
int addStu();
int deleteStu();
bool getStuByName(stu *p,char *name);
bool getStuByID(stu *p,int id);