本项目里主要使用到了结构体以及结构体数组,函数的调用,指针的运用,各种库函数的使用需要理解注意的点是:
1.如何创建结构体变量
2.如果使用结构体数组
3.函数指针传参
4.结构体的使用
5.各类库函数的使用以及需要的头文件
本程序我使用了4个文件来编写
test.c——————是主程序的位置,负责主程序的逻辑运行
administrator.c————主要是管理员的功能,录入账号密码、修改
Teacherfuntion.c————老师学生的功能主要放这
Management.h————结构体定义以及头文件定义,函数定义,常量定义
如果对你有帮助请点个赞、评论一下
如果对你有帮助请点个赞、评论一下
如果对你有帮助请点个赞、评论一下
如果对你有帮助请点个赞、评论一下
如果对你有帮助请点个赞、评论一下
有什么问题或者意见欢迎指导
一、test.c文件
主要的逻辑
#define _CRT_SECURE_NO_WARNINGS 1
#include "Management.h"//所有定义、结构体、函数都在management头文件里
void menu1()//欢迎界面菜单
{
printf("—————————————————————————————————————————————————————\n");
printf("———————— 欢迎进入柳州大学成绩管理系统 —————————\n");
printf("———————— 【0. 退出系统 】 —————————\n");
printf("———————— 【1.账号密码查询】 —————————\n");
printf("———————— 【2.教师登录】 —————————\n");
printf("———————— 【3.学生登录】 —————————\n");
printf("———————— 【4. 管理员登录 】 —————————\n");
printf("—————————————————————————————————————————————————————\n");
}
void menu3()//老师界面
{
printf("———————————————————————————————————————————————————————————————————\n");
printf("——— 老师界面 ———\n");
printf("——— 【0. 退出系统 】 【1.学生成绩录入】 ———\n");
printf("——— 【2.学生成绩修改】 【3.学生成绩查询】 ———\n");
printf("——— 【4.学生成绩显示】 【5.排名成绩查询】 ———\n");
printf("——— 【6.学生成绩删除】 ———\n");
printf("———————————————————————————————————————————————————————————————————\n");
}
void menu4()//学生界面
{
printf("———————————————————————————————————————————————————————————————————\n");
printf("——— 学生界面 ———\n");
printf("——— 【0. 退出系统 】 ———\n");
printf("——— 【1.学生成绩查询】 【2.排名成绩查询】 ———\n");
printf("———————————————————————————————————————————————————————————————————\n");
}
void menu5()//账号密码查询界面
{
printf("———————————————————————————————————————————————————————————————————\n");
printf("——— 账号密码查询界面 ———\n");
printf("——— 【0. 退出系统 】 ———\n");
printf("——— 【1.学生查询】 【2.老师查询】 ———\n");
printf("———————————————————————————————————————————————————————————————————\n");
}
void gly()//管理员密码为程序直接设置
{
ManAP s1;//存到的地方
strcpy(s1.Account, "gly");//管理员账号为gly
strcpy(s1.password, "gly");//密码为gly
}
int main()
{
int c = 0;
c = c + 1;
if (c <= 0)//程序初始化有点小bug
{
InitAPStu(&Stu);
InitAPTea(&Tea);
InitGrades(&Gra);
}
gly();//管理员账号密码函数
int input = 0;
int input1 = 0;
int input2 = 0;
int input3 = 0;
int input4 = 0;//定义选择用的变量
do
{
menu1();
printf("请选择:》》》");//欢迎菜单选择
scanf("%d", &input);
switch (input)//欢迎菜单大循环
{
//选择一
case 1://账号密码查询
do
{
menu5();
printf("请输入查找类型\n");
scanf("%d", &input4);
switch (input4)//选择学生账号查询还是老师
{
case 1:
StuAPsearch(&Stu);//查找学生账号密码
break;
case 2:
TeaAPsearch(&Tea);//查找老师账号密码
break;
case 0:
printf("退出程序!!\n");
break;
default:
printf("请重新输入\n");
break;
}
} while (input4);
break;
//账号密码查询
//选择二
case 2:
Teacher_enter(&Tea);//老师登录
do
{
menu3();
printf("请选择:>>");//老师欢迎界面选择
scanf("%d", &input2);
switch (input2)
{
case 1:
StuGradesadd(&Gra);//学生成绩添加
break;
case 2:
StuGradesrevise(&Gra);//成绩修改
break;
case 3:
StuGradessearch(&Gra);//成绩查询
break;
case 4:
ShowStuGrade(&Gra);//学生成绩显示
break;
case 5:
SortStuGrade(&Gra);//学生成绩查找
break;
case 6:
StuGradedelete(&Gra);//学生成绩删除
break;
case 0:
printf("退出系统\n");
break;
default:
printf("请重新输入!\n");
break;
}
} while (input2);
break;
///
case 3://学生登录
Student_enter(&Stu);
do
{
menu4();
printf("请选择:>>");//学生欢迎界面
scanf("%d", &input3);
switch (input3)
{
case 1:
StuGradessearch(&Gra);//学生成绩查找
break;
case 2:
SortStuGrade(&Gra);//学生查找成绩显示
ShowStuGrade(&Gra);//学生查找成绩显示
break;
case 0:
printf("退出程序\n");
break;
default:
printf("请重新输入!!\n");
break;
}
} while (input3);
break;
//
case 4:
mamagement_enter();//管理员登录
do
{
menu2();
printf("请选择:》》》");//管理员欢迎界面
scanf("%d", &input1);
switch (input1)
{
case 1:
StuAPenter(&Stu);//学生账号密码录入
break;
case 2:
TeaAPenter(&Tea);//老师账号密码录入
break;
case 3:
StuAPsearch(&Stu);//学生账号密码查找
break;
case 4:
TeaAPsearch(&Tea);//老师账号密码查找
break;
case 5:
StuAPrevise(&Stu);//老师账号密码修改
break;
case 6:
TeaAPrevise(&Tea);//老师账号密码修改
break;
case 7:
ShowstuAP(&Stu);//学生账号密码显示
break;
case 8:
ShowteaAP(&Tea);//老师账号密码显示
break;
case 9:
StuAPdelete(&Stu);//学生账号密码删除
break;
case 10:
TeaAPdelete(&Tea);//老师账号密码删除
break;
case 0:
printf("退出系统!\n");
break;
default:
printf("输入错误请重新输入!\n");
break;
}
} while (input1);
break;
case 0:
printf("退出系统!\n");
break;
default:
printf("输入错误请重新输入!\n");
break;
}
} while (input);
return 0;
}
二、administrator.c
主要负责管理员的各项功能
#define _CRT_SECURE_NO_WARNINGS 1
#include "Management.h"
void menu2()
{
printf("———————————————————————————————————————————————————————————————————\n");
printf("——— 管理员界面 ———\n");
printf("——— 【0. 退出系统 】 【1.学生账号密码录入】 ———\n");
printf("——— 【2.老师账号密码录入】 【3.学生账号密码查询】 ———\n");
printf("——— 【4.老师账号密码查询】 【5.学生账号密码修改】 ———\n");
printf("——— 【6.老师账号密码修改】 【7.学生账号密码显示】 ———\n");
printf("——— 【8.老师账号密码显示】 【9.学生账号密码删除】 ———\n");
printf("——— 【10.老师账号密码删除】 ———\n");
printf("———————————————————————————————————————————————————————————————————\n");
}
void InitAPStu(StuAParr* pc)//初始化
{
assert(pc);
pc->count1 = 0;//人数计数
memset(pc->data1, 0, sizeof(pc->data1));
}
void InitAPTea(TeaAParr* pc)//初始化
{
assert(pc);
pc->count2 = 0;
memset(pc->data2, 0, sizeof(pc->data2));
}
void InitGrades(Gradesarr* pc)
{
assert(pc);
pc->count3 = 0;
memset(pc->data3, 0, sizeof(pc->data3));
}
void mamagement_enter()
{
int i = 0;
int c = 3;
char zhanghao[MAX_Man] = { 0 };
char mima[MAX_Man] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入账号:>>\n");
scanf("%s", zhanghao);
printf("请输入密码:>>\n");
scanf("%s", mima);
if (strcmp(zhanghao, "gly") == 0 && strcmp(mima, "gly") == 0)//对比管理员账号是否正确
{
printf("登录成功\n");
break;
}
else
{
c = c - i;
printf("密码错误!您还剩%d次机会!\n", 2 - i);
}
}
if (c == 0)
{
main();
}
}
void StuAPenter(StuAParr* pc)
{
assert(pc);
if (pc->count1 == MAX_Stu)
{
printf("密码库已满,无法添加\n");
return;
}
printf("请输入名字:>");
scanf("%s", &pc->data1[pc->count1].name);
printf("请输入账号:>");
scanf("%s", &pc->data1[pc->count1].Account);
printf("请输入密码:>");
scanf("%s", &pc->data1[pc->count1].password);
pc->count1++;
printf("增加成功\n");
}
void ShowstuAP(StuAParr* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-10s\t%-12s\n", "名字", "账号", "密码");
for (i = 0; i < pc->count1; i++)
{
printf("%-20s\t%-10s\t%-12s\n", pc->data1[i].name,
pc->data1[i].Account,
pc->data1[i].password);
}
}
int StuFindbyname(StuAParr* pc, char name[])//查找名字函数
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count1; i++)//for循环判断用的是结构体里记录人数的count1,指向他
{
if (0 == strcmp(pc->data1[i].name, name))//strcmp库函数用来判断是否相同如果相同等于0
{
return i;
}
}
return -1;
}
void StuAPsearch(StuAParr* pc)
{
assert(pc);
int i = 0;
char name[MAX_Name] = { 0 };
printf("请输入要查找人的名字:》\n");
scanf("%s", name);
int pos = StuFindbyname(pc, name);//查找需要进入结构体里进行一一比对调用函数进行
if (pos == -1)
{
printf("查找的人不存在\n");
return;
}
else
{
printf("%-20s\t%-10s\t%-12s\n", "名字", "账号", "密码");
printf("%-20s\t%-10s\t%-12s\n", pc->data1[pos].name,
pc->data1[pos].Account,
pc->data1[pos].password);
}
}
void StuAPrevise(StuAParr* pc)
{
assert(pc);
int i = 0;
char name[MAX_Name] = { 0 };
printf("请输入要修改人的名字:》\n");
scanf("%s", name);
int pos = StuFindbyname(pc, name);//查找名字
if (pos == -1)
{
printf("修改的人不存在\n");
return;
}
else
{
printf("已查询到该联系人,接下来开始修改:\n");
printf("请输入名字:>");
scanf("%s", pc->data1[pos].name);
printf("请输入账号:>");
scanf("%s", pc->data1[pos].Account);
printf("请输入密码:>");
scanf("%s", pc->data1[pos].password);
printf("修改成功");
}
}
void StuAPdelete(StuAParr* pc)
{
char name[MAX_Name] = { 0 };
assert(pc);
int i = 0;
printf("请输入要删除人的名字:》");
scanf("%s", name);
//查找
int pos = StuFindbyname(pc, name);
if (pos == -1)
{
printf("要删除的人不存在");
return;
}
//删除
for (i = pos; i < pc->count1 - 1; i++)
{
pc->data1[i] = pc->data1[i + 1];
}
pc->count1--;
printf("删除成功\n");
}
void TeaAPenter(TeaAParr* pc)
{
assert(pc);
if (pc->count2 == MAX_Tea)
{
printf("密码库已满,无法添加\n");
return;
}
printf("请输入名字:>");
scanf("%s", &pc->data2[pc->count2].name);
printf("请输入账号:>");
scanf("%s", &pc->data2[pc->count2].Account);
printf("请输入密码:>");
scanf("%s", &pc->data2[pc->count2].password);
pc->count2++;
printf("增加成功\n");
}
void ShowteaAP(TeaAParr* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-10s\t%-12s\n", "名字", "账号", "密码");
for (i = 0; i < pc->count2; i++)
{
printf("%-20s\t%-10s\t%-12s\n", pc->data2[i].name,
pc->data2[i].Account,
pc->data2[i].password);
}
}
int TeaFindbyname(TeaAParr* pc, char name1[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count2; i++)
{
if (0 == strcmp(pc->data2[i].name, name1))
{
return i;
}
}
return -1;
}
void TeaAPrevise(TeaAParr* pc)
{
assert(pc);
int i = 0;
char name1[MAX_Name] = { 0 };
printf("请输入要修改人的名字:》");
scanf("%s", name1);
int pos = TeaFindbyname(pc, name1);
if (pos == -1)
{
printf("修改的人不存在");
return;
}
else
{
printf("已查询到该联系人,接下来开始修改:");
printf("请输入名字:>");
scanf("%s", pc->data2[pos].name);
printf("请输入账号:>");
scanf("%s", pc->data2[pos].Account);
printf("请输入密码:>");
scanf("%s", pc->data2[pos].password);
printf("修改成功");
}
}
void TeaAPsearch(TeaAParr* pc)
{
assert(pc);
int i = 0;
char name1[MAX_Name] = { 0 };
printf("请输入要查找人的名字:》");
scanf("%s", name1);
int pos = TeaFindbyname(pc, name1);
if (pos == -1)
{
printf("查找的人不存在");
return;
}
else
{
printf("%-20s\t%-10s\t%-12s\n", "名字", "账号", "密码");
printf("%-20s\t%-10s\t%-12s\n", pc->data2[pos].name,
pc->data2[pos].Account,
pc->data2[pos].password);
}
}
void TeaAPdelete(TeaAParr* pc)
{
char name1[MAX_Name] = { 0 };
assert(pc);
int i = 0;
printf("请输入要删除人的名字:》");
scanf("%s", name1);
//查找
int pos = TeaFindbyname(pc, name1);
if (pos == -1)
{
printf("要删除的人不存在");
return;
}
//删除
for (i = pos; i < pc->count2 - 1; i++)
{
pc->data2[i] = pc->data2[i + 1];
}
pc->count2--;//删除完后人数计数--
printf("删除成功\n");
}
三、Management.h
此项目的头文件,主要是负责定义各类函数的结构体,和声明
#pragma once
#include
#include
#include
#include//库函数
#define MAX_Stu 20
#define MAX_Tea 20
#define MAX_Man 20
#define MAX_Name 50//标识符常量
//账号密码
typedef struct StuAP//学生账号密码类型
{
char name[MAX_Stu];//名字
char Account[MAX_Stu];//账号
char password[MAX_Stu];//密码
} StuAP;
typedef struct TeaAP//老师账号密码类型
{
char name[MAX_Tea];//名字
char Account[MAX_Tea];//账号
char password[MAX_Tea];//密码
} TeaAP;
typedef struct ManAP//管理账号密码类型
{
char name[MAX_Name];
char Account[MAX_Man];
char password[MAX_Man];
} ManAP;
typedef struct StuAParr
{
StuAP data1[MAX_Stu];//存放学生账号密码
int count1;//记录实际人数
}StuAParr;
typedef struct TeaAParr
{
TeaAP data2[MAX_Tea];//存放老师账号密码
int count2;//记录实际人数
}TeaAParr;
typedef struct Grades//学生分数类型
{
char name[MAX_Name];
int Chinese;
int Mathematics;
int English;
int sum;
}Grades;
typedef struct Gradesarr
{
Grades data3[MAX_Stu];//存放学生成绩结构体数组
int count3;//记录实际人数
}Gradesarr;
struct StuAParr Stu;
struct TeaAParr Tea;
struct Gradesarr Gra;
//管理员
//主程序进入
void mamagement_enter();
//录入学生密码
void StuAPenter(StuAParr *pc);
//查询学生密码
void StuAPsearch(StuAParr* pc);
//显示学生账号密码
void ShowstuAP(StuAParr* pc);
//学生密码修改
void StuAPrevise(StuAParr* pc);
//学生信息删除
void StuAPdelete(StuAParr* pc);
//
//录入老师账号密码
void TeaAPenter(TeaAParr* pc);
//查询老师账号密码
void TeaAPsearch(TeaAParr* pc);
//老师账号密码显示
void ShowteaAP(TeaAParr* pc);
//老师账号修改
void TeaAPrevise(TeaAParr* pc);
//老师账号查找
void TeaAPsearch(TeaAParr* pc);
//老师账号密码删除
void TeaAPdelete(TeaAParr* pc);
//
//老师
//
//老师登录
void Teacher_enter(TeaAParr* pc);
//
void StuGradesadd(Gradesarr* pc);//学生成绩添加
void menu2();
void StuGradesrevise(Gradesarr* pc);//学生成绩修改
void StuGradessearch(Gradesarr* pc);//学生成绩查找
void ShowStuGrade(Gradesarr* pc);//学生成绩显示
void SortStuGrade(Gradesarr* pc);//学生成绩排名
void StuGradedelete(Gradesarr* pc);//学生成绩删除
//学生
void Student_enter(StuAParr* pc);
//有些函数的可以通用的不另外做定义
//
四、Teacherfuntion.c
老师和学生的账号密码功能实现
这里的账号密码对比使用了两if先判断账号再判断密码也是使用指针去结构体里寻找。
#define _CRT_SECURE_NO_WARNINGS 1
#include "Management.h"
int TeaFindbyaccount(TeaAParr* pc, char account1[], char password1[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count2; i++)
{
if (strcmp(pc->data2[i].Account, account1) == 0 )
{
if (strcmp(pc->data2[i].password, password1) == 0)
{
return i;
}
}
}
return -1;
}
void Teacher_enter(TeaAParr* pc)
{
int i = 0;
int c = 3;
char zhanghao2[20] = { 0 };
char mima2[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入账号:>>\n");
scanf("%s", zhanghao2);
printf("请输入密码:>>\n");
scanf("%s", mima2);
int pos1 = TeaFindbyaccount(pc, zhanghao2, mima2);
if (pos1 == 0)
{
printf("登录成功!欢迎您:\n");
break;
}
else
{
c = c - i;
printf("账号或密码错误您还剩%d次机会,请重新输入!!\n", 2 - i);
}
}
if (c == 0)
{
main();
}
}
void StuGradesadd(Gradesarr* pc)
{
assert(pc);
if (pc->count3 == MAX_Stu)
{
printf("成绩库已满,无法添加\n");
return;
}
printf("请输入名字:>");
scanf("%s", pc->data3[pc->count3].name);
printf("请输入语文成绩:>");
scanf("%d", &(pc->data3[pc->count3].Chinese));
printf("请输入数学成绩:>");
scanf("%d", &(pc->data3[pc->count3].Mathematics));
printf("请输入英语:>");
scanf("%d", &(pc->data3[pc->count3].English));
printf("总分为:>\n");
pc->data3[pc->count3].sum = pc->data3[pc->count3].Chinese + pc->data3[pc->count3].Mathematics + pc->data3[pc->count3].English;
//scanf("%d", &(pc->data3[pc->count3].sum));
printf("%d", pc->data3[pc->count3].sum);
pc->count3++;
printf("增加成功\n");
}
void StuGradesrevise(Gradesarr* pc)
{
assert(pc);
int i = 0;
char name1[MAX_Name] = { 0 };
printf("请输入要修改人的名字:》");
scanf("%s", name1);
int pos = StuFindbyname_Grade(pc, name1);
if (pos == -1)
{
printf("修改的人不存在");
return;
}
else
{
printf("已查询到该联系人,接下来开始修改:");
printf("请输入名字:>");
scanf("%s", pc->data3[pos].name);
printf("请输入语文成绩:>");
scanf("%d", &(pc->data3[pos].Chinese));
printf("请输入数学成绩:>");
scanf("%d", &(pc->data3[pos].Mathematics));
printf("请输入英语成绩:>");
scanf("%d", &(pc->data3[pos].English));
printf("请输入总分成绩:>");
scanf("%d", &(pc->data3[pos].sum));
printf("修改成功");
}
}
int StuFindbyname_Grade(Gradesarr* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count3; i++)
{
if (0 == strcmp(pc->data3[i].name, name))
{
return i;
}
}
return -1;
}
void StuGradessearch(Gradesarr* pc)
{
assert(pc);
int i = 0;
char name[MAX_Name] = { 0 };
printf("请输入要查找人的名字:》");
scanf("%s", name);
int pos3 = StuFindbyname_Grade(pc, name);
if (pos3 == -1)
{
printf("查找的人不存在");
return;
}
else
{
printf("%-20s\t%-10s\t%-10s\t%-10s\t%-10s\n", "名字", "语文", "数学","英语","总分");
printf("%-20s\t%-10d\t%-10d\t%-10d\t%-10d\n", pc->data3[pos3].name,
pc->data3[pos3].Chinese,
pc->data3[pos3].Mathematics,
pc->data3[pos3].English,
pc->data3[pos3].sum);
}
}
void ShowStuGrade(Gradesarr* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-10s\t%-10s\t%-10s\t%-10s\n", "名字", "语文", "数学", "英语", "总分");
for (i = 0; i < pc->count3; i++)
{
printf("%-20s\t%-10d\t%-10d\t%-10d\t%-10d\n", pc->data3[i].name,
pc->data3[i].Chinese,
pc->data3[i].Mathematics,
pc->data3[i].English,
pc->data3[i].sum);
}
}
int cmp_peo_by_name(const void* e1, const void* e2)
{
return strcmp(&((Grades*)e2)->sum, &((Grades*)e1)->sum);
}
void SortStuGrade(Gradesarr* pc)
{
int i = 0;
assert(pc);
for (i = 0; i <= pc->count3; i++)
{
qsort(pc->data3, pc->count3, sizeof(Grades), cmp_peo_by_name);
}
printf("排序成功!");
}
//学生
int StuFindbyaccount(StuAParr* pc, char account2[], char password2[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count1; i++)
{
if (strcmp(pc->data1[i].Account, account2) == 0)
{
if (strcmp(pc->data1[i].password, password2) == 0)
{
return i;
}
}
}
return -1;
}
void Student_enter(StuAParr* pc)
{
int i = 0;
int c = 3;
char zhanghao3[20] = { 0 };
char mima3[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入账号:>>\n");
scanf("%s", zhanghao3);
printf("请输入密码:>>\n");
scanf("%s", mima3);
int pos5 = StuFindbyaccount(pc, zhanghao3, mima3);
if (pos5 == 0)
{
printf("登录成功!欢迎您:\n");
break;
}
else
{
c = c - i;
printf("账号或密码错误您还剩%d次机会,请重新输入!!\n", 2 - i);
}
}
if (c == 0)
{
main();
}
}
void StuGradedelete(Gradesarr* pc)
{
char name[MAX_Name] = { 0 };
assert(pc);
int i = 0;
printf("请输入要删除人的名字:》");
scanf("%s", name);
//查找
int pos1 = StuFindbyname_Grade(pc, name);
if (pos1 == -1)
{
printf("要删除的人不存在");
return;
}
//删除
for (i = pos1; i < pc->count3 - 1; i++)
{
pc->data3[i] = pc->data3[i + 1];
}
pc->count3--;
printf("删除成功\n");
}