// 学生信息管理系统.cpp : Defines the entry point for the console application.
/*
题目三:学生信息管理系统设计
问题描述:学生的基本个人信息管理,其中个人信息应包含:姓名、性别、年龄、出生年月、家庭住址、班级、电话号码、宿舍号等
实现功能:具有整张信息表的浏览功能、整表输出到文件功能、个人信息的二次修改功能、新人员的基本信息的添加功能、删除实际人员基本信息功能、查询功能等
知 识 点:数组,指针、结构体、文件操作
说 明:必须用到结构体和文件操作
程序代码如下:
*/
// 职工信息管理.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
int shouldsave=1;//用于学生信息的保存
struct student
{
char name[15];//学生的姓名
char sex[15];//学生的性别
int age;//学生的年龄
char birthday[15];//学生的出生年月
char address[15];//学生的家庭住址
char classes[15];//学生所在班级
char tele[15];//学生的电话号码
char num[15];//学生宿舍号
};
struct node
{
struct student data;
struct node *next;//结构体指针
};
///主菜单
void menu()
{
printf("/n/n/n");
printf("************************************欢迎光临************************************/n");
printf("/n/n");
printf("/t/t 0 退出管理系统/n");
printf("/t/t 1 录入学生信息/t/t 2 删除学生信息/n");
printf("/t/t 3 查询学生信息/t/t 4 修改学生信息/n");
printf("/t/t 5 保存学生信息/t/t 6 显示学生信息/n");
printf("/n/n");
printf("********************************************************************************/n");
printf(" 电信10709 tianmo /n");
printf(" 时候: 2009年7月10日 /n");
}
//
void printstart()
{
printf("--------------------------------------------------------------------------------/n");
}
void wrong()
{
printf("/n======>提示:输入错误!/n");
}
void nofind()
{
printf("/n=====>提示:没有找到相应的学生!/n");
}
void printc()//用于输出学生的相关中文信息
{
printf("姓名 性别 年龄 出生年月 家庭住址 班级 电话号码 宿舍号/n");
}
void printe(struct node *p)//用于输出学生信息
{
printf("%s %s %d %s %s %s %s %s/n",p->data.name,p->data.sex,p->data.age,p->data.birthday,p->data.address,p->data.classes,p->data.tele,p->data.num);
}
查找满足要求的节点
struct node *Locate(struct node *head,char findmess[],char nameornum[]) //该函数用于定位连表中符合要求的接点,并返回该指针
{
struct node *r;
if(strcmp(nameornum,"num")==0) // 按学生电话号码查询
{
r=head->next; //把r链接在头指针里面
while(r!=NULL)
{
if(strcmp(r->data.tele,findmess)==0)
return r;//返回结点
r=r->next; //结点向后移动1
}
}
else if(strcmp(nameornum,"name")==0) //按学生姓名查询
{
r=head->next; //把r链接在头指针里面
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r; //返回结点
r=r->next; //结点向后移动1
}
}
return 0;
}
录入学生信息/
void Add(struct node *head)
{
struct node *p,*p1,*p2;
char num[20];
p1=head;//把头指针付给p1
p2=p1->next;//把p2连接在p1后面
while(p1->next !=NULL)//把p1放在最后
{
p1=p1->next; //结点向后移动一
}
while(1)//利用无穷循环
{
printf("/n");
printf("请您输入学生电话号码(以0返回上一级菜单):");
scanf("%s",num);
if(strcmp(num,"0")==0)//技术性处理返回主菜单
{
break;
}
while(p2)//利用循环在记录里面查找,看该学生电话号码是否已经存在
{
if(strcmp(p2->data.tele,num)==0)
{
printf("/n");
printf("====>提示学生电话号码为'%s'已经存在,若要修改,请选择'4'/n",num);
printf("/n");
printstart();//调用函数
printf("/n");
printc();//调用函数
printf("/n");
printe(p2);//调用函数
printstart();//调用函数
printf("/n");
}
p2=p2->next;//结点向后移动1
}
p=(struct node *)malloc(sizeof(struct node));//申请一个动态存储区域,它的大小为sizeof(struct node)
strcpy(p->data.tele,num);
printf("请您输入学生的姓名:");
scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'
getchar(); //用于接收enter
printf("请你输入学生的性别:");
scanf("%s",p->data.sex);
getchar(); //用于接收enter
printf("请你输入学生的年龄:");
scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'
getchar(); //用于接收enter
printf("请你输入学生的出生年月:");
scanf("%s",p->data.birthday);
getchar(); //用于接收enter
printf("请输入学生的家庭住址:");
scanf("%s",p->data.address);
getchar(); //用于接收enter
printf("请输入所在的班级:");
scanf("%s",p->data.classes);
getchar(); //用于接收enter
printf("请输入学生所在的宿舍号:");
scanf("%s",p->data.num);
getchar(); //用于接收enter
p->next =NULL;//将p后面指空
p1->next =p;//把p连接在p1的后面
p1=p;//把p赋给p1
shouldsave=1;//用于后面的保存
}
}
///
void Qur(struct node *head) // 查询学生信息
{
int sel;
char findmess[20];
struct node *p;
if(head->next==NULL) //判断head后面是否连接有内容
{
printf("/n=====>提示:没有学生信息可以查询!/n");
}
printf("/n=====>1按学生电话查找/n=====>2按学生姓名查找/n");
scanf("%d",&sel);
if(sel==1)//按学生电话查询
{
printf("请你输入要查找的书籍的编号:");
scanf("%s",findmess);
p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找学生电话的指针
if(p)
{
printf("/t/t/t/t查找结果/n");
printstart(); //调用函数
printc();//调用函数
printe(p); //调用函数
printstart(); //调用函数
}
else
nofind();
}
else if(sel==2) //按学生姓名查询
{
printf("请你输入要查找的职工名字:");
scanf("%s",findmess);
p=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找学生名字的指针
if(p)
{
printf("/t/t/t/t查找结果/n");
printstart(); //调用函数
printc(); //调用函数
printe(p); //调用函数
printstart(); //调用函数
}
else
nofind();
}
else
wrong();
}
///
void Delete(struct node *head) //删除学生信息
{
int sel;
struct node *p1,*p2;
char findmess[20];
if(head->next==NULL) //判断head后面是否连接有内容
{
printf("/n提示:没有学生信息可以删除!/n");
}
printf("/n=====>1按学生电话删除/n=====>2按学生姓名删除/n");
scanf("%d",&sel);
if(sel==1)
{
printf("请你输入要删除的学生的电话号码:");
scanf("%s",findmess);
p1=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找学生编号的指针
if(p1)
{
p2=head;
while(p2->next!=p1) //利用循环找到要指向删除学生电话的指针p1
{
p2=p2->next;
}
p2->next=p1->next; //将p1后面的一个指针连接在p2->next,从而删除了p1->data.tele
free(p1); //释放p1所占的内存
printf("/n提示:该学生信息已经成功删除!/n");
shouldsave=1; //用于后面的保存
}
else
{
nofind();
}
}
else if(sel==2)
{
printf("请你输入要删除的学生姓名:");
scanf("%s",findmess);
p1=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找学生姓名的指针
if(p1)
{
p2=head;
while(p2->next!=p1) //利用循环找到要指向删除的学生的指针p1
{
p2=p2->next;
}
p2->next=p1->next; //将p1后面的一个指针连接在p2->next,从而删除了p1->data.name
free(p1); //释放p1所占的内存
printf("/n提示:该学生信息已经成功删除!/n");
shouldsave=1;//用于后面的保存
}
else
{
nofind();
}
}
else
wrong();
}
///
void Modify(struct node *head) //学生信息的修改
{
struct node *p;
char findmess[20];
if(head->next==NULL)
{
printf("/n=====>提示:没有资料可以修改!/n");
}
printf("请你输入要修改的学生电话号码:");
scanf("%s",findmess);
p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要修改学生的指针
if(p)
{
printf("请您输入新的学生电话号码:");
scanf("%s",p->data.tele); //注意:因为tele是首地址,故不用加上'&'
getchar(); //用于接收enter
printf("请您输入新的学生姓名:");
scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'
getchar(); //用于接收enter
printf("请您输入新的学生性别:");
scanf("%s",p->data.sex);
getchar(); //用于接收enter
printf("请您输入新的学生年龄:");
scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'
getchar(); //用于接收enter
printf("请您输入新的学生出生年月:");
scanf("%s",p->data.birthday);
getchar(); //用于接收enter
printf("请您输入新的学生家庭住址:");
scanf("%s",p->data.address);
printf("请您输入新的学生班级:");
scanf("%s",p->data.classes);
printf("请您输入新的学生宿舍号:");
scanf("%s",p->data.num);
printf("/n=====>提示:资料修改成功!/n");
shouldsave=1;
}
else
nofind();
}
///
void Save(struct node *head) //保存学生工的相关信息
{
FILE* fp;
struct node *p;
int flag=1,count=0;
fp=fopen("D://student","wb"); //为输出打开一个二进制的文件
if(fp==NULL)
{
printf("/n=====>提示:重新打开文件时发生错误!/n");
exit(1); //注意:逃离函数,它在stdlib库里面
}
p=head->next; //将p连接在head的后面
while(p) //判断p是否为空,以便进行循环
{
if(fwrite(p,sizeof(struct node),1,fp)==1) //把p中的内容写到fp中
{
p=p->next; //p向后移动一
count++;//用于统计保存学生信息记录的数目
}
else
{
flag=0;
break; //如果fwrite(p,sizeof(struct node),1,fp)返回值不是一,提前跳出循环
}
}
if(flag==1)
{
printf("/n=====>提示:文件保存成功.(有%d条记录已经保存)./n",count);
shouldsave=0;
}
fclose(fp); //关闭fp文件
}
///
void Display(struct node *head) //用于显示保存的学生相关信息
{
int count=0;
struct node *p;
p=head->next; //将p连接在head的后面
if(p==NULL)
{
printf("/n=====>提示:没有资料可以显示!/n");
}
printf("/t/t/t/t 显示结果/n");
printstart();
printc();
printf("/n");
while(p) //利用循环把学生的所有信息全部显示
{
printe(p);
p=p->next; //p向后移动一
}
printstart();
printf("/n");
}
///
int main(int argc, char* argv[])
{
printf("/n/n/t/t/t/t学生信息管理系统/n");
FILE *fp;
int count=0,n;
char jian,ch;
struct node *head,*p1,*p2;
head=p1=(struct node *)malloc(sizeof(struct node));
p1->next=NULL;
head=p1;
if((fp=fopen("D://student","rb"))==NULL)
{
printf("文件还不存在,是否新建?(Y/N):");
scanf("%c",&jian);
if(jian=='Y'||jian=='y')
{
fp=fopen("D://student","wb");
}
else
{
exit(0);
}
}
while(!feof(fp))//判断文件是否全部读完
{
p2=(struct node *)malloc(sizeof(struct node));
if(fread(p2,sizeof(struct node),1,fp)) //把文件中的内容连接在链表里
{
p2->next=NULL;
p1->next=p2;
p1=p2; //关键的技术处理部分,否则会出现覆盖的问题
count++;
}
}
fclose(fp);
while(1)
{
menu();
printf("请您选择:");
scanf("%d",&n);
if(n==0)
{
getchar();
printf("/n====>提示:资料已改动,是否将改动保存到文件中?(y/n)/n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(head); //调用函数
printf("/n=====>提示:您已经推出系统 !/n");
break;
}
switch(n)
{
case 1:Add(head);break;
case 2:Delete(head);break;
case 3:Qur(head);break;
case 4:Modify(head);break;
case 5:Save(head);break;
case 6:Display(head);break;
default:wrong();break;
}
}
return 0;
}