设计要求:
学生信息管理系统
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计学生信息管理系统,使之能提供以下功能:
(1) 系统以菜单方式工作
(2) 学生信息录入功能(学生信息用文件保存)—输入
(3) 学生信息浏览功能—输出
(4) 查询、排序功能—算法
(5) 按学号查询
(6) 按姓名查询
(7) 学生信息的删除与修改
对于文件操作是二进制读入读出,保存数据会保存到和cpp同一文件夹中的data.txt文件中,如果没有在保存数据后会自动创建
对于数据在内存中的临时的储存采用双链表结构
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int Len = 20;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//菜单栏
void menu(void)
{
printf(" ==================================================\n");
printf(" | menu |\n");
printf(" | 1.学生信息录入 |\n");
printf(" | 2.学生信息查询 |\n");
printf(" | 3.学生信息删除 |\n");
printf(" | 4.学生信息修改 |\n");
printf(" | 5.读取数据 |\n");
printf(" | 6.保存数据 |\n");
printf(" | 7.退出 |\n");
printf(" ==================================================\n");
}
//一个学生结构体类型
typedef struct{
char name[Len];
int age;
char sex[Len];
int stnumber;
char birthday[Len];
char adress[Len];
char telephone[Len];
char email[Len];
}studentinf;
//链表
typedef struct Node
{
studentinf data;
struct Node *next;
struct Node *pre;
}Node;
Node * head = NULL;
Node * end = NULL;
//信息读入
void infinput(void)
{
studentinf student;
printf("请输入学生姓名:\n");
scanf("%s",student.name);
printf("请输入学生年龄:\n");
scanf("%d",&(student.age));
printf("请输入学生性别:\n");
scanf("%s",student.sex);
printf("请输入学生学号:\n");
scanf("%d",&(student.stnumber));
printf("请输入学生生日:\n");
scanf("%s",student.birthday);
printf("请输入学生住址:\n");
scanf("%s",student.adress);
printf("请输入学生电话:\n");
scanf("%s",student.telephone);
printf("请输入学生邮箱:\n");
scanf("%s",student.email);
printf("---------------------------------------信息录入成功-------------------------------------------\n");
printf("\n");
printf("\n");
//向链表中插入新结点
Node * temp = (Node*)malloc(sizeof(Node));
temp->data = student;//会存在问题---需要全部的data成员都进行了明确的赋值!!
printf("录入成功!\n");
temp->next = NULL;
temp->pre = NULL;
if(NULL == head)
{
head = temp;
end = temp;
}
else
{
end -> next = temp;
temp -> pre = end;
end = temp;
}
}
//按照姓名 查询
void fname(char* findname)
{
Node *temp = head;
if(temp == NULL) printf("请先录入学生信息!\n");
while(temp != NULL)
{
//if(temp) printf("temp 有东西\n");
if(!(strcmp((temp->data).name,findname)))
{
//输出他的所有信息
printf("查询成功!\n");
printf("----------------------------\n");
printf("姓名:%s\n",(temp->data).name);
printf("年龄:%d\n",(temp->data).age);
printf("性别:%s\n",(temp->data).sex);
printf("学号:%d\n",(temp->data).stnumber);
printf("生日:%s\n",(temp->data).birthday);
printf("住址:%s\n",(temp->data).adress);
printf("电话:%s\n",(temp->data).telephone);
printf("邮箱:%s\n",(temp->data).email);
printf("----------------------------\n");
break;
}
temp = temp->next;
if(temp == NULL) printf("请输入正确学生姓名!\n");
}
}
//按照学号查询
void fstnumber(int findstnumber)
{
Node *temp = head;
if(temp == NULL) printf("请先录入学生信息!\n");
while(temp != NULL)
{
if((temp->data).stnumber == findstnumber)
{
//输出他的所有信息
printf("查询成功!\n");
printf("----------------------------\n");
printf("姓名:%s\n",(temp->data).name);
printf("年龄:%d\n",(temp->data).age);
printf("性别:%s\n",(temp->data).sex);
printf("学号:%d\n",(temp->data).stnumber);
printf("生日:%s\n",(temp->data).birthday);
printf("住址:%s\n",(temp->data).adress);
printf("电话:%s\n",(temp->data).telephone);
printf("邮箱:%s\n",(temp->data).email);
printf("----------------------------\n");
break;
}
temp = temp->next;
if(temp == NULL) printf("请输入正确学生学号!\n");
}
}
//查询菜单及其操作
void inffind()
{
printf(" ==================================================\n");
printf(" | menu |\n");
printf(" | 1.按照学生姓名查询 |\n");
printf(" | 2.按照学生学号查询 |\n");
printf(" ==================================================\n");
printf("请输入1或2!!!!\n");
int op;//操作序号
while(1)
{
scanf("%d",&op);
if(op == 1)
{
system("cls");
printf("请输入查询姓名:\n");
char findname[Len];
scanf("%s",findname);
printf("查询中...\n");
fname(findname);
break;
}
else if(op == 2)
{
system("cls");
printf("请输入查询学号:\n");
int findstnumber;
scanf("%d",&findstnumber);
fstnumber(findstnumber);
break;
}
}
}
void delinf()
{
printf("请输入要删除学生信息的姓名:\n");
char delname[Len];
scanf("%s",delname);
//链表查找
Node *temp = head;
if(temp == NULL) printf("请先录入学生信息!\n");
while(temp != NULL)
{
//if(temp) printf("temp 有东西\n");
if(!(strcmp((temp->data).name,delname)))//-------------------出现问题!(temp->data).name == delname总是为假 ,因为字符串不能直接比较,需要借用strcmp函数!
{
//输出他的所有信息
printf("----------------------------\n");
printf("姓名:%s\n",(temp->data).name);
printf("年龄:%d\n",(temp->data).age);
printf("性别:%s\n",(temp->data).sex);
printf("学号:%d\n",(temp->data).stnumber);
printf("生日:%s\n",(temp->data).birthday);
printf("住址:%s\n",(temp->data).adress);
printf("电话:%s\n",(temp->data).telephone);
printf("邮箱:%s\n",(temp->data).email);
printf("----------------------------\n");
printf("正在删除...\n");
if(temp->next == NULL && temp -> pre == NULL)
{
free(temp);
printf("删除成功!\n");
break;
}
if(temp->next == NULL)//删除尾结点
{
temp->pre->next = NULL;
}
else if(temp -> pre == NULL)//删除首结点
{
temp->next->pre = NULL;
}
else
{
temp->pre->next = temp->next;
temp->next->pre = temp->pre;
}
free(temp);
printf("删除成功!\n");
break;
}
//printf("===当前遍历到学生%s===\n",(temp->data).name);
temp = temp->next;
if(temp == NULL) printf("请输入正确学生姓名!\n");
}
}
void changinf()
{
Node *temp = head;
if(temp == NULL) printf("请先录入学生信息!\n");
char changname[Len];
printf("输入修改的学生姓名:\n");
scanf("%s",changname);
while(temp != NULL)
{
//if(temp) printf("temp 有东西\n");
if(!(strcmp((temp->data).name,changname)))
{
//输出他的所有信息
printf("----------------------------\n");
printf("姓名:%s\n",(temp->data).name);
printf("年龄:%d\n",(temp->data).age);
printf("性别:%s\n",(temp->data).sex);
printf("学号:%d\n",(temp->data).stnumber);
printf("生日:%s\n",(temp->data).birthday);
printf("住址:%s\n",(temp->data).adress);
printf("电话:%s\n",(temp->data).telephone);
printf("邮箱:%s\n",(temp->data).email);
printf("----------------------------\n");
//修改操作
studentinf student;
printf("请输入学生姓名:\n");
scanf("%s",student.name);
printf("请输入学生年龄:\n");
scanf("%d",&(student.age));
printf("请输入学生性别:\n");
scanf("%s",student.sex);
printf("请输入学生学号:\n");
scanf("%d",&(student.stnumber));
printf("请输入学生生日:\n");
scanf("%s",student.birthday);
printf("请输入学生住址:\n");
scanf("%s",student.adress);
printf("请输入学生电话:\n");
scanf("%s",student.telephone);
printf("请输入学生邮箱:\n");
scanf("%s",student.email);
temp->data = student;
printf("---------------------------------------信息修改成功-------------------------------------------\n");
printf("\n");
printf("\n");
printf("----------------------------------------------------------------------------------------------\n");
printf("姓名:%s\n",(temp->data).name);
printf("年龄:%d\n",(temp->data).age);
printf("性别:%s\n",(temp->data).sex);
printf("学号:%d\n",(temp->data).stnumber);
printf("生日:%s\n",(temp->data).birthday);
printf("住址:%s\n",(temp->data).adress);
printf("电话:%s\n",(temp->data).telephone);
printf("邮箱:%s\n",(temp->data).email);
printf("----------------------------------------------------------------------------------------------\n");
break;
}
temp = temp->next;
if(temp == NULL) printf("请输入正确学生姓名!\n");
}
}
//从文件中读取数据
void read_data()
{
printf("读取中...\n");
FILE *fp = NULL;
fp = fopen("data.txt","rb");
//将data.txt中的数据从文件中读出存入到链表中去
while(!feof(fp))
{
Node * tmp = (Node*)malloc(sizeof(Node));
fread(&(tmp->data),sizeof(studentinf),1,fp);
tmp->next = NULL;
tmp->pre = NULL;
if(NULL == head)
{
head = tmp;
end = tmp;
}
else
{
end ->next = tmp;
tmp ->pre = end;
end = tmp;
}
}
fclose(fp);
printf("读取中成功!\n");
}
//存数据到文件
void save_data()
{
printf("保存中...\n");
FILE *fp = NULL;
fp = fopen("data.txt","wb");//打开一个文件,允许写入文件,默认当前路径
//将链表的所有data 写入到文件data.txt中去
Node *tmp = head;
while(tmp != NULL)
{
fwrite(&(tmp->data),sizeof(studentinf),1,fp);
tmp = tmp->next;
}
fclose(fp);
}
int main()
{
menu();
int op;//操作序号
printf("请输入1-7的数字!\n");
while(1)
{
scanf("%d",&op);
if(op == 1)
{
system("cls");
infinput();
menu();
}
else if(op == 2)
{
system("cls");
inffind();
menu();
}
else if(op == 3)
{
system("cls");
delinf();
menu();
}
else if(op == 4)
{
system("cls");
changinf();
menu();
}
else if(op == 5)//读取数据
{
system("cls");
read_data();
menu();
}
else if(op == 6)//保存数据
{
system("cls");
save_data();
menu();
}
else if(op == 7)
{
break;
}
else
{
printf("input error!\n");
}
}
return 0;
}