问题遇到的现象和发生背景
代码是输入学号和姓名并进行循环,查到学号相同或姓名相同时输出,但在实际使用时出现输入的和输出的对应不上,不知道是哪里出现了问题,软件使用的是VS2019
问题相关代码,请勿粘贴截图
//题目 5:学生成绩记录系统
//设计和实现一个“学生成绩记录系统”,满足以下要求:
//1.系统以菜单方式工作;
//2.使用链表或结构数组对不同班级的学生成绩信息进行管理和维护;
//3.使用二进制文件在磁盘上保存学生记录信息;
//4.链表中各结点或结构数组中各元素包括“学号、班级、姓名、语文、数学、
//外语、计算机、平均分、总分”字段;
//5.实现如下基本功能:
//(1)列出指定班级的所有学生的成绩单
//(2)录入学生记录 (新增学生的信息)
//(3)查找学生 (查找指定学号的学生,显示该学生的学号、班级、
//姓名、所有课程成绩)
//(4)删除学生 (删除指定学号的学生)
//(5)计算总分和平均分 (计算每位学生四门课程的平均分和总分)
//(5)排序 (对指定班级的所有学生按总分由高到低的方式排序并输出)
//(6)统计指定班级各门课程的平均分 (计算并输出某班级学生每门课程
//的平均分)
//(7)查询所有存在不及格课程的学生,并输出这些学生信息;
//(8)将学生记录保存到文件存盘 (将数据以文件的形式存盘)
//(9)从文件中读入学生记录 (将已经盘的文件数据读入内存)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
//链表基础
typedef struct _student
{
int num, cla;
char name[20];
float chi, mat, eng, com, aver, sum;
}student;
//链表节点
typedef struct _Node
{
student stu;
struct _Node* pNext;
}Node;
Node* g_pHead = NULL;
//启动界面
void interface()
{
printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t\t学生信息管理系统(初版)\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t\t1.显示学生信息\t\t\t*\n");
printf("*\t\t2.录入学生信息\t\t\t*\n");
printf("*\t\t3.查找学生信息\t\t\t*\n");
printf("*\t\t4.删除学生信息\t\t\t*\n");
printf("*\t\t5.计算平均分、总分\t\t*\n");
printf("*\t\t6.统计科目平均分\t\t*\n");
printf("*\t\t7.查询存在挂科学生\t\t*\n");
printf("*\t\t8.保存学生信息\t\t\t*\n");
printf("*\t\t9.读取学生信息\t\t\t*\n");
printf("*\t\t0.退出程序\t\t\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
}
//功能1:显示学生信息
void print()
{
system("cls");//清除屏幕
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t\t\t\t\t\t学生信息管理系统(初版)\t\t\t\t\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t姓名\t*\t学号\t*\t班级\t*\t语文\t*\t数学\t*\t英语\t*\t计算机\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
Node* p = g_pHead;
while (p != NULL)
{
printf("*\t%s\t*\t%d\t*\t%d\t*\t%5.1f\t*\t%5.1f\t*\t%5.1f\t*\t%5.1f\t*\n", p->stu.name, p->stu.num, p->stu.cla, p->stu.chi, p->stu.mat, p->stu.eng, p->stu.com);
p = p->pNext;
}
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
//功能2:录入学生信息
void enter()
{
Node* pNewNode = (Node*)malloc(sizeof(Node));//pNewNode是一个空的新节点
pNewNode->pNext = NULL;
if (g_pHead == NULL)//头插法
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf_s("%s", pNewNode->stu.name,20);//接收姓名
printf("请输入学号:\n");
scanf_s("%d", &pNewNode->stu.num);//接收学号
printf("请输入班级:\n");
scanf_s("%d", &pNewNode->stu.cla);//接收班级
printf("请输入语文、数学、英语、计算机成绩:\n");
scanf_s("%f%f%f%f", &pNewNode->stu.chi, &pNewNode->stu.mat, &pNewNode->stu.eng, &pNewNode->stu.com);//接收各科目成绩
printf("录入成功!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
//功能3:查找学生信息
Node* find()
{
int numstu;
char namestu[20];
printf("请输入要查找的学生的学号:");
scanf_s("%d", &numstu);
printf("请输入要查找学生的姓名:");
scanf_s("%s", namestu,20);
Node* p = g_pHead;
while (p!=NULL)
{
if (p->stu.num == numstu || strcmp(p->stu.name, namestu))
{
return p;
}
p = p->pNext;
}
return NULL;
}
//功能4:删除学生信息
void deletestu()
{
int numstu;
printf("请输入要删除的学生学号:");
scanf_s("%d", &numstu);
Node* p1, * p2;
//判断是否为头节点
if (g_pHead->stu.num == numstu)
{
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
return;
}
//当不是头结点时
Node* p = g_pHead;
while (p->pNext != NULL)
{
if (p->pNext->stu.num == numstu)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
return;
}
p = p->pNext;
if (p->pNext == NULL)
{
break;
}
}
if (p->pNext == NULL)
{
printf("未找到该学生!\n");
}
}
//功能5:计算平均分和总分
void plus()
{
printf("正在计算每位同学的平均分和总分。。。\n");
printf("计算完成!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t\t\t\t学生信息管理系统(初版)\t\t\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("*\t姓名\t*\t学号\t*\t班级\t*\t平均分\t*\t总分\t*\n");
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
Node* p = g_pHead;
while (p != NULL)
{
p->stu.aver = (p->stu.chi + p->stu.mat + p->stu.eng + p->stu.com) / 4;
p->stu.sum = p->stu.chi + p->stu.mat + p->stu.eng + p->stu.com;
printf("*\t%s\t*\t%d\t*\t%d\t*\t%5.1f\t*\t%5.1f\t*\n",p->stu.name,p->stu.num,p->stu.cla,p->stu.aver,p->stu.sum);
p = p->pNext;
}
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
//功能6:统计某一科目的平均分
//功能7:查询存在不及格的学生
//功能8:保存学生信息
void save()
{
FILE* fp = fopen("C:\\Users\\给不了的未来\\Documents\\information.dat", "w+");//打开文件并写入
if (fp == NULL)
{
perror("未能成功打开文件。\n");
system("pause");//暂停程序
system("cls");//清除屏幕
return;
}
Node* p = g_pHead;
while (p != NULL)
{
fwrite(&p->stu, 1, sizeof(student), fp);
p = p->pNext;
}
fclose(fp);//关闭文件
printf("\n保存文件成功!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
//功能9:读取学生信息
void load()
{
FILE* fp = fopen("C:\\Users\\给不了的未来\\Documents\\information.dat", "r");
if (fp == NULL)
{
printf("打开文件失败或该文件不存在!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
return;
}
student stu;
while (fread(&stu, 1, sizeof(student), fp))
{
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode, &stu, sizeof(student));
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
fclose(fp);
printf("成功加载文件中的数据!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
//主函数
int main()
{
while (1)
{
interface();
char ch=_getch();
switch (ch)
{
case '1':
print();
break;//功能1:显示学生信息
case '2':
enter();
break;//功能2:录入学生信息
case '3':
{
Node* p = find();
if (p != NULL)
{
printf("姓名:%s\t学号:%d\t班级:%d\t语文:%5.1f\t数学:%5.1f\t英语:%5.1f\t计算机:%5.1f\n",p->stu.name,p->stu.num,p->stu.cla,p->stu.chi,p->stu.mat,p->stu.eng,p->stu.com);
}
else
printf("未找到该学生!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
break;//功能3:查找学生信息
}
case '4':
{
deletestu();
system("pause");//暂停程序
system("cls");//清除屏幕
break;//功能4:删除学生信息
}
case '5':
plus();
break;//功能5:计算平均分和总分
case '6':break;//功能6:统计某一科目的平均分
case '7':break;//功能7:查询存在不及格的学生
case '8':
save();
break;//功能8:保存学生信息
case '9':
load();
break;//功能9:读取学生信息
case '0':
printf("谢谢您的使用!\n");
return 0;
default:
printf("您的输入有误,请重新输入!\n");
system("pause");//暂停程序
system("cls");//清除屏幕
}
}
return 0;
}