学生学籍管理程序

学生学籍管理通常使用数据库为基础的管理信息系统(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;
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值