要求使用链表、文件。
输入一个班级的学生的基本信息(包括学号,姓名,性别,5门课程成绩)。
按姓名或者学号查找、增加、修改、删除和保存各个学生的信息。
计算每个学生各门功课总分和平均分,按学号或总分排序输出每个学生的基本信息及总分、平均分和名次。
计算全班各门功课的平均分,显示每门课程中低于平均分的每一个学生的学号,姓名,性别,科目,成绩。
显示每门科目中,成绩在90分以上的学生信息,以及每门科目中不及格的学生信息。
用菜单进行管理
只有正确输入用户名密码才能使用此系统。
所有内容能够保存到文件中。下次进入系统是从文件中读取原有信息。
文件法和链表法。因为学生成绩统计需要用文件来储存我们的数据,用户名、密码以及学生成绩,所以我选择使用文件读取或输入有关信息。这样操作起来比较简单,而且逻辑性也比较强。在这里面我还用了些数组,来存放我们读出的数据,后面进行比较的时候也是比较方便的。链表法写起来虽然有点复杂,但是他的效率还是比较高的。
角色1:登陆
序号 |
功能描述 |
备注 |
1 |
登陆系统 |
|
2 |
登陆成功跳转界面 |
|
角色2:主菜单
序号 |
功能描述 |
备注 |
1 |
显示基本信息 |
|
2 |
查找学生信息 |
|
3 |
增加学生信息 |
|
4 |
修改学生信息 |
|
5 |
删除学生信息 |
|
6 |
学生信息排序 |
|
7 |
学生成绩处理 |
|
角色3:学生成绩处理
序号 |
功能描述 |
备注 |
1 |
低于平均分 |
|
2 |
高于90分 |
|
3 |
不及格 |
|
怎么把文件中的数据读取出来并使用
我第一步做的是登陆界面,这时我就需要使用一个文件把数据读取出来。在一开始的时候,自己对文件的掌握程度完全不够。于是就思考如何处理文件中的数据。先要输入自己的账号和密码,第二就是把输入的东西和文件里本有的数据进行比较,于是我就用了fscanf 这个函数,把文件里的数据读取出来,如果相同就登陆成功。
登陆界面已经可以成功操作了,而且对后面文件里数据的处理也会比较方便。
怎么将文件里的一串数据进行删除
我想开始想的实施用链表,后面在网上看到一些与数据结构有关的东西,建立、初始化、删除、插入等12个基本操作,但是他与我前面写的代码不太吻合。于是按照自己的方法想,后面觉得文件还是可以操作的,我们可以使用“w”打开只写文件,若文件存在则长度清为0,及文件内容和会消失,重新写一份新的文件。先把文件里的数据放入数组里,然后进行比较,若与需要删除的学生姓名或学号不同,则即将他写入文件,大功告成。
文件里一连串的数据能够删除了。
工程时间分为了2各部分,第一部分是对模块化的使用,让我们清楚的了解到使用模块化操作的简便性。在第一部分完成后,我们进行第二部分的工作,自己独立完成一个项目。我选择的是学生成绩统计管理,以应用教材所学的C语言知识为主,综合课本知识完成一个接近实际需要的应用。我觉得它比较适合我目前的情况。在开始这个项目后,我就在构思,我到底需要一个呈现一个怎样的界面,能够清晰明白地造作好系统。在处理这些问题前,我先是对文件的运用做一个基本的掌握,方便后面的使用。
在做这些东西的时候,一定要有自己的构思和安排,想好后一定要写出自己的工作分解和时间节点,那么就可以清晰的按照自己的思路高效率地走下去。我把自己的工作分成了三个部分,主界面、模块化的处理、数据处理。主界面包括登陆和主菜单,我先做的第一部就是登陆,我想它就类似于我们学校网站的学生登陆界面一样,后台需要有存放账户和密码的地方,我把账户和密码都放进一个文件里,然后读取出来,后面很多基本上也是这一个操作。登陆成功后也有一个提示界面,未成功也会有4次重新登陆。第二部分我就开始做显示学生基本信息、学生信息查找、学生信息增加、学生信息修改、学生信息删除这几个部分,学生信息查找有细划分为按姓名查找和按学号查找。第三部分呢,我就开始做数据的排序和处理,感觉到这里已经是非常轻松了。这个项目里我是根据自己要做的操作,模块化的方方式进行处理的,每个模块都写完后,再把它们结合在一起。等我写完所有的模块,总合最后的主函数也是很简单了。
我觉得里面比较麻烦的就是要设计自己的排版,工作量不算大,但就是考虑美观性,一点一点地去修改也是挺麻烦的,但是要做就一定要做的好看,让自己感官上比较舒服。我在构思如何书写自己的程序时,有时按照自己的逻辑发现可能这条路是走不通的,有的换一种方法去思考,在这个过程中,我也有和我的同学交流,有时发现与他们交流一些问题,自己会收获很多,而且,每个人争对同一个问题都有不同的解决方案,有时也会给自己一种茅塞顿开的感觉。
int login()//登陆
{
FILE *fp;
char name[10],password[10];
char usename[10],usepassword[10];
int num=1,flag=0;
system("mode con cols=60 lines=20");//改变界面大小
system ("color F9");//白底蓝字
printf("\n\n\n\n --------------学生成绩管理系统--------------\n\n\n\n");
printf(" 账号:");
printf("\n\n");
printf(" 密码:");
gotoxy(19,9);
scanf("%s",name);//输入账号
getchar();
gotoxy(19,11);
scanf("%s",password);//输入密码
getchar();
fp=fopen("user.txt","r");//只读的方式打开文件
while(fscanf(fp,"%s %s",usename,usepassword)!=EOF)//格式化的方式读出已有的账号和密码
{
if(strcmp(name,usename)==0&&strcmp(password,usepassword)==0)//对比
{
flag=1;//相同返回1
break;
}
}
if(flag==1)//相同返回1
{
return 1;
}
else//不同返回0
{
while(num<4)//循环共5次
{
printf("\n\n\n账号或密码错误!你还有%d次输入得机会。",(4-num));
num++;
Sleep(2000);
system("cls");
printf("\n\n\n\n --------------学生成绩管理系统--------------\n\n\n\n");
printf(" 账号:");
printf("\n\n");
printf(" 密码:");
gotoxy(19,9);scanf("%s",name);
getchar();
gotoxy(19,11);
scanf("%s",password);
getchar();
rewind(fp);
while(fscanf(fp,"%s %s",usename,usepassword)!=EOF)
{
if(strcmp(name,usename)==0&&strcmp(password,usepassword)==0)
{
flag=1;
break;
}
}
if(flag==1)
{
return 1;
}
}
return 0;
}
void seach()//查找
{
int c;
system("color F9");
system("mode con cols=60 lines=20");
while(1)
{
printf("\n\n\n --------------学生信息查找--------------\n\n");
printf(" [1]按姓名查找\n");
printf(" [2]按学号查找\n\n");
printf(" ----------------------------------------\n\n");
printf(" 请输入以上编号:");
scanf("%d",&c);
getchar();
if(c==1)//按姓名查找
{
seach_name();
break;
}
else if(c==2)//按学号查找
{
seach_num();
break;
}
}
}
void add()//增加信息
{
FILE *fp;
int flag=1;
system("cls");
system("color F9");
system("mode con cols=90 lines=30");
printf("\n\n\n ------------【增加学生信息】------------\n\n\n");
if((fp=fopen("student.txt","a"))==NULL)//向文件尾部追加数据
{
printf("文件打开失败!\n");
flag=0;
}
if(flag==1)//成功打开文件
{
printf(" 请按以下顺序输入学生信息(学号 姓名 性别 语文 数学 英语 物理 体育):\n\n");
gotoxy(12,9);
scanf("%s %s %s %f %f %f %f %f",stu.num,stu.name,stu.sex,&stu.yw,&stu.sx,&stu.yy,&stu.wl,&stu.ty);//输入
getchar();
if(fprintf(fp,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty)==EOF)//向文件写入数据结束
{
printf("学生信息增加失败!\n\n");
flag=0;//失败返回0
}
if(flag==1)//增加成功
{
printf(" 学生信息增加成功!\n\n");
printf(" 你输入得学生信息为:\n %s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty);
}
fclose(fp);
}
}
void change()//修改
{
struct stu student[50];//定义数组存放修改的数据
char Scanf[20];
FILE *fp1,*fp2;
int flag=0,i=0,j=0,f,mark;
system("cls");
system("color F9");
system("mode con cols=90 lines=30");
printf("\n --------------修改学生信息--------------\n");
printf(" 请输入需要修改的学生的【姓名】或【学号】:");
scanf("%s",Scanf);
getchar();
if((fp1=fopen("student.txt","r"))==NULL)//只读的方式打开文件
{
printf("学生基本信息读取失败!");
}
printf(" --------------------------------------------------------------\n");
printf(" 学 号 姓 名 性别 语文 数学 英语 物理 体育\n");
while(fscanf(fp1,"%s %s %s %f %f %f %f %f",stu.num,stu.name,stu.sex,&stu.yw,&stu.sx,&stu.yy,&stu.wl,&stu.ty)!=EOF)//从文件中读出数据
{
if(strcmp(Scanf,stu.name)==0 || strcmp(Scanf,stu.num)==0)//比较
{
printf(" --------------------------------------------------------------\n");
printf(" %-12s %-8s %-3s %-6.1f %-6.1f %-6.1f %-6.1f %-6.1f\n",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty);
flag=1;
mark=j;
}
strcpy(student[j].num,stu.num);
strcpy(student[j].name,stu.name);
strcpy(student[j].sex,stu.sex);
student[j].yw=stu.yw;
student[j].sx=stu.sx;
student[j].yy=stu.yy;
student[j].wl=stu.wl;
student[j].ty=stu.ty;
j++;
}
printf(" --------------------------------------------------------------\n");
fclose(fp1);
printf("\n 请输入需要更改的项目:");
scanf("%s",Scanf);
getchar();
if(flag==0)
{
printf(" 你输入的项目错误!\n\n");
}
else
{
if(strcmp(Scanf,"学号")==0)
f=1;
else if(strcmp(Scanf,"姓名")==0)
f=2;
else if(strcmp(Scanf,"性别")==0)
f=3;
else if(strcmp(Scanf,"语文")==0)
f=4;
else if(strcmp(Scanf,"数学")==0)
f=5;
else if(strcmp(Scanf,"英语")==0)
f=6;
else if(strcmp(Scanf,"物理")==0)
f=7;
else if(strcmp(Scanf,"体育")==0)
f=8;
switch(f)
{
case 1:{
fp2=fopen("student.txt","w");
printf(" 将学号【%s】修改为:",student[mark].num);
scanf("%s",Scanf);
getchar();
strcpy(student[mark].num,Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 2:{
fp2=fopen("student.txt","w");
printf(" 将姓名【%s】修改为:",student[mark].name);
scanf("%s",Scanf);
getchar();
strcpy(student[mark].name,Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 3:{
fp2=fopen("student.txt","w");
printf(" 将性别【%s】修改为:",student[mark].sex);
scanf("%s",Scanf);
getchar();
strcpy(student[mark].sex,Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 4:{
fp2=fopen("student.txt","w");
printf(" 将语文成绩【%.1f】修改为:",student[mark].yw);
scanf("%s",Scanf);
getchar();
student[mark].yw=atof(Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 5:{
fp2=fopen("student.txt","w");
printf(" 将数学成绩【%.1f】修改为:",student[mark].sx);
scanf("%s",Scanf);
getchar();
student[mark].sx=atof(Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 6:{
fp2=fopen("student.txt","w");
printf(" 将英语成绩【%.1f】修改为:",student[mark].yy);
scanf("%s",Scanf);
getchar();
student[mark].yy=atof(Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 7:{
fp2=fopen("student.txt","w");
printf(" 将物理成绩【%.1f】修改为:",student[mark].wl);
scanf("%s",Scanf);
getchar();
student[mark].wl=atof(Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
case 8:{
fp2=fopen("student.txt","w");
printf(" 将体育成绩【%.1f】修改为:",student[mark].ty);
scanf("%s",Scanf);
getchar();
student[mark].ty=atof(Scanf);
for(i=0;i<j;i++)
{
fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);
}
printf("\n 修改成功!\n");
fclose(fp2);
};break;
}
}
}
void Delete()//删除
{
struct stu aa[50];
FILE *fp1,*fp2;
int i=0,j,flag=0,f;
char Scanf[20];
system("cls");
system("color F9");
system("mode con cols=90 lines=30");
printf("\n --------------删除学生信息--------------\n");
printf(" 请输入需要删除的学生的【姓名】或【学号】:");
scanf("%s",Scanf);
getchar();
printf(" --------------------------------------------------------------\n");
printf(" 学 号 姓 名 性别 语文 数学 英语 物理 体育\n");
if((fp1=fopen("student.txt","r"))==NULL)//用只读的方式打开文件
{
printf("学生基本信息读取失败!");
}
while(fscanf(fp1,"%s %s %s %f %f %f %f %f",aa[i].num,aa[i].name,aa[i].sex,&aa[i].yw,&aa[i].sx,&aa[i].yy,&aa[i].wl,&aa[i].ty)!=EOF)
{
if(strcmp(Scanf,aa[i].num)==0 || strcmp(Scanf,aa[i].name)==0)//比较
{
printf(" --------------------------------------------------------------\n");
printf(" %-12s %-10s %-3s %-6.1f %-6.1f %-6.1f %-6.1f %-6.1f\n",aa[i].num,aa[i].name,aa[i].sex,aa[i].yw,aa[i].sx,aa[i].yy,aa[i].wl,aa[i].ty);
flag=1;//找到返回1
}
i++;
}
printf(" --------------------------------------------------------------\n");
fclose(fp1);
if(flag==0)
{
printf("\n 没有找到姓名或学号为【%s】的学生!\n",Scanf);
}
else
{
printf("\n 确认删除输入【1】,放弃删除输入【0】:");
scanf("%d",&f);
getchar();
if(f==1)
{
fp2=fopen("student.txt","w");// 用只写的方式打开文件
for(j=0;j<i;j++)
{
if(strcmp(Scanf,aa[j].num)!=0 && strcmp(Scanf,aa[j].name)!=0)//重新写入其他人的数据放入文件
{
fprintf(fp1,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",aa[j].num,aa[j].name,aa[j].sex,aa[j].yw,aa[j].sx,aa[j].yy,aa[j].wl,aa[j].ty);
}
}
printf("\n 删除成功!\n\n");
}
else
{
printf("\n 你已放弃删除该学生的成绩信息!\n");
}
}
fclose(fp2);
}
备注:自己的作业,想保存一下,没别的意思,写的也很丑。