问题及代码:
/*2015,烟台大学计算机与控制工程学院
*作者:张瑞蕾
*完成日期:2015年12月28日
*/
#ifndef TOU_H_INCLUDED
#define TOU_H_INCLUDED
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;
#endif // TOU_H_INCLUDED
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include "tou.h"
#include <string>
#include "stdlib.h"
#include <windows.h>
STUDENT *headLink;//链表表头指针
void ReadInfoFormFile(void);//w读文件
void DesplayMenu(void);//主界面
void CreateHeadLink(void);//建立链表
STUDENT *MallocNode(void);//创建节点
void GetInformation(STUDENT *t);//获取学生信息
void OutputInformation(void);//输出学生信息
void DesplayInfoBystudentNumber(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);//最终结果
int choose;/*用于接受用户的选择*/
int main()
{
system("color 7D");
int h,flag1,flag2;
char name[20]="zhang",password[10]="2222";
char person[20],password1[10];
printf("\t\t 欢迎进入学生成绩管理系统! \n\n");
printf("\t\t\t 用户登录: \n\n");
for(h=0; h!=5;)
{
printf("\t\t\t\t 用户名:");
gets(person);
flag1=strcmp(person,name);
printf("\t\t\t\t 密码:");
gets(password1);
flag2=strcmp(password,password1);
if(flag1==0&&flag2==0)
{
printf("\t\t\t\t 登陆成功 !\n\n");
break;
}
else
{
printf("\t\t\t 用户名或密码错误!\n\n");
printf("\t\t\t 请注意:您还剩%d次机会 !\n\n",4-h);
}
}
if(h==5)
printf("对不起,您输入的用户名或密码有误,已被强制退出。\n");
CreateHeadLink();
ReadInfoFormFile();
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
void ReadInfoFormFile(void)// 函数功能:从文件中读学生信息到链表中
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while
(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
//函数功能:显示菜单,根据用户的输入 完成相应的功能
void DesplayMenu(void)
{
system("cls");
STUDENT *p;
printf("**********&***********&*************\n\n");
printf("***********请选择相应功能***********\n\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\n");
printf("**********&***********&**************\n\n");
printf("-----------请输入你的选择,Enter确定\n");
scanf("%d",&choose);//取得用户的选择
switch(choose)
{
case 1:
OutputInformation();//显示所有学生的信息
break;
case 2:
DesplayInfoBystudentNumber();
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);
return ;
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';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->next=NULL;
//数据初始化,保证不用的时候是0
return p;
}
void GetInformation(STUDENT *t)//函数功能:取得用户输入的学生信息
{
printf("请输入学号:\n");
scanf("%s",t->studentNumber);
printf("请输入姓名:\n");
scanf("%s",t->studentName);
printf("请输入该生所在班级:\n");
scanf("%s",t->className);
printf("请输入成绩1:\n");
scanf("%f",&(t->mark1));
printf("请输入成绩2:\n");
scanf("%f",&(t->mark2));
printf("请输入成绩3:\n");
scanf("%f",&(t->mark3));
getch();
}
void InsertOneNode(STUDENT *t)//在链表的结尾处增加一个结点
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;//遍历链表,尾插法,知道P的下一位是空,p的下一位是t
}
void DesplayInfoBystudentNumber(void)//函数功能:根据用户输入的学生学号显示该学生的信息
{
system("cls");
STUDENT *p;
char studentNumber[20];
char flag=0;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
getch();
}
void DesplayOneNode(STUDENT *t)//函数功能:输出一个结点的信息
{
// system("cls");
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->className);
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)//函数功能:根据用户输入的学号删除该学生
{
system("cls");
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");
getch();
return;
}
printf("成功删除\n");
getch();
}
void OutputInformation(void)//函数功能:显示所有学生的信息
{
system("cls");
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有该学生信息,请先输入学生信息\n\n");
getch();
return;
}
printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
getch();
}
void ChangeMarkByName(void)//函数功能:根据输入的姓名修改成绩
{
system("cls");
STUDENT *p;
int a;
char studentName[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
/*printf("请输入学生班级:\n");
scanf("%d",&a);*/
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的成绩1:\n");
scanf("%f",&mark1);
printf("请输入新的成绩2:\n");
scanf("%f",&mark2);
printf("请输入新的成绩3:\n");
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);
getch();
}
//函数功能:根据输入的学期修改成绩
void ChangeMarkByNumber(void)
{
system("cls");
STUDENT *p;
int b;
char studentNumber[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
/*printf("请输入学生所在学期:\n");
scanf("%d",&b);*/
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的成绩1:\n");
scanf("%f",&mark1);
printf("请输入新的成绩2:\n");
scanf("%f",&mark2);
printf("请输入新的成绩3:\n");
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);
getch();
}
void SaveLinkToFile(void)//函数功能:保存链表数据到文件中
{
system("cls");
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
getch();
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
getch();
return;
}
while(p)
{
fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
p=p->next;
}
fclose(fp);
}
void DesplayMarkSegment(void)//函数功能:不及格学生成绩
{
system("cls");
STUDENT *p;
int count=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\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);
printf("下一次要加油喽!");
getch();
}
void CompositorByTotalMark(void)//函数功能:按平均成绩排序
{
system("cls");
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
getch();
return;
}
while(r)//两层while循环实现排序
{
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);//C语言风格字符串,用strcpy来交换 类似3个数交换
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->mark2;
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();
}
运行结果:
学习心得:
已是学期末,这是数据结构这节课发的最后的博文了,还是希望要做到最完美的句号。