学生学籍管理通常使用数据库为基础的管理信息系统(MIS)系统,但是这里要求不使用数据库技术,而是使用数据结构struct和链表操作完成管理任务。利用链表对文件的操作,实现对学生信息的存储,基本功能都实现了,但是没有实现真正意义上的与数据库等同,文件操作里面有个ftell给文件指针定位的函数,但是这个貌似是按字节来定位的,我就没有深入下去了,现把我实现的代码奉上,若有不完善之处,欢迎留言指正,大家相互学习,谢谢。
#include <iostream>
#include <stdlib.h>
#define MaxStuNum 2//定义添加的最大学生数量
using namespace std;
typedef struct student
{
char sno[10];
char sname[10];
int sage;
char sprof[20];
char sclass[5];
}student;
typedef struct LNode
{
student stu;
LNode *next;
}LNode,*LinkList;
void Initial(LinkList &head)
{
head=(LinkList)malloc(sizeof(LNode));
if(!head)
exit(0);
head->next=NULL;
}
//添加操作
void Add(LinkList &head)
{
int i;
FILE *fp;
LinkList L=head;
LinkList p;
if(L!=NULL){
fp=fopen("stuInfo.txt","w");
if(!fp){
cout<<"打开文件错误!!!"<<endl;
exit(0);
}
fprintf(fp," 学号 姓名 年龄 专业 班级\n");
for(i=0;i<MaxStuNum;i++){
p=(LinkList)malloc(sizeof(LNode));
cout<<"学生 "<<i+1<<" 学号<1-8位数字>:";
cin>>p->stu.sno;
cout<<"学生 "<<i+1<<" 姓名<1-8个字符>:";
cin>>p->stu.sname;
cout<<"学生 "<<i+1<<" 年龄<2位整数>:";
cin>>p->stu.sage;
cout<<"学生 "<<i+1<<" 专业名<1-8个字符>:";
cin>>p->stu.sprof;
cout<<"学生 "<<i+1<<" 班级<1-5个字符>:";
cin>>p->stu.sclass;
fprintf(fp,"%10s%10s%5d%10s%5s\n",p->stu.sno,p->stu.sname,p->stu.sage,p->stu.sprof,p->stu.sclass);
p->next = L->next;
L -> next = p;
while (L ->next != NULL) /*每次for循环后在NULL与p之间插入下一个节点*/
{
L = L ->next;
}
}
cout<<"添加信息完成!"<<endl;
fclose(fp);
}
}
//修改操作
void Modify(LinkList &head)
{
FILE *fp;
LinkList p=head;
LinkList L=head;
char num[10];
int choice;
cout<<"请输入需要修改学生的学号:"<<endl;
cin>>num;
int flag=1;
while(flag!=0 && p->next != NULL){
if( strcmp(p->next->stu.sno,num)==0){//查找匹配学号
flag=0;//修改状态,已经查到需要修改的位置
cout<<"请选择需要进行修改的信息<1-学号,2-姓名,3-年龄,4-专业,5-班级>:";
cin>>choice;
cout<<endl;
switch (choice)
{
case 1:
cout<<"请输入该学生新学号<1-8位数字>:";
cin>>p->next->stu.sno;
cout<<endl;
break;
case 2:
cout<<"请输入该学生新姓名<1-8位字符>:";
cin>>p->next->stu.sname;
cout<<endl;
break;
case 3:
cout<<"请输入该学生新年龄<2位整数>:";
cin>>p->next->stu.sage;
cout<<endl;
break;
case 4:
cout<<"请输入该学生新专业名<1-8位字符>:";
cin>>p->next->stu.sprof;
cout<<endl;
break;
case 5:
cout<<"请输入该学生新班级名<1-5位字符>:";
cin>>p->next->stu.sclass;
cout<<endl;
break;
default:
cout<<"选择错误!!!"<<endl;break;
}
cout<<"修改成功!!!"<<endl;
}
else
p=p->next;
}
fp=fopen("stuInfo.txt","w");
if(!fp){
cout<<"打开文件错误!!!"<<endl;
exit(0);
}
fprintf(fp," 学号 姓名 年龄 专业 班级\n");
while(L->next!=NULL)
{
L=L->next;
fprintf(fp,"%10s%10s%5d%10s%5s\n",L->stu.sno,L->stu.sname,L->stu.sage,L->stu.sprof,L->stu.sclass);
}
fclose(fp);
}
//删除操作
void Delete(LinkList head)
{
FILE *fp;
LinkList p=head,q;
LinkList L=head;
char num[10];
cout<<"请输入需要删除学生的学号:"<<endl;
cin>>num;
while ( strcmp(p->next->stu.sno,num) != 0)//查找匹配学号
{
p=p->next;
}
q=p->next;//q指向要删除的节点
p->next=q->next;
fp=fopen("stuInfo.txt","w");
if(!fp){
cout<<"打开文件错误!!!"<<endl;
exit(0);
}
fprintf(fp," 学号 姓名 年龄 专业 班级\n");
while(L->next != NULL)
{
L=L->next;
fprintf(fp,"%10s%10s%5d%10s%5s\n",L->stu.sno,L->stu.sname,L->stu.sage,L->stu.sprof,L->stu.sclass);
}
cout<<"删除操作成功!!!"<<endl;
free(q);//释放掉删除的节点
fclose(fp);
}
//查询操作
void Find(LinkList head)
{
//FILE *fp;
LinkList p=head,q;
char num[10];
cout<<"请输入需要查询学生学号:";
cin>>num;
while ( strcmp(p->next->stu.sno,num) != 0)//查找匹配学号
{
p=p->next;
}
q=p->next;//q指向查询学生当前节点
cout<<"学号:"<<q->stu.sno<<" 姓名:"<<q->stu.sname
<<" 年龄:"<<q->stu.sage<<" 专业:"<<q->stu.sprof
<<" 班级:"<<q->stu.sclass<<endl;
cout<<"查询操作完成!!!"<<endl;
}
//输出打印
void Print(LinkList head)
{
FILE *fp;
LinkList p=head;
fp=fopen("stuInfo.txt","r");
while (p->next!=NULL)
{
p=p->next;
fprintf(fp,"%10s%10s%5d%10s%5s\n",p->stu.sno,p->stu.sname,p->stu.sage,p->stu.sprof,p->stu.sclass);
}
system("start stuInfo.txt");
cout<<"输出操作完成!!!"<<endl;
fclose(fp);
}
//菜单设置
void Menu()
{
cout<<"************学生基本信息管理************"<<endl;
cout<<"0-返回主菜单"<<endl;
cout<<"1-添加学生"<<endl;
cout<<"2-查询学生信息"<<endl;
cout<<"3-删除学生信息"<<endl;
cout<<"4-修改学生信息"<<endl;
cout<<"5-打印输出学生信息"<<endl;
cout<<"6-退出"<<endl;
cout<<"选择需要进行的操作: ";
}
int main()
{
LinkList L;
Initial(L);
int choice;
Menu();
while(cin>>choice){
switch(choice)
{
case 0:
Menu();break;
case 1:
Add(L);Menu();break;
case 2:
Find(L);Menu();break;
case 3:
Delete(L);Menu();break;
case 4:
Modify(L);Menu();break;
case 5:
Print(L);Menu();break;
case 6:
exit(0);//退出
default:
cout<<"选择错误!!!"<<endl;Menu();break;
}
}
return 0;
}