#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 4 //修改 课程数目
typedef struct stu
{
long stuID; //学号
char stuname[10]; //名字
char stusex; //性别
int score[N]; //分数
int total; //总分
float aver; //平均分 int
int line; //排名
}STU;
typedef struct node //创建结点类型
{
STU stu; //数据域
struct node* next; //指向下一个节点的指针
}NODE;
NODE* head = NULL; //定义头指针
//NODE* creatlist();
void IDtoscoreandline();
void start();
void inputstudent();
void savestudent();
void readstudent();
void printfstudent();
void rank(); //排名次函数
int main()
{
//int arr[100] = { 1 };//存每名学生的名次 修改
int m = 4;
while (1)
{
start();
char ch = _getch();
switch (ch)
{
case '1': //录入学生信息
inputstudent(); //inputstudent(stu); 修改
rank();
break;
case '2': //保存学生信息
savestudent();
break;
case '3'://读取学生信息
readstudent();
break;
case '4': //打印学生信息
printfstudent();
break;
case'5': //根据学号查询学生的分数及名次
IDtoscoreandline();
break;
case'6': //根据姓名查询学生的分数及名次
break;
case '7': //按学号由小到大排出成绩表
break;
case '8': //按姓名字典顺序排序排出成绩表
break;
}
}
return 0;
}
void start()
{
printf("*****************************************\n");
printf("欢迎使用学生成绩管理系统 *\n");
printf("*1.录入学生信息 *\n");
printf("*2.保存学生信息 *\n");
printf("*3.读取学生信息 *\n");
printf("*4.打印学生信息 *\n");
printf("*5.按总分由高到低排出名次 *\n");
printf("*6.按总分由低到高排出名次 *\n");
printf("*7.按学号由小到大排出成绩表 *\n");
printf("*8.按姓名字典顺序排序排出成绩表 *\n");
printf("*9.根据学号查询学生成绩及排名 *\n");
printf("*0.根据姓名查询学生成绩及排名 *\n");
printf("*****************************************\n");
}
NODE* creatlist() //创建表头表示整个链表即创建链表(表头可以是头结点,也可以是数据结点,通常是头结点)
{
NODE* headNode = (NODE*)malloc(sizeof(NODE));
headNode->next = NULL;
return headNode;
}
void inputstudent()
{
int i;
NODE* newnode = (NODE*)malloc(sizeof(NODE));
newnode->next = NULL;
printf("学号:");
scanf_s("%ld", &newnode->stu.stuID);
printf("姓名:");
scanf_s("%s", newnode->stu.stuname, 10);
printf("性别:");
scanf_s(" %c", &newnode->stu.stusex, 1);
printf("%d门课程成绩:", N);
for (i = 0, newnode->stu.total = 0; i < N; i++) { //输入4科成绩并计算总分
scanf_s("%d", &newnode->stu.score[i]);
newnode->stu.total += newnode->stu.score[i];
}
newnode->stu.aver = (float)(newnode->stu.total / N); //计算平均数
if (head == NULL)//以下代码,实现输入每个学生信息后,按总分从高到低链入链表
head = newnode;
else
{
NODE* p = head;
while (p->next && p->next->stu.total > newnode->stu.total)
p = p->next;
if (p == head && p->stu.total < newnode->stu.total)
{
newnode->next = head;
head = newnode;
}
else
{
newnode->next = p->next;
p->next = newnode;
}
}
}
void savestudent() //保存学生信息
{
FILE* pf = fopen("pph.txt", "w"); //创建并打开文件
if (pf == NULL) //判断打开文件是否失败
{
printf("打开文件失败\n");
return;
}
NODE* p = head;
while (p != NULL)
{
fwrite(&p->stu, sizeof(STU), 1, pf);
p = p->next;
}
fclose(pf);
printf("数据保存成功\n");
}
void readstudent() //读取学生信息
{
FILE* pf = fopen("pph.txt", "r"); //打开文件
if (pf == NULL) //判断打开文件是否失败
{
printf("err!\n");
return;
}
NODE* pt = NULL;
while (1)
{
NODE* newnode = (NODE*)malloc(sizeof(NODE));
newnode->next = NULL;
if (fread(&newnode->stu, sizeof(STU), 1, pf) != 1) {
free(newnode);
break;
}
if (head == NULL)
head = newnode;
else
{
if (!pt) {
pt = head;
while (pt->next) pt = pt->next;
}
pt->next = newnode;
pt = newnode;
}
}
fclose(pf);
printf("加载数据成功\n");
}
void printfstudent()
{
int i;
NODE* P = head;
while (P != NULL)
{
printf("%ld %s %c", P->stu.stuID, P->stu.stuname, P->stu.stusex);
for (i = 0; i < N; i++)
printf(" %d", P->stu.score[i]);
printf(" %d %.2f %d\n", P->stu.total, P->stu.aver, P->stu.line);
P = P->next;
}
system("pause");
}
void rank() // 排名次函数
{
int k = 0;
NODE* P = head, * pre = NULL;
while (P != NULL)
{
if (P == head)
k++;
else if (pre->stu.total != P->stu.total){
k++;
}
P->stu.line = k;
pre = P;
P = P->next;
}
}
void IDtoscoreandline()
{
printf("输入学生学号:");
long ID = 0;
scanf_s("%ld", ID);
int i;
NODE* k = (NODE*)malloc(sizeof(NODE*));
k = head->next;
while (1)
{
if (k->stu.stuID == ID);
{
printf("%d %d", k->stu.total, k->stu.line);
break;
}
k = k->next;
}
}
调用IDtoscoreandline();的时候运行错误了
应该是IDtoscoreandline()函数写的有问题,如何修改?