#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
typedef struct STUDENT
{
char studentNumber[20]/*学生学号*/
char studentName[20]/*学生姓名*/
char className[20]/*班级名称*/
float mark1/*第1门成绩*/
float mark2/*第2门成绩*/
float mark3/*第3门成绩*/
struct STUDENT *next
}STUDENT
STUDENT *headLink/*链表表头指针*/
/*函数声明*/
void ReadInfoFormFile()
void Menu()
void CreateHeadLink()
STUDENT *MallocNode()
void GetInformation(STUDENT *t)
void OutputInformation()
void DesplayInfoBystudentName()
void DesplayInfoBystudentNumber()
void DesplayOneNode(STUDENT *t)
void InsertOneNode(STUDENT *t)
void DeleteNodeBystudentNumber()
void ChangeMarkByName()
void ChangeMarkByNumber()
void SaveLinkToFile()
void paixu()
void DesplayMarkSegment()
int choose/*用于接受用户的选择*/
/*主函数*/
main()
{
system("color 2a")
printf("\n\t\t欢迎进入***学院***班学生成绩管理系统\n\n\n")
printf("\t\t\t\tO(∩_∩)O\n\n\n\n")
printf("\t\t\t^_^\t\t\t^_^\n\n")
printf("\n\t\t注意:请按照要求输入相应信息,谢谢!\n\n\n\n\n")
printf("\t\t\t\t\t\t\t\t制作人:***\n\n\n")
printf("\t\t\t 按任意键进入…………")
getch()
system("cls")
CreateHeadLink()
ReadInfoFormFile()
Menu()
}
/*从文件中读学生信息到链表中*/
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 Menu(void)
{
STUDENT *p
printf("\t\t (^o^)欢迎使用学生成绩管理系统(^o^)\n\n")
printf("\t ※--------------------请选择相应功能---------------------※\n\n")
printf("\t1: 显示所有学生的信息 |")
printf(" \t 2: 按姓名查询 |\n\n")
printf("\t3: 按学号查询 |")
printf(" \t\t 4: 增加学生 |\n\n")
printf("\t5: 删除学生 |")
printf(" \t\t 6: 按姓名修改学生成绩 |\n\n")
printf("\t7: 按学号修改学生成绩 |")
printf(" \t 8: 保存所有学生信息 |\n\n")
printf("\t9: 按成绩输出学生信息 |")
printf("\t 10: 显示不及格及优秀学生 |\n\n")
printf("\t11: 返回主菜单 |")
printf("\t\t 12: 退出 |\n\n")
printf("\t ※----------------------O(∩_∩)O------------------------※\n\n")
printf("\t 请输入对应数字:")
scanf("%d",&choose)/*取得用户的选择*/
switch(choose)
{
case 1:system("cls")
OutputInformation()/*显示所有学生的信息*/
break
case 2: system("cls")
DesplayInfoBystudentName()
break
case 3: system("cls")
DesplayInfoBystudentNumber()/*根据用户输入的学号显示该学生的信息*/
break
case 4: system("cls")
p=MallocNode()/*先申请一个新结点*/
GetInformation(p)/*要求用户输入信息到新结点中*/
InsertOneNode(p)/*将新结点加到链表中*/
break
case 5: system("cls")
DeleteNodeBystudentNumber()/*根据用户输入的学号删除该学生*/
break
case 6: system("cls")
ChangeMarkByName()/*根据用户输入的姓名修改学生成绩*/
break
case 7: system("cls")
ChangeMarkByNumber()/*根据用户输入的学号修改学生成绩*/
break
case 8: system("cls")
SaveLinkToFile()/*保存数据*/
break
case 9: system("cls")
paixu()break
case 10: system("cls")
DesplayMarkSegment()break
case 11: system("cls")
break
case 12: system("cls")
SaveLinkToFile()/*保存数据后再退出*/
free(headLink)
exit(1)
break
default: system("cls")break
}
Menu()/*递归调用*/
}
/*建立链表表头*/
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=0i<10i++)
p->studentNumber='\0'
for(i=0i<20i++)
p->studentName='\0'
for(i=0i<20i++)
p->className='\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("请输入第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)
{system("cls")
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n")
DesplayOneNode(p)
flag=1
break
}
p=p->next
}
if(!flag) {system("cls")
printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName)}
}
/*根据用户输入的学号显示该学生的信息*/
void DesplayInfoBystudentNumber(void)
{
STUDENT *p
char studentNumber[20]
char flag=0
p=headLink->next
printf("请输入学生学号:")
scanf("%s",studentNumber)
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{ system("cls")
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n")
DesplayOneNode(p)
flag=1
break
}
p=p->next
}
if(!flag) {system("cls")
printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber)
}}
/*输出一个结点的信息*/
void DesplayOneNode(STUDENT *t)
{
printf("\t%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)
{
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)
{ system("cls")
printf("\t 不存在该学号的学生\n")
return
}
system("cls")
printf("\t 成功删除\n")
}
/*显示所有学生的信息*/
void OutputInformation(void)
{
STUDENT *p
p=headLink->next
if(p==NULL)
{
printf("\t现在没有学生信息,请先输入学生信息\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
char studentName[20]
char flag=0
float mark1,mark2,mark3
p=headLink->next
printf("请输入学生姓名:")
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) {system("cls")
printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName)
} }
/*根据输入的姓名修改成绩*/
void ChangeMarkByNumber(void)
{
STUDENT *p
char studentNumber[20]
char flag=0
float mark1,mark2,mark3
p=headLink->next
printf("请输入学生学号:")
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){system("cls")
printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber)
}}
/*保存链表数据到文件中*/
void SaveLinkToFile(void)
{
STUDENT *p
FILE *fp
p=headLink->next
if(p==NULL)
{
printf("\t 现在没有学生信息,请先输入学生信息\n\n")
return
}
fp=fopen("student.txt","w+")
if(!fp)
{
printf("文件不存在\n")
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)
{
STUDENT *p
int count=0
p=headLink->next
printf("\t60分以下(不及格)的学生成绩如下:\n")
printf("\t学号\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("\t不及格的学生一共有%d人\n",count)
p=headLink->next
printf("\t成绩优秀的学生成绩如下:\n")
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n")
count=0
while(p)
{
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10))))
{
count++
DesplayOneNode(p)
}
p=p->next
}
printf("\t成绩优秀的学生一共有%d人\n",count)
}
/*按总成绩排序*/
void paixu(void)
{
STUDENT exchange,*r,*p,*q
r=headLink->next
if(r==NULL)
{
printf("\t 现在还没学生信息,请先输入学生信息\n")
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)
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()
}
#include <iostream>#include <iomanip>
#include <string>
using namespace std
typedef struct student {
unsigned m_id
string m_name
unsigned m_age
string m_sex
string m_address
string m_contact
string m_dormitory
struct student *m_next
}student
class CStudent {
private :
student *head
public :
CStudent() {
head = new student
head->m_id = 0
head->m_name = "noname"
head->m_next = NULL
}
~CStudent() {
student *p = head,*q
while(p) {
q = p
p = q->m_next
delete q
}
}
student readdata(int model) // model = 1:不读取学号,2:不读取姓名,其他,读取所有信息
void entering()
bool insert(const student &astu)
student *findid(unsigned id) const
student *findname(const string &name) const
student *findsex(const string &sex) const
student *finddormitory(const string &dormitory) const
unsigned boys() const
unsigned girls() const
unsigned headcount() const
bool eraseid()
bool erasename()
bool modifyid()
bool modifyname()
void Show() const
void query() const
void friend statistics(const CStudent &aclss)
void friend erase(CStudent &aclss)
void friend modify(CStudent &aclss)
}
string readstring() {
string str
while(cin.get() != '\n')
cin >> str
return str
}
student CStudent::readdata(int model) {
student tmp
if(model != 1) { cout << "学 号: " cin >> tmp.m_id }
if(model != 2) { cout << "姓 名: " tmp.m_name = readstring() }
cin >> tmp.m_age
cout << "性 别: "
tmp.m_sex = readstring()
cout << "住 址: "
tmp.m_address = readstring()
cout << "联系方式: "
tmp.m_contact =readstring()
cout << "寝 室: "
tmp.m_dormitory = readstring()
return tmp
}
void CStudent::entering() {
student tmp
cout << "学号(0 to return): "
cin >> tmp.m_id
while(tmp.m_id) {
if(findid(tmp.m_id) == NULL) {
cout << "姓 名: "
tmp.m_name = readstring()
cout << "年 龄: "
cin >> tmp.m_age
cout << "性 别: "
tmp.m_sex = readstring()
cout << "住 址: "
tmp.m_address = readstring()
cout << "联系方式: "
tmp.m_contact = readstring()
cout << "寝 室: "
tmp.m_dormitory = readstring()
insert(tmp)
}
else cout << "重复的学号:" << tmp.m_id << endl
cout << "学号(0 to return): "
cin >> tmp.m_id
}
}
student *CStudent::findid(unsigned id) const {
student *p
for(p = head p->m_next p = p->m_next)
if(p->m_next->m_id == id) return p
return NULL
}
student *CStudent::findname(const string &name) const {
student *p
for(p = head p->m_next p = p->m_next)
if(p->m_next->m_name == name) return p
return NULL
}
student *CStudent::findsex(const string &sex) const {
student *p
for(p = head p->m_next p = p->m_next)
if(p->m_next->m_sex == sex) return p
return NULL
}
student *CStudent::finddormitory(const string &dormitory) const {
student *p
for(p = head p->m_next p = p->m_next)
if(p->m_next->m_dormitory == dormitory) return p
return NULL
}
bool CStudent::insert(const student &astu) {
student *newnode,*p = head
if(p->m_next == NULL) {
p->m_next = new student(astu)
p->m_next->m_next = NULL
return true
}
while(p->m_next) {
if(p->m_next->m_id == astu.m_id) {
cout << "重复的学号,插入失败!\n"
return false
}
if(p->m_next->m_id > astu.m_id) {
newnode = new student(astu)
newnode->m_next = p->m_next
p->m_next = newnode
return true
}
p = p->m_next
}
p->m_next = new student(astu)
p->m_next->m_next = NULL
return true
}
unsigned CStudent::boys() const {
unsigned cnt = 0
student *p
for(p = head->m_next p p = p->m_next)
if(p->m_sex == "男") ++cnt
return cnt
}
unsigned CStudent::girls() const {
unsigned cnt = 0
student *p
for(p = head->m_next p p = p->m_next)
if(p->m_sex == "女") ++cnt
return cnt
}
unsigned CStudent::headcount() const {
unsigned cnt = 0
student *p
for(p = head->m_next p p = p->m_next,++cnt)
return cnt
}
bool CStudent::eraseid() {
student *q,*p
unsigned id
cout << "输入要删除的学号:"
cin >> id
p = findid(id)
if(p == NULL) {
cout << "没有找到学号是\"" << id << "\"的学生,删除失败!\n"
return false
}
q = p->m_next
p->m_next = q->m_next
delete q
return true
}
bool CStudent::erasename() {
student *q,*p
string name
cout << "输入要删除人的姓名:"
name = readstring()
p = findname(name)
if(p == NULL) {
cout << "没有找到姓名是\"" << name << "\"的学生,删除失败!\n"
return false
}
q = p->m_next
p->m_next = q->m_next
delete q
return true
}
bool CStudent::modifyid() {
student tmp,*p
unsigned id
cout << "输入要修改的学号:"
cin >> id
p = findid(id)
if(p == NULL) {
cout << "没有找到学号是\"" << id << "\"的学生,修改失败!\n"
return false
}
tmp = readdata(1)
tmp.m_id = id
*p = tmp
return true
}
bool CStudent::modifyname() {
student *p,tmp
string name
cout << "输入要修改人的姓名:"
name = readstring()
p = findname(name)
if(p == NULL) {
cout << "没有找到姓名是\"" << name << "\"的学生,修改失败!\n"
return false
}
tmp = readdata(2)
tmp.m_name = name
*p = tmp
return true
}
int menu() {
int choice
do {
system("cls")
cout << "\t****************************\n"
cout << "\t* 学生基本信息管理系统 *\n"
cout << "\t*==========================*\n"
cout << "\t* 1、录入学生信息 *\n"
cout << "\t* 2、显示学生信息 *\n"
cout << "\t* 3、查询学生信息 *\n"
cout << "\t* 4、添加学生信息 *\n"
cout << "\t* 5、统计学生信息 *\n"
cout << "\t* 6、删除学生信息 *\n"
cout << "\t* 7、修改学生信息 *\n"
cout << "\t* 0、退出管理系统 *\n"
cout << "\t****************************\n"
cout << "\n\t请选择:"
cin >> choice
}while(choice < 0 || choice > 7)
return choice
}
void show(student *p) {
cout << p->m_id << " " << p->m_name << " " << p->m_age << " "
cout << p->m_sex << " " << p->m_address << " "
cout << p->m_contact << " " << p->m_dormitory << endl
}
void CStudent::Show() const {
student *p
cout << "----------------------------------------------------------\n"
for(p = head->m_next p p = p->m_next) show(p)
cout << "----------------------------------------------------------\n"
system("pause")
}
void CStudent::query() const {
int select
unsigned id
string name
student *p
cout << "1、按学号查询\n2、按姓名查询\n0、返回\n"
cin >> select
switch(select) {
case 1 : cout << "请输入学号:" cin >> id
if(p = findid(id)) show(p->m_next)
break
case 2 : cout << "请输入姓名:" name = readstring()
if(p = findname(name)) show(p->m_next)
break
case 0 : return
default : cout << "选择错误。\n"
}
system("pause")
}
void statistics(const CStudent &a) {
unsigned total = a.headcount()
unsigned boys = a.boys()
unsigned girls = a.girls()
cout << "学生总数:" << total << "人。\n"
cout << "其中,男生:" << boys << "名。"
cout << "女生:" << girls << "名。\n"
system("pause")
}
void erase(CStudent &a) {
int select
unsigned id
string name
student *p,*q
cout << "1、按学号删除\n2、按姓名删除\n0、返回\n"
cin >> select
switch(select) {
case 1 : cout << "请输入学号:" cin >> id
if(p = a.findid(id)) {
q = p->m_next
p->m_next = q->m_next
delete q
cout << "成功删除 " << id << " 的信息。\n"
}
break
case 2 : cout << "请输入姓名:" name = readstring()
if(p = a.findname(name)) {
q = p->m_next
p->m_next = q->m_next
delete q
cout << "成功删除 " << name << " 的信息。\n"
}
break
case 0 : return
default : cout << "选择错误。\n"
}
system("pause")
}
void modify(CStudent &a) {
int select
cout << "1、按学号修改\n2、按姓名修改\n0、返回\n"
cin >> select
switch(select) {
case 1 : if(a.modifyid()) cout << "修改成功。\n" break
case 2 : if(a.modifyname()) cout << "修改成功。\n" break
case 0 : return
default : cout << "选择错误。\n"
}
system("pause")
}
int main() {
CStudent a
int an
do {
an = menu()
switch(an) {
case 1 : a.entering() break
case 2 : a.Show() break
case 3 : a.query() break
case 4 : a.entering() break
case 5 : statistics(a) break
case 6 : erase(a) break
case 7 : modify(a) break
case 0 : break
default : cout << "选择错误。\n" break
}
}while(an)
return 0
}