该系统管理学生的课程信息。系统提供账户的管理和学生信息的管理功能。
系统提供的功能主要有学生信息的查询、修改、增加、删除,账户信息的
查询、修改、增加、删除。
刚进入系统有两个选择
管理者(身份码为1)
普通学生(身份码为2)
初始化了两个登录身份
管理者使用姓名和密码登录:admin 123
学生使用姓名和学号登录:zhangsan 111
学生的功能只有一种,查看自己的信息
为了方便期间,学生信息中的课程用课程ID来代替,int类型
其他功能皆为管理员所有
程序设计方面,觉得有些地方不太合理
比如一般管理员,只有一个,没有必要对管理员的身份添加删除和修改
一些想法是可以扩展为3个对象
管理员身份(身份码为1)
老师身份(身份码为2)
学生身份(身份码为3)
在刚开始的登录界面就先进行身份选择,然后根据不同的身份码进入不同的界面
管理员可以对老师和学生信息进行操作,老师可以对学生部分信息进行操作
但该学生管理系统的目的主要是为了熟悉链表操作和文件操作,所以没有做其他修改。
代码设计流程参考了:
https://github.com/Mered1th-Wang/SIMS
预处理模块
系统在启动时会根据配置文件里的内容去相应文件里去加载账户信息和学生信息。
登陆模块
输入用户名和密码,输密码的时候用“*” 代表用户当前输入的内容。
输入回车代表结束。
当用户输入完用户名和密码后,系统会拿它去跟内存中的用户名和密码
匹配。如果匹配成功则进入系统菜单界面。如果匹配不成功则会直接退
出程序。实现方法是采用
#include<conio.h> char c=getch()
getch() 输入时,不会显示在屏幕上,读到一个字符后,就输出一个*,
当读到的是\b 字符,如何实现退格呢?先输出一个\b,再输出一个空格,
再输出一个\b,即使用 printf("\b \b")
系统功能菜单显示
根据用户名的权限不同显示不同的功能,普通用户只具有查询学生信息的功能。
当用户选择查询学生信息功能时会根据用户权限的不同显示不同功能的查询功能。
system.h文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define USR_NAME_LEN 20
#define USR_PWD_LEN 20
#define FILENAME_MAX 100
#define ACCOUNT 1
#define TRUE 1
#define ERROR -1
typedef int USR_ROLE;
typedef int SEARCH_ID;
typedef int USR_ACCOUNT_NUM;
typedef int USR_INFOR_NUM;
typedef int SYSTEM_MENU_TYPE;
typedef struct usr_account_tag
{
char usr_name[USR_NAME_LEN];
char usr_pwd[USR_PWD_LEN];
USR_ROLE usr_role;
struct usr_account_tag* pNext_Usr_Account;
}USR_ACCOUNT, *pUSR_ACCOUNT;
typedef struct usr_infor_tag
{
int usr_id;
char usr_name[USR_NAME_LEN];
int usr_course_id;
double usr_course_score;
struct usr_infor_tag* pNext_Usr_Infor;
}USR_INFOR, *pUSR_INFOR;
//系统初始化函数。初始化内存中的学生信息链表和账号列表。
void system_init(const char* config_file_name, pUSR_ACCOUNT* pUsr_Acount, pUSR_INFOR* pUsr_Infor);
//提示用户选择自己的身份信息
int Identity_Select();
//根据输入的用户名和密码检查是否合法并确认当前账号的权限(管理员或普通用户)
USR_ROLE role_confirm(pUSR_ACCOUNT pUsr_Account);
//根据输入的用户名和密码检查是否合法并确认当前账号的权限(管理员或普通用户)
USR_ROLE student_confirm(pUSR_INFOR pUsr_Infor);
//显示系统菜单,返回当前用户所选择的菜单
SYSTEM_MENU_TYPE show_system_menu(USR_ROLE role);
//当前用户选择查询功能时根据权限显示具有不同功能的查询功能的菜单
SYSTEM_MENU_TYPE show_search_menu(USR_ROLE role);
void print_student_self_information(pUSR_INFOR pUsr_Infor_List);
//显示所有学生信息
void search_usr_infor_all(pUSR_INFOR pUsr_Infor_List);
//根据当前用户所输的学号查询相应的学生信息。
void search_usr_infor_by_id(pUSR_INFOR pUsr_Infor_List, SEARCH_ID search_id);
//根据当前用户所输的姓名查询相应的学生信息。
void search_usr_infor_by_name(pUSR_INFOR pUsr_Infor_List, char* search_name);
//添加学生信息,返回指向插入的学生的指针
pUSR_INFOR add_usr_infor(pUSR_INFOR* ppUsr_Infor_List);
//修改学生的信息,返回指向修改后的学生的信息的指针
pUSR_INFOR update_usr_infor(pUSR_INFOR pUsr_Infor_List, SEARCH_ID search_id);
//删除学生的信息,返回所删除的学生的下一个学生的指针
pUSR_INFOR delete_usr_infor(pUSR_INFOR* ppUsr_Infor_List, SEARCH_ID search_id);
//根据当前账号输入的账号名查询相应的账号信息。
void search_usr_account(pUSR_ACCOUNT pUsr_Account_List, char* search_name);
//增加账号信息,返回指向当前账号的指针
pUSR_ACCOUNT add_usr_account(pUSR_ACCOUNT* ppUsr_Account_List);
//修改账号信息返回指向当前修改账号的信息
pUSR_ACCOUNT update_usr_account(pUSR_ACCOUNT* ppUsr_Account_List, char* search_name);
//删除账号信息,返回指向下一个账号的指针
pUSR_ACCOUNT delete_usr_account(pUSR_ACCOUNT* ppUsr_Account_List, char* search_name);
//将学生信息和账号信息保存到文件里去。
void save_data_to_file(pUSR_ACCOUNT pUsr_Account_List, pUSR_INFOR pUsr_infor_List);
system.c文件
#define _CRT_SECURE_NO_WARNINGS
#include "system.h"
extern int SERVE_STUDENT_ID;
//系统初始化函数。初始化内存中的学生信息链表和账号列表。
void system_init(const char* config_file_name, pUSR_ACCOUNT* pUsr_Acount, pUSR_INFOR* pUsr_Infor)
{
FILE* fp;
fp = fopen("configure.txt", "r");
if (NULL == fp)
{
perror("fopen");
return;
}
char buf[FILENAME_MAX];
memset(buf, 0, sizeof(buf));
char c;
int num = 0;
while ((c = fgetc(fp)) != EOF)
{
if (c == '\n')
{
break;
}
buf[num++] = c;
}
char* usr_account_file_ptr = (char*)calloc(FILENAME_MAX, sizeof(char));
strcpy(usr_account_file_ptr, buf);
memset(buf, 0, sizeof(buf));
num = 0;
while ((c = fgetc(fp)) != EOF)
{
buf[num++] = c;
}
char* usr_infor_file_ptr = (char*)calloc(FILENAME_MAX, sizeof(char));
strcpy(usr_infor_file_ptr, buf);
fclose(fp);
FILE* fp2;
fp2 = fopen(usr_account_file_ptr, "r");
if (NULL == fp2)
{
perror("fopen");
return;
}
pUSR_ACCOUNT temp = (pUSR_ACCOUNT)calloc(1, sizeof(USR_ACCOUNT));
while (fscanf(fp2, "%s\t%s\t%d\n", temp->usr_name, temp->usr_pwd, &temp->usr_role) == 3)
{
pUSR_ACCOUNT pnew = (pUSR_ACCOUNT)calloc(1, sizeof(USR_ACCOUNT));
strcpy(pnew->usr_name, temp->usr_name);
strcpy(pnew->usr_pwd, temp->usr_pwd);
pnew->usr_role = temp->usr_role;
if (NULL == *pUsr_Acount)
{
*pUsr_Acount = pnew;
}
else
{
pUSR_ACCOUNT ppreNode = *pUsr_Acount;
pUSR_ACCOUNT pcurNode = *pUsr_Acount;
while (pcurNode)
{
ppreNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Account;
}
ppreNode->pNext_Usr_Account = pnew;
pnew->pNext_Usr_Account = NULL;
}
}
fclose(fp2);
FILE* fp3;
fp3 = fopen(usr_infor_file_ptr, "r");
if (NULL == fp3)
{
perror("fopen");
return;
}
pUSR_INFOR tmp = (pUSR_INFOR)calloc(1, sizeof(USR_INFOR));
while (fscanf(fp3, "%d\t%s\t%d\t%lf\n", &tmp->usr_id, tmp->usr_name, &tmp->usr_course_id, &tmp->usr_course_score) == 4)
{
pUSR_INFOR pnew = (pUSR_INFOR)calloc(1, sizeof(USR_INFOR));
pnew->usr_id = tmp->usr_id;
strcpy(pnew->usr_name, tmp->usr_name);
pnew->usr_course_id = tmp->usr_course_id;
pnew->usr_course_score = tmp->usr_course_score;
if (NULL == *pUsr_Infor)
{
*pUsr_Infor = pnew;
}
else
{
pUSR_INFOR ppreNode = *pUsr_Infor;
pUSR_INFOR pcurNode = *pUsr_Infor;
while (pcurNode)
{
ppreNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Infor;
}
ppreNode->pNext_Usr_Infor = pnew;
pnew->pNext_Usr_Infor = NULL;
}
}
}
//提示用户选择自己的身份信息
int Identity_Select()
{
int num;
printf("请选择你的身份,按1为管理员身份,按2为普通学生身份:\n");
scanf("%d", &num);
return num;
}
//根据输入的用户名和密码检查是否合法并确认当前账号的权限(管理员或普通用户)
USR_ROLE role_confirm(pUSR_ACCOUNT pUsr_Account)
{
system("cls");
printf("输入用户的姓名:\n");
char name[USR_NAME_LEN];
scanf("%s", name);
char pwd[USR_PWD_LEN];
char c;
int num = 0;
printf("请输入密码:\n");
while (1)
{
c = _getch();
if ('\r' == c)
{
break;
}
if ('\b' == c)
{
if (num == 0)
continue;
else
{
printf("\b \b");
num--;
}
}
else
{
putchar('*');
pwd[num++] = c;
}
}
pwd[num] = '\0';
putchar('\n');
while (pUsr_Account)
{
if (strcmp(pUsr_Account->usr_name, name) == 0)
{
if (strcmp(pUsr_Account->usr_pwd, pwd) == 0)
{
return pUsr_Account->usr_role;
}
else
{
printf("密码错误!\n");
return ERROR;
}
pUsr_Account = pUsr_Account->pNext_Usr_Account;
}
}
if (NULL == pUsr_Account)
{
printf("该账户不存在!\n");
return ERROR;
}
}
USR_ROLE student_confirm(pUSR_INFOR pUsr_Infor)
{
system("cls");
printf("输入学生的姓名:\n");
char name[USR_NAME_LEN];
scanf("%s", name);
printf("请输入学生的学号:\n");
int ID;
scanf("%d", &ID);
while (pUsr_Infor)
{
if (strcmp(pUsr_Infor->usr_name, name) == 0)
{
if (pUsr_Infor->usr_id == ID)
{
SERVE_STUDENT_ID = ID;
return 2;
}
else
{
printf("学号错误!\n");
return ERROR;
}
pUsr_Infor = pUsr_Infor->pNext_Usr_Infor;
}
}
if (NULL == pUsr_Infor)
{
printf("该学生不存在!\n");
return ERROR;
}
}
//显示系统菜单,返回当前用户所选择的菜单
SYSTEM_MENU_TYPE show_system_menu(USR_ROLE role)
{
SYSTEM_MENU_TYPE num;
system("cls");
printf("====================== 欢迎来到学生管理系统 =====================\n");
if (role == 1)
{
printf("\t\t -------------------------------\n");
printf("\t\t| 1.search student information |\n");
printf("\t\t| 2.add student information |\n");
printf("\t\t| 3.update student information |\n");
printf("\t\t| 4.delete student information |\n");
printf("\t\t| 5.add user account |\n");
printf("\t\t| 6.update user account |\n");
printf("\t\t| 7.delete user account |\n");
printf("\t\t| 8.search user account |\n");
printf("\t\t| 9.exit |\n");
printf("\t\t -------------------------------\n");
}
else if (role == 2)
{
printf("\t\t -------------------------------\n");
printf("\t\t| 1.search student information |\n");
printf("\t\t| 9.exit |\n");
printf("\t\t -------------------------------\n");
}
printf("选择一个选项:\n");
scanf("%d", &num);
return num;
}
//当前用户选择查询功能时根据权限显示具有不同功能的查询功能的菜单
SYSTEM_MENU_TYPE show_search_menu(USR_ROLE role)
{
system("cls");
SYSTEM_MENU_TYPE num;
if (role == 1)
{
printf("\t\t -------------------------------\n");
printf("\t\t| 1.search all |\n");
printf("\t\t| 2.search by name |\n");
printf("\t\t| 3.search by id |\n");
printf("\t\t| 4.return |\n");
printf("\t\t -------------------------------\n");
}
else
{
printf("\t\t -------------------------------\n");
printf("\t\t| 1.search by name |\n");
printf("\t\t| 2.search by id |\n");
printf("\t\t| 3.return |\n");
printf("\t\t -------------------------------\n");
}
printf("选择一个选项:\n");
scanf("%d", &num);
return num;
}
void print_student_self_information(pUSR_INFOR pUsr_Infor_List)
{
while (pUsr_Infor_List)
{
if (pUsr_Infor_List->usr_id == SERVE_STUDENT_ID)
{
printf("%-5d %5s %-2d %.2f\n", pUsr_Infor_List->usr_id, pUsr_Infor_List->usr_name, pUsr_Infor_List->usr_course_id, pUsr_Infor_List->usr_course_score);
break;
}
pUsr_Infor_List = pUsr_Infor_List->pNext_Usr_Infor;
}
return;
}
//显示所有学生信息
void search_usr_infor_all(pUSR_INFOR pUsr_Infor_List)
{
if (NULL == pUsr_Infor_List)
{
printf("学生信息为空!\n");
return;
}
while (pUsr_Infor_List)
{
printf("%-5d %5s %-2d %.2f\n", pUsr_Infor_List->usr_id, pUsr_Infor_List->usr_name, pUsr_Infor_List->usr_course_id, pUsr_Infor_List->usr_course_score);
pUsr_Infor_List = pUsr_Infor_List->pNext_Usr_Infor;
}
}
//根据当前用户所输的学号查询相应的学生信息。
void search_usr_infor_by_id(pUSR_INFOR pUsr_Infor_List, SEARCH_ID search_id)
{
while (pUsr_Infor_List)
{
if (pUsr_Infor_List->usr_id == search_id)
{
printf("%-5d %10s %-2d %.2f\n", pUsr_Infor_List->usr_id, pUsr_Infor_List->usr_name, pUsr_Infor_List->usr_course_id, pUsr_Infor_List->usr_course_score);
return;
}
pUsr_Infor_List = pUsr_Infor_List->pNext_Usr_Infor;
}
if (NULL == pUsr_Infor_List)
{
printf("你所查找的用户信息不存在!\n");
}
}
//根据当前用户所输的姓名查询相应的学生信息。
void search_usr_infor_by_name(pUSR_INFOR pUsr_Infor_List, char* search_name)
{
while (pUsr_Infor_List)
{
if (strcmp(pUsr_Infor_List->usr_name, search_name) == 0)
{
printf("%-5d %5s %-2d %.2f\n", pUsr_Infor_List->usr_id, pUsr_Infor_List->usr_name, pUsr_Infor_List->usr_course_id, pUsr_Infor_List->usr_course_score);
return;
}
pUsr_Infor_List = pUsr_Infor_List->pNext_Usr_Infor;
}
if (NULL == pUsr_Infor_List)
{
printf("你所查找的用户信息不存在!\n");
}
}
//添加学生信息,返回指向插入的学生的指针
pUSR_INFOR add_usr_infor(pUSR_INFOR* ppUsr_Infor_List)
{
printf("请按照如下格式输入你需要添加的学生信息:\n");
printf("学号 姓名 科目 成绩\n");
pUSR_INFOR pnew = (pUSR_INFOR)calloc(1, sizeof(USR_INFOR));
scanf("%d %s %d %lf", &pnew->usr_id, pnew->usr_name, &pnew->usr_course_id, &pnew->usr_course_score);
pUSR_INFOR ptr1, ptr2;
ptr1 = ptr2 = *ppUsr_Infor_List;
if (NULL == *ppUsr_Infor_List)
{
*ppUsr_Infor_List = pnew;
}
else
{
while (ptr2)
{
if (ptr2->usr_id > pnew->usr_id)
{
ptr1->pNext_Usr_Infor = pnew;
pnew->pNext_Usr_Infor = ptr2;
}
ptr1 = ptr2;
ptr2 = ptr2->pNext_Usr_Infor;
}
ptr1->pNext_Usr_Infor = pnew;
pnew->pNext_Usr_Infor = NULL;
}
printf("你已成功添加该学生信息!\n");
return pnew;
}
//修改学生的信息,返回指向修改后的学生的信息的指针
pUSR_INFOR update_usr_infor(pUSR_INFOR pUsr_Infor_List, SEARCH_ID search_id)
{
printf("请按照如下格式输入你需要修改的学生信息:\n");
printf("学号 姓名 科目 成绩\n");
char name[USR_NAME_LEN];
int course_id;
int usr_id;
double score;
scanf("%d %s %d %lf", &usr_id, name, &course_id, &score);
pUSR_INFOR ptr = pUsr_Infor_List;
while (ptr)
{
if (ptr->usr_id == search_id)
{
ptr->usr_id = usr_id;
strcpy(ptr->usr_name, name);
ptr->usr_course_id = course_id;
ptr->usr_course_score = score;
printf("成功修改该学生信息!\n");
break;
}
ptr = ptr->pNext_Usr_Infor;
}
if (NULL == ptr)
{
printf("该学生学号不存在,修改失败!\n");
}
return ptr;
}
//删除学生的信息,返回所删除的学生的下一个学生的指针
pUSR_INFOR delete_usr_infor(pUSR_INFOR* ppUsr_Infor_List, SEARCH_ID search_id)
{
pUSR_INFOR ppreNode = *ppUsr_Infor_List;
pUSR_INFOR pcurNode = *ppUsr_Infor_List;
pUSR_INFOR pfreeNode;
if (pcurNode->usr_id == search_id)
{
*ppUsr_Infor_List = pcurNode->pNext_Usr_Infor;
pfreeNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Infor;
free(pfreeNode);
printf("成功删除该学生信息!\n");
return pcurNode;
}
while (pcurNode)
{
if (pcurNode->usr_id == search_id)
{
pfreeNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Infor;
ppreNode->pNext_Usr_Infor = pcurNode;
free(pfreeNode);
printf("成功删除该学生信息!\n");
return pcurNode;
}
ppreNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Infor;
}
if (NULL == pcurNode)
{
printf("你输入的学号有误,无该学生信息!\n");
}
return NULL;
}
//根据当前账号输入的账号名查询相应的账号信息。
void search_usr_account(pUSR_ACCOUNT pUsr_Account_List, char* search_name)
{
while (pUsr_Account_List)
{
if (strcmp(pUsr_Account_List->usr_name, search_name) == 0)
{
printf("%s %s %d\n", pUsr_Account_List->usr_name, pUsr_Account_List->usr_pwd, pUsr_Account_List->usr_role);
break;
}
pUsr_Account_List = pUsr_Account_List->pNext_Usr_Account;
}
if (NULL == pUsr_Account_List)
{
printf("输入错误,查无此人!\n");
}
}
//增加账号信息,返回指向当前账号的指针
pUSR_ACCOUNT add_usr_account(pUSR_ACCOUNT* ppUsr_Account_List)
{
printf("请按照如下格式输入你需要添加的账号信息:\n");
printf("姓名(xiaowang) 密码(1234) 身份(1)\n");
pUSR_ACCOUNT pnew = (pUSR_ACCOUNT)calloc(1, sizeof(USR_ACCOUNT));
scanf("%s %s %d", pnew->usr_name, pnew->usr_pwd, &pnew->usr_role);
pUSR_ACCOUNT ppreNode = *ppUsr_Account_List;
pUSR_ACCOUNT pcurNode = *ppUsr_Account_List;
if (NULL == *ppUsr_Account_List)
{
*ppUsr_Account_List = pnew;
}
else
{
while (pcurNode)
{
ppreNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Account;
}
ppreNode->pNext_Usr_Account = pnew;
pnew->pNext_Usr_Account = NULL;
}
printf("成功添加该信息!\n");
return pnew;
}
//修改账号信息返回指向当前修改账号的信息
pUSR_ACCOUNT update_usr_account(pUSR_ACCOUNT* ppUsr_Account_List, char* search_name)
{
printf("请按照如下格式输入你需要修改的账号信息:\n");
printf("姓名(xiaowang) 密码(1234) 身份(1)\n");
char name[USR_NAME_LEN];
char pwd[USR_NAME_LEN];
int role;
scanf("%s %s %d", name, pwd, &role);
pUSR_ACCOUNT pcurNode = *ppUsr_Account_List;
while (pcurNode)
{
if (strcmp(pcurNode->usr_name, search_name) == 0)
{
memset(pcurNode->usr_name, 0, sizeof(pcurNode->usr_name));
strcpy(pcurNode->usr_name, name);
pcurNode->usr_role = role;
memset(pcurNode->usr_pwd, 0, sizeof(pcurNode->usr_pwd));
strcpy(pcurNode->usr_pwd, pwd);
printf("成功更新账号信息!\n");
break;
}
pcurNode = pcurNode->pNext_Usr_Account;
}
if (NULL == pcurNode)
{
printf("输入错误,查无此人!\n");
}
return pcurNode;
}
//删除账号信息,返回指向下一个账号的指针
pUSR_ACCOUNT delete_usr_account(pUSR_ACCOUNT* ppUsr_Account_List, char* search_name)
{
pUSR_ACCOUNT ppreNode = *ppUsr_Account_List;
pUSR_ACCOUNT pcurNode = *ppUsr_Account_List;
pUSR_ACCOUNT pfreeNode;
if (NULL == *ppUsr_Account_List)
{
printf("账户信息为空!\n");
return NULL;
}
else if (strcmp(pcurNode->usr_name, search_name) == 0)
{
*ppUsr_Account_List = pcurNode->pNext_Usr_Account;
pfreeNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Account;
free(pfreeNode);
printf("删除成功!\n");
return pcurNode;
}
while (pcurNode)
{
if (strcmp(pcurNode->usr_name, search_name) == 0)
{
pfreeNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Account;
ppreNode->pNext_Usr_Account = pcurNode;
free(pfreeNode);
printf("删除成功!\n");
return pcurNode;
}
ppreNode = pcurNode;
pcurNode = pcurNode->pNext_Usr_Account;
}
}
//将学生信息和账号信息保存到文件里去。
void save_data_to_file(pUSR_ACCOUNT pUsr_Account_List, pUSR_INFOR pUsr_infor_List)
{
FILE* fp2;
fp2 = fopen("usr_account.txt", "w+");
if (NULL == fp2)
{
perror("fopen");
return;
}
while (pUsr_Account_List)
{
fprintf(fp2, "%s %s %d\n", pUsr_Account_List->usr_name,
pUsr_Account_List->usr_pwd, pUsr_Account_List->usr_role);
pUsr_Account_List = pUsr_Account_List->pNext_Usr_Account;
}
fclose(fp2);
FILE* fp3;
fp3 = fopen("usr_infor.txt", "w+");
if (NULL == fp3)
{
perror("fopen");
return;
}
while (pUsr_infor_List)
{
fprintf(fp3, "%d %s %d %.2f\n", pUsr_infor_List->usr_id, pUsr_infor_List->usr_name,
pUsr_infor_List->usr_course_id, pUsr_infor_List->usr_course_score);
pUsr_infor_List = pUsr_infor_List->pNext_Usr_Infor;
}
fclose(fp3);
}
main.c文件
#define _CRT_SECURE_NO_WARNINGS
#define USR_NAME_LEN 20
#define N 10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
int usr_id;
char usr_name[USR_NAME_LEN];
int gender;
double course_score_1;
double course_score_2;
double course_score_3;
struct student* pNext;
}Student_t, *pStudent_t;
int compare(const void* p1, const void* p2)
{
pStudent_t* ptr1 = (pStudent_t*)p1;
pStudent_t* ptr2 = (pStudent_t*)p2;
if (((*ptr1)->course_score_1 + (*ptr1)->course_score_2 + (*ptr1)->course_score_3) >
((*ptr2)->course_score_1 + (*ptr2)->course_score_2 + (*ptr2)->course_score_3))
{
return 1;
}
else
{
return 0;
}
}
int main(int argc, char** argv)
{
FILE* fp;
pStudent_t phead = NULL;
int cnt = 0;
if (argc != 2)
{
printf("error args\n");
return -1;
system("pause");
}
fp = fopen(argv[1], "r+");
if (NULL == fp)
{
perror("fopen");
return -1;
}
pStudent_t tmp = (pStudent_t)calloc(1, sizeof(Student_t));
while ((fscanf(fp, "%d\t%s\t%d\t%lf\t%lf\t%lf\n", &tmp->usr_id, tmp->usr_name, &tmp->gender,
&tmp->course_score_1, &tmp->course_score_2, &tmp->course_score_3)) == 6)
{
pStudent_t pnew = (pStudent_t)calloc(1, sizeof(Student_t));
pnew->usr_id = tmp->usr_id;
strcpy(pnew->usr_name, tmp->usr_name);
pnew->gender = tmp->gender;
pnew->course_score_1 = tmp->course_score_1;
pnew->course_score_2 = tmp->course_score_2;
pnew->course_score_3 = tmp->course_score_3;
if (phead == NULL)
{
phead = pnew;
}
else
{
pStudent_t ppreNode = phead;
pStudent_t pcurNode = phead;
while (pcurNode)
{
ppreNode = pcurNode;
pcurNode = pcurNode->pNext;
}
ppreNode->pNext = pnew;
pnew->pNext = NULL;
}
cnt++;
}
fclose(fp);
pStudent_t* pArr = (pStudent_t*)calloc(cnt, sizeof(pStudent_t));
pStudent_t pCur = phead;
for (int i = 0; i < cnt; i++)
{
pArr[i] = pCur;
pCur = pCur->pNext;
}
pCur = NULL;
qsort(pArr, cnt, sizeof(pStudent_t), compare);
fp = fopen(argv[1], "w+");
if (NULL == fp)
{
perror("fopen");
return -1;
}
for (int i = 0; i < cnt; i++)
{
fprintf(fp, "%d\t%s\t%d\t%f\t%f\t%f\n", pArr[i]->usr_id, pArr[i]->usr_name, pArr[i]->gender,
pArr[i]->course_score_1, pArr[i]->course_score_2, pArr[i]->course_score_3);
}
fclose(fp);
while (phead != NULL)
{
pCur = phead;
phead = phead->pNext;
free(pCur);
pCur = NULL;
}
free(pArr);
system("pause");
return 0;
}