本系统由本人与Hakuuna、共同完成。
#include<stdio.h>
#include<stdlib.h>//引用暂停和清屏函数
#include <string.h>
#include <conio.h>
#define LEN sizeof(struct student)
int studentTotle=0;//定义学生人数为全局变量
typedef struct student
{
char name[20]; //姓名
char num[15]; //学号
char sex[10]; //性别
char from[20]; //籍贯
char phone[15]; //手机号
char QQ[15]; //QQ号
char dorm[10]; //宿舍
char zy[20];///专业
int grade;//综测成绩
char beizhu[50];///备注
struct student *next; //结构体指针
}stu;
//主菜单 以及对应的管理员和用户的菜单
int menu();//主菜单
int menu_admin();//管理员权限菜单
int menu_user();//用户权限菜单
int userslogin();//用户密码登录
int managerslogin();//管理员密码登录
//管理员的功能: 增删查改
struct student *AppendNode(struct student *head);//添加信息
int only_num(struct student *head,struct student *p);//对于学号是否唯一的判断
void DisplyNode(struct student *head);//显示信息
struct student *DelNode(struct student *head);//删除信息
struct student *Change(struct student *head);//修改信息
void average_grade(struct student *head);//综测成绩的平均和求和
//用户查询
void Find(struct student *head); //查询信息
void find_user_num(struct student *head);//查询函数,用户查询,按学号查询
void find_user_name(struct student *head);//查询函数,用户查询,按姓名查询
int menu_user_find();//用户查找信息菜单
//排序 分为两个排序内容 分别是成绩的升序和降序
void PrintSort();//排序菜单
struct student *Sort(struct student *head);//排序
struct student * sort1(struct student *head);// 升序
struct student * sort2(struct student *head);//降序
struct student * sort3(struct student *head);//zy排序
void swapStruct(struct student *p,struct student *k);//排序的交换
//文件的写入与读出
void WriteFile(struct student *head);//将内容写入文件
struct student *ReadFile(struct student *head);//读文件
//主函数
int main()
{
struct student *head=NULL; //学生链表开始为空
int answer=100; //用户的回答
int c;
head=ReadFile(head);
do {
system("cls");//清屏
answer=menu();//调用主菜单 返回一个用户的选择
switch(answer)//根据用户选择进入不同界面
{
case 1: //管理员菜单
system("cls");//清屏
managerslogin();//管理员密码登录
do{
system("cls");//清屏
c=menu_admin();
switch(c)//根据用户选择进入不同界面,管理员界面
{
case 1: //输入相关数据
system("cls");//清屏
head=AppendNode(head);//生成数据链表,返回头节点
break;
case 2://删除数据
system("cls");//清屏
head=DelNode(head);
break;
case 3://修改数据
system("cls");//清屏
head=Change(head);//修改
break;
case 4://显示数据
system("cls");//清屏
DisplyNode(head);//显示
break;
case 5://综测成绩排序
system("cls");//清屏
head=Sort(head);
break;
case 6://综测成绩的平均和求和
system("cls");//清屏
average_grade(head);
break;
}
} while (c!=7);
break;
case 2://用户菜单
system("cls");//清屏
userslogin();//用户密码登录
do{
system("cls");//清屏
c=menu_user();
switch(c)//根据用户选择进入不同界面
{
case 1://查看数据
system("cls");//清屏
Find(head);
break;
}
}
while (c!=2);
printf(" 按任意键返回主菜单……");
break;
}
} while(answer!=3);//选择3则退出系统
return 0;
}
//菜单函数实现对具体操作的选择
int menu()//主菜单
{
int c;
printf("\t 欢迎您使用通讯录管理系统\n");
printf("\n");
printf("\t ************************************************************\n");
printf("\t * 【1】 管理员登陆 *\n");
printf("\t * 【2】 用户登陆 *\n");
printf("\t * 【3】 退出 *\n");
printf("\t * 请选择: *\n");
printf("\t ************************************************************\n");
scanf("%d",&c);
return c;
}
int menu_admin()//管理员菜单界面
{
int c;
printf("\n\n\n\n\n\t ************************************************************\n");
printf(" \t 欢迎管理员登陆\n");
printf("\t ************************************************************\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 ---- >> 返回主菜单 *\n");
printf("\t * 请选择: *\n");
printf("\t ************************************************************\n");
scanf("%d",&c);
return c;
}
int menu_user()//用户菜单界面
{
int c;
printf("\t 欢迎用户登陆 \n");
printf("\n");
printf("\t ************************************************************\n");
printf("\t * 1 ---- >> 查询 *\n");
printf("\t * 2 ---- >> 返回主菜单 *\n");
printf("\t * 请选择: *\n");
printf("\t ************************************************************\n");
scanf("%d",&c);
return c;
}
int userslogin()//用户密码登录
{
char zhanghao[20]={"abc123"};
char mima[20]={"123456"};
char zhanghao1[20];
char mima1[20];
printf("\n\n\n\t**********欢迎使用信息管理系统用户端**********\n\n\n");
printf("\t 请输入您的账号及密码 \n\n");
while(1)
{
printf("\t账号:");
scanf("%s",zhanghao1);
printf("\n");
printf("\t密码:");
scanf("%s",mima1);
if(strcmp(zhanghao,zhanghao1)==0&&strcmp(mima,mima1)==0)
break;
else
printf("很抱歉您输入的有误,请重新输入\n");
}
return 1;
}
int managerslogin()//管理员登录
{
char zhanghao[20]={"zzz111"};
char mima[20]={"123456"};
char zhanghao1[20];
char mima1[20];
printf("\n\n\n\t**********欢迎使用信息管理系统管理端**********\n\n\n");
printf("\t 请输入您的账号及密码 \n\n");
while(1)
{
printf("\t账号:");
scanf("%s",zhanghao1);
printf("\n");
printf("\t密码:");
scanf("%s",mima1);
if(strcmp(zhanghao,zhanghao1)==0&&strcmp(mima,mima1)==0)
{
break;
}
else
{
printf("很抱歉您输入的有误,请重新输入\n");
}
}
return 1;
}
void WriteFile(struct student *head)//打开文件写
{
FILE *fp;
struct student *p=head;
int count=0;
if(head==NULL)
{
printf("无学生信息!\n");
return ;
}
if((fp=fopen("data.txt","wb"))==NULL) //注意这里是打开文本文件用来写入
{
printf("文件打开失败!\n");
return ;
}
while(p!=NULL) //将链表的全部数据写入文件中
{
fwrite(p,LEN,1,fp); //将p所指向的1个节点数据写入文件
count++;
p=p->next;
}
fclose(fp); //关闭文件
return ;
}
struct student *ReadFile(struct student *head)//读文件
{
FILE *fp;
struct student *p=NULL;
if((fp=fopen("data.txt","rb"))==NULL) //打开文本文件用来读
{
printf("打开文件失败!\n");
return head;
}
p=(struct student *)malloc(LEN);
fread(p , LEN, 1, fp);//从文件中读出数据
p->next=NULL;
while(!feof(fp))
{ //下面将从文件读出的一个学生的数据添加到链表的一个节点中
if(head==NULL)
{
head=p;
}
else
{
p->next=head;
head=p;
}
p=(struct student *)malloc(LEN);
fread(p,LEN,1,fp); //从文件中读出一条学生记录到p节点中
p->next=NULL;
}
fclose(fp);//关闭文件
return head;
}
//信息的录入
struct student *AppendNode(struct student *head)
{
struct student *p=NULL;
int c=0;
p=head;
int m;
while (c!=1)
{
p=(struct student *)malloc (sizeof (struct student));
printf ("请输入姓名\n"); scanf ("%s",p->name );
printf ("请输入学号\n");
m=only_num(head,p);
if (m==1)
{
printf ("此学号已存在\n");
system ("pause");
return head;
}
else
{
printf ("请输入性别\n"); scanf ("%s",p->sex );
printf ("请输入籍贯\n"); scanf ("%s",p->from );
printf ("请输入手机号\n"); scanf ("%s",p->phone );
printf ("请输入QQ号\n"); scanf ("%s",p->QQ );
printf ("请输入宿舍\n"); scanf ("%s",p->dorm );
printf ("请输入专业\n"); scanf ("%s",p->zy );
printf ("请输入综测成绩\n");scanf ("%d",&p->grade );
printf ("请输入备注\n"); scanf ("%s",p->beizhu );
printf ("是否继续输入,如果退出请按1,否则按0键\n");
scanf ("%d",&c);
system("cls");
if (head==NULL)
{
head=p;
p->next =NULL;
studentTotle++;//节点数增加1
}
else
{
p->next =head;
head=p;
studentTotle++;//节点数增加1
}
WriteFile(head);
}
}return head;
}
//信息的修改
struct student *Change(struct student *head)
{
system("cls");
struct student *p;
p=head;//p是头结点
char num[15];
int m;//选项
printf("请输入要修改的学生的学号\n");
scanf("%s",num);
getchar();
while(p!=NULL)//成立则进行下面循环,不成立则跳出循环
{
if(strcmp(p->num,num)!=0)///不相等
{
p=p->next;
}
else if(strcmp(p->num,num)==0)//找到了要修改的学号
{
break;
}
}
if(p!=NULL)
{
printf("******************************************************************************\n");
printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
printf("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5d %-5s\n ",p->name,p->num,p->sex,p->from,p->phone,p->QQ,p->dorm,p->zy,p->grade,p->beizhu);
printf("******************************************************************************\n");
printf("以上为该学生目前的信息\n\n");
printf("\n选择修改的内容\n");
printf("1.修改姓名\n");
printf("2.修改学号\n");
printf("3.修改性别\n");
printf("4.修改籍贯\n");
printf("5.修改手机号\n");
printf("6.修改QQ号\n");
printf("7.修改宿舍\n");
printf("8.修改专业名\n");
printf("9.修改综测成绩\n");
printf("10.修改备注\n");
printf("11.退出菜单\n");
printf("--------------\n");
do
{
printf("请选择选项\n");
scanf("%d", &m);
switch(m)
{
case 1:
{
printf("请输入改正后的姓名\n");
scanf("%s",p->name);
}
break;
case 2:
{
printf("请输入改正后的学号\n");
scanf("%s",p->num);
}
break;
case 3:
{
printf("请输入改正后的性别\n");
scanf("%s",p->sex);
}
break;
case 4:
{
printf("请输入改正后的籍贯\n");
scanf("%s",p->from);
}
break;
case 5:
{
printf("请输入改正后的手机号\n");
scanf("%s",p->phone);
}
break;
case 6:
{
printf("请输入改正后的qq号\n");
scanf("%s",p->QQ);
}
break;
case 7:
{
printf("请输入改正后的宿舍\n");
scanf("%s",p->dorm);
}
break;
case 8:
{
printf("请输入改正后的专业名\n");
scanf("%s",p->zy);
}
break;
case 9:
{
printf("请输入改正后的综测成绩\n");
scanf("%d",&p->grade);
}
break;
case 10:
{
printf("请输入改正后的备注\n");
scanf("%s",p->beizhu);
}
break;
}
printf("信息修改成功谢谢使用\n");
}while(m!=11);
}
else
{
printf("很抱歉,学号不存在,信息修改失败\n谢谢使用\n");
system("pause");
}
WriteFile(head);
return head;
}
//信息的删除
struct student *DelNode(struct student *head)
{
system("cls");
char num[15];
struct student* p=NULL;
struct student* q=NULL;
printf("请输入要删除学生的学号\n");
scanf("%s", num);
p=head;
while((strcmp(p->num,num)!=0)&&p->next!=NULL)//没找到、没到结尾
{
q=p;
p=p->next;
}
if((strcmp(p->num,num)==0))//找到
{
if(p==head)
{
head=p->next;
}
else
{
q->next=p->next;
}
studentTotle=studentTotle-1;
printf("学生信息删除成功,谢谢使用\n");
printf(" 按任意键返回主菜单……");
getch();//在屏幕停留信息,等待用户按下任意键
free(p);
}
else
{
printf("查无此人\n");
printf(" 按任意键返回主菜单……");
getch();//在屏幕停留信息,等待用户按下任意键
}
WriteFile(head);
return (head);
}
//信息的显示
void DisplyNode(struct student *head)
{
struct student *p=NULL; //定义指向链表当前结点的指针
p=head;
if(head!=NULL)
{
printf("\n\n*************************************************************************\n\n");
printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
while(p!=NULL)
{
printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );
p=p->next;
}
printf("*************************************************************************\n\n");
}
else
printf("\n\n\t抱歉,没有学生数据!\n\n");
system ("pause");
}
//信息的查找 用户方面
void Find(struct student *head)
{
struct student *p=NULL;
int c=0;
do
{
c=menu_user_find();
switch (c)
{
case 1: //按姓名查询
system("cls");//清屏
find_user_name(head);
break;
case 2://按学号查询
system("cls");//清屏
find_user_num(head);
break;
}
}while(c!=3);
return;
}
//查询函数,用户查询,按姓名查询
void find_user_name(struct student *head)
{
struct student *p=NULL;
p=head;
printf ("请输入要查询的学生的姓名\n");
char x[100];
scanf ("%s",x);
while (p!=NULL)
{
if (strcmp (p->name ,x)==0)
{
printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );
break;
}
p=p->next ;
}
if (p==NULL)
{
printf ("没有找到这名学生\n");
}
return;
}
//查询函数,用户查询,按学号查询
void find_user_num(struct student *head)
{
struct student *p=NULL;
p=head;
printf ("请输入要查询的学生的学号\n");
char x[100];
scanf ("%s",x);
while (p!=NULL)
{
if (strcmp (p->num ,x)==0)
{
printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );
break;
}
p=p->next ;
}
if (p==NULL)
{
printf ("没有找到这名学生\n");
}
return;
}
//用户查找信息菜单
int menu_user_find()
{
int c;
printf("\t 请选择您的查找方式 \n");
printf("\n");
printf("\t ************************************************************\n");
printf("\t * 1 ---- >> 按姓名查询 *\n");
printf("\t * 2 ---- >> 按学号查询 *\n");
printf("\t * 3 ---- >> 返回上一级菜单 *\n");
printf("\t * 请选择: *\n");
printf("\t ************************************************************\n");
scanf ("%d",&c);
return c;
}
//输出排序菜单
void PrintSort()
{
printf("\t ************************************************************\n");
printf("\t * *\n");
printf("\t * 您可以进行以下操作: *\n");
printf("\t * *\n");
printf("\t * 按综测成绩升序排序 请按 1 *\n");
printf("\t * *\n");
printf("\t * 按综测成绩降序排序 请按 2 *\n");
printf("\t * *\n");
printf("\t * 按专业的首字母排序 请按 3 *\n");
printf("\t * *\n");
printf("\t * 返回上一级菜单 请按 4 *\n");
printf("\t * *\n");
printf("\t ************************************************************\n\n");
}
//排序
struct student *Sort(struct student *head)
{
system("cls");
int a;
do{
system("cls");
PrintSort();
scanf("%d",&a);
switch(a)
{
case 1:
head=sort1(head);
DisplyNode(head);
break;
case 2:
head=sort2(head);
DisplyNode(head);
break;
case 3:
head=sort3(head);
DisplyNode(head);
break;
}
}while (a!=4);
system("pause");
return(head);
system("cls");
}
struct student *sort1(struct student *head)///按综测成绩升序排序
{
struct student *p=NULL;///相当于数组排序中的i
struct student *q=NULL;///相当于数组排序中的j
struct student *k=NULL;///相当于数组排序中的k
if(head!=NULL)
{
for(p=head;p!=NULL;p=p->next)
{
k=p;
for(q=p->next;q!=NULL;q=q->next)
{
if(q->grade<k->grade)
{
k=q;
}
}
if(k!=p)
{
swapStruct(p,k);
}
}
}
else
printf("\n\t抱歉,没有数据!\n\n");
return(head);
}
struct student *sort2(struct student *head)///按综测成绩降序排序
{
struct student *p=NULL;///相当于数组排序中的i
struct student *q=NULL;///相当于数组排序中的j
struct student *k=NULL;///相当于数组排序中的k
if(head!=NULL)
{
for(p=head;p!=NULL;p=p->next)
{
k=p;
for(q=p->next;q!=NULL;q=q->next)
{
if(q->grade>k->grade)
{
k=q;
}
}
if(k!=p)
{
swapStruct(p,k);
}
}
}
else
printf("\n\t抱歉,没有数据!\n\n");
return(head);
}
struct student *sort3(struct student *head)///按专业的首字母排序
{
struct student *p=NULL;///相当于数组排序中的i
struct student *q=NULL;///相当于数组排序中的j
struct student *k=NULL;///相当于数组排序中的k
if(head!=NULL)
{
for(p=head;p!=NULL;p=p->next)
{
k=p;
for(q=p->next;q!=NULL;q=q->next)
{
if(strcmp(q->zy,k->zy)==-1)
{
k=q;
}
}
if(k!=p)
{
swapStruct(p,k);
}
}
}
else
printf("\n\t抱歉,没有数据!\n\n");
return(head);
}
void swapStruct(struct student *p,struct student *k)//排序的交换
{
struct student temp;
temp=*p;
*p=*k;
*k=temp;
struct student *x;
x=p->next;
p->next=k->next;
k->next=x;
}
//综测成绩的平均和求和
void average_grade(stu *head)
{
stu *p=head;
int sum=0,t=0;
float ave=0;
system("cls");
while(p!=NULL)
{
sum+=p->grade;
t++;
p=p->next;
}
ave=sum*1.0/t;
printf("\t ************************************************************\n");
printf(" 和为%d\n",sum);
printf(" 平均数为%.2f\n",ave);
printf("\t ************************************************************\n");
system("pause");
}
int only_num(struct student *head,struct student *p)
{
struct student *q;
q=head;//q是头结点
char num[15];
int m=0;//选项
scanf("%s",p->num);
getchar();
while(q!=NULL)//成立则进行下面循环,不成立则跳出循环
{
if(strcmp(q->num,p->num)!=0)///不相等
{
m=0;
q=q->next;
}
else if(strcmp(q->num,p->num)==0)//学号相同
{
m=1;
break;
}
}
return m;
}