<结构体应用>简单结构体实现学生成绩管理系统

该管理系统通过使用全局定义结构体存储学生信息,因此每个函数不用在形参调用;

使用了少量go to语句实现层级跳转;

注意:

        1.学号一般是很长的几位数,而int型只有4个字节,会出现数据溢出,所以定义long long;

long long n;

        2.查询遍历等操作不需要修改原数据,所以形参不用设置指针,但要传值判断结构体是否为空;但如删除操作则需要定义指针。(实参--单向传递-->形参);

        3.冒泡排序,单趟把最小的数据放在结构体最后面

for (i = 0; i < sn - 1; i++)
    {
        for (j = 0; j < sn - 1 - i; j++)   //每一趟比较把最小的数放在最下面 
        {
            if (stu[j].grades < stu[j + 1].grades)
            {
                temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }

完整代码:

/*******************学生成绩管理系统******************
************************阿布君***************** ******/ 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SN 50


struct ST    //定义数据模板 
{
	char name[10];
	int age;
	char sex;
	long long int xuehao;
	int grades;
}stu[SN];       //直接定义数组变量 


void firstface()      //设置首页 
{
	printf("           功能菜单如下:\n");
	printf("**0.重新查看功能表\n**1.查看系统中所有学生信息\n**2.检索个人信息(以学号)\n**3.录入学生信息\n**4.删除学生信息\n**5.学生成绩排名\n**6.导出学生成绩为txt文件\n**7.本地导入数据到系统\n**8.退出系统!\n\n请选择操作:\n"); 
} 
 
void ckall(int sn)						//1.查看所有学生信息 
{
	if(sn==0)                   //sn传入当前数组的数据个数 
	{
		printf("当前系统内无任何学生信息,请选择录入!\n");
		return;
	}
	int i;
	for(i=0;i<sn;i++)
	{
		printf("姓名:%s\n",stu[i].name);
		printf("	年龄:%d\n",stu[i].age); 
		printf("	性别:%c\n",stu[i].sex); 
		printf("	学号:%lld\n",stu[i].xuehao); 
		printf("	成绩:%d\n",stu[i].grades); 
		printf("\n");
	}
}


void one(int sm)					//2.通过学号检索学生信息 
{
	if(sm==0)
	{
		printf("当前系统内无任何学生信息,请选择录入!\n");
		return;
	}
	int i;
	long long n;                 //学号很长,int型只有4个字节,会出现数据溢出 
	printf("请输入要查询的学生的学号:\n");
	bg2:
	scanf("%d",&n);
	for(i=0;i<sm;i++)
	{
		if(stu[i].xuehao==n)
		{
			printf("查询结果为:\n");
			printf("	姓名:%s\n",stu[i].name);
			printf("	年龄:%d\n",stu[i].age); 
			printf("	性别:%c\n",stu[i].sex); 
			printf("	学号:%lld\n",stu[i].xuehao); 
			printf("	成绩:%d\n",stu[i].grades); 
			printf("\n");
			goto bg1;
		}
	}
	printf("未查询到该生信息,请重新确认学号并输入!\n");
	goto bg2;
	bg1:
		return;
}
void add(int *sm,int *p)						//3.批次录入学生信息 
{
	int k,i,j=0;
	bg2:
	printf("请确认要录入多少位学生的信息:\n");
	bg1:
	scanf("%d",&k);
	if(k>SN-*sm)
	{
		printf("超出系统容量!最多只能录入%d位学生,请重新确认输入人数!\n",SN);
		goto  bg1;
	}
	if(k<=0)
	{
		printf("输入错误,是否取消录入?\n**1.取消录入回到主界面\n**2.重新录入\n**3.退出系统!\n");
		bg3:
		scanf("%d",&j);
		if(j==1)
			{
				firstface();
				return; 
			}
		else if(j==2)
			goto bg2;
		else if(j==3)
			*p=0;
		else
			{
				printf("输入错误。请重新输入!");
				goto bg3;
			}
	}
	bg4:
	printf("请依次输入学生的:姓名 年龄 性别(M%cm或者W%cw) 学号 成绩",92,92);    //92是'\'的ASCII码 
	for(i=0;i<k;i++)
	{
		printf("\n请输入第%d名同学的信息:",i+1);
		scanf("%s %d %c %lld %d",stu[*sm+i].name,&stu[*sm+i].age,&stu[*sm+i].sex,&stu[*sm+i].xuehao,&stu[*sm+i].grades);  //注意:第一个stu[*sm+i].name不用加& 
		if(stu[*sm+i].sex!='M'&&stu[*sm+i].sex!='W'&&stu[*sm+i].sex!='m'&&stu[*sm+i].sex!='w')
		{
			printf("请按照要求格式输入!\n");
			goto bg4;
		}
	}
	printf("录入成功,请选择查看!\n");
	
	 *sm+=k; 
} 

void delete(int *sm)				//4.通过学号删除学生信息 
{
	if(*sm==0)
	{
		printf("当前系统内无任何学生信息,请选择录入!\n");
		return;
	}
	bg1:
	printf("请输入要删除的学生的学号进行删除:");
	int i,j;
	long long n;
	scanf("%d",&n);
	for(i=0;i<*sm;i++)
	{
		if(stu[i].xuehao==n)
		{
			for(;i<*sm-1;i++)
			{
				stu[i]=stu[i+1];
			} 
			stu[i].xuehao=0; 
			//system("CLS");
			printf("删除成功!\n");
			firstface();
			return;
		}
	}
	printf("未找到该学生信息,请选择重新输入或返回\n**1.重新输入\n**2.返回上一级\n");
	bg2:
	scanf("%d",&j);
	if(j==1)
		goto bg1;
	else if(j==2)
		{
			//system("CLS");
			firstface();
			return;
		}
	else
		{
			printf("输入错误。请重新输入!");
			goto bg2;
		}
		
	
}

void com(int sn)						//5.成绩排名(冒泡) 
{
	if (sn == 0)
    {
        printf("当前系统内无任何学生信息,请选择录入!\n");
        return;
    }
    int i, j;
    struct ST temp;
    for (i = 0; i < sn - 1; i++)
    {
        for (j = 0; j < sn - 1 - i; j++)   //每一趟比较把最小的数放在最下面 
        {
            if (stu[j].grades < stu[j + 1].grades)
            {
                temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }

    printf("学生成绩排名如下:\n");
    for (i = 0; i < sn; i++)
    {
        printf("姓名:%s\n", stu[i].name);
        printf("	年龄:%d\n", stu[i].age);
        printf("	性别:%c\n", stu[i].sex);
        printf("	学号:%lld\n", stu[i].xuehao);
        printf("	成绩:%d\n", stu[i].grades);
        printf("\n");
    }	
}

void dataout(int sn)					//6.导出到txt 
{
	 if (sn == 0)
    {
        printf("当前系统内无任何学生信息,请选择录入!\n");
        return;
    }
    FILE *fp;
    fp = fopen("students.txt", "w");
    if (fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    int i;
    for (i = 0; i < sn; i++)
    {
        fprintf(fp, "姓名:%s\n", stu[i].name);
        fprintf(fp, "	年龄:%d\n", stu[i].age);
        fprintf(fp, "	性别:%c\n", stu[i].sex);
        fprintf(fp, "	学号:%lld\n", stu[i].xuehao);
        fprintf(fp, "	成绩:%d\n", stu[i].grades);
        fprintf(fp, "\n");
    }
    fclose(fp);   //记得关闭文件 
    printf("导出成功!请在桌面查看students.txt文件。\n");
}

void insert(int *sn)
{
	FILE *fp;
	fp=fopen("students.txt","r");
	if (fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    *sn=0;
    while(!feof(fp)&&*sn<SN)
    {
    	fscanf(fp, "姓名:%s\n	年龄:%d\n	性别:%c\n	学号:%lld\n	成绩:%d\n", stu[*sn].name, &stu[*sn].age, &stu[*sn].sex, &stu[*sn].xuehao, &stu[*sn].grades);
    	*sn++;
	}
	
	
	 // 输出读取到的学生信息
	 int i; 
    for(i = 0; i < *sn; i++)
    {
        printf("姓名:%s\n", stu[i].name);
        printf("年龄:%d\n", stu[i].age);
        printf("性别:%c\n", stu[i].sex);
        printf("学号:%lld\n", stu[i].xuehao);
        printf("成绩:%d\n\n", stu[i].grades);
    }
	printf("文件导入成功!");
	*sn--;
}

void exitt(int *p) 					//8.退出系统! 6
{
	*p=0;
}


int main()
{
	int ex=1,*p=ex;   //定义一个指针,通过指针来实现退出循环(系统) 
	int snum=0;
	printf("******欢迎进入学生成绩管理系统!******\n");
	firstface();
	memset(&stu,0,sizeof(struct ST)*SN);
	while(ex)
	{
		int n;
		scanf("%d",&n);
		switch(n)
		{
			case 0:
					firstface();break;
			case 1:
					ckall(snum);break;
			case 2:
					one(snum);break;
			case 3:
					add(&snum,p);break;
			case 4:
					delete(&snum);break;
			case 5:
					com(snum);break;
			case 6:
					dataout(snum);break;
			case 7:
					insert(&snum);break;
			case 8:
					exitt(p);break;
			
			default:
					printf("输入有误,请重新输入!");
		}
	 
	
	
	
	}
	return 0;
} 

该代码有一个问题就是当导出为txt文件之后,下次想要直接导入,会因为格式错误而导入失败,目前还不知道怎么解决,请求高人指点,谢谢啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值