• 学生管理系统收获


    学生成绩信息管理系统收获

    这次的学生信息管理系统,锻炼了我对C语言知识的运用,我在其中负责的是老师的功能的实现以及文件读写的实现

    • 教师信息包括:工号、密码、姓名、性别、年龄、工龄学生信息管理:
      1. 添加学生,单个添加或批量添加
      2. 删除学生,删除后的学生记作退学学生修改学生基本信息
      3. 重置学生密码解锁学生帐号
      4. 根据姓名查询学生基本信息显示所有在读学生
      5. 显示所有退学学生
    • 学生成绩管理:
      1. 录入学生成绩,单个录入或指导入修改学生成绩
      2. 根据学号或姓名查询学生成绩按各科分数和部分排序
      3. 修改登陆密码

    以下是我文件读写功能实现的代码,在main函数开始时从文件读进管理员、教师、学生结构体,在程序退出时保存到文件中

    //读取文件中的信息
    	FILE* stu_r=fopen("stu.txt","r");
    	if(stu_r==NULL)
    	{
    		perror("fopen");
    		return 0;
    	}
    	fseek(stu_r,0,SEEK_END);
    	long ret_stu=ftell(stu_r);
    	rewind(stu_r);
    	stu_count=ret_stu/sizeof(student);
    	for(int i=0;i<stu_count;i++)
    	{
    		fread(&stu[i],sizeof(student),1,stu_r);
    	}
    	fclose(stu_r);
    	stu_r=NULL;
    	FILE* tea_r=fopen("tea.txt","r");
    	if(tea_r==NULL)
    	{
    		perror("fopen");
    		return 0;
    	}
    	fseek(tea_r,0,SEEK_END);
    	long ret_tea=ftell(tea_r);
    	rewind(tea_r);
    	tea_count=ret_tea/sizeof(teacher);
    	for(int i=0;i<tea_count;i++)
    	{
    		fread(&tea[i],sizeof(teacher),1,tea_r);
    	}
    	fclose(tea_r);
    	tea_r=NULL;
    	FILE* ma_r=fopen("ma.txt","r");
    	if(ma_r==NULL)
    	{
    		perror("fopen");
    		return 0;
    	}
    	fseek(ma_r,0,SEEK_END);
    	long ret_ma=ftell(ma_r);
    	rewind(ma_r);
    	ma_count=ret_ma/sizeof(manager);
    	for(int i=0;i<ma_count;i++)
    	{
    		fread(&ma[i],sizeof(manager),1,ma_r);
    	}
    	fclose(ma_r);
    	ma_r=NULL;
    //退出登录
    void quit(void)
    {	
    	FILE* stu_w=fopen("stu.txt","w");
    	if(stu_w==NULL)
    	{
    		perror("fopen");
    		return;
    	}
    	for(int i=0;i<stu_count;i++)
    	{
    		fwrite(&stu[i],sizeof(student),1,stu_w);
    	}
    	fclose(stu_w);
    	stu_w=NULL;
    	FILE* tea_w=fopen("tea.txt","w");
    	if(tea_w==NULL)
    	{
    		perror("fopen");
    		return;
    	}
    	for(int i=0;i<tea_count;i++)
    	{
    		fwrite(&tea[i],sizeof(teacher),1,tea_w);
    	}
    	fclose(tea_w);
    	tea_w=NULL;
    	FILE* ma_w=fopen("ma.txt","w");
    	if(ma_w==NULL)
    	{
    		perror("fopen");
    		return;
    	}
    	for(int i=0;i<ma_count;i++)
    	{
    		fwrite(&ma[i],sizeof(manager),1,ma_w);
    	}
    	fclose(ma_w);
    	return;
    }	
    

    在我开始写读写文件这一部分时,也遇到过一些问题,我直接把结构体字节数出来写到代码中去了,这会导致之后不能再往结构体中添加新的成员了,所以我改变了写法

    下面是我负责的老师批量添加学生,批量添加分数的代码

    //批量添加学生
    void batch_add_student(void)
    {
    	system("clear");
    	FILE *frp=fopen("batch_stu.txt","r");
    	if(NULL==frp)
    	{
    		printf("打开文件失败
    ");
    		return;
    	}
    	while(!feof(frp))
    	{
    		fscanf(frp,"%d %s %s %c %d %d %d %d %f %d %d %d %d %d %d %d
    ",&stu[stu_count].num,stu[stu_count].password,stu[stu_count].name,&stu[stu_count].sex,&stu[stu_count].age,&stu[stu_count].chinese,&stu[stu_count].math,&stu[stu_count].english,&stu[stu_count].avg,&stu[stu_count].sum,&stu[stu_count].rank_all,&stu[stu_count].rank_chinese,&stu[stu_count].rank_math,&stu[stu_count].rank_english,&stu[stu_count].index,&stu[stu_count].lock);
    		if(stu_count!=0)
    		{
    			stu[stu_count].num=stu[stu_count-1].num+1;
    		}
    		stu_count++;
    	}
    	fclose(frp);
    	frp=NULL;
    	puts("导入成功");
    	anykey_continue();
    }
    //批量添加分数
    void batch_add_score(void)
    {
    	int i;
    	system("clear");
    	FILE *frp=fopen("batch_score.txt","r");
    	if(NULL==frp)
    	{
    		printf("打开文件失败
    ");
    		return;
    	}
    	for(i=0;i<stu_count;i++)
    	{
    		if(strcmp(stu[i].name,"杨万里")==0)
    		{
    			while(!feof(frp))
    			{
    				fscanf(frp,"%d %d %d
    ",&stu[i].chinese,&stu[i].math,&stu[i].english);
    				if(stu[i].index==1)
    				{
    					stu[i].chinese=0;
    					stu[i].math=0;
    					stu[i].english=0;
    				}
    				i++;
    				
    			}
    			break;
    		}
    	}
    	fclose(frp);
    	frp=NULL;
    	puts("导入成功");
    	anykey_continue();
    }
    

    使用了feof这个文件指针,在批量写入时我用到了fscanf这个函数

    //隐藏密码函数
    void hide(char *pass)
    {
    	for(int i = 0;i<10;i++)
    	{
    		pass[i] = getch();
    		if(i==0 && 127==pass[i])
    		{	
    			i--;
    			printf(" ");
    			continue;
    		}
    		if(i>0&&127 == pass[i])
    		{
    			i-=2;	
    			printf(" ");
    			continue;
    		}
    		if('
    ' == pass[i])
    		{
    			pass[i] = '';
    			break;
    		}
    		putchar('*');
    	}
    	printf("
    ");
    }
    

    这个是我写的隐藏密码的函数,其中是退格,在写这个时也是遇到过一些问题,例入为0时,会发生错误,最后我让它在为0时先减一,再退格打印空格再退格,就正常了

    这次的这个项目也让我意识到了我的很多不足,我的框架搭建的就不是很好,有一些问题,但是也是通过这个项目学到了不少的知识

  • 相关阅读:
    python初接触
    Visual Studio Code 必备插件
    C# 基础知识 -- 枚举(Enum)
    Visual Studio : Console.WriteLine(); 快捷键
    C# 调用Outlook发送邮件
    C# Dos、Unix、Mac文件格式之间的相互转换
    Treeview控件失去焦点,将选择的节点设置为高亮显示
    oracle中的Exists、In、Any、All
    TreeView控件如何控制滚动条的位置
    oracle 查看最大连接数与当前连接数
  • 原文地址:https://www.cnblogs.com/xiwen2017/p/10129689.html
Copyright © 2020-2023  润新知