C语言实现学生成绩管理系统实战教学分享!

在写成绩录入和成绩打印功能时,发现始终只能保存(没加入文件保存)最后一个数据,确定链表的相关操作没有问题,仔细判断逻辑关系后,发现是每次在头节点传到GetScore()函数,为新节点申请内存后,直接将数据保存在了新申请的节点里面,没有将链表移动到尾节点,导致每次录入成绩,都会覆盖前一次输入的数据。解决办法是链表传到函数后,先移动到最后一个节点,将新申请的节点挂接在最后一个节点之后。

  /*成绩录入*/  void GetScore(Lnode *&h)  {  	Lnode *p, *q = h;  	char name[10], id[15];  	int Math, English, Datastruct;  	p = (Lnode *)malloc(sizeof(Lnode));		//为学生信息申请节点  	printf("请依次输入学生信息:n");  	printf("姓名 学号 数学 英语 数据结构n");  	scanf("%s %s %d %d %d", &name, &id, &Math, &English, &Datastruct);     	for (; q->next != NULL; q = q->next){;}  //移动到尾节点  	//保存数据  	strcpy(p->Name, name);  	strcpy(p->ID, id);  	p->Score[0] = Math;  	p->Score[1] = English;  	p->Score[2] = Datastruct;  	p->Ave_Sco = ((float)((p->Score[0] + p->Score[1] + p->Score[2]) - 150)) / 30;          //始终指向最后一个节点  	p->next = NULL;  	q->next = p;  	q = p;  }  

二、文件操作

用文件保存遇到的问题主要是每次打印数据时除正常数据外,始终多一行乱码。判断方法是while(!feof(file))。排除错误时确定了两种可能性:多保存了一行;多读取了一行。经过某度feof()与EOF的关系后,确定是多读取了一行数据。

用feof()函数进行文件尾判断时,当文件已经到达尾部后,还需要在读取一次后,feof()函数才会返回-1,所以会出现多读一次的情况;解决办法时,在循环读取之前先将第一个数据读取出来,然后在正常读取。即注意多读一次的问题。

  /*打开文件*/  void LoadInf(Lnode *h)  {  	Lnode *p = h;  	Lnode *q;  //临时变量 用于保存从文件中读取的信息  	FILE* file = fopen("./Information.dat", "rb");  	if (!file)  	{  		printf("文件打开失败!");  		return ;  	}     	/*  		使用feof判断文件是否为结束要注意的问题:  			当读取文件结束时,feof函数不会立即设置标志符为-1,而是  			需要再读取一次后,才会设置。所以要先读一次。  	*/  	q = (Lnode *)malloc(sizeof(Lnode));  	fread(q, sizeof(Lnode), 1, file);  	while (!feof(file))  //一直读到文件末尾  	{  		p->next = q;  		p = q;  		q = (Lnode *)malloc(sizeof(Lnode));  		fread(q, sizeof(Lnode), 1, file);  	} //while循环结束  	p->next = NULL;  	fclose(file);  }  

—-想了解C语言实现学生成绩管理系统实战教学分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482686.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐