C语言学生管理系统(原版本)(自编)

时间:2023-03-09 08:27:05
C语言学生管理系统(原版本)(自编)
/*系统特色:(大牛勿笑)
  *颜色提示
  *文字提示
  *功能
*/ #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <windows.h>
#include <conio.h> FILE *fp;//定义文件指针 int count;//这个count在这个系统中起到了莫大的作用,比较参参数,规定参数范围等 struct add
{
int SID;
char Name[];
int Age;
char Gender[];
double EntranxeScore;
}add1[], student, *pointer;//定义结构体,最大不得超过750.但我对下面的动态分配还是不清楚
//add1 = (char*)malloc(sizeof(struct add)*100);
void color(const unsigned short color1)
{
if (color1 >= && color1 <= )
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color1);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), );
}//定义一个表示颜色(0~15),当然我们也可以直接用system那种形式 void printinfor();//菜单函数 void wuyu_1();//按学号排序函数
void wuyu_2();//按总成绩排序函数 void function_1();//添加学生信息函数
void function_2();//删除学生信息函数
void function_3();//更改学生信息函数
void function_4();//查询学生信息函数
void function_5();//显示所有学生信息函数
void function_6();//附加功能选项函数 void findfunction_1();//通过学号查询函数
void findfunction_2();//通过学生姓名查询函数
void findfunction_3();//通过学生年龄查询函数
void findfunction_4();//通过学生分数查询函数 int main(void)
{
int num_1, k;
fp = fopen("D:\\studyinfor.txt", "rb+");//打开文本/创建,进行操作
fread(add1, sizeof(struct add), , fp);//读取文本储存信息
for (k = ; k<; k++)//判断文本中储存人数(Age==0表示此处无数据)
{
if (add1[k].Age == )
{
break;
}
count++;
}
fclose(fp);//关闭指针
printinfor();//显示菜单
while ()//使用者操作
{
do
{
printf("请输入要进行操作的序列号:");
scanf("%d", &num_1);
} while (num_1< || num_1>);
if (num_1 == )break; switch (num_1)
{
case :function_1(); break;
case :function_2(); break;
case :function_3(); break;
case :function_4(); break;
case :function_5(); break;
case :function_6(); break;
}
system("cls");
printinfor();
}
return ;
} void checkSID(int j)//检查学号大小函数
{
while (add1[j].SID <= || add1[j].SID>)
{
color();
printf("warning:SID的取值范围在0~750,请重新输入.\n");
color();
printf("请输入学生的学号:");
scanf("%d", &add1[j].SID);
if (add1[j].SID > && add1[j].SID <= )
{
break;//符合要求就结束循环
}
}
} void checkSID_1(int m)//检查学号是否重复函数
{
int k;
for (k = ; k < count; k++)
{
while (add1[k].SID == m)
{
color();
printf("学号重复,请重新输入.\n");//这里不知道为什么不能检查第一个是否与输入的重复
color();
printf("请输入学号:");
scanf("%d", &m);
}
}
}
//因为选择输入的方式是ab+,从新从i=0开始输入进去,所以想要通过
void checkName(int m, char Name[])//检查姓名函数
{
while (strlen(Name)>)
{
color();
printf("warning:Name的字数最多为5,请重新输入.\n");
color();
printf("请输入学生的姓名:");
scanf("%s", &add1[m].Name);
}
} void checkAge(int m)//检查年龄函数
{
while (add1[m].Age< || add1[m].Age>)
{
color();
printf("warning:Age的取值范围在0~122,请重新输入,严肃对待!\n");
color();
printf("请输入学生的年龄:");
scanf("%d", &add1[m].Age);
}
} void checkGender(int i, char a[])//检查性别函数
{
while (strcmp(a, "男") && strcmp(a, "女"))
{
color();
printf("warning:Gender只能是男或女,请重新输入.\n");
color();
printf("请输入学生的性别:");
scanf("%s", &add1[i].Gender);
}
} checkEntranxeScore(int k)
{
while (add1[k].EntranxeScore< || add1[k].EntranxeScore>)
{
color();
printf("warning:EntranxeScore的取值范围在0~750,请重新输入.\n");
color();
printf("请输入学生的分数:");
scanf("%lf", &add1[k].EntranxeScore);
}
} void getName(char name[]) {
while () {
printf("请输入学生的姓名:");
fflush(stdin);//刷新内存,现在对为什么要刷新内存还是迷迷糊糊的
scanf("%s", name);
if (strlen(name)<) {
break;
}
}
}//刷新内存的方式还有很多种,大家可以在网上搜一下 void printinfor()//主菜单
{
system("date /t");
system("TIME /t\n");//显示当前时间,也可以用预定义宏printf("Time : %s\n", __TIME__);
printf(" **************欢迎使用学生信息管理系统(当前有%d人)********\n", count);
printf(" *\t\t(1)添加学生信息\t\t\t\t*\n");
printf(" *\t\t(2)删除学生信息\t\t\t\t*\n");
printf(" *\t\t(3)更改学生信息\t\t\t\t*\n");
printf(" *\t\t(4)查询学生信息\t\t\t\t*\n");
printf(" *\t\t(5)显示所有学生信息\t\t\t*\n");
printf(" *\t\t(6)附加功能选项\t\t\t\t*\n");
printf(" *\t\t(0)退出学生系统\t\t\t\t*\n");
printf(" *\t\t\t\t\t 作者:liu\t*\n");
printf(" *********************************************************\n");
} void findfunction()
{
system("cls");
system("date /t");
system("TIME /t\n");
printf(" ***************查询学生信息(当前有%d人)*****************\n", count);
printf(" *\t\t(1)通过学生学号查询 \t\t\t*\n");
printf("\n");
printf(" *\t\t(2)通过学生姓名查询 \t\t\t*\n");
printf("\n");
printf(" *\t\t(3)通过学生年龄查询 \t\t\t*\n");
printf("\n");
printf(" *\t\t(4)通过学生分数查询 \t\t\t*\n");
printf(" *********************************************************\n");
} void Morefunction()
{
system("cls");
printf(" *******************附加功能*****************\n");
printf("\t\t\t*\t\t\t\t\t *\n");
printf(" *\t\t(1)按学号进行整理 \t *\n");
printf("\t\t\t*\t\t\t\t\t *\n");
printf(" *\t\t(2)按总分进行整理 \t *\n");
printf("\t\t\t*\t\t\t\t\t *\n");
color();
printf("\t\t\t*待开发... ... *\n");
color();
printf("\t\t\t********************************************\n");
} void inputmomo(int i)
{
printf("请输入学生的学号:");
scanf("%d", &add1[i].SID);
checkSID(i);
checkSID_1(add1[i].SID);
color();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
color();
printf("请输入学生的名字:");
scanf("%s", &add1[i].Name);
checkName(i, add1[i].Name);
color();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
color();
printf("请输入学生的年龄:");
scanf("%d", &add1[i].Age);
checkAge(i);
color();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
color();
printf("请输入学生的性别:");
scanf("%s", &add1[i].Gender);
checkGender(i, add1[i].Gender);
color();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
color();
printf("请输入学生的总成绩:");
scanf("%lf", &add1[i].EntranxeScore);
checkEntranxeScore(i);
color();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
color();
} void function_1()//添加学生信息函数
{
int n, i, m = count;
if ((fp = fopen("D:\\studyinfor.txt", "ab+")) == NULL)//检测文本是否正常打开
{
color();
printf("Can't open the file!");
color();
system("pause");
exit();
}
printf("请输入您要添加的学生信息人数:");
scanf("%d", &n); for (i = count; i<n + m; i++)
{
printf("请输入No.%d的信息.\n", i + );
inputmomo(i - m);//录入学生信息
count++;
}
fwrite(add1, sizeof(struct add), n, fp);
rewind(fp);
color();
printf("添加中");
Sleep();
printf(".");
Sleep();
printf(".");
Sleep();
printf(". ");
Sleep();
printf(".");
Sleep();
printf(".");
Sleep();
printf(".\n");
color();
printf("添加成功!\n");
printf("学生信息目录已更新.\n");
fread(add1, sizeof(struct add), count, fp);//读取学生信息
color();
printf("___________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (i = ; i<count; i++)//打印更新的学生信息
{
if (add1[i].SID>)
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore);
}
printf("|-------------------------------------------------|\n");
fclose(fp);
printf("按任意键返回主菜单... ....\n");
system("pause");
} void function_2()//删除学生信息
{
int m, k, i, j = ;
if ((fp = fopen("D:\\studyinfor.txt", "wb+")) == NULL)
{
printf("Can't open the file!\n");
system("pause");
exit();
}
if (count == )
{
color();
printf("The file is NULL!!!\n");
color();
return;
}
printf("请输入你要删除的学生的学号:");
scanf("%d", &m);
fread(add1, sizeof(struct add), count, fp);
for (k = ; k<count; k++)
{
if (add1[k].SID == m)
{
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
printf(" %.2d %-6s %-3d %-3s \t%5.2lf \n", add1[k].SID, add1[k].Name, add1[k].Age, add1[k].Gender, add1[k].EntranxeScore);
printf("|---------------------------------------------------|\n");
for (i = k; i<count - ; i++)//将要删除的数后面的函数往前进一格,占去要删除的部分
{
add1[i].SID = add1[i + ].SID;
strcpy(add1[i].Name, add1[i + ].Name);
add1[i].Age = add1[i + ].Age;
strcpy(add1[i].Gender, add1[i + ].Gender);
add1[i].EntranxeScore = add1[i + ].EntranxeScore;
}
count--;
fwrite(add1, sizeof(struct add), count, fp);
rewind(fp);//使指针回到开头
fclose(fp);
color();
printf("删除中");
Sleep();
printf(".");
Sleep();
printf(".");
Sleep();
printf(". ");
Sleep();
printf(".");
Sleep();
printf(".");
Sleep();
printf(".\n");
Sleep();
color();
printf("删除成功!按任意键继续... ...\n");
color();
j++;
}
}
if (j == )
{
color();
printf("查无此人!\n");
color();
}
system("pause");
} void function_3()//更改学生信息
{
int m, k, j = ;
if ((fp = fopen("D:\\studyinfor.txt", "rb+")) == NULL)
{
printf("Can't open the file!\n");
getch();
exit();
}
if (count == )
{
color();
printf("The file is NULL!!!\n");
color();
return;
}
printf("请输入你要更改的学生的学号:");
scanf("%d", &m);
fread(add1, sizeof(struct add), count, fp);
for (k = ; k<count; k++)
{
if (add1[k].SID == m)
{
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[k].SID, add1[k].Name, add1[k].Age, add1[k].Gender, add1[k].EntranxeScore);
printf("|---------------------------------------------------|\n");
printf("请输入你要修改的内容:\n");
inputmomo(k);
rewind(fp);
fwrite(add1, sizeof(struct add), count, fp);
//rewind(fp);
fclose(fp);
color();
printf("更改成功!按任意键继续... ...\n");
color();
j++;
}
}
if (j == )
{
color();
printf("查无此人!\n");
color();
}
system("pause");
} void function_4()//查询学生信息
{
int m;
findfunction();//进入查询菜单
printf("请输入你查询的方式序列号:");
scanf("%d", &m);
switch (m)
{
case :findfunction_1(); break;
case :findfunction_2(); break;
case :findfunction_3(); break;
case :findfunction_4(); break;
}
} void function_5()//显示所有学生信息
{
int i;
if ((fp = fopen("D:\\studyinfor.txt", "rb")) == NULL)
{
printf("Can't open the file!\n");
getch();
exit();
}
fread(add1, sizeof(struct add), count, fp);
if (count == )
{
color();
printf("The file is NULL!\n");
color();
system("pause");
return;
}
else {
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (i = ; i<count; i++)
{
if (add1[i].SID != )
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore);
}
printf("|---------------------------------------------------|\n");
}
fclose(fp);
printf("按任意键返回主菜单... ...\n");
system("pause");
} void function_6()//附加功能选项
{
Morefunction();//附加功能
int k;
do {
printf("请输入你要操作的序号:");
scanf("%d", &k);
switch (k)
{
case :wuyu_1(); break;
case :wuyu_2(); break;
default:
{
color();
printf("输入有误,请重新输入!\n");
color();
}
}
} while (k < || k>);
} void findfunction_1()//学生学号查询
{
int m, n, i, j = ;
printf("请输入你要搜索的学生学号范围:\n");
printf("最小值:");
scanf("%d", &m);
printf("最大值:");
scanf("%d", &n);
fp = fopen("D:\\studyinfor.txt", "rb+");
fread(add1, sizeof(struct add), count, fp);
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (i = ; i<count; i++)
{
if (add1[i].SID >= m && add1[i].SID <= n)
{
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore);
printf("|---------------------------------------------------|\n");
j++;
}
}
if (j == )
{
printf("无相关学生信息.\n");
}
printf("按任意键返回主菜单... ...\n");
system("pause");
} void findfunction_2()//学生姓名查询
{
int i, n = ;
char name[];
getName(name);//输入学生姓名
rewind(fp);
fp = fopen("D:\\studyinfor.txt", "rb+");
fread(add1, sizeof(struct add), count, fp);
for (i = ; i<count; i++)
{
if (strcmp(add1[i].Name, name) == ) {
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore);
printf("|---------------------------------------------------|\n");
++n;
break;
}
}
if (n == )
{
color();
printf("无相关学生信息!\n");
color();
}
printf("按任意键返回主菜单... ...\n");
system("pause");
} void findfunction_3()//学生年龄查询
{
int m, n, i, j = ;
printf("请输入你要查询的学生年龄范围:\n");
printf("最小值:");
scanf("%d", &m);
printf("最大值:");
scanf("%d", &n);
fp = fopen("D:\\studyinfor.txt", "rb+");
fread(add1, sizeof(struct add), count, fp);
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (i = ; i<count; i++)
{
if (add1[i].Age >= m && add1[i].Age <= n)
{
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i - ].SID, add1[i - ].Name, add1[i - ].Age, add1[i - ].Gender, add1[i - ].EntranxeScore);
printf("|---------------------------------------------------|\n");
j++;
}
}
if (j == )
{
printf("无相关学生信息!\n");
}
printf("按任意键返回主菜单... ...\n");
system("pause");
} void findfunction_4()//学生分数查询
{
int m, n, i, j = ;
printf("请输入你要查询的学生总成绩范围:\n");
printf("最小值:");
scanf("%d", &m);
printf("最大值:");
scanf("%d", &n);
fp = fopen("D:\\studyinfor.txt", "rb+");
fread(add1, sizeof(struct add), count, fp);
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (i = ; i<count; i++)
{
if (add1[i].EntranxeScore >= m && add1[i].EntranxeScore <= n)
{
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore);
printf("|---------------------------------------------------|\n");
j++;
}
}
if (j == )
{
printf("无相关学生信息!\n");
}
printf("按任意键返回主菜单... ...\n");
system("pause");
} void ExchangeFunction(int m, int n)//交换数据结构中两个统一结构的不同下标的结构值
{
double max = ;
int max_1 = ;
max = add1[m].EntranxeScore;
add1[m].EntranxeScore = add1[n].EntranxeScore;
add1[n].EntranxeScore = max;
max_1 = add1[m].Age;
add1[m].Age = add1[n].Age;
add1[n].Age = max_1;
max_1 = add1[m].SID;
add1[m].SID = add1[n].SID;
add1[n].SID = max_1;
strcpy(student.Gender, add1[m].Gender);
strcpy(add1[m].Gender, add1[n].Gender);
strcpy(add1[n].Gender, student.Gender);
strcpy(student.Name, add1[m].Name);
strcpy(add1[m].Name, add1[n].Name);
strcpy(add1[n].Name, student.Name);
} void wuyu_1()//按学号查询
{
if ((fp = fopen("D:\\studyinfor.txt", "rb+")) == NULL)
{
printf("Can't open the file!\n");
system("PAUSE");
exit();
}
int m, n, j;
for (m = ; m < count - ; m++)//比较学号大小
{
for (n = m + ; n < count; n++)
{
if (add1[n].SID < add1[m].SID)
{
ExchangeFunction(m, n);//交换一个结构体整体值
}
}
}
color();
printf("排序中");
Sleep();
printf("(");
Sleep();
printf(";");
Sleep();
printf("—");
Sleep();
printf("_");
Sleep();
printf("—");
Sleep();
printf(")\n");
Sleep();
color();
printf("排序成功!按任意键继续... ...\n");
color();
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (j = ; j<count; j++)
{
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[j].SID, add1[j].Name, add1[j].Age, add1[j].Gender, add1[j].EntranxeScore);
printf("|---------------------------------------------------|\n");
}
rewind(fp);
//fread(add1,sizeof(struct add),count,fp);
fwrite(add1, sizeof(struct add), count, fp);
fclose(fp);
system("pause");
} void wuyu_2()//按总分排序
{
if ((fp = fopen("D:\\studyinfor.txt", "rb+")) == NULL)
{
printf("Can't open the file!\n");
getch();
exit();
}
int m, n, j;
for (m = ; m < count - ; m++)//比较总分大小
{
for (n = m + ; n < count; n++)
{
if (add1[n].EntranxeScore > add1[m].EntranxeScore)
{
ExchangeFunction(m, n);//交换两个结构体整体值
}
}
}
color();
printf("排序中");
Sleep();
printf("(");
Sleep();
printf("*");
Sleep();
printf("— ");
Sleep();
printf("з");
Sleep();
printf("—");
Sleep();
printf(")\n");
Sleep();
color();
printf("排序成功!按任意键继续... ...\n");
color();
printf("_____________________________________________________\n");
printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 |\n");
for (j = ; j<count; j++)
{
printf(" %.2d %-6s %-3d %-3s \t %5.2lf \n", add1[j].SID, add1[j].Name, add1[j].Age, add1[j].Gender, add1[j].EntranxeScore);
printf("|---------------------------------------------------|\n");
}
rewind(fp);
//fread(add1,sizeof(struct add),count,fp);加了这句,无法储存,难道会改变内部指针位置?
fwrite(add1, sizeof(struct add), count, fp);
fclose(fp);
system("pause");
}