您的位置:首页 > 理论基础 > 数据结构算法

[置顶] 数据结构课程设计-学生成绩管理系统

2015-12-25 08:51 876 查看
学生成绩管理系统

1.头文件
<span style="font-size:18px;">//第一门成绩即为语文成绩
//第二门成绩即为数学成绩
//第三门成绩即为英语成绩

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<string>
#include<windows.h>
#include<iostream>
using namespace std;
typedef struct STUDENT
{
char studentNumber[10];/*学生学号*/
char studentName[20];/*学生姓名*/
char className[20];/*班级名称*/
char yearName[20];/*学期名称*/
float mark1;/*第1门成绩*/
float mark2;/*第2门成绩*/
float mark3;/*第3门成绩*/
struct STUDENT *next;
}STUDENT;

STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/

void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT *MallocNode(void);

void GetInformation(STUDENT *t);
void OutputInformation(void);
void DesplayInfoBystudentName(void);
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkByName(void);
void ChangeMarkByNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void CompositorByTotalMark(void);</span>
2.源文件
<span style="font-size:18px;">#include"head.h"
int choose;/*用于接受用户的选择*/
/*主函数*/
void welcome()//登录考试报名管理系统
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t*****************************************************************\n");
printf("\t    欢迎进入考试报名管理系统    \n");
printf("\t*****************************************************************\n");
char username[20];
string passward;
printf("\n");
printf("\t\t\t请输入用户名: ");
gets(username);
printf("\n");
printf("\t\t\t请输入您的密码:");
cin>>passward;
//	gets(passward);
while(passward!="123456")
{
printf("密码错误,请重新输入!!!\n");
printf("请输入用户名:");
gets(username);
//	    scanf("%d\n",username);
printf("请输入密码:");
//		scanf("%d\n",passward);
cin>>passward;
}
system("cls");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t\t*************************************\n");
printf("\t\t*  密码正确,请稍候 !!!  *\n");
printf("\t\t*************************************\n");
Sleep(3000);
system("cls");
}

void main()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}

/************************************
函数功能:从文件中读学生信息到链表中
************************************/

void ReadInfoFormFile(void)
{
welcome();
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,p->yearName,&(p->mark1),&(p->mark2),&(p->mark3))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}

/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
************************************/

void DesplayMenu(void)
{
STUDENT *p;
printf("\n");
printf("                       欢迎使用学生成绩管理系统            \n");
printf("           ┏━━━━━━━━━━━━━━━━━━━━┓\n");
printf("           ┃   1.按班级输出学生成绩单┃\n");
printf("           ┃   2.报上大名,让我来查找┃\n");
printf("           ┃   3.添加学生信息┃\n");
printf("           ┃   4.删除学生信息┃\n");
printf("           ┃   5.按班级修改学生成绩┃\n");
printf("           ┃   6.按学期修改学生成绩┃\n");
printf("           ┃   7.保存所有学生信息┃\n");
printf("           ┃   8.显示不及格学生成绩┃\n");
printf("           ┃   9.按平均成绩排序并输出成绩┃\n");
printf("           ┃  10.退出系统哟┃\n");
printf("           ┗━━━━━━━━━━━━━━━━━━━━┛\n");
printf("老师寄语:成绩并不代表什么,关键要从中吸取经验和教训,再接再厉!重新树立起好的心态哦,踏踏实实的走下去吧^_^\n");
printf(">>请输入选择:");
scanf("%d",&choose);/*取得用户的选择*/
printf("\n");
switch(choose)
{
case 1:
OutputInformation();/*显示所有学生的信息*/
break;
case 2:
DesplayInfoBystudentName();
break;
case 3:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case 4:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 5:
ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
break;
case 6:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
break;
case 7:
SaveLinkToFile();/*保存数据*/
break;
case 8:
DesplayMarkSegment();/*显示不及格的学生成绩*/
break;
case 9:
CompositorByTotalMark();/*按平均成绩排序*/
break;
case 10:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
break;
default:
break;
}
DesplayMenu();/*递归调用*/
}

/************************************
函数功能:建立链表表头
************************************/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}

/************************************
函数功能:申请一个新结点,并将其初始化
************************************/

STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
for(i=0;i<20;i++)
p->className[i]='\0';
for(i=0;i<20;i++)
p->yearName[i]='\0';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->next=NULL;
return p;
}

/************************************
函数功能:取得用户输入的学生信息
************************************/

void GetInformation(STUDENT *t)
{
printf("请输入学生学号:");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:");
scanf("%s",t->studentName);
printf("请输入该生所在班级:");
scanf("%s",t->className);
printf("请输入学期:");
scanf("%s",t->yearName);
printf("请输入第1门课成绩:");
scanf("%f",&(t->mark1));
printf("请输入第2门课成绩:");
scanf("%f",&(t->mark2));
printf("请输入第3门课成绩:");
scanf("%f",&(t->mark3));
}

/************************************
函数功能:在链表的结尾处增加一个结点
************************************/

void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}

/************************************
函数功能:根据用户输入的学生姓名显示该学生的信息
************************************/

void DesplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生姓名:");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,(╯^╰〉不存在姓名为 %s 的学生\n",studentName);
}

/************************************
函数功能:输出一个结点的信息
************************************/

void DesplayOneNode(STUDENT *t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->className);
printf("%s\t",t->yearName);
printf("%.2f\t",t->mark1);
printf("%.2f\t",t->mark2);
printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark1+t->mark2+t->mark3);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);
}

/************************************
函数功能:根据用户输入的学号删除该学生
************************************/

void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("对不起,(°ο°)不存在该学号的学生\n");
return;
}
printf("成功删除\n");
}

/************************************
函数功能:显示所有学生的信息
************************************/

void OutputInformation(void)
{
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}

/************************************
函数功能:根据输入的班级修改成绩
************************************/

void ChangeMarkByName(void)
{
STUDENT *p;
int a;
char studentName[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
printf("请输入学生班级:");
scanf("%d",&a);
printf("请输入学生姓名:");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在班级为 %s 的学生\n",studentName);
}

/************************************
函数功能:根据输入的学期修改成绩
************************************/

void ChangeMarkByNumber(void)
{
STUDENT *p;
int b;
char studentNumber[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
printf("请输入学生所在学期:");
scanf("%d",&b);
printf("请输入学生学号:");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门(语文)成绩:");
scanf("%f",&mark1);
printf("请输入新的第2门(数学)成绩:");
scanf("%f",&mark2);
printf("请输入新的第3门(英语)成绩:");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学期为 %s 的学生\n",studentNumber);
}

/************************************
函数功能:保存链表数据到文件中
************************************/

void SaveLinkToFile(void)
{
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息哦\n\n");
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s %s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->yearName,p->mark1,p->mark2,p->mark3);
p=p->next;
}
fclose(fp);
printf("学生信息保存成功!\n");
}

/************************************
函数功能:不及格学生成绩
************************************/

void DesplayMarkSegment(void)
{
STUDENT *p;
int count=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
while(p)
{
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10)))) /*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("不及格的学生一共有%d人\n",count);
}

/************************************
函数功能:按平均成绩排序
************************************/

void CompositorByTotalMark(void)
{
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*实现排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;

strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark3;
q->mark3=p->mark3;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3;
}
q=q->next;
}
r=r->next;
}

OutputInformation();
}
</span>

[align=left]读文件操作文件截图:[/align]



运行结果;

1.用户界面登陆





2.管理界面



3.按照班级查找成绩单



4.增添保存学生功能:





5.显示不及格学生成绩



6.显示按照平均成绩从高到低排序



[align=left]设计心得:[/align]
[align=left]三天的课程设计,通过对代码的调试,对整体框架系统的构思,让我受益匪浅,希望自己可以在这次课程设计中找到自己的不足,以后认真对待并且去克服它,多思考,多总结,这样学习才会达到事半功倍的效果。[/align]
[align=left]                                                                                                                2015.12.27[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: