该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#include
#define NULL 0
#define LEN sizeof(struct student)
/*定义结构体*/
struct student
{
char name[20];
long int num;
int age;
int English;
int Math;
int Chinese;
int Physics;
int Chemistry;
struct student *next;
};
int AUTO_NUM = 0; /*学号计数*/
int TOTAL_NUM = 0; /*学生总数*/
struct student *head = NULL;
/*函数原型*/
void mainmenu(); /*菜单界面*/
void record(); /*记录数据*/
void insert(struct student *stu); /*插入数据*/
void display(struct student *stu); /*显示学生信息*/
void displayAll(); /*显示所有学生信息*/
void query_by_num(); /*按学号查找*/
void readData(); /*读取文件里学生信息*/
void writeData(); /*向文件写入学生信息*/
void freeAll(); /*清空链表内容*/
void del(); /*删除学生信息*/
void change(); /*更改学生信息*/
void devise(struct student *p); /*选择更改内容*/
/*主函数*/
int main(void)
{
mainmenu();
return 0;
}
/*系统主菜单*/
void mainmenu()
{
int choice;
choice = -1;
readData();
do
{
printf("\n");
printf("\t************欢迎使用学生成绩管理系统**************");
printf("\n");
printf("\t*\t\t[1]----录入学生信息 *\n");
printf("\t*\t\t[2]----浏览学生信息 *\n");
printf("\t*\t\t[3]----修改学生信息 *\n");
printf("\t*\t\t[4]----删除学生信息 *\n");
printf("\t*\t\t[5]----查询学生信息 *\n");
printf("\t*\t\t[0]----退出系统 *\n");
printf("\t**************************************************\n");
printf("\t请输入0~5,输入其他键不起作用哦~\n");
printf("---------------------------------------------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&choice);
switch(choice)
{
case 0:
writeData();
freeAll();
exit(0); /*正常退出*/
case 1:
record();
break;
case 2:
displayAll();
break;
case 3:
change();
break;
case 4:
del();
break;
case 5:
query_by_num();
break;
default:
printf("\n无效选项!");
break;
}
}
while(choice != 0);
}
/*录入学生信息*/
void record()
{
struct student *p0;
p0 = (struct student *)malloc(LEN); /*分配LEN个字节的内存,给类型为struct student*的p0*/
//printf("请输入学生的学号:");
//scanf("%ld",&p0->num);
p0->num = AUTO_NUM + 1;
AUTO_NUM = p0->num;
printf("请输入学生的姓名:");
scanf("%s",p0->name);
printf("请输入学生的年龄:");
scanf("%d",&p0->age);
printf("请输入学生的英语成绩:");
scanf("%d",&p0->English);
printf("请输入学生的数学成绩:");
scanf("%d",&p0->Math);
printf("请输入学生的语文成绩:");
scanf("%d",&p0->Chinese);
printf("请输入学生的物理成绩:");
scanf("%d",&p0->Physics);
printf("请输入学生的化学成绩:");
scanf("%d",&p0->Chemistry);
insert(p0);
printf("该学生的信息:\n");
printf("---------------------------------------------------------------------\n");
printf("学号\t姓名\t\t年龄\t英语\t数学\t语文\t物理\t化学\n");
display(p0);
printf("---------------------------------------------------------------------\n");
}
/*插入学生信息*/
void insert(struct student *stu)
{
struct student *p0, *p1, *p2;
p1 = head;
p0 = stu;
if (head == NULL)
{
head = p0;
p0->next = NULL;
}
else
{
while((p0->num > p1->num) && (p1->next != NULL))
{
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1)
head = p0;
else
{
p2->next = p0;
p0->next = p1;
}
}
else
{
p1->next = p0;
p0->next = NULL;
}
}
TOTAL_NUM++;
}
/*显示学生信息*/
void display(struct student *p)
{
printf("%ld\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n", p->num, p->name, p->age, p->English, p->Math, p->Chinese, p->Physics, p->Chemistry);
}
void displayAll()
{
struct student *p;
printf("学生总数:%d\n", TOTAL_NUM);
p = head;
if(head != NULL)
{
printf("学号\t姓名\t\t年龄\t英语\t数学\t语文\t物理\t化学\n");
printf("---------------------------------------------------------------------\n");
do
{
display(p);
p = p->next;
}
while(p != NULL);
}
printf("---------------------------------------------------------------------\n");
printf("\n");
}
/*按学号查找*/
void query_by_num()
{
long int num;
struct student *p1;
printf("请输入学号:");
scanf("%ld", &num);
if(head == NULL)
{
printf("无学生记录\n");
return;
}
p1 = head;
while(num != p1->num && p1->next != NULL)
p1 = p1->next;
if(num == p1->num)
{
printf ("学号\t姓名\t\t年龄\t英语\t数学\t语文\t物理\t化学\n");
printf ("---------------------------------------------------------------------\n");
display(p1);
}
else
printf("没有该学生记录,请核实!");
}
/*写入文件*/
void writeData()
{
FILE *fp; /*文件指针*/
struct student *p;
fp = fopen("stu.txt","w"); /*第一个参数是文件路径,第二个参数是打开方式,w 打开只写文件*/
if(!fp)
{
printf("文件打开错误!");
return;
}
fprintf(fp,"%d\n", TOTAL_NUM);
for(p = head;p != NULL;p = p->next)
{
fprintf(fp,"%ld\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n", p->num, p->name, p->age, p->English, p->Math, p->Chinese, p->Physics, p->Chemistry);
}
fclose(fp); /*关闭文件*/
}
/*读取文件*/
void readData()
{
FILE *fp;
struct student *p1, *p2;
fp = fopen("stu.txt","r"); /*r以只读方式打开文件,该文件必须存在*/
if(!fp)
{
printf("文件打开错误!");
return;
}
fscanf(fp,"%d\n",&TOTAL_NUM);
head = p1 = p2 = (struct student *)malloc(LEN);
fscanf(fp,"%ld\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n", p1->num, p1->name, p1->age, p1->English, p1->Math, p1->Chinese, p1->Physics, p1->Chemistry);
while(!feof(fp)) /*feof()函数为检查文件是否结束*/
{
p1 = (struct student *)malloc(LEN);
fscanf(fp,"%ld\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n", p1->num, p1->name, p1->age, p1->English, p1->Math, p1->Chinese, p1->Physics, p1->Chemistry);
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
fclose(fp);
}
/*清空链表*/
void freeAll()
{
struct student *p1,*p2;
p1 = p2 = head;
while(p1)
{
p2 = p1->next;
free(p1); /*释放malloc函数申请的动态内存*/
p1 = p2;
}
}
/*按学号删除信息*/
void del()
{
struct student *p1, *p2;
long int num;
if(head == NULL)
{
printf("无学生记录!");
return;
}
printf("请输入您要删除学生的学号:");
scanf("%d",&num);
p1 = head;
while(num != p1->num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if(num == p1->num)
{
if(p1 == head)
head = p1->next;
else
p2->next = p1->next;
free(p1);
TOTAL_NUM--;
printf("信息删除成功!");
}
else
printf("无该学生记录,请核对!");
}
/*更改信息*/
void change()
{
struct student *p1, *p2;
long int num;
if(head == NULL) /*判断是否为空*/
{
printf("无学生记录!");
return;
}
printf("请输入您要修改学生的学号:");
scanf("%d",&num);
p1 = head;
while(num != p1->num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if(num == p1->num)
devise(p1);
else
printf("无该学生记录,请核对!");
}
/*修改内容*/
void devise(struct student *p)
{
int choice;
choice = -1;
do
{
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("│ [0]-------取消修改 │\n");
printf("└--------------------------------┘\n");
printf("请输入您的选择:");
scanf("%d",&choice);
switch(choice)
{
case 0:
return;
case 1:
printf("请输入修改后的姓名:");
scanf("%s", p->name);
printf("修改成功!");
break;
case 2:
printf("请输入修改后的年龄:");
scanf("%d", &p->age);
printf("修改成功!");
break;
case 3:
printf("请输入修改后的英语成绩:");
scanf("%d", &p->English);
printf("修改成功!");
break;
case 4:
printf("请输入修改后的数学成绩:");
scanf("%d", &p->Math);
printf("修改成功!");
break;
case 5:
printf("请输入修改后的语文成绩:");
scanf("%d", &p->Chinese);
printf("修改成功!");
break;
case 6:
printf("请输入修改后的物理成绩:");
scanf("%d", &p->Physics);
printf("修改成功!");
break;
case 7:
printf("请输入修改后的化学成绩:");
scanf("%d", &p->Chemistry);
printf("修改成功!");
break;
default:
printf("\n无效的选项!");
break;
}
}
while(choice != 0);
}