您的位置:首页 > 其它

学生成绩管理C实现

2015-10-07 12:56 253 查看
对学生的基本信息及成绩的管理,有增删查找修改保存的功能。

具体的通过代码和图形进行实现。

系统总体框图



具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TITLE "学生成绩管理系统"
#define MAX 10

#define MENU_MAIN_COUNT 8 /* 主菜单的选项个数 */
#define MENU_SEARCH_COUNT 4 /* 查询子菜单的选项个数 */
#define MENU_CALC_COUNT 3 /* 计算子菜单的选项个数 */

typedef struct student{
char name[MAX]; /* 姓名 */
char num[MAX]; /* 学号 */
char sex[MAX]; /* 性别 */
int chinese; /* 语文成绩 */
int mathematic; /* 数学成绩 */
int english; /* 英语成绩 */
int computer; /* 计算机成绩 */
struct student *next; /* 指向下一个学生的指针 */
}stu;

/* 定义一个头节点,将其初始化为空 */
stu* head = NULL;

/* 声明主要处理函数 */
void input_record(); /* 输入学生成绩的处理 */
void show_record(); /* 显示学生成绩的处理 */
void search_record(); /* 查询学生的成绩处理 */
void update_record(); /* 更新学生成绩 */
void delete_record(); /* 删除学生成绩 */
void calculate(); /* 计算学生成绩 */
void save_to_file(); /* 保存到文件的处理 */
void exit_system(); /* 退出系统 */

/* 声明查询子函数 */
void search_by_id(); /* 通过学号检索学生的处理 */
void search_by_name(); /* 通过姓名检索学生的处理 */
void search_by_sex(); /* 通过性别检索学生的处理 */
void search_exit(); /* 退出子菜单,返回上级菜单 */

/* 计算子函数声明 */
void calc_total(); /* 计算总成绩的处理 */
void calc_average(); /* 计算平均成绩的处理 */
void calc_exit(); /* 退出子菜单,返回上级菜单 */

/* 辅助函数申明 */
void create_stu_by_input(stu* pNewStu); /* 通过输入为student赋值 */
stu* get_last_student(stu *p); /* 找到最后一个学生的记录 */
void clear_record(); /* 清空所有记录 */

/* 显示控制函数申明 */
void print_menu_main(); /* 显示主菜单 */
void print_menu_title(char* title); /* 显示菜单的标题 */

void print_table_head(); /* 显示学生记录的表格的头部 */
void print_table_row(stu* p); /* 显示一条学生记录的表格的底部 */
void print_table_buttom(); /* 显示总分表格的底部 */

void print_table_head_total(); /* 显示总分数表格的头部 */
void print_table_row_total(stu *p); /* 显示一个学生的总分数 */
void print_table_buttom_total(); /* 显示总分数表格的底部 */

void print_table_head_avg(); /* 显示平均分表格的头部 */
void print_table_row_avg(stu* p); /* 显示一个学生的平均分 */
void print_table_buttom_avg(); /* 显示平均分表格的底部 */

/* 全局变量声明 */
/* 主菜单显示的字符 */
char menu_main[]=
"|\n"
"| 1 输入学生成绩\n"
"| 2 显示学生成绩\n"
"| 3 查询学生成绩\n"
"| 4 更新学生成绩\n"
"| 5 删除学生成绩\n"
"| 6 计算学生成绩\n"
"| 7 保存文件\n"
"| 8 退出系统\n"
"|\n";

/* 函数指针数组用来存储菜单项中8个功能函数的地址 */
void( *menu_main_func[])()=
{
input_record,
show_record,
search_record,
update_record,
delete_record,
calculate,
save_to_file,
exit_system
};

/* 字符数组中存储的是查询子菜单中要显示的字符 */
char menu_search[]=
"|\n"
"| 1 按学号查询\n"
"| 2 按姓名查询\n"
"| 3 按性别查询\n"
"| 4 返回上级菜单\n"
"|\n"
;

/* 函数指针数组存储的是查询子菜单所对应的4个功能函数的地址 */
void (*menu_search_func[])()=
{
search_by_id,
search_by_name,
search_by_sex,
search_exit
};

/* 字符数组中存储的是子菜单要显示的字符 */
char menu_calc[]=
"|\n"
"| 1 计算总成绩\n"
"| 2 计算平均分\n"
"| 3 返回上级菜单\n"
"|\n";

/* 函数指针数组存储的计算子菜单项中的地址 */
void (* menu_calc_func[])()=
{
calc_total,
calc_average,
calc_exit
};

/* main函数 */
void main()
{
/* 显示主菜单等待用户输入 */
print_menu_main();
}

/* 主处理函数 */
void input_record()
{
char continue_input = 'N';
stu *pLastStu = NULL;
stu * pNewStu = (stu *)malloc(sizeof(stu));
pNewStu->next = NULL;
create_stu_by_input(pNewStu);
if (head == NULL)
{
head = pNewStu;
}
else
{
pLastStu = get_last_student(head);
pLastStu->next = pNewStu;
}

printf("继续输入学生成绩?(Y 继续, N 返回菜单)");
getchar();
continue_input = getchar();
if ( continue_input == 'n' || continue_input == 'N')
{
print_menu_main();
}
else
{
input_record();
}
}

/* 显示学生的成绩函数 */
void show_record()
{
stu *p = head;
print_table_head();
while ( p != NULL)
{
print_table_row(p);
p = p->next;
}

print_table_buttom();
printf("按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}

/* 查询学生成绩函数 */
void search_record()
{
int selected = 0;
system("cls");
print_menu_title("查询学生成绩");
printf(menu_search);
printf("================================================================\n");
while(!((selected >= 1) && (selected <= MENU_SEARCH_COUNT)))
{
printf("> 请选择:");
scanf("%d", &selected);
if (selected >= 1 && selected <= MENU_SEARCH_COUNT)
{
break;
}
printf("\n>输入错误!(请选择1 - %d)\n",MENU_SEARCH_COUNT);
}
menu_search_func[selected - 1]();
}

/* 按学号查询 */
void search_by_id()
{
char id[MAX];
char continue_input = 'N';
stu *p = head;
int isfound = 0;
printf(">请输入学生学号:");
scanf("%s",&id);
printf("\n > 查询[%s]...\n",id);
print_table_head();
while ( p != NULL)
{
if (strcmp(p->num,id) == 0)
{
print_table_row(p);
isfound = 1;
break;
}
p = p->next;
}
if (!isfound)
{
printf("\n 没有找到结果!\n");
}
print_table_buttom();
printf("继续查找?(Y 继续, N 返回)");
getchar();
continue_input = getchar();

if (continue_input == 'Y' || continue_input == 'y')
{
search_by_id();
}
else
{
search_record();
}
}

/* 按姓名查询一个学生的信息 */
void search_by_name()
{
char name[MAX];
char continue_input = 'N';
stu *p = head;
int isfound = 0;
printf("> 请输入学生姓名:");
scanf("%s",&name);
printf("\n>查找[%s]...\n",name);
print_table_head();
while(p != NULL)
{
if (strcmp(p->name,name) == 0)
{
print_table_row(p);
isfound = 1;
}
p = p->next;
}
if (!isfound)
{
printf("\n 没有找到结果!\n");
}
print_table_buttom();
printf("继续查找?(Y 继续,N 返回)");
getchar();
continue_input = getchar();
if (continue_input == 'Y' || continue_input == 'y')
{
search_by_name();
}
else
{
search_record();
}
}

void search_by_sex()
{
char sex[MAX];
char continue_input = 'N';
stu *p = head;
int isfound = 0;
printf(">请输入学生性别:");
scanf("%s", &sex);
printf("\n>查找[%s]...\n",sex);
print_table_head();
while (p != NULL)
{
if (strcmp(p->sex,sex) == 0)
{
print_table_row(p);
isfound = 1;
}
p = p->next;
}
if (!isfound)
{
printf("\n 没有找到结果!\n");
}
print_table_buttom();
printf("继续查找?(Y 继续, N 返回)");
getchar();
continue_input = getchar();
if (continue_input == 'Y' || continue_input == 'y')
{
search_by_sex();
}
else
{
search_record();
}
}

/* 退出菜单子函数 */
void search_exit()
{
print_menu_main();
}

/* 更新学生信息 */
void update_record()
{
stu *p = head;
char id[MAX];
char continue_input = 'N';
printf("请输入要更新学生的学号:");
scanf("%a",id);
while (p != NULL)
{
if (strcmp(p->num ,id) == 0)
{
break;
}
p = p->next;
}
if ( p == NULL)
{
printf("没有学号是[%s]的学生.",id);
}
else
{
create_stu_by_input(p);
}
printf("继续更新吗?(Y 继续, N 返回菜单)");
getchar();
continue_input = getchar();

if ( continue_input == 'n' || continue_input == 'N')
{
print_menu_main();
}
else
{
update_record();
}
}

/* 删除学生信息 */
void delete_record()
{
stu *p = head;
stu *pPre = NULL;
char id[MAX];
char continue_input = 'N';
printf("请输入要删除的学生学号:");
scanf("%s",id);
while ( p != NULL)
{
if (strcmp(p->num, id) == 0)
{
break;
}
p = p->next;
}
if (p == NULL)
{
printf("没有学号是[%s]的学生.",id);
}
else
{
printf("确定要删除学号为[%s]姓名为[%s]的学生吗?(Y,确定, N,取消)",p->num,p->name);
getchar();
continue_input = getchar();
if ( continue_input == 'y' || continue_input == 'Y')
{
pPre = head;
if (pPre = p)
{
head = p->next;
free(p);
}
else
{
while( pPre != NULL)
{
if (pPre->next == p)
{
pPre->next = p->next;
free(p);
break;
}
pPre = pPre->next;
}
}
printf(">删除成功!\n");
}
}
printf("继续删除吗?(Y 继续删除, N 返回菜单)");
getchar();
continue_input = getchar();
if (continue_input == 'n' || continue_input == 'N')
{
print_menu_main();
}
else
{
delete_record();
}
}

/* 计算学生成绩函数 */
void calculate()
{
int selected = 0;
system("cls");
print_menu_title("计算学生成绩");
printf(menu_calc);
printf("================================================================\n");
while ( !(selected >= 1 && selected <= MENU_CALC_COUNT))
{
printf("> 请选择:");
scanf("%d",&selected);
if (selected >= 1 && selected <= MENU_CALC_COUNT)
{
break;
}
printf("\n >输入错误!(请输入(1 - %d)\n",MENU_CALC_COUNT);
}
menu_calc_func[selected - 1]();
}

/* 计算总成绩函数 */
void calc_total()
{
stu *p = head;
print_table_head_total();
while ( p != NULL)
{
print_table_row_total(p);
p = p->next;
}
print_table_buttom_total();
printf("按任意键返回菜单..\n");
getchar();
getchar();
calculate();
}

/* 计算平均成绩 */
void calc_average()
{
stu *p = head;
print_table_head_avg();
while ( p != NULL)
{
print_table_row_avg(p);
p = p->next;
}

print_table_buttom_avg();
printf("按任意键返回菜单..\n");
getchar();
getchar();
calculate();
}

/* 退出子菜单 */
void calc_exit()
{
print_menu_main();
}

/* 保存到文件函数 */
void save_to_file()
{
FILE *fp;
char file[100];
stu *p = head;
printf("请输入文件名:");
scanf("%s",file);
fp = fopen(file,"w");
while (p != NULL)
{
fprintf(fp, "%s,%s,%s,%d,%d,%d,%d\n",p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer);
p = p->next;
}
fclose(fp);
printf("保存成功!\n按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}

/* 退出系统函数 */
void exit_system()
{
clear_record(head);
exit(0);
}

/* 显示主菜单 */
void print_menu_main()
{
int selected = 0;
system("cls");
print_menu_title(TITLE);
printf(menu_main);
printf("================================================================\n");
while (!((selected >=1) && (selected <= MENU_MAIN_COUNT)))
{
printf(">请选择:");
scanf("%d", &selected);
if ( selected >= 1 && selected <= MENU_MAIN_COUNT)
{
break;
}
printf("\n输入错误!(注:请选择1 - %d)\n",MENU_MAIN_COUNT);
}

menu_main_func[selected - 1]();
}

/* 输入学生信息 */
void create_stu_by_input(stu* pNewStu)
{
printf(">请输入学生信息(注:最大长度是10个字符):\n");
printf("学号:"); scanf("%s",&(pNewStu->num));
printf("姓名:"); scanf("%s",&(pNewStu->name));
printf("性别:"); scanf("%s",&(pNewStu->sex));
printf(">请输入%s的成绩(注:成绩范围0-100):\n",&(pNewStu->name));
printf("语文:"); scanf("%d",&(pNewStu->chinese));
printf("数学:"); scanf("%d",&(pNewStu->mathematic));
printf("英语:"); scanf("%d",&(pNewStu->english));
printf("计算机:"); scanf("%d",&(pNewStu->computer));
}

/* 取得链表最后一个值函数 */
stu* get_last_student(stu *p)
{
if (p->next == NULL)
{
return p;
}
else
{
return get_last_student(p->next);
}

}

/* 删除student结构链表的函数 */
void clear_record(stu* p)
{
if (p == NULL)
{
return;
}

if (p->next == NULL)
{
free(p);
}
else
{
clear_record(p->next);

free(p);
p = NULL;
}
}

/* 自是菜单标题处理函数 */
void print_menu_title(char* title)
{
printf("================================================================\n");
printf("| %s\n",title);
printf("----------------------------------------------------------------\n");
}

/* 显示记路表格头部的函数 */
void print_table_head()
{
printf("+----------+----------+----------+----+----+----+------+-------+\n");
printf("|学号 |姓名 |性别 |语文|数学|英语|计算机|\n");
printf("+----------+----------+----------+----+----+----+------+-------+\n");
}

/* 显示总分数表格头部函数 */
void print_table_head_total()
{
printf("+----------+----------+----------+----+----+----+------+-------+\n");
printf("|学号 |姓名 |性别 |语文|数学|英语|计算机|总成绩 |\n");
printf("+----------+----------+----------+----+----+----+------+-------+\n");
}

/* 显示平均分表格头部 */
void print_table_head_avg()
{
printf("+----------+----------+----------+----+----+----+------+--------+\n");
printf("|学号 |姓名 |性别 |语文|数学|英语|计算机|平均分数|\n");
printf("+----------+----------+----------+----+----+----+------+--------+\n");
}

/* 显示一个学生记录的函数 */
void print_table_row(stu* p)
{
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|\n",p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer);
}

/* 显示一个学生的总分数 */
void print_table_row_total(stu* p)
{
int t = p->chinese + p->mathematic + p->english + p->computer;
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|%6d|\n",p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer,t);
}

/* 显示一个学生的平均成绩 */
void print_table_row_avg(stu* p)
{
float a = ((float)(p->chinese + p->mathematic + p->english + p->computer))/(float)4.0;
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|%8.1f|\n",p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer,a);
}

/* 显示表格底部 */
void print_table_buttom()
{
printf("+----------+----------+----------+----+----+----+------+-------+\n");
}

/* 显示总分数表格底部的函数 */
void print_table_buttom_total()
{
printf("+----------+----------+----------+----+----+----+------+-------+\n");
}

/* 显示平均分表格的底部 */
void print_table_buttom_avg()
{
printf("+----------+----------+----------+----+----+----+------+-------+\n");
}实现的效果如图所示:
主菜单



输入 学生信息



显示



查询



删除



计算功能



保存



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: