C语言学生选课系统

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 17:04   35   0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//课程结构体
typedef struct cou
{
char name[40];//课程名
float sco;//成绩
struct cou* next;
}cou;


//学生结构体
typedef struct stu
{
int num;//学号
char name[40];//姓名
float ave;//平均分
int cnum;//课程数目
cou *chead;//课程结构体的头指针
cou *ctail;//课程结构体的尾指针
struct stu *next;
}stu;


//全局指针
stu *head=NULL;//指向学生链表的第一个结构体
stu *tail=NULL;//指向学生链表的最后一个

/***************************************************************************
功能:用于加载文件内容到结构体链表: void ini();
***************************************************************************/
void ini()
{
FILE *fp;
fp=fopen("stu.txt","r");

if (fp==NULL)
{
printf("/n提示:学生文件不存在!");
return ;
}

int n=0;
fread(&n,sizeof(int),1,fp);

for (int i=0; i<n; i++)
{
stu *p=(stu*)malloc(sizeof(stu));
fread(p,sizeof(stu),1,fp);
p->next=NULL;
p->chead=NULL;
p->ctail=NULL;
// printf("/n初始化学生%s信息成功!",p->name);
//-----------------------
for (int j=0;j<p->cnum;j++)
{
cou *q=(cou*)malloc(sizeof(cou));
fread(q,sizeof(cou),1,fp);
q->next=NULL;
if (p->chead==NULL)
{
p->chead=q;
p->ctail=q;
}
else
{
p->ctail->next=q;
p->ctail=q;
}

// printf("/n |--->初始化学生%s的%s课程信息成功!",p->name,q->name);
}
//--------------------------

if (head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}

}
fclose(fp);

}
/******************************************************************************
功能:增加一个学生到学生结构体链表 : void addstu()
******************************************************************************/
void addstu()
{
printf("/n/n/n[ 增 加 学 生 ] ");
printf("/n/n请输入学号(整数): ");

loop:

int num=0;
scanf("%d",&num);

//---------------------
//检查学号是否重复
stu *h=head;
while (h)
{
if (h->num==num)
{
printf("/n提示:学号已存在!/n请重新输入学号: ");
goto loop;
}
h=h->next;
}
//---------------------
stu *p=(stu*)malloc(sizeof(stu));
p->ave=0.0;
p->cnum=0;
p->chead=NULL;
p->ctail=NULL;
p->next=NULL;
p->num=num;
printf("/n请输入学生姓名: ");
scanf("%s",p->name);
if (head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}
printf("/n增加学生信息成功!");
}

/******************************************************************************
功能: 从学生链表中删除一个学生结构体 :void delstu()
******************************************************************************/
void delstu()
{
printf("/n/n/n[ 删 除 学 生 ] ");

if (head==NULL)
{
printf("/n/n提示:学生信息为空! ");
return ;
}

printf("/n/n请输入要删除学号: ");
int num=0;
scanf("%d",&num);
bool y=1;
stu *tem=NULL;

if (head->num==num)
{
y=0;
tem=head;
head=head->next;
}
else
{
stu *p=head;
while (p->next)
{
if (p->next->num==num)
{
y=0;
tem=p->next;
p->next=p->next->next;
break;
}
p=p->next;
}
}


if (y)
{
printf("/n/n错误:删除学生的学号不存在!");
}
else
{

printf("/n/n删除学号%d的学生成功 !",tem->num);
//---------------------
cou *q=tem->chead;
cou *qq=NULL;
while (q)
{
qq=q->next;
printf("/n |--->删除课程%s成功 !",q->name);
delete q;
q=qq;
}
//---------------------
delete tem;
}


}

/******************************************************************************
功能: 从一个学生结构体中删除一个或者所有课程 :void delcou()
******************************************************************************/
void delcou()
{
printf("/n/n/n[ 删 除 课 程 ] ");

if (head==NULL)
{
printf("/n/n提示:学生信息为空! ");
return ;
}

printf("/n/n请输入要删除学号: ");
int num=0;
scanf("%d",&num);
bool y=1;
stu *tem=NULL;

stu *p=head;
while (p)
{//1----------

if (p->num==num)
{//2----------

y=0;
if (p->chead==NULL)
{
printf("/n错误:该学生并没有选修课程!");
}
else//3-------------
{

printf("/n请输入删除的课程名(全部删除请输入all): ");
char a[40];
scanf("%s",a);

if (strcmp(a,"all")==0)//如果是删除所有
{
cou *q=p->chead,*t;
while (q)
{
t=q->next;
printf("/n删除学号%d删除课程%s成功 !",p->num,q->name);
delete q;
q=t;
}
p->chead=NULL;
p->ctail=NULL;
p->cnum=0;//课程数为0
}
else//删除单个课程
{ //4----------------------
bool b=0;
cou *q=p->chead,*t;

if (strcmp(q->name,a)==0)//如果第一个就是
{
b=1;
t=q;
p->chead=p->chead->next;
}
else
{

while (q->next)
{
if (strcmp(q->next->name,a)==0)
{
b=1;
t=q->next;
if (t->next==NULL)//如果是最后一个
{
p->ctail=q;//改变尾指针
}
q->next=q->next->next;
break;
}
q=q->next;
}


}


if (b)
{
printf("/n删除学号%d的课程%s成功 !",p->num,t->name);
--(p->cnum);//课程数减1
delete t;
}
else
{
printf("/n错误,您没有选修该课程!");
}


}//4-------

} //3------

break;


}//2-----------

p=p->next;

}//1-------


if (y)
{
printf("/n/n错误:删除学生的学号不存在!");
}


}
/******************************************************************************
功能: 修改学生结构体的信息 :void modifystu()
******************************************************************************/
void modifystu()
{
printf("/n/n/n[ 修 改 学 生 ] ");

if (head==NULL)
{
printf("/n/n提示:学生信息为空! ");
return ;
}

printf("/n/n请输入要修改的学号: ");
int num=0;
scanf("%d",&num);
bool y=1;
stu *tem=NULL;

stu *p=head;
while (p)
{
if (p->num==num)
{
y=0;
printf("/n|-------------------------------------------------------------------|");
printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum);
printf("/n|-------------------------------------------------------------------|");
printf("/n请输入新姓名: ");
scanf("%s",p->name);
printf("/n修改成功,新的学生信息如下:");
printf("/n|-------------------------------------------------------------------|");
printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum);
printf("/n|-------------------------------------------------------------------|");
break;
}

p=p->next;
}

if (y)
{
printf("/n/n错误:修改学生的学号不存在!");
}

}


/******************************************************************************
功能: 从一个学生结构体中修改课程信息 :void modifycou()
******************************************************************************/
void modifycou()
{
printf("/n/n/n[ 修 改 课 程 ] ");

if (head==NULL)
{
printf("/n/n提示:学生信息为空! ");
return ;
}

printf("/n/n请输入要修改的学号: ");
int num=0;
scanf("%d",&num);
bool y=1;
stu *tem=NULL;

stu *p=head;
while (p)
{//1----------

if (p->num==num)
{//2----------

y=0;
if (p->chead==NULL)
{
printf("/n错误:该学生并没有选修课程!");
}
else//3-------------
{

printf("/n请输入要修改的课程名: ");
char a[40];
scanf("%s",a);

bool b=1;
cou *q=p->chead;

while (q)
{
if (strcmp(q->name,a)==0)
{
b=0;
printf("/n|--------------------------------------------|");
printf("/n 课程名:%5s 成绩: %5.2f ",q->name,q->sco);
printf("/n|--------------------------------------------|");
printf("/n请输入新的课程名:");
scanf("%s",q->name);
printf("/n请输入新的成绩:");
scanf("%f",&q->sco);


printf("/n修改成功,新的课程信息如下:");
printf("/n|--------------------------------------------|");
printf("/n 课程名:%5s 成绩: %5.2f ",q->name,q->sco);
printf("/n|--------------------------------------------|");
break;
}
q=q->next;
}


if (b)
{
printf("/n错误,您没有选修该课程!");
}

} //3------

break;


}//2-----------

p=p->next;

}//1-------


if (y)
{
printf("/n/n错误:修改学生的学号不存在!");
}


}

/******************************************************************************
功能: 为一个学生结构体录入课程成绩 :void setsco()
******************************************************************************/
void setsco()
{
printf("/n/n/n[ 录 入 成 绩 ] ");

if (head==NULL)
{
printf("/n/n提示:学生信息为空! ");
return ;
}

printf("/n/n请输入要录入成绩的学生的学号: ");
int num=0;
scanf("%d",&num);
bool y=1;
stu *tem=NULL;

stu *p=head;

while (p)
{//1----------

if (p->num==num)
{//2----------

y=0;
if (p->chead==NULL && p->cnum==0)
{
printf("/n错误:该学生并没有选修课程!");
}
else//3-------------
{
printf("/n该学生选修了如下%d门课程:",p->cnum);

cou *q=p->chead ;
int n=0;
float sum=0;
while (q)
{

printf("/n|--------------------------------------------|");
printf("/n [%d]课程名:%5s 成绩: %5.2f ",++n,q->name,q->sco);
printf("/n|--------------------------------------------|");
printf("/n请录入成绩:");
scanf("%f",&q->sco);
printf("/n课程%s录入成绩%.2f成功!",q->name,q->sco);
sum+=q->sco;
q=q->next;
}

p->ave=sum/n;

} //3------

break;


}//2-----------

p=p->next;

}//1-------


if (y)
{
printf("/n/n错误:学生的学号不存在!");
}


}

/******************************************************************************
功能:加入N个课程结构体到一个学生结构体中: void addcou()
******************************************************************************/
void addcou()
{
printf("/n/n/n[ 学 生 选 课 ] ");
printf("/n/n请输入你的学号: ");
int num=0;
bool y=1;
scanf("%d",&num);

stu *p=head;
while (p)
{
if (p->num==num)
{
y=0;
printf("/n|------------------------------------------------------|");
printf("/n 学号:%5d 姓名:%8s 已选课程数:%4d",p->num,p->name,p->cnum);
printf("/n|------------------------------------------------------|");
if (p->cnum>=10)
{
printf("/n您已经修满了10门课程,请不要选课! ");
return ;
}
printf("/n请输入选修的课程的数目(每个学生最多选10门课程): ");
loop:
int n=0;
scanf("%d",&n);
if (n<0 || p->cnum+n>10)
{
printf("/n错误:请重新输入课程的数目: ");
goto loop;
}

for (int j=0;j<n;j++)
{
cou *q=(cou*)malloc(sizeof(cou));
q->next=0;
q->sco=0;
printf("/n请输入选修第%d门课程名: ",j+1);
scanf("%s",q->name);

if (p->chead==NULL)
{
p->chead=q;
p->ctail=q;
}
else
{
p->ctail->next=q;
p->ctail=q;
}
}



p->cnum+=n;
printf("/n选修%d门课程成功! ",p->cnum);
break;
}
p=p->next;
}
if (y)
{
printf("/n你输入的学号不存在,选课失败 !");
}
}

/******************************************************************************
功能:显示学生信息及课程结构体 :void show()
******************************************************************************/

void show()
{
if (head==NULL)
{
printf("/n提示:学生信息为空!");
return ;
}
stu *p=head;
printf("/n/n/n 学生选课情况信息总表 ");
printf("/n|---------------------------------------------------------------------|");
while (p)
{
printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum);
printf("/n|---------------------------------------------------------------------|");
//------------------------------

cou *q=p->chead;
int n=0;
while (q)
{
printf("/n |-->课程名%d:%5s 成绩: %5.2f ",++n,q->name,q->sco);
printf("/n |--------------------------------------------|");
q=q->next;

}
//------------------------------
printf("/n|---------------------------------------------------------------------|");
p=p->next;
}

}


/******************************************************************************
功能:排序显示学生信息 :void order()
******************************************************************************/

void order()
{
if (head==NULL)
{
printf("/n提示:学生信息为空!");
return ;
}

//计算出结构体个数
stu *p=head;
int n=0;
while (p)
{
n++;
p=p->next;
}

stu **pp=new stu *[n];
p=head;
for (int i=0;i<n;i++)
{
pp[i]=p;
p=p->next;
}


//下面用冒泡法进行排序
for (i=0;i<n-1;i++)
for (int j=0;j<n-1-i;j++)
{
if (pp[j]->ave<pp[j+1]->ave)
{
stu *tem;
tem=pp[j] ;
pp[j]= pp[j+1];
pp[j+1]=tem;
}

}

printf("/n/n 学生成绩排名一览表");
printf("/n|---------------------------------------------------------------------|");
for (i=0;i<n;i++)
{
printf("/n [%d]平均分:%5.2f 学号:%-4d 姓名:%-8s 课程数:%4d",i+1,pp[i]->ave,pp[i]->num,pp[i]->name,pp[i]->cnum);
printf("/n|---------------------------------------------------------------------|");
}

}


/******************************************************************************
功能:查找学生信息及课程结构体 :void look()
******************************************************************************/

void look()
{
if (head==NULL)
{
printf("/n提示:学生信息为空!");
return ;
}

printf("/n/n请输入要查找的学号: ");
int num=0;
scanf("%d",&num);
bool y=1;

stu *p=head;
while (p)
{
if (p->num==num)
{
y=0;
printf("/n查找成功,信息如下:");
printf("/n|---------------------------------------------------------------------|");
printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum);
printf("/n|---------------------------------------------------------------------|");
//------------------------------

cou *q=p->chead;
int n=0;
while (q)
{
printf("/n |-->课程名%d:%5s 成绩: %5.2f ",++n,q->name,q->sco);
printf("/n |--------------------------------------------|");
q=q->next;

}
//------------------------------

}
p=p->next;
}

if (y)
{
printf("/n错误:查找学生的学号不存在!");
}

}


/******************************************************************************
功能:保存学生信息及课程结构体 :void save()
******************************************************************************/
void save()
{
FILE *fp;
fp=fopen("stu.txt","w");
stu *p=head;
int n=0;
while (p)
{
n++;
p=p->next;
}
fwrite(&n,sizeof(n),1,fp);

p=head;
while(p)
{
//printf("/n保存学生%s信息成功!",p->name);
fwrite(p,sizeof(stu),1,fp);

cou*q=p->chead;
while (q)
{
// printf("/n |--->保存课程%s信息成功!",q->name);
fwrite(q,sizeof(cou),1,fp);
q=q->next;
}
p=p->next;

}

fclose(fp);
}

/******************************************************************************
功能: 清空所有信息 :void release()
******************************************************************************/
void release()
{
printf("/n/n/n[ 清 空 信 息 ] ");

if (head==NULL)
{
printf("/n/n提示:文件信息为空! ");
return ;
}

stu *p=head;
stu *pp;
while (p)
{
pp=p->next;
//--------------------------------
cou *q=p->chead;
cou *qq=NULL;
while (q)
{
qq=q->next;
delete q;
q=qq;
}
//--------------------------------
delete p;
p=pp;
}
head=NULL;
tail=NULL;
printf("/n清空系统成功!");
}

/********************************************************************
以下为菜单显示函数
********************************************************************/

void show1()
{
printf("/n/n|-----------------------|");
printf("/n| 主 菜 单 |");
printf("/n|-----------------------|");
printf("/n| A 增 加 学 生 |");
printf("/n|-----------------------|");
printf("/n| B 学 生 选 课 |");
printf("/n|-----------------------|");
printf("/n| C 成 绩 录 入 |");
printf("/n|-----------------------|");
printf("/n| D 信 息 查 询 |");
printf("/n|-----------------------|");
printf("/n| E 系 统 维 护 |");
printf("/n|-----------------------|");
printf("/n| F 退 出 系 统 |");
printf("/n|-----------------------|");
}


void show2()
{
printf("/n/n|---------------------|");
printf("/n| 查询菜单 |");
printf("/n|---------------------|");
printf("/n| A 所有学生信息 |");
printf("/n|---------------------|");
printf("/n| B 单个学生信息 |");
printf("/n|---------------------|");
printf("/n| C 成绩排名信息 |");
printf("/n|---------------------|");
printf("/n| D 退 出 菜 单 |");
printf("/n|---------------------|");

}

void show3()
{
printf("/n/n|---------------------|");
printf("/n| 维护菜单 |");
printf("/n|---------------------|");
printf("/n| A 修改学生信息 |");
printf("/n|---------------------|");
printf("/n| B 修改课程信息 |");
printf("/n|---------------------|");
printf("/n| C 删除学生信息 |");
printf("/n|---------------------|");
printf("/n| D 删除课程信息 |");
printf("/n|---------------------|");
printf("/n| E 清 空 系 统 |");
printf("/n|---------------------|");
printf("/n| F 退 出 菜 单 |");
printf("/n|---------------------|");

}

void main(int argc, char *argv[])
{
ini();
printf("/n 欢迎进入学生选课系统!!!");

char c1;
do
{
show1();
c1=getch();
putchar(c1);

switch (c1)
{
case 'A':
case 'a':addstu(); break;

case 'B':
case 'b':addcou(); break;

case 'C':
case 'c':setsco(); break;

case 'D':
case 'd':
{

char c2;
do
{
show2();
c2=getch();
putchar(c2);

switch (c2)
{

case 'A':
case 'a':show(); break;

case 'B':
case 'b':look(); break;

case 'C':
case 'c':order(); break;
}

} while (c2!='D' && c2!='d');

}
break;


case 'E':
case 'e':
{

char c3;
do
{
show3();
c3=getch();
putchar(c3);
switch (c3)
{
case 'A':
case 'a':modifystu(); break;

case 'B':
case 'b':modifycou(); break;

case 'C':
case 'c':delstu(); break;

case 'D':
case 'd':delcou(); break;

case 'E':
case 'e':release(); break;
}

} while (c3!='F' && c3!='f');

}
break;


default:break;
}

save();

} while (c1!='F' && c1!='f');

printf("/n谢谢您的使用!");

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP