#include <stdlib.h>
#include <string.h>struct student
{
char name[60]
char ID[7]
int score
}int dq(struct student st[])
void xianshi()
void bc(struct student st[])
void add()
void select()
void zz()
void chazhao()
void xhcz()
void xmcz()
void del()
void xmsc()
void xhsc()
void tj()
void px()
void bjg()
void xg()
void xhxg()
void xmxg()
void bca()
void fh()
struct student st[300] //这个数组用来保存所有的学生信息 和文件里面的一致
int Number=0//记录总的学生人数 也就是数组/文件里面的学生人数
void main()
{
int choose=0
FILE *fp=NULL
char yesorno
if((fp=fopen("C://student.dat","rb"))==NULL)
{
printf("\n=========>提示:文件不存在,是否要创建一个?(y/n)\n")
scanf("%c",&yesorno)
if(yesorno=='y'||yesorno=='Y')
{
//这里仅为了建立文件
fp=fopen("C://student.dat","wb")
fclose(fp)
}
else
exit(0)
}
else
{
Number=dq(st)//要是文件只能够已经有数据 将数据初始化到数组中
}
system("cls")
while(true)
{
xianshi()
printf("\t\t====>请选择:")
scanf("%d",&choose)
system("cls")
switch(choose)
{
case 0: exit(0)
//退出
break
case 1: add()
fh()//增加学生成绩
break
case 2: select()
fh()//查看学生成绩
break
case 3: chazhao()
fh()// 查找
break
case 4: del()
fh()//删除
break
case 5: tj()
fh()//统计
break
case 6: px()
fh()//排序
break
case 7: bjg()
fh()//输出不及格
break
case 8: xg()
fh()//修改
break
case 9:zz()
fh()//作者
break
case 10:bca()
fh()//保存
break
default:
break
}
fflush(stdin)
getchar()
system("cls")
}
}
void bca()
{
printf("\t=====程序在运行时已自动保存.....\n")
}
void fh()
{
printf("\t===>按Enter键返回主菜单\n")
}
void xg() //修改学生信息
{
int way=0
printf("请选择修改查找方式\n")
printf("1 按姓名查找修改\n")
printf("2 按学号查找修改\n")
scanf("%d",&way)
switch(way)
{
case 1: xmxg()
break
case 2: xhxg()
break
default: printf("输入有误,结束!\n")
break
}
}
//按姓名修改
void xmxg()
{
FILE *fp=NULL
char name[60]
int i=0
int changeIndex=0
int index=0
printf("请输入要修改的学生姓名:")
scanf("%s",name)
for (i=0i<Numberi++)
{
if (strcmp(name,st[i].name))
{
changeIndex=i //保存要修改的人的下标
}
break
}
printf("\t姓名\t学号\t成绩\n")
printf("\t%s\t%s\t%d\n\n",st[changeIndex].name,st[changeIndex].ID,st[changeIndex].score)
printf("请重新输入该学生信息")
printf("姓名:")
scanf("%s",st[changeIndex].name)
printf("学号:")
scanf("%s",st[changeIndex].ID)
printf("成绩:")
scanf("%d",&st[changeIndex].score)//信息修改后重新更新文件里面的数据 以保持数据一致性
fp=fopen("C://student.dat","wb")
for (i=0i<Numberi++)
{
fwrite(&st[i],sizeof(struct student),1,fp)
}
fclose(fp)
}
void xhxg()//按学号修改
{
FILE *fp=NULL
char id[60]
int i=0
int changeIndex=0
int index=0
printf("请输入要修改的学生学号:")
scanf("%s",id)
for (i=0i<Numberi++)
{
if (strcmp(id,st[i].ID))
{
changeIndex=i //保存要修改的人的下标
}
break
}
printf("\t姓名\t学号\t成绩\n")
printf("\t%s\t%s\t%d\n\n",st[changeIndex].name,st[changeIndex].ID,st[changeIndex].score)
printf("请重新输入该学生信息")
printf("姓名:")
scanf("%s",st[changeIndex].name)
printf("学号:")
scanf("%s",st[changeIndex].ID)
printf("成绩:")
scanf("%d",&st[changeIndex].score)
//信息修改后重新更新文件里面的数据 以保持数据一致性
fp=fopen("C://student.dat","wb")
for (i=0i<Numberi++)
{
fwrite(&st[i],sizeof(struct student),1,fp)
}
fclose(fp)
printf("\t=======>修改成功\n")
}void bjg() //输出不及格人数
{
int i=0
printf("以下是不及格:\n")
printf("\t姓名\t学号\t成绩\n")
for (i=0i<Numberi++)
{
if (st[i].score<60)
{
printf("\t%s\t%s\t%d\n",st[i].name,st[i].ID,st[i].score)
}
}
}
void px()//排序
{
struct student temp
int wantNUmber=0
int i=0
int j=0
for(i=0i<Number-1i++)
{
for(j=ij<Number-1j++)
{
if(st[j].score>st[j+1].score)
{
temp=st[j]
st[j]=st[j+1]
st[j+1]=temp
}
}
}
printf("你想输出前几名的成绩:")
scanf("%d",&wantNUmber)
if (wantNUmber>Number)
{
wantNUmber=Number
}printf("\t姓名\t学号\t成绩\n")
for(i=0i<wantNUmberi++)
{
printf("\t%s\t%s\t%d\n",st[i].name,st[i].ID,st[i].score)
}
}
void tj()//统计
{
int i=0
double sum=0.0
for(i=0i<Numberi++)
{
sum+=st[i].score
}
printf("全班总分为:%f\n",sum)
printf("平均分为:%f\n",sum/Number)
}
void del()//删除
{
int n=0
printf("1 按姓名删除\n")
printf("2 按学号删除\n")
scanf("%d",&n)
switch(n)
{
case 1: xmsc()
break
case 2: xhsc()
break
}
}
void xmsc()//按姓名删除
{
FILE *fp=NULL
char name[60]
int i=0
int j=0
printf("请输入要删除的学生姓名:")
scanf("%s",name)
for(i=0i<Numberi++)
{
if (strcmp(name,st[i].name)==0) //如果查找到就删除
{
for (j=ij<Number-1j++)
{
st[j]=st[j+1]
}
Number--
}
} //将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了
fp=fopen("C://student.dat","wb")
for (i=0i<Numberi++)
{
fwrite(&st[i],sizeof(struct student),1,fp)
}
fclose(fp)
printf("删除成功\n")
}
void xhsc()//按学号删除
{
FILE *fp=NULL
char id[60]
int i=0
int j=0
printf("请输入要删除的学生学号:")
scanf("%s",id)
for(i=0i<Numberi++)
{
if (strcmp(id,st[i].ID)==0) //如果查找到就删除
{
for (j=ij<Number-1j++)
{
st[j]=st[j+1]
}
Number--
}
}
//将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了
fp=fopen("C://student.dat","wb")
for (i=0i<Numberi++)
{
fwrite(&st[i],sizeof(struct student),1,fp)
}
fclose(fp)
printf("删除成功\n")
}
void chazhao()//查找学生
{
int n=0
printf("1 按姓名查找\n")
printf("2 按学号查找\n")
scanf("%d",&n)
switch(n)
{
case 1: xmcz()
break
case 2: xhcz()
break
default: printf("输入有误,结束!\n")
break
}
}
void xhcz()//按学号查找
{
char id[7]
int i=0
printf("请输入要查找学生学号:")
scanf("%s",id)
system("cls")
printf("\t姓名\t学号\t成绩\n")
for (i=0i<Numberi++)
{
if (strcmp(id,st[i].ID)==0)
{
printf("\t%s\t%s\t%d\n",st[i].name,st[i].ID,st[i].score)
}
}
}
void xmcz()//按姓名查找
{
char name[7]
int i=0
printf("请输入要查找学生姓名:")
scanf("%s",name)
system("cls")
printf("\t姓名\t学号\t成绩\n")
for (i=0i<Numberi++)
{
if (strcmp(name,st[i].name)==0)
{
printf("\t%s\t%s\t%d\n",st[i].name,st[i].ID,st[i].score)
}
}
}
void zz()
{
printf("\t**********************************************************\n\n")
printf("\t^^^^^^^^^^ 武汉工程大学邮电与信息工程学院 ^^^^^^^^^^\n\n")
printf("\t^^^^^^^^^ 07网络与安全管理2班 ^^^^^^^^^\n\n")
printf("\t^^^^^^^^ 易樊制作 ^^^^^^^^\n\n")
printf("\t^^^^^^^^^ 禁止CTRL+C谢谢合作^^^^^^^^^\n\n")
printf("\t^^^^^^^^^^QQ:895115828\n\n")
printf("\t**********************************************************\n\n")
}
void select()//查看学生
{
int i=0
printf("以下是全部学生成绩\n")
printf("\t姓名\t学号\t成绩\n")
for(i=0i<Numberi++)
{
printf("\t%s\t%s\t%d\n",st[i].name,st[i].ID,st[i].score)
}
}
void add()//增加学生
{
int numberTemp=0
int i=0
struct student temp//临时保存信息
printf("请输入要增加学生成绩个数:")
scanf("%d",&numberTemp)
for(i=0i<numberTempi++)
{
printf("输入第%d个同学信息\n",i+1)
printf("姓名:")
scanf("%s",temp.name)
printf("学号:")
scanf("%s",temp.ID)
printf("成绩:")
scanf("%d",&temp.score)
st[Number++]=temp//将刚添加的写入到数组
bc(&temp)//将刚添加的写入到文件 }
printf("添加成功\n")
}
void bc(struct student *st)
{
FILE *fp=NULL
fp=fopen("C://student.dat","ab+")
fwrite(st,sizeof(struct student),1,fp)
fclose(fp)
}
int dq(struct student st[])
{
FILE *fp=NULL
int i=0
fp=fopen("C://student.dat","rb")
while(fread(&st[i],sizeof(struct student),1,fp))
i++
fclose(fp)
return i
}
void xianshi()
{
printf("\t*****************************************************************\n")
printf("\t* *\n")
printf("\t* 学生成绩管理系统 *\n")
printf("\t* *\n")
printf("\t* [1]增加学生成绩[2]查看学生成绩 *\n")
printf("\t* [3]查找学生成绩[4]删除学生成绩 *\n")
printf("\t* [5]统计(总成绩和平均分) [6]输出前N名学生成绩 *\n")
printf("\t* [7]输出不及格人数 [8]修改学生信息 *\n")
printf("\t* [9]关于作者[10] 保存数据 *\n")
printf("\t* [0]退出系统 *\n")
printf("\t*****************************************************************\n")
}运行成功,请你下去后慢慢研究下这个程序,很简单的,祝你成功!~
求采纳为满意回答。
#include <iostream>#include <string>
#include <iomanip>
#include <fstream>
using namespace std
struct List
{
string m_Name
string m_ID//可能有的学号里有字母,所以用string类型。
short int m_Chinese
short int m_Match
short int m_English
struct List *Next//指针域。
}
typedef struct List Node
typedef Node *Link
//---------------函数声明-------------------
Link Create(Link Head)
Link Search(Link Head)
Link Search_front(Link Head)
void Release(Link Head)
void Display(Link Head)
void Display_One(Link Head)
void Display(Link Head,fstream&ofile)
Link AddInfo(Link Head)
Link DelInfo(Link Head)
Link Modify(Link Head)
void Grade_Stat(Link Head)
Link Sort(Link Head)
//---------------函数实现-------------------
Link Create(Link Head)
{
/*构造一个头节点*/
Head=(Link)new Node
if(!Head)
{
cout<<"分配内存失败。"<<endl
exit(-1)
}
Head->m_Name=""
Head->m_ID=""
Head->m_Chinese=0
Head->m_Match=0
Head->m_English=0
Head->Next=NULL
return Head
}
Link Search(Link Head)
{
cout<<" 1.按姓名查询 2.按学号查询 "<<endl
int select
cin>>select
while(cin.fail())
{
cout<<"请选择正确的菜单项:"
cin.clear()
fflush(stdin)
cin>>select
}
Link ptr
ptr=Head
if(select==1)
{
string name
cout<<"请输入要查询的姓名:"
cin>>name
while(ptr!=NULL)
{
if(ptr->m_Name==name)
{
Display_One(ptr)
return ptr
}
ptr=ptr->Next
}
cout<<"没找到,怎么办?"<<endl
}
else if(select==2)
{
string ID
cout<<"请输入要查询的学号:"
cin>>ID
while(ptr!=NULL)
{
if(ptr->m_ID==ID)
{
Display_One(ptr)
return ptr
}
ptr=ptr->Next
}
cout<<"没找到,怎么办?"<<endl
}
return ptr
}
Link Search_front(Link Head)
{//返回前驱节点。
cout<<" 1.按姓名删除 2.按学号删除 "<<endl
int select
cin>>select
while(cin.fail())
{
cout<<"请选择正确的菜单项:"
cin.clear()
fflush(stdin)
cin>>select
}
Link ptr
Link front
ptr=Head->Next
front=Head
if(select==1)
{
string name
cout<<"请输入要删除的姓名:"
cin>>name
while(ptr!=NULL)
{
if(ptr->m_Name==name)
{
Display_One(ptr)
return front
}
ptr=ptr->Next
front=front->Next
}
cout<<"没找到,怎么办?"<<endl
}
else if(select==2)
{
string ID
cout<<"请输入要删除的学号:"
cin>>ID
while(ptr!=NULL)
{
if(ptr->m_ID==ID)
{
Display_One(ptr)
return front
}
ptr=ptr->Next
front=front->Next
}
cout<<"没找到,怎么办?"<<endl
}
return front
}
void Release(Link Head)
{
Link ptr
while(Head!=NULL)
{
ptr=Head
Head=Head->Next
delete ptr
}
}
void Display(Link Head)
{
Link ptr
ptr=Head->Next
cout<<"----------------------------------------------------------------------"<<endl
cout<<"---------------------------- 所有学生信息 --------------------------"<<endl
cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl
while(ptr!=NULL)
{
cout<<setw(15)<<left<<ptr->m_Name
<<setw(15)<<left<<ptr->m_ID
<<setw(15)<<left<<ptr->m_Chinese
<<setw(15)<<left<<ptr->m_Match
<<setw(15)<<left<<ptr->m_English<<endl
ptr=ptr->Next
}
}
void Display(Link Head,fstream&ofile)
{
Link ptr
ptr=Head->Next
ofile<<"----------------------------------------------------------------------"<<endl
ofile<<"---------------------------- 所有学生信息 --------------------------"<<endl
ofile<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl
while(ptr!=NULL)
{
ofile<<setw(15)<<left<<ptr->m_Name
<<setw(15)<<left<<ptr->m_ID
<<setw(15)<<left<<ptr->m_Chinese
<<setw(15)<<left<<ptr->m_Match
<<setw(15)<<left<<ptr->m_English<<endl
ptr=ptr->Next
}
}
void Display_One(Link Head)
{
Link ptr
ptr=Head
cout<<"----------------------------------------------------------------------"<<endl
cout<<"---------------------------- 查询结果信息 --------------------------"<<endl
cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl
cout<<setw(15)<<left<<ptr->m_Name
<<setw(15)<<left<<ptr->m_ID
<<setw(15)<<left<<ptr->m_Chinese
<<setw(15)<<left<<ptr->m_Match
<<setw(15)<<left<<ptr->m_English<<endl
}
Link AddInfo(Link Head)
{
Link ptr
ptr=Head
while(ptr->Next!=NULL)
{
ptr=ptr->Next
}
Link ptr2
char again
do
{
ptr2=(Link)new Node
if(!ptr2)
{
cout<<"内存分配失败!"<<endl
exit(-1)
}
//数据域
string Name,ID
short int Chinese,Match,English
cout<<"输入姓名:"
cin>>Name
cout<<endl<<"输入学号:"
cin>>ID
cout<<endl<<"语文成绩:"
cin>>Chinese
cout<<endl<<"数据成绩:"
cin>>Match
cout<<endl<<"英语成绩:"
cin>>English
ptr2->m_Name=Name
ptr2->m_ID=ID
ptr2->m_Chinese=Chinese
ptr2->m_Match=Match
ptr2->m_English=English
//指针域
ptr2->Next=NULL//作为尾节点。
ptr->Next=ptr2//连接入链表。
ptr=ptr2//将ptr2作为下一次产生的节点的前驱节点.
cout<<"是否继续输入?(Y/N) "
cin>>again
}while(again=='Y'||again=='y')
return Head
}
Link DelInfo(Link Head)
{
Link ptr
Link ptr2
ptr=Head
Link f_ptr//前驱节点。
f_ptr=Search_front(ptr)
ptr2=f_ptr->Next
f_ptr->Next=f_ptr->Next->Next
delete ptr2
return Head
}
Link Modify(Link Head)
{
Link ptr
ptr=Head
ptr=Search(ptr)
cout<<"修改前信息为:"<<endl
Display_One(ptr)
//cout<<"请选择你要修改的选项:A:姓名 B:学号 C:语文成绩 D:数学成绩 E:英语成绩"<<endl
string name,ID
float Chinese,Match,English
cout<<"输入新姓名:"
cin>>name
cout<<endl<<"输入新学号:"
cin>>ID
cout<<endl<<"输入新语文成绩:"
cin>>Chinese
cout<<endl<<"输入新数学成绩:"
cin>>Match
cout<<endl<<"输入新英语成绩:"
cin>>English
ptr->m_Name=name
ptr->m_ID=ID
ptr->m_Chinese=Chinese
ptr->m_Match=Match
ptr->m_English=English
cout<<endl<<"修改后信息为:"<<endl
Display_One(ptr)
return Head
}
void Grade_Stat(Link Head)
{//成绩统计。
Link ptr
ptr=Head
cout<<"请输入你要查询的课程名(chinese|match|english)和一个分数范围[min,max]."<<endl
string name
short int min,max
int SwitchNum
cout<<"课程名:"
cin>>name
cout<<endl<<"分数下限:"
cin>>min
cout<<endl<<"分数上限:"
cin>>max
if(name=="chinese")
SwitchNum=1
else if(name=="match")
SwitchNum=2
else if(name=="english")
SwitchNum=3
else
{
cout<<"请输入一个正确的课程名:"<<endl
return
}
while(ptr!=NULL)
{
switch(SwitchNum)
{
case 1:
if(ptr->m_Chinese<=max&&ptr->m_Chinese>=min)
Display_One(ptr)
break
case 2:
if(ptr->m_Match<=max&&ptr->m_Match>=min)
Display_One(ptr)
break
case 3:
if(ptr->m_English<=max&&ptr->m_English>=min)
Display_One(ptr)
}
}
}
Link Sort(Link Head)
{//我创建的是带头节点的链表。用直接插入法。
cout<<"请输入你想排序的课程名(用中文):"
string course_name
cin>>course_name
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!"<<endl
return Head
}
//-----------第二步;
Link ptr
Link ptr_F
Link ptr_N
ptr=Head->Next->Next
ptr_F=Head
Head->Next->Next=NULL//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->Next
ptr_F=Head//ptr_F的归位。
while(ptr_F->Next)
{
if(course_name=="语文")
{
if(ptr->m_Chinese>ptr_F->Next->m_Chinese)
{
ptr->Next=ptr_F->Next
ptr_F->Next=ptr
break
}//if
else
{
ptr_F=ptr_F->Next
}
}
if(course_name=="数学")
{
if(ptr->m_Match>ptr_F->Next->m_Match)
{
ptr->Next=ptr_F->Next
ptr_F->Next=ptr
break
}//if
else
{
ptr_F=ptr_F->Next
}
}
if(course_name=="英语")
{
if(ptr->m_English>ptr_F->Next->m_English)
{
ptr->Next=ptr_F->Next
ptr_F->Next=ptr
break
}//if
else
{
ptr_F=ptr_F->Next
}
}
}//while(ptr_F->Next)
if(ptr_F->Next==NULL)
{
ptr->Next=ptr_F->Next
ptr_F->Next=ptr//表示插到有序链表的最后面了。
}
ptr=ptr_N//归位,准备下一次排序。
}//while(ptr)
cout<<"从高到低,排序成功!"<<endl
return Head
}
//----------主函数----------------------
int main()
{
fstream ofile
ofile.open("e:\\student.txt",ios_base::out)
if(!ofile)
{
cout<<"文件打开失败。"<<endl
exit(-1)
}
Link head=0
head=Create(head)
while(1)
{
cout<<"*****************************************************"<<endl
cout<<"*** 1.添加信息 2.修改信息 3.删除信息 4.信息查询 ***"<<endl
cout<<"*** 5.成绩统计 6.排 序 7.显示/保存 0.退 出 ***"<<endl
cout<<"*****************************************************"<<endl
cout<<"请选择正确的菜单项:"
int sel
cin>>sel
while(cin.fail())
{
cout<<"请选择正确的菜单项:"
cin.clear()
fflush(stdin)
cin>>sel
}
switch(sel)
{
case 0:
exit(0)
case 1:
head=AddInfo(head)
break
case 2:
head=Modify(head)
break
case 3:
head=DelInfo(head)
break
case 4:
Search(head)
break
case 5:
Grade_Stat(head)
break
case 6:
Sort(head)
break
case 7:
Display(head)//在标准显示器上显示。
Display(head,ofile)//在文件中显示。
break
default:
break
}
}
Release(head)
return 0
}
换一下汉字就好了
根据自己的需要,自己看着修改一下 ^^#include<stdio.h>
#include<stdlib.h>
int N1,N2,kk1,kk2,kk3
struct couse * head1
struct student * head2
struct couse//课程信息结构体
{
int num1
char name1[20]
int score
int nelepeo//课程已选人数
int Melepeo//课程人数上限
struct couse * next
}
struct student//学生信息结构体
{
int num2
char name2[20]
int nelenum[50]//已选课程编号
int nelen//已选课程数量
struct student * next
}
void Ms()
{
for(kk1=0kk1<1100kk1++)
for(kk2=0kk2<1200kk2++)
for(kk3=0kk3<1200kk3++)
}
void keyboardc()//录入课程子函数(从键盘录入)
{
struct couse *p1,*p2
N1=0
p1=p2=(struct couse*)malloc(sizeof(struct couse))
printf("课程编号\t课程名称\t学分\t课程人数上限\n")
scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo)
p1->nelepeo=0
head1=NULL
while(p1->num1!=0)
{
N1=N1+1
if(N1==1)head1=p1
else p2->next=p1
p2=p1
p1=(struct couse * )malloc(sizeof(struct couse))
scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo)
p1->nelepeo=0
}
p2->next=NULL
}
void filec()//录入键盘子函数(从文件录入)
{
FILE * fp
char filepath[20]
struct couse *p1,*p2
N1=0
printf("输入要读入的文件路径:")
getchar()
gets(filepath)
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!\n",filepath)
exit(0)
}
p1=p2=(struct couse*)malloc(sizeof(struct couse))
fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo)
head1=NULL
while(!feof(fp))
{
N1=N1+1
if(N1==1)head1=p1
else p2->next=p1
p2=p1
p1=(struct couse * )malloc(sizeof(struct couse))
fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo)
}
p2->next=NULL
}
void inputc()//录入课程主函数
{
int i
printf("\t\t\t录入课程信息\n")
printf("\n1.从键盘录入\n")
printf("2.从文件录入\n")
printf("3.返回主菜单\n")
printf("请选择(1~3):\n")
scanf("%d",&i)
switch(i)
{
case(1):keyboardc()break
case(2):filec()break
case(3):break
}
}
void insertc(struct couse *incouse)//课程管理子函数(增加课程)
{
struct couse *p0,*p1,*p2
p1=head1
p0=incouse
if(head1==NULL)
{
head1=p0
p0->next=NULL
}
else
{
while((p0->num1 >p1->num1) &&(p1->next!=NULL))
{
p2=p1
p1=p1->next
}
if(p0->num1 <= p1->num1)
{
if(head1==p1) head1=p0
else p2->next=p0
p0->next=p1
}
else
{
p1->next=p0
p0->next=NULL
}
}
N1=N1+1
}
void delc(int num1)//课程管理子函数(删除课程)
{
struct couse *p1,*p2
if(head1==NULL)
{
printf("\n没有课程,无法删除!\n")
goto end
}
p1=head1
while(num1!=p1->num1 &&p1->next!=NULL)
{
p2=p1
p1=p1->next
}
if(num1==p1->num1)
{
if(p1==head1) head1=p1->next
else p2->next=p1->next
printf("已删除该编号课程!\n")
N1=N1-1
}
else printf("无该编号的课程!\n")
end:
}
void managementc()//课程管理主函数
{
struct couse * incouse
int i,num1
printf("\t\t\t课程管理\n")
printf("1.新增课程\n")
printf("2.删除课程\n")
printf("3.返回主菜单\n")
printf("请选择(1~3):\n")
scanf("%d",&i)
switch(i)
{
case(1):
{
incouse=(struct couse *)malloc(sizeof(struct couse))
printf("课程编号\t课程名称\t学分\t课程人数上限\n")
scanf("%d%s%d%d",&incouse->num1,incouse->name1,&incouse->score,&incouse->Melepeo)
incouse->nelepeo=0
insertc(incouse)
break
}
case(2):
{
printf("请输入要删除课程的编号:\n")
scanf("%d",&num1)
delc(num1)
break
}
case(3):break
}
}
void keyboards()//录入学生信息子函数(从键盘录入)
{
int i
struct student *p1,*p2
N2=0
p1=p2=(struct student *)malloc(sizeof(struct student))
printf("学生学号\t学生姓名\n")
scanf("%d%s",&p1->num2,p1->name2)
p1->nelen=0
for(i=0i<20i++) p1->nelenum[i]=0
head2=NULL
while(p1->num2!=0)
{
N2=N2+1
if(N2==1)head2=p1
else p2->next=p1
p2=p1
p1=(struct student * )malloc(sizeof(struct student))
scanf("%d%s",&p1->num2,p1->name2)
p1->nelen=0
for(i=0i<20i++) p1->nelenum[i]=0
}
p2->next=NULL
}
void files()//录入学生信息子函数(从文件录入)
{
int i=0
FILE * fp
char filepath[20]
struct student *p1,*p2
N2=0
printf("输入要读入的文件路径:")
getchar()
gets(filepath)
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!\n",filepath)
exit(0)
}
p1=p2=(struct student*)malloc(sizeof(struct student))
fread(p1,sizeof(struct student),1,fp)
head2=NULL
while(!feof(fp))
{
i=0
N2=N2+1
if(N2==1)head2=p1
else p2->next=p1
p2=p1
p1=(struct student * )malloc(sizeof(struct student))
fread(p1,sizeof(struct student),1,fp)
}
p2->next=NULL
}
void inputs()//录入学生信息主函数
{
int i
printf("\t\t\t录入学生信息\n")
printf("\n1.从键盘录入\n")
printf("2.从文件录入\n")
printf("3.返回主菜单\n")
printf("请选择(1~3):\n")
scanf("%d",&i)
switch(i)
{
case(1):keyboards()break
case(2):files()break
case(3):break
}
}
void inserts(struct student * incouse)//学生信息管理子函数(填加学生信息)
{
struct student *p0,*p1,*p2
p1=head2
p0=incouse
if(head2==NULL)
{
head2=p0
p0->next=NULL
}
else
{
while((p0->num2 >p1->num2) &&(p1->next!=NULL))
{
p2=p1
p1=p1->next
}
if(p0->num2 <= p1->num2)
{
if(head2==p1) head2=p0
else p2->next=p0
p0->next=p1
}
else
{
p1->next=p0
p0->next=NULL
}
}
N2=N2+1
}
void dels(int num2)//学生信息管理子函数(删除学生信息)
{
struct student *p1,*p2
if(head2==NULL)
{
printf("\n没有该学生信息,无法删除!\n")
goto end
}
p1=head2
while(num2!=p1->num2 &&p1->next!=NULL)
{
p2=p1
p1=p1->next
}
if(num2==p1->num2)
{
if(p1==head2) head2=p1->next
else p2->next=p1->next
printf("已删除该学生信息!\n")
N2=N2-1
}
else printf("无该学号的学生!\n")
end:
}
void managements()//学生信息管理主函数
{
struct student * incouse
int i,num2
printf("\t\t\t学生信息管理\n")
printf("1.新增学生信息\n")
printf("2.删除学生信息\n")
printf("3.返回主菜单\n")
printf("请选择(1~3):\n")
scanf("%d",&i)
switch(i)
{
case(1):
{
incouse=(struct student *)malloc(sizeof(struct student))
incouse->nelen=0
incouse->nelenum[0]=0
printf("学生学号\t学生姓名\n")
scanf("%d%s",&incouse->num2,incouse->name2)
inserts(incouse)
break
}
case(2):
{
printf("请输入要删除学生的学号:\n")
scanf("%d",&num2)
dels(num2)
break
}
case(3):break
}
}
void elect(struct student * s)//选课
{
struct couse * p
int num1,i
printf("请输入要选课的编号:\n")
scanf("%d",&num1)
for(i=0s->nelenum[i]!=0i++)
s->nelenum[i]=num1
(s->nelen)++
p=head1
while(p->num1!=num1) p=p->next
(p->nelepeo)++
}
void cheak()//学生选课子函数(查询可选课程)
{
char e
struct couse * c
struct student * s
int num2,i,j=0,t=0
printf("请输入你的学号:")
scanf("%d",&num2)
s=head2
while(s->num2!=num2 &&s->next!=NULL) s=s->next
if(s->num2!=num2)
{
printf("不存在你的信息,请进入主菜单录入你的信息!\n")
goto end
}
c=head1
printf("你的可选课程编号:\n")
while(c!=NULL)
{
for(t=0,i=0s->nelenum[i]!=0i++)
{
if(c->num1==s->nelenum[i]) t=1
}
if(t==0 &&(c->nelepeo!=c->Melepeo))
{
printf("%d\n",c->num1)
j++
}
c=c->next
}
if(j==0)
{
printf("你已选完所有课程,无法再多选!\n")
goto end
}
printf("选课(y/n)?:\n")
getchar()
e=getchar()
i=0
while(e=='y')
{
elect(s)
printf("继续选课(y/n)?:\n")
getchar()
e=getchar()
}
end:
}
void back(struct student * p)//退课
{
struct couse * p1
int num1,i,j
printf("请输入你要退掉的课程编号:\n")
scanf("%d",&num1)
p1=head1
while(p1->num1!=num1) p1=p1->next
for(i=0p->nelenum[i]!=num1i++)
for(j=ip->nelenum[j]!=0j++) p->nelenum[j]=p->nelenum[j+1]
p->nelenum[--j]=0
(p1->nelepeo)--
printf("退课成功!\n")
}
void hcheak()//学生选课子函数(查询已选课程)
{
char c
struct couse * p0
struct student * p
int num2,i,f=0
printf("请输入学号:\n")
scanf("%d",&num2)
p=head2
while(p->num2!=num2 &&p!=NULL) p=p->next
if(p==NULL)
{
printf("不存在你的信息,请回主菜单录入信息:\n")
goto end
}
printf("已选课程编号:\n")
if(p->nelenum[0]==0)
{
printf("你还没选课!\n")
goto end
}
for(i=0p->nelenum[i]!=0i++)
{
printf("%d\n",p->nelenum[i])
p0=head1
while(p0->num1!=p->nelenum[i]) p0=p0->next
f=f+p0->score
}
printf("总学分:%d\n",f)
printf("是否进行退课(y/n)?")
getchar()
c=getchar()
while(c=='y')
{
back(p)
printf("继续退课(y/n)?")
getchar()
c=getchar()
(p->nelen)--
}
end:
}
void elective()//学生选课主函数
{
int i
printf("\t\t\t学生选课\n")
printf("1.查询可选课程\n")
printf("2.查询已选课程\n")
printf("3.返回主菜单\n")
printf("请输入(1~3):\n")
scanf("%d",&i)
switch(i)
{
case(1):cheak()break
case(2):hcheak()break
case(3):break
}
}
void listc()//输出课程信息
{
struct couse * p
p=head1
printf("课程编号 课程名称 学分 课程已选人数 课程人数上限\n")
while(p!=NULL)
{
printf("%-8d%10s%6d%8d%12d\n",p->num1,p->name1,p->score,p->nelepeo,p->Melepeo)
p=p->next
}
}
void lists()//输出学生信息
{
struct student * p
p=head2
printf("学生学号 学生姓名 已选课程数量\n")
while(p!=NULL)
{
printf("%-4d %10s %6d\n",p->num2,p->name2,p->nelen)
p=p->next
}
}
void intoc()//存储课程信息
{
FILE * fp
struct couse * p
char filepath[30]
printf("输入课程信息要保存的文件路径:")
getchar()
gets(filepath)
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失败!")
exit(0)
}
p=head1
while(p!=NULL)
{
fprintf(fp,"%d %s %d %d %d\n",p->num1,p->name1,p->score,p->nelepeo,p->Melepeo)
p=p->next
}
fclose(fp)
printf("课程信息已保存在%s中!\n",filepath)
}
void intos()//存储学生信息
{
FILE * fp
struct student * p
char filepath[30]
printf("输入学生信息要保存的文件路径:")
getchar()
gets(filepath)
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失败!")
exit(0)
}
p=head2
while(p!=NULL)
{
fwrite(p,sizeof(struct student),1,fp)
p=p->next
}
fclose(fp)
printf("学生信息已保存在%s中!\n",filepath)
}
void into()//存储信息
{
int i
printf("1.存储课程信息\n")
printf("2.存储学生信息\n")
printf("3.返回主菜单\n")
printf("请输入(1~3)\n")
scanf("%d",&i)
switch(i)
{
case(1):intoc()break
case(2):intos()break
case(3):break
}
}
void store()//信息主函数
{
int i
printf("\t\t系统信息查看及存储\n")
printf("1.查看课程信息\n")
printf("2.查看学生信息\n")
printf("3.存储信息\n")
printf("4.返回主菜单\n")
printf("请输入(1~4):\n")
scanf("%d",&i)
switch(i)
{
case(1):listc()break
case(2):lists()break
case(3):into()break
case(4):break
}
}
int main()//主函数
{
int i
start:
printf("\n\t\t\t欢迎使用学生选课系统!\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("\n请输入菜单选项(1~7):\n")
scanf("%d",&i)
if(i<1 || i>7)
{
printf("输入错误,请重输:\n")
goto start
}
switch(i)
{
case(1):
{
system("cls")
inputc()
goto start
break
}
case(2):
{
system("cls")
managementc()
goto start
break
}
case(3):
{
system("cls")
inputs()
goto start
break
}
case(4):
{
system("cls")
managements()
goto start
break
}
case(5):
{
system("cls")
elective()
goto start
break
}
case(6):
{
system("cls")
store()
goto start
break
}
case(7):
{
system("cls")
printf("感谢使用本系统!\n\n再见!\n")
}
}
return(0)
}