学生学籍管理系统(c语言)

一、项目背景

​ 学生成绩管理系统是一个学校不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该为用户提供充足的信息和快捷的查询手段。同时,学生成绩管理是各大学的主要日常管理工作之一,涉及到校、系、师、生的诸多方面,随着教学体制的不断改革,尤其是学分制、选课制的展开和深入,学生成绩日常管理工作及保存管理日趋繁重、复杂。高校都迫切需要研制开发一款属于自己的功能强大,操作简单,具有人性化的学生成绩管理系统。

二、需求分析

设计一个利用文件处理方式,实现对学生学籍信息(包括:学号,姓名,性别,年龄,籍贯,系别,专业,班级)进行添加、修改、删除、查找、统计输出等操作。学生学籍管理系统的功能要求如下:

①增加数据

②更新数据

③查询数据

④删除数据

⑤显示数据

⑥重组文件

⑦要求本系统采用结构体等数据结构。

三、系统总体设计

学生学籍管理系统包含6个模块。

(1)增加数据模块 (2)更新数据模块。

(3)查询数据模块 (4)删除数据模块。

(5)显示数据模块 (6)重组文件模块

在这里插入图片描述

四、详细设计

1、系统包含的函数

(1)主函数:main()函数。

(2)子函数:

①增加数据函数:add_data()函数

②更新数据函数:updata_data()函数

③查询数据函数:search_data()函数

④删除数据函数:delete_data()函数

⑤显示数据函数:list_data()函数

⑥重组文件函数:pack()函数

2、各个功能模块的软件功能

(1)add_data()函数

函数原型:void add_data();

函数功能:输入一个或多个学生的信息,并将所输入的学生信息存入到数据文件中。

(2)updata_data()函数

函数原型:void updata_data();

函数功能:更新已存在的学生的信息。

(3)search_data()函数

函数原型:void search_data();

函数功能:按学号查询未作删除标记的学生的信息。

(4)delete_data()函数

函数原型:void delete_data();

函数功能:对某学生信息作删除标记,只作逻辑删除。

(5)list_data()函数

函数原型:void list_data();

函数功能:按指定条件显示未作删除标记的学生的信息。

(6)pack()函数

函数原型:void pack();

函数功能:对作删除标记的学生信息作物理删除。

3、各个功能模块的程序流程图

1、主函数流程图

在这里插入图片描述

2、add_data()函数流程图

在这里插入图片描述

3、update()函数流程图

在这里插入图片描述

4、search_data()函数流程图

在这里插入图片描述

5、delete()函数流程图

在这里插入图片描述

6、list_data()函数流程图

在这里插入图片描述

7、pack()函数流程图

在这里插入图片描述

五、代码

/*全部数据定义及各子函数声明*/
#include<stdio.h>  
#include<stdlib.h>
#include<string.h>
#define MAX 100
struct student
{
	short status;		/*数据状态,0:正常 1:删除*/
	int num;			/*学生的学号*/
	char name[9];		/*姓名*/
	char sex[3];		/*性别*/
	int age;			/*年龄*/
	char origin[21];	/*籍贯*/
	char depart[21];	/*系别*/
	char major[21];	/*专业*/
	int clas;			/*班级*/
};

/*子函数部分*/
void add_data();		/*增加数据*/
void update_data();	/*更新数据*/
void search_data();	/*查询数据*/
void delete_data();	/*删除数据,只做删除标志*/
void list_data();		/*显示数据*/
void pack();			/*在物理上删除作有删除标记的记录*/

/*主函数*/
FILE *fp;
void main()
{
	int select;		/*选择变量*/
	if((fp=fopen("stu.dat","rb+"))==NULL)		/*stu.dat文件不存在*/
	{
		if((fp=fopen("stu.dat","wb+"))==NULL)	/*打开stu.dat文件失败*/
		{
			printf("打开文件stu.dat失败!");
			system("PAUSE");		/*暂时停一下,等待下一个操作*/
		    exit(1);				/*退出程序*/
		}
	}
do
{
	printf("\n学生学籍管理系统\n");
	printf("1.增加数据 \n2.更新数据 \n3.查询数据\n4.删除数据\n5.显示数据 \n6.重组文件\n7.退出\n");
	printf("\n请选择:\n");
	scanf("%d",&select);
	while(select<1||select>7)
	{
		printf("请输入1至7的数:");
		scanf("%d",&select);
	}
	switch(select)
	{
	case 1:
		add_data();		/*增加数据*/
break; 
	case 2:
		update_data();		/*更新数据*/
break; 
    case 3:
		search_data();		/*查询数据*/
break; 
	case 4:
		delete_data();		/*删除数据,只作删除标志*/
break; 
	case 5:
		list_data();		/*显示数据*/
break; 
	case 6:
		pack();				/*在物理上删除作有删除标记的记录*/
break;	
	}
}while(select!=7);			/*选择7退出循环*/
fclose(fp);				/*关闭文件*/
system("PAUSE");			/*暂时停一下,等待下一个操作*/
}

/*增加数据函数*/
void add_data()
{
	struct student stu;		/*定义学生变量stu*/
	char tag;					/*设置标志是否继续添加数据*/
	stu.status=0;				/*数据状态,0:正常 1:删除*/
	do
	{
		printf("学号:");
		scanf("%d",&stu.num);
		printf("姓名:");
		scanf("%s",stu.name);
		printf("性别:");
		scanf("%s",stu.sex);
		printf("年龄:");
		scanf("%d",&stu.age);
		printf("籍贯:");
		scanf("%s",stu.origin);
		printf("系别:");
		scanf("%s",stu.depart);
		printf("专业:");
		scanf("%s",stu.major);
		printf("班级:");
		scanf("%d",&stu.clas);
		  
		fseek(fp,0,SEEK_END);			/*将指针移动到文件尾部*/
/*将学生信息存入文件中*/
		fwrite(&stu,sizeof(struct student),1,fp); 
		printf("继续添加吗(y/n):");
		while (getchar()!='\n');		/*跳过当前行*/
		tag=getchar();
		tag=tolower(tag);				/*将大写字母转化为小写字母*/
		while(tag!='y'&&tag!='n')
		{
			printf("输入非法,从新输入(y/n):");
			while(getchar()!='\n');	/*跳过当前行*/
			tag=getchar();
			tag=tolower(tag);			/*将大写字母转化为小写字母*/
		 }
	  }while(tag=='y');				/*当回答要求循环时*/
}

/*更新数据函数*/
void update_data()
{
	struct student stu;		/*学生*/
	int num;					/*要修改的学生的学号*/
	printf("输入要修改的学生的学号:");
	scanf("%d",&num);
	rewind(fp);				/*使位置指针返回到文件的开头*/
	fread(&stu,sizeof(struct student),1,fp);	/*读入学生信息*/
	while(!feof(fp))
	{
/*文件未结束*/
/*查找学号相同且数据状态正常未作删除标记*/
		if(stu.num==num&&stu.status==0) 
			break;
		fread (&stu,sizeof(struct student),1,fp);/*继续读取学生信息*/
	}
	if(!feof(fp))
	{
/*查询成功*/
		printf("更新前学生的信息:\n");
		printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n",
			"学号","姓名","性别","年龄","籍贯","系别","专业","班级");
		printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",
			stu.num,stu.name,stu.sex,stu.age,stu.origin,
			stu.depart,stu.major,stu.clas);
		printf("输入更新后的数据:\n");
printf("学号:");
		scanf("%d",&stu.num);
		printf("姓名:");
		scanf("%s",stu.name);
		printf("性别:");
		scanf("%s",stu.sex);
		printf("年龄:");
		scanf("%d",&stu.age);
		printf("籍贯:");
		scanf("%s",stu.origin);
		printf("系别:");
		scanf("%s",stu.depart);
		printf("专业:");
		scanf("%s",stu.major);
		printf("班级:");
		scanf("%d",&stu.clas);
/*将指针从当前位置移动到一个学生信息之前*/
		fseek(fp,-sizeof(struct student),SEEK_CUR); 
		fwrite(&stu,sizeof(struct student),1,fp);	/*写入数据*/
	}
	else
	{
/*查询失败*/
		printf("无此学号的学生!\n");
		clearerr(fp);		/*清除文件结束标志*/
	}
}

/*查询数据函数*/
void search_data()
{
	struct student stu;		/*学生*/
	int num;					/*学生的学号*/
	printf("输入要查询的学生的学号:");
	scanf("%d",&num);
	rewind(fp);
	fread(&stu,sizeof(struct student),1,fp);	/*读入学生信息*/
	while(!feof(fp))
	{
/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/
		if(stu.num==num&&stu.status==0)		 	/*查询成功*/
			break; 
		fread(&stu,sizeof(struct student),1,fp);/*读入学生信息*/
	}
    if(!feof(fp))
	{
/*查询成功*/
		printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n",
			"学号","姓名","性别","年龄","籍贯","系别","专业","班级");
        printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",
		    stu.num,stu.name,stu.sex,stu.age,stu.origin,
		    stu.depart,stu.major,stu.clas);
	}
	else
	{
/*查询失败*/
		printf("无此学号的学生:");
		clearerr(fp);
	}
}

/*删除数据函数*/
void delete_data()
{
	struct student stu;
	int num;
	printf("输入要删除数据的学生的学号:");
	scanf("%d",&num);
	rewind(fp);
	fread(&stu,sizeof(struct student),1,fp);
	while(!feof(fp))
	{
/*文件未结束*/
		/*学生的学号相同并且数据状态正常,未作删除标记*/
if(stu.num==num&&stu.status==0) 
			break;
		fread(&stu,sizeof(struct student),1,fp);
	}
	if(!feof(fp))
	{
/*查询成功*/
		printf("被删除记录为:\n");
        printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n",
			"学号","姓名","性别","年龄","籍贯","系别","专业","班级");
        printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",
		    stu.num,stu.name,stu.sex,stu.age,stu.origin,
		    stu.depart,stu.major,stu.clas);
		stu.status=1;		/*使数据状态为删除状态*/
		/*将指针从当前位置移动到一个学生信息之前*/
fseek(fp,-sizeof(struct student),SEEK_CUR); 
		fwrite(&stu,sizeof(struct student),1,fp);	/*写入数据*/
	}
	else
	{
/*查询失败*/
		printf("无此学生学号的信息!\n");
		clearerr(fp);
	}
}

/*显示数据函数*/
void list_data()
{
	struct student stu[MAX],tstudent;
	int select;		/*选择变量*/
	int stcout=0,n;	/*stcout表示学生的个数*/
	int i,j;
	printf("请选择:\n");
	printf("1.按学号显示  2.按专业显示\n");
	scanf("%d",&select);
	while(select<1||select>3)
	{
		printf("请输入1或2的数:");
		scanf("%d",&select);
	}
	rewind(fp);		/*使位置指针返回到文件的开头*/
	fread(&stu[0],sizeof(struct student),1,fp);		/*读入学生信息*/
	while(!feof(fp))
	{
/*计算文件中学生信息的学生数*/
		stcout++;
/*继续读入学生信息*/
		fread(&stu[stcout],sizeof(struct student),1,fp);
	}
	if(select==1)
	{
/*用冒泡排序法把学生信息按学号大小排序*/
		for(i=1;i<=stcout;i++)
			for(j=0;j<stcout-i;j++)
			{
				if(stu[j].num>stu[j+1].num)
				{
					tstudent=stu[j];
					stu[j]=stu[j+1];
					stu[j+1]=tstudent;
				}
			}
			printf("按学生的学号排序:\n");
			printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n",
			"学号","姓名","性别","年龄","籍贯","系别","专业","班级");
			for(i=0;i<stcout;i++)		/*按学号顺序输出学生信息*/
			{
				if(stu[i].status==0)	/*数据状态正常,未作删除标志*/
				{
                    printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",
		            stu[i].num,stu[i].name,stu[i].sex,stu[i].age,
			        stu[i].origin,stu[i].depart,stu[i].major,
			        stu[i].clas);
				}
			}
	}
	else
	{
/*用冒泡排序法把学生信息按专业排序*/
		for(i=0;i<stcout;i++)
			for(j=0;j<stcout-i;j++)
			{
				if(strcmp(stu[j].major,stu[j+1].major)>0)
				{
					tstudent=stu[j];
					stu[j]=stu[j+1];
					stu[j+1]=tstudent;
				}
			}
			printf("按专业排序:\n");
            printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n",
			"学号","姓名","性别","年龄","籍贯","系别","专业","班级");
			for(i=0;i<stcout;i++)		/*按专业顺序输出学生信息*/
			{
				if(stu[i].status==0)
				{
                    printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",
		            stu[i].num,stu[i].name,stu[i].sex,stu[i].age,
			        stu[i].origin,stu[i].depart,stu[i].major,
			        stu[i].clas);
				}
			}
	}
	clearerr(fp);		/*清除文件结束标记*/
}

/*重组文件函数*/
void pack()
{
	struct student stu;
	FILE *fpTmp;
	if((fpTmp=fopen("stu_tmp.dat","wb"))==NULL)
	{
/*文件stu_tmp.dat打开失败*/
		printf("打开文件stu_tmp.dat失败!");
		system("PAUSE");	/*暂时停一下,等待下一个操作*/
		exit(2);			/*退出程序*/
	}
	rewind(fp);			/*使文件指针返回到文件开头*/
	fread(&stu,sizeof(struct student),1,fp);	/*读入图书信息*/
	while(!feof(fp))
	{   
/*文件未结束*/
		if(stu.status==0)		/*数据状态正常,未作删除标记*/
			fwrite(&stu,sizeof(struct student),1,fpTmp);	/*写入图书信息*/
		fread(&stu,sizeof(struct student),1,fp);	/*继续读入图书信息*/
	}
	fclose(fp);fclose(fpTmp);				/*关闭文件*/
	remove("stu.dat");						/*删除文件*/
	rename("stu_tmp.dat","stu.dat");		/*更改文件名*/
	if((fp=fopen("stu.dat","rb+"))==NULL)
	{   
/*打开文件stu.dat失败*/
		printf("打开文件stu.dat失败!");
		system("PAUSE");		/*暂时停一下,等待下一个操作*/
		exit(3);				/*退出程序*/
	}
}
  • 44
    点赞
  • 464
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
学生管理系统程序 #include <iostream> using namespace std; #include <stdlib.h> double avg=0;//统计总分和加平均分权 const int mathp=4;//数学学分 const int cppp=5;//C++学分 const sum=70;//设置总学分 class Student { private: int num; char *name; char *sex; char *phone; char *rphone; double math; double cpp; Student* next; public: Student() {next=NULL;} ~Student(); void Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp); void Delete(Student *head,int data); Student* Find(Student* head,int data); void Display(Student* head); int Length(Student* head); void Math(Student* head,int data); void Update(Student* head,int data); void Insert(); }; Student* head=new Student;//带头结点的头指针 void Student::Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp) { Student* newnode=new Student;//新增加结点 newnode->num=num; newnode->name=name; newnode->sex=sex; newnode->phone=phone; newnode->rphone=rphone; newnode->math=math; newnode->cpp=cpp; newnode->next=*refhead; *refhead=newnode;//重置表头 } //遍历 void Student::Display(Student* head) { Student* temp; temp=head; if(temp->next==NULL)//判断空表 cout<<"没有学生!"; else {while(temp!=NULL)// { cout<<"学号:"<<temp->num<<"姓名:"<<temp->name<<"性别:"<<temp->sex<<"手机:"<<temp->phone<<"宿舍电话:"<<temp->rphone<<"数学成绩:"<<temp->math<<"C++成绩:"<<temp->cpp<<endl; temp=temp->next; } } return; } //人数 int Student::Length(Student* head) { Student* cur; cur=head; int count=0; while(cur!=NULL) { count++;//通过累加统计人数 cur=cur->next; } return count; } //查找 Student* Student::Find(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num=data) { bo=true;//如果找到则改变bo的值 cout<<"学号:"<<cur->num<<"姓名:"<<cur->name<<"性别:"<<cur->sex<<"手机:"<<cur->phone<<"宿舍电话:"<<cur->rphone<<"数学成绩:"<<cur->math<<"C++成绩:"<<cur->cpp<<endl; break; } cur=cur->next; } if(bo==false)//通过判断bo的值判断找到与否 cout<<"没有这个人!"<<endl; return cur; } //删除 void Student::Delete(Student* head,int data) { Student *bef,*cur; bef=cur=head; while(cur!=NULL) { if(cur->num==data) break; else {bef=cur;cur=cur->next;} } if(cur==head)//如果是头结点则删除头结点 { head=cur->next; delete cur; } else { bef->next=cur->next; delete cur; } } //修改 void Student::Update(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num==data) { bo=true; int a,b; char *c; double d; for(;;) //找到后提供各字段的修改 { cout<<"1修改学号|2修改姓名|3修改性别|4修改手机号|5修改宿舍电话号|6修改数学成绩|7修改C++成绩|8退出\n"; cin>>a; switch(a) { case 1:cout<<"输入新学号:"; cin>>b; cur->num=a; break; case 2:cout<<"输入新姓名:"; cin>>c; cur->name=c; break; case 3:cout<<"输入新性别:"; cin>>c; cur->sex=c; break; case 4:cout<<"输入新手机号:"; cin>>c; cur->phone=c; break; case 5:cout<<"输入新宿舍电话号:"; cin>>c; cur->rphone=c; break; case 6:cout<<"输入新数学成绩:"; cin>>d; cur->math=d; break; case 7:cout<<"输入C++成绩:"; cin>>d; cur->cpp=d; break; case 8:exit(1); break; default:cout<<"操作错误"; break; } } break; } } if(bo==false) cout<<"没有这个人!"<<endl; return; } //统计 void Student::Math(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num=data) { bo=true; avg=cur->math*(mathp/sum)+cur->cpp*(cppp/sum);//计算总分和加平均分权的公式 break; } cur=cur->next; } if(bo==false){ cout<<"没有这个人!"<<endl; return; } cout<<"该生的总分和加平均分权="<<avg<<endl; return; } //录入 void Student::Insert() { head=NULL; int num; char name[8]; char sex[4]; char phone[11]; char rphone[7]; double math; double cpp; cout<<"请输入基本信息:\n"; cout<<"学号:"; cin>>num; cout<<"姓名:"; cin>>name; cout<<"性别:"; cin>>sex; cout<<"手机号:"; cin>>phone; cout<<"宿舍电话:"; cin>>rphone; cout<<"数学成绩:"; cin>>math; cout<<"C++成绩:"; cin>>cpp; Push(&head,num,name,sex,phone,rphone,math,cpp);//调用函数Push建立有序链表 } //用释构函数逐个释放空间 Student::~Student() { while(head!=NULL) { delete head; head=head->next; } } //程序主入口 void main() { for(;;) { head=NULL; Student s; int x; int data; cout<<"|1录入|2查找|3删除|4修改|5统计|6退出|\n"; cout<<"请作选择:\n"; cin>>x; switch(x) { case 1: start: s.Insert(); cout<<"继续吗?[Y/N]"; char ch; cin>>ch; if(ch=='y' || ch=='Y') goto start; s.Display(head); int l; l=s.Length(head); cout<<"一共有"<<l<<"个学生。"<<endl; break; case 2: cout<<"请输入你要查找的学生的学号:"; cin>>data; s.Find(head,data); break; case 3: cout<<"请输入你要删除的学生的学号:"; cin>>data; s.Delete(head,data); break; case 4: cout<<"请输入你要修改的学生的学号:"; cin>>data; s.Update(head,data); break; case 5: cout<<"请输入你要统计的学生的学号:"; cin>>data; s.Math(head,data); break; case 6: exit(1); break; default:cout<<"操作错误!"<<endl; break; } }}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾亿-唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值