学校c++课设任务
有录入打印查找删除排序功能,发出来希望对你有帮助,多多三连支持,不喜勿喷谢谢

#include
#include
#include
#include
typedef struct _Student//定义一个学生
{
char name[20];//姓名
int num;//学号
int chinese;//成绩1
int math; //成绩2
int english; //成绩3
float average;//平均分
int score;//总分
}Student;
typedef struct _Node//定义一个节点
{
Student student;
struct _Node* next;
}Node;
void menu();
void inputStudent(Node* head);
void printStudent(Node* head);
void findStudent(Node* head);
void saveStudent(Node* head);
void countstudent(Node* head);
void loadStudent(Node* head);
void deleteStudent(Node* head);
void sortStudent(Node* head);
//以上是头文件内容,头文件名student或者将下一行删除
#include"student.h"
#pragma warning(disable:4996)
int main()
{
Node* head = (Node*)malloc(sizeof(Node));//创建头结点
head->next = NULL;
loadStudent(head); //读取文件学生信息
while (1)
{
menu();
char c = getch();
switch (c)
{
case '1': //录入学生信息
inputStudent(head);
break;
case '2': //打印学生信息
deleteStudent(head);
break;
case '3':
printStudent(head);
break;
case '4': //查找学生信息
findStudent(head);
break;
case '5': //计算所有学生总分和均分
countstudent(head);
break;
case '6': //按成绩排序
sortStudent(head);
break;
case '7': //退出系统
system("cls");
printf("Bye Bye!\n");
exit(0);
break;
default:
printf("数字错误请重新输入\n");
system("pause");//暂停程序
system("cls");//清空控制台
break;
}
}
return 0;
}
void menu() //菜单函数
{
system("title 学生成绩管理系统");
printf("*********************************\n");
printf("*\t学生成绩管理系统\t*\n");
printf("*********************************\n");
printf("*\t请选择功能列表\t\t*\n");
printf("*********************************\n");
printf("*\t1.录入学生信息\t\t*\n");
printf("*\t2.删除学生信息\t\t*\n");
printf("*\t3.打印学生信息\t\t*\n");
printf("*\t4.查找学生信息\t\t*\n");
printf("*\t5.计算所有学生总分和均分*\n");
printf("*\t6.按成绩排序\t\t*\n");
printf("*\t7.退出系统\t\t*\n");
printf("*********************************\n");
}//无问题
void inputStudent(Node* head)//录入学生信息
{
Node* fresh = (Node*)malloc(sizeof(Node));//创建头结点
fresh->next = NULL;
printf("请输入学生姓名\n");
scanf_s("%s", fresh->student.name,20);
printf("请输入学生学号\n");
scanf_s("%d", &fresh->student.num);
printf("请输入学生语文成绩\n"); //name前没有&符是因为数组代表地址所以不用&符
scanf_s("%d", &fresh->student.chinese);
printf("请输入学生数学成绩\n");
scanf_s("%d", &fresh->student.math);
printf("请输入学生英语成绩\n");
scanf_s("%d", &fresh->student.english);
printf("学生成绩录入完成\n");
Node* move = head;//尾插法
while (move->next != NULL) //当move当前指向的节点的下一个节点不为空时,move指向下一个节点
{
move = move->next;
}
move->next = fresh;//当move当前指向的节点的下一个节点为空时,将学生节点插入到尾部
saveStudent(head);
system("pause");//暂停程序
system("cls");//清空控制台
}//无问题
void printStudent(Node* head)//输出学生信息
{
Node* move = head->next;
while (move != NULL)
{
printf("姓名%s学号%d成绩1:%d成绩2:%d成绩3:%d\n", move->student.name, move->student.num, move->student.chinese, move->student.math, move->student.english);
move = move->next;
}
system("pause");//暂停程序
system("cls");//清空控制台
}//无问题
void findStudent(Node* head) //查找学生信息
{
printf("请输入要查找的学生的学号:\n ");
int num;
scanf_s("%d", &num);
Node* move = head->next;//从首元节点开始
while (move != NULL)
{
if (num == move->student.num)
{
printf("姓名%s,学号%d,成绩1:%d,成绩2:%d,成绩3:%d\n", move->student.name, move->student.num, move->student.chinese, move->student.math, move->student.english);
system("pause");//暂停
system("cls");//清屏
return;
}
move = move->next;
}
printf("未找到学生信息\n");
system("pause");//暂停
system("cls");//清屏
}
void saveStudent(Node* head) //保存学生信息
{
FILE* file = fopen("./stu.info", "w");//(在当前文件夹打开stu.info,写入)发回一个文件指针
Node* move = head->next;
while (move != NULL)
{
if (fwrite(&move->student, sizeof(Student), 1, file) != 1) //(写哪个结构体,大小,写入次数,判断)
{
printf("写入失败\n");
return;
}
move = move->next;
}
fclose(file);//关闭文件
}
void loadStudent(Node* head) //读取文件
{
FILE* file = fopen("./stu.info", "r");//(在当前文件夹找stu.info,读取)
if (!file)//没有生成文件指针
{
printf("没有学生文件,跳过读取\n");
return;
}
Node* fresh = (Node*)malloc(sizeof(Node));
fresh->next = NULL;
Node* move = head;
while (fread(&fresh->student, sizeof(Student), 1, file) == 1)//(读取的结构体,读取大小,读取次数,读取成功)
{
move->next = fresh;
move = fresh;
fresh = (Node*)malloc(sizeof(Student));
fresh->next = NULL;
}
free(fresh);
fclose(file);//关闭文件
printf("读取成功\n");
}//无问题
void deleteStudent(Node* head) //删除学生信息
{
printf("请输入要删除的学生学号 :");
int num;
scanf_s("%d", &num);
Node* move = head;
while (move->next != NULL)//遍历链表找
{
if (move->next ->student.num == num)//找到相同学号
{
Node* tmp = move->next;//该指针为释放空间以目的定义
move->next = move->next->next;//跳过move->next
free(tmp);//释放tmp/move->nect指向节点所占空间
tmp = NULL;//tmp指向为空,防止后期成为野指针
saveStudent(head);//保存
printf("删除成功\n");
system("pause");//暂停
system("cls");//清屏
return;
}
move = move->next;
}
printf("未找到学生信息\n");
system("pause");//暂停
system("cls");//清屏
}//无问题
void countstudent(Node* head)//各学生成绩总分和平均值
{
Node* move = head->next;
while(move != NULL)//遍历链表求各学生成绩平均值,成绩平均值可以反映总评好坏
{
move->student.average = float((move->student.chinese + move->student.math + move->student.english) / 3);
move->student.score = move->student.chinese + move->student.math + move->student.english;
printf("姓名%s,平均分%f,总分%d\n",move->student.name, move->student.average,move->student.score);
move = move->next;
}
system("pause");//暂停
system("cls");//清屏
}//无问题
void sortStudent(Node* head)//排序
{
Node* sort = head->next;
while (sort != NULL)//遍历链表求各学生成绩平均值,成绩平均值可以反映总评好坏
{
sort->student.average = float((sort->student.chinese + sort->student.math + sort->student.english) / 3);
sort->student.score = sort->student.chinese + sort->student.math + sort->student.english;
sort = sort->next;
}
Node* move = NULL;
for (Node* turn = head->next; turn->next != NULL; turn = turn->next)//双循环冒泡排序,turn控制比较轮数
{
for (Node*move = head->next; move->next != NULL; move = move->next) //move控制比较次数
{
if (move->student.score > move->next->student.score)
{
Student temp = move->student;
move->student = move->next->student;//交换节点里的学生数据
move->next->student = temp;
}
}
}
printf("总分从低到高\n");
printStudent(head);
}//无问题
标签: