课程设计
#include<stdio.h>
#include <stdlib.h> //成绩数据处理系统#include <string.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct student
{
long num;
char name[20];
float score[3];
float aver;
struct student *next;
};
void denglu(); //登陆系统函数
void t_menu(struct student *head); //老师菜单
void s_menu(struct student *head); //学生菜单
void choose(struct student *head); //功能选择
void input_head(int n,struct student *head); //添加信息
struct student *create_head(struct student*head); //创建头结点
void serch_message(struct student *head); //查找信息菜单
void serch_num(struct student *head); //按照学号查找
void serch_name(struct student *head); //按照姓名查找
void serch_highest(struct student *head);
void insert(struct student *head); //插入新结点
void revise(struct student *head);
void delete_head(struct student *head); //删除结点
void conserve_file(struct student *head); //保存文件
void nopass(struct student *head); //不及格学生信息
struct student *read_file(); //读取文件
void print(struct student *head); //打印函数
void free1(struct student *head); //释放空间
void serch_message1(struct student *head);
int main()
{
system("color 3E");
denglu();
return 0;
}
void denglu()
{
int i;
printf("*********1:老师**********2:学生***********\n");
scanf("%d",&i);
while(1)
{
if(i==1)
{
struct student *head;
//head=(struct student *)malloc(LEN);
head=create_head(head);
t_menu(head);
break;
}
else if(i=2)
{
struct student *head;
head=create_head(head);
s_menu(head);
break;
}
else
printf("请正确输入!\n");
}
}
struct student *create_head(struct student *head) //创建头节点
{
struct student *p;
p=(struct student *)malloc(LEN);
if(p==NULL)
{
printf("创建头节点失败!\n");
exit(-1);
}
p->next=NULL;
return(p);
}
void t_menu(struct student *head)
{
while(1)
{
printf("\t老师您好!!\n");
printf("\n **欢**********迎*************使************用****\n");
printf(" 成绩数据处理系统 \n");
printf(" *************************************************\n\n");
printf("\tSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\n");
printf("\t** 1,添加信息 **\n");
printf("\t** 2,查信息 **\n");
printf("\t** 3,插入找新信息 **\n");
printf("\t** 4,修改成绩 **\n");
printf("\t** 5,删除信息 **\n");
printf("\t** 6,不及格的信息 **\n");
printf("\t** 7,保存到文件test.txt **\n");
printf("\t** 8,读取test.txt的信息 **\n");
printf("\t** 9,输出链表 **\n");
printf("\t** 0,退出程序 **\n");
printf("\tSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\n");
printf("\t请输入你的选择[ ]\b\b\b");
choose(head);
}
}
void s_menu(struct student *head) //学生菜单
{
int a;
printf(" 同学你好!\n");
printf("\n **欢**********迎*************使************用****\n");
printf(" \t 成绩数据处理系统 \n");
printf(" *************************************************\n\n");
while(1)
{
printf("\tSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\n");
printf("\t** 1,显示所有信息 **\n");
printf("\t** 2,查找信息 **\n");
printf("\t** 3,不及格的信息 **\n");
printf("\t** 0,退出程序 **\n");
printf("\tSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\n");
printf("\t请输入你的选择[ ]\b\b\b");
scanf("%d",&a);
switch(a)
{
case 1:
head->next=read_file();
print(head);
//s_menu(head);
break;
case 2:
serch_message1(head);
break;
case 3:
nopass(head);
break;
case 0:
free1(head); //释放空间
printf("\t****已经退出程序****\t\n");
printf("\t欢迎下次使用!\t\n");
exit(-1);
default:
printf("警告!输入错误!\n\t请重新输入!\n");
break;
}
}
}
void choose(struct student *head)
{
int ch;
int i,n;
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("你想添加几组信息[ ]\b\b\b");
scanf("%d",&n);
input_head(n,head);
break;
case 2:
serch_message(head);
break;
case 3:
insert(head);
print(head);
break;
case 4:
revise(head);
break;
case 5:
delete_head(head);
conserve_file(head);
print(head);
break;
case 6:
nopass(head);
break;
case 7:
conserve_file(head);
print(head);
printf("\t\t保存信息成功!\t\n");
break;
case 8:
head->next=read_file();
print(head);
t_menu(head);
break;
case 9:
print(head);
break;
case 0:
free1(head); //释放空间
printf("\t****已经退出程序****\t\n");
printf("\t\t欢迎下次使用!\t\n");
exit(-1);
default:
printf("警告!输入错误!\n\t请重新输入!\n");
break;
}
}
void input_head(int n,struct student *head)
{
struct student *p,*p1,*q;
p=(struct student *)malloc(LEN);
q=p;
while(n)
{
printf("请输入你要添加的学生的信息!\n");
p1=p;
printf("学号:");
scanf("%ld",&p->num);
printf("姓名:");
scanf("%s",p->name );
printf("高数:");
scanf("%f",&p->score[0]);
printf("英语:");
scanf("%f",&p->score[1]);
printf("C语言成绩:");
scanf("%f",&p->score[2]);
//scanf("%ld%s%f%f%f",&p->num,p->name,&p->score[0],&p->score[1],&p->score[2]);
p->aver=(p->score[0]+p->score[1]+p->score[2])/3;
p=(struct student *)malloc(LEN);
p1->next=p;
n--;
}
p1->next=NULL;
while(head->next!=NULL)
{
head=head->next;
}
head->next=q;
}
void serch_message(struct student *head) //学生查询
{
int a;
while(1)
{
printf("*** 1,按学号查询 ***\n");
printf("*** 2,按姓名查询 ***\n");
printf("*** 3,查询最高分 ***\n");
printf("*** 0,返回 ***\n");
printf("请输入你的选择[ ]\b\b\b");
scanf("%d",&a);
switch(a)
{
case 1:
serch_num(head); /*按学号查询*/
break;
case 2:
serch_name(head); /*按姓名查询*/
break;
case 3:
serch_highest(head); /*最高分查询*/
break;
case 0:
t_menu(head);/* 返回 */
break;
default:
printf("警告!输入错误!\n请重新输入!\n");
break;
}
}
}
void serch_message1(struct student *head)
{
int a;
while(1)
{
printf("*** 1,按学号查询 ***\n");
printf("*** 2,按姓名查询 ***\n");
printf("*** 3,查询最高分 ***\n");
printf("*** 0,返回 ***\n");
printf("请输入你的选择[ ]\b\b\b");
scanf("%d",&a);
switch(a)
{
case 1:
serch_num(head);/*按学号查询*/
break;
case 2:
serch_name(head);/*按姓名查询*/
break;
case 3:
serch_highest(head);/*最高分查询*/
break;
case 0:
s_menu(head);/* 返回 */
break;
default:
printf("警告!输入错误!\n请重新输入!\n");
break;
}
}
}
void serch_num(struct student *head)
{
long a;
int c=1;
printf("请输入你要查询的学生的学号!\n");
scanf("%ld",&a);
while(head->next!=NULL)
{
head=head->next;
if(head->num==a)
{
c=-1;
printf("你查询的学生的信息为:\n");
//printf("%ld %s %f %f %f %f\n",head->num,head->name,head->score[0],head->score[1],head->score[2],head->aver);
printf("学号:%ld ",head->num );
printf("姓名:%s ",head->name );
printf("高数:%f ",head->score[0]);
printf("英语:%f ",head->score[1]);
printf("C语言:%f ",head->score[2]);
printf("平均分:%f\n",head->aver );
}
}
if(c>0)
{
printf("没有找到此学生!\n");
}
}
void serch_name(struct student *head)
{
int b=1;
char a[20];
scanf("%s",a);
while(head->next!=NULL)
{
head=head->next;
if(strcmp(head->name,a)==0)
{
b=-1;
printf("你查询的学生的信息为:\n");
//printf("%ld %s %f %f %f %f\n",head->num,head->name,head->score[0],head->score[1],head->score[2],head->aver);
printf("学号:%ld ",head->num );
printf("姓名:%s ",head->name );
printf("高数:%f ",head->score[0]);
printf("英语:%f ",head->score[1]);
printf("C语言:%f ",head->score[2]);
printf("平均分:%f\n",head->aver );
}
}
if(b>0)
{
printf("没有找到此学生!\n");
}
}
void serch_highest(struct student *head)
{
struct student *p;
float b;
head=head->next;
p=head;
b=head->aver;
while(head->next!=NULL)
{
head=head->next;
if(b<head->aver)
{
b=head->aver;
}
}
while(p->next!=NULL)
{
p=p->next;
if(b==p->aver)
{
printf("平均分最高的学生信息为:\n");
printf("学号:%ld ",p->num );
printf("姓名:%s ",p->name );
printf("高数:%f ",p->score[0]);
printf("英语:%f ",p->score[1]);
printf("C语言:%f ",p->score[2]);
printf("平均分:%f\n",p->aver );
//printf("%ld %s %f %f %f %f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
}
}
}
void insert(struct student *head)
{
struct student *p;
p=(struct student *)malloc(LEN);
printf("请输入你要插入的学生信息:\n");
printf("学号:");
scanf("%ld",&p->num);
printf("姓名:");
scanf("%s",p->name);
printf("高数成绩:");
scanf("%f",&p->score[0]);
printf("英语成绩:");
scanf("%f",&p->score[1]);
printf("C语言成绩:");
scanf("%f",&p->score[2]);
p->aver =(p->score[0]+p->score[1]+p->score[2])/3;
p->next=NULL;
while(head->next!=NULL)
{
head=head->next;
}
head->next=p;
}
void print(struct student *head)
{
int n=0;
printf("学号: \t姓名: \t高数成绩:\t英语成绩:\tC 语言成绩:\t平均分:\n");
while(head->next!=NULL)
{
n++;
head=head->next;
printf("%d \t%s\t%3.2f\t\t%3.2f\t\t%3.2f\t\t%3.2f\t\n",head->num,head->name,head->score[0],head->score[1],head->score[2],head->aver);
}
printf("______________________链表的节数为 %d_____________________\n",n);
}
void revise(struct student *head) /*------修改信息------*/
{
struct student *p;
p=head;
char a[20];
int m=-1;
printf("*************** 请输入要修改学生的姓名 *****************************\n");
scanf("%s",a);
while(p->next!=NULL)
{
if(strcmp(p->name,a)==0)
{
m=1;
printf("*************** 请输入新同学的成绩 *****************************\n");
printf("高数成绩:");
scanf("%f",&p->score[0]);
printf("英语成绩:");
scanf("%f",&p->score[1]);
printf("C语言成绩:");
scanf("%f",&p->score[2]);
head->aver =(p->score[0]+p->score[1]+p->score[2])/3;
break;
}
p=p->next;
}
if(m<0)
printf("没有此学生!!!\n");
}
void delete_head(struct student *head) /* 删除信息 */
{
char name[20];
int a,m=-1;
struct student *p,*q;
p=head;
printf("请输入你要删除的学生的姓名:");
scanf("%s",name);
while(p->next!=NULL)
{
if(strcmp(name,p->next->name)==0)
{
printf("学号: \t姓名: \t高数成绩:\t英语成绩:\tC 语言成绩:\t平均分:\n");
printf("%d \t%s\t%3.2f\t\t%3.2f\t\t%3.2f\t\t%3.2f\t\n",p->next->num,p->next->name,p->next->score[0],p->next->score[1],p->next->score[2],p->next->aver);
printf("是否确定删除该组信息?\n 1:是,2:否[ ]\b\b\b");
scanf("%d",&a);
if(a==1)
{
m=1;
q=p->next;
p->next=p->next->next;
free(q);
printf("********已删除********\n");
break;
}
if(a==2)
{
continue;
}
}
p=p->next;
}
if(m<0)
printf("没有此学生!!!\n");
}
void conserve_file(struct student *head) /*保存文件*/
{
struct student *p;
FILE *fp;
p=head;
if((fp=fopen("test.txt","wb"))==NULL)
{
printf ("没有事先创建test.txt这个文件\n");
exit(-1);
}
while(p->next != NULL)
{
p=p->next;
fwrite(p,LEN,1,fp);
}
fclose(fp);
}
void nopass(struct student *head)
{
int a=1;
while(head->next!=NULL)
{
head=head->next;
if(head->aver<60.0)
{
a=-1;
//printf("%d \t%s\t%3.2f\t\t%3.2f\t\t%3.2f\t\t%3.2f\t\n",head->num,head->name,head->score[0],head->score[1],head->score[2],head->aver);
printf("学号:%ld ",head->num );
printf("姓名:%s ",head->name );
printf("高数:%f ",head->score[0]);
printf("英语:%f ",head->score[1]);
printf("C语言:%f ",head->score[2]);
printf("平均分:%f\n",head->aver );
}
}
if(a>0)
{
printf("没有学生不及格\n");
}
}
struct student *read_file()
{
struct student *p,*q,*head;
FILE *fp;
head=(struct student *)malloc(LEN);
p=(struct student *)malloc(LEN);
if((fp=fopen("test.txt","rb"))==NULL)
{
printf ("\n\tcannot open this file!\n\n");
exit(-1);
}
if(fread(head,LEN,1,fp))
{
q=head;
printf("__________________________________________\n");
while(fread(p,LEN,1,fp))
{printf("%d \t%s\t%3.2f\t\t%3.2f\t\t%3.2f\t\t%3.2f\t\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
q->next=p;
q=p;
p=(struct student *)malloc(LEN);
}
}
q->next=NULL;
fclose(fp);
return (head);
}
void free1(struct student *head) //释放空间
{
struct student *q;
q=(struct student *)malloc(LEN);
q=head;
while(head->next!=NULL)
{
head=head->next;
free(q);
q=head;
}
free(q);
}