使用c语言建立一个学生管理系统(使用结构体)

一.题目分析(学生信息管理系统)
做一个学生信息管理系统,首先定义一个结构体。结构体成员分别有:学号,姓名,年龄,性别等。然后分别实现帮助、查询学生信息、增加学生信息、显示当前学生信息等若干功能。整个程序中使用n这个全局变量来控制学生信息管理系统中的人数。在menu()方法中,用一个循环来一直输出这个学生管理系统的界面,直到输入8才结束
二.关键算法构造
N-S盒图:
使用c语言建立一个学生管理系统(使用结构体)_第1张图片

流程图:
在这里插入图片描述
使用c语言建立一个学生管理系统(使用结构体)_第2张图片

三.程序实现
源代码:
#include /I/O函数/
#include /其它说明/
#include /字符串函数/
#define LEN 15 /* 学号和姓名最大字符数,实际请更改*/
#define N 50 /* 最大学生人数,实际请更改*/
struct student{ //定义一个学生结构体
char code[20]; // 学号
char name[20]; // 姓名
int age; //年龄
char sex[20]; //性别
float score[3]; //3门课程成绩
};
struct student students[N]; //定义一个学生数组

int n=0;// n代表当前记录的学生人数
int m;
void help()//帮助
{
while(true)
{
printf("\n0.欢迎使用系统帮助!\n");
printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
printf("\n2.按照菜单提示键入数字代号;\n");
printf("\n3.增加学生信息后,切记保存;\n");
printf("\n4.谢谢您的使用!\n");
printf("\n 退出帮助请按0\n");
int a;
scanf("%d",&a);
switch(a)
{
case 0:
return;//退出当前函数
default:
printf(“输出错误”);
}
}
}

void refresh()//刷新
{
system(“cls”);//清屏
}

void seek() //查找
{
int i,item,flag;
char s1[20];
printf("------------------\n");
printf("-----1.按学号查询-----\n");
printf("-----2.按姓名查询-----\n");
printf("-----3.退出本菜单-----\n");
printf("------------------\n");
while(1)
{
printf(“请选择子菜单编号:”);
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf(“请输入要查询的学生的学号:\n”);
scanf("%s",&s1);//存放输入的字符串
getchar();
for(i=0;i if(strcmp(students[i].code,s1)0)//验证俩个字符串是否相等
{
flag=1;//判断是否找到该学生
printf(“学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n”);
printf("--------------------------------------------------------------------\n");
printf("%6s %7s %7d %6s %9.1f %10.1f %10.1f\n",students[i].code,students[i].name,students[i].age,
students[i].sex,students[i].score[0],students[i].score[1],students[i].score[2]);
}
if(flag
0)
printf(“该学号不存在!\n”);
break;
case 2:
printf(“请输入要查询的学生的姓名:\n”);
scanf("%s",&s1);
for(i=0;i if(strcmp(students[i].name,s1)0)//验证俩个字符串是否相等
{
flag=1;//判断是否找到该学生
printf(“学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n”);
printf("--------------------------------------------------------------------\n");
printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",students[i].code,students[i].name,students[i].age,
students[i].sex,students[i].score[0],students[i].score[1],students[i].score[2]);
}
if(flag
0)
printf(“该姓名不存在!\n”);
break;
case 3:return;
default:printf(“请在1-3之间选择\n”);
}
}
}

void modify() //修改信息
{
int i,item,num;
char sex1[20],s1[LEN+1],s2[LEN+1]; // 以姓名和学号最长长度+1为准
float score1;
printf(“请输入要要修改的学生的学号:\n”);
scanf("%s",s1);
for(i=0;i if(strcmp(students[i].code,s1)==0) //比较字符串是否相等
num=i;
printf("------------------\n");
printf(“1.修改姓名\n”);
printf(“2.修改年龄\n”);
printf(“3.修改性别\n”);
printf(“4.修改C语言成绩\n”);
printf(“5.修改高等数学成绩\n”);
printf(“6.修改大学英语成绩\n”);
printf(“7.退出本菜单\n”);
printf("------------------\n");
while(1)
{
printf(“请选择子菜单编号:”);
scanf("%d",&item);
switch(item)
{
case 1:
printf(“请输入新的姓名:\n”);
scanf("%s",s2);
strcpy(students[num].name,s2); break;//将s2的值赋给students[num].name
case 2:
printf(“请输入新的年龄:\n”);
scanf("%d",students[num].age);break;
case 3:
printf(“请输入新的性别:\n”);
scanf("%s",&students[num].sex);
break;
case 4:
printf(“请输入新的C语言成绩:\n”);
scanf("%f",&score1);
students[num].score[0]=score1; break;
case 5:
printf(“请输入新的高等数学成绩:\n”);
scanf("%f",&score1);
students[num].score[1]=score1; break;
case 6:
printf(“请输入新的大学英语成绩:\n”);
scanf("%f",&score1);
students[num].score[2]=score1; break;
case 7: return;
default:printf(“请在1-7之间选择\n”);
}
}
}

void sort()//按学号排序
{
int i,j,k,*p,*q,s;
char temp[LEN+1],ctemp[20];
float ftemp;
for(i=0;i {
for(j=n-1;j>i;j–)
if(strcmp(students[j-1].code,students[j].code)>0)
{
strcpy(temp,students[j-1].code);
strcpy(students[j-1].code,students[j].code);
strcpy(students[j].code,temp);
strcpy(temp,students[j-1].name);
strcpy(students[j-1].name,students[j].name);
strcpy(students[j].name,temp);
strcpy(ctemp,students[j-1].sex);
strcpy(students[j-1].sex,students[j].sex);
strcpy(students[j].sex,ctemp);
p=&students[j-1].age;
q=&students[j].age;
s=*q;
*q=*p;
*p=s;
for(k=0;k<3;k++)
{
ftemp=students[j-1].score[k];
students[j-1].score[k]=students[j].score[k];
students[j].score[k]=ftemp;
}
}
}
}

void insert() //增加
{
int j;

printf("请输入待增加的学生数:\n");
scanf("%d",&m);//记录学生数量增加的个数
for(j=n;j

}

void del()//删除
{
int i,j,flag=0;
char s1[LEN+1];
printf(“请输入要删除学生的学号:\n”);
scanf("%s",s1);
for(i=0;i if(strcmp(students[i].code,s1)0)//判断俩个字符串是否相等
{
flag=1;//是否找到该学生的标志
for(j=i;j {
strcpy(students[j].code,students[j+1].code);//将学生数组中每一个元素向前移一位
strcpy(students[j].name,students[j+1].name);
students[j].age=students[j+1].age;
strcpy(students[j].sex,students[j+1].sex);
students[j].score[0]=students[j+1].score[0];
students[j].score[1]=students[j+1].score[1];
students[j].score[2]=students[j+1].score[2];
}
}
if(flag
0)
printf(“该学号不存在!\n”);
if(flag==1)
{
printf(“删除成功,显示结果请选择菜单\n”);
n–;//学生数量减1
}
printf(“退出请按0\n”);
int a;
scanf("%d",&a);
switch(a)
{
case 0:
return;//退出
default:
printf(“输入错误”);
}
}

void display()//显示
{
int i;
printf(“共有%d位学生的信息:\n”,n);
if(n!=0)//判断学生数量是否为空值
{
printf(“学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n”);
printf("--------------------------------------------------------------------\n");
for(i=0;i {
printf("%7s %7s %6d %6s %9.1f %10.1f %10.1f\n",students[i].code,students[i].name,students[i].age,students[i].sex,
students[i].score[0],students[i].score[1],students[i].score[2]);
}
}
else//n0,表示无学生信息
{
printf(“暂无学生信息\n”);
}
printf(“退出请按0\n”);
int a;
scanf("%d",&a);
if(a
0)
return;
}

void save()
{
FILE *fp;
fp= fopen(“in.txt”,“w”);//打开文档,写入
for(int i=0;i {
fprintf(fp,“学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n”);
fprintf(fp,"%7s %7s %6d %6s %9.1f %10.1f %10.1f\n",students[i].code,students[i].name,students[i].age,students[i].sex,
students[i].score[0],students[i].score[1],students[i].score[2]);
}
fclose(fp);
}

void log()//退出系统
{
printf(" \n\n \n\n");
printf("*********************************");
printf("\n\n 欢迎下次使用\n\n");
printf("*********************************\n\n");
}

void menu()/* 界面*/
{
int input=0;
while(input!=8)
{
printf(" \n\n \n\n");
printf(" ******************************************************\n\n");
printf(" * 学生信息管理系统 *\n \n");
printf(" *************************************************\n\n");
printf("系统功能菜单
\n");
printf(" ---------------------- ---------------------- \n");
printf(" ********************************************* \n");
printf(" * 0.系统帮助及说明 * * 1.刷新学生信息 * \n");
printf(" ********************************************* \n");
printf(" * 2.查询学生信息 * * 3.修改学生信息 * \n");
printf(" ********************************************* \n");
printf(" * 4.增加学生信息 * * 5.按学号删除信息 * \n");
printf(" ********************************************* \n");
printf(" * 6.显示当前信息 * * 7.保存当前学生信息
\n");
printf(" ********************** ********************** \n");
printf(" * 8.退出系统 * \n");
printf(" ********************** \n");
printf(" ---------------------- ---------------------- \n");
printf(“请选择菜单编号:”);
scanf("%d",&input);
switch(input)
{
case 0:help();break;//系统帮助及说明
case 1:refresh();break;//刷新学生信息
case 2:seek();break;//查询学生信息
case 3:modify();break;//修改学生信息
case 4:insert();break;//增加学生信息
case 5:del();break;//按学号删除信息
case 6:display();break;//显示当前信息
case 7:save();break;//保存当前学生信息
case 8:printf(“即将退出学生管理系统”);break;
default:printf(“请在0-8之间选择\n”);break;
}
system(“cls”);//刷新屏幕
}
log();//退出界面
}
void main()
{
menu();//界面
}
四.调试、测试及运行结果
调试:
在这里插入图片描述

字符串的赋值直接采用等号进行,会出现以下错误
在这里插入图片描述

所以利用strcmp函数对字符串进行赋值
由于在函数menu()中加入清屏功能,所以在执行每一个菜单模块时,输入值后就会立马回到功能菜单那个界面,所以在每一个功能界面的后面加上一个退出选项
在这里插入图片描述

在执行完该程序以后会有一个界面的停留
测试:
测试程序中按学号排序的功能是否正确
使用c语言建立一个学生管理系统(使用结构体)_第3张图片
使用c语言建立一个学生管理系统(使用结构体)_第4张图片

使用c语言建立一个学生管理系统(使用结构体)_第5张图片

测试结果:
使用c语言建立一个学生管理系统(使用结构体)_第6张图片

运行结果:
菜单界面

使用c语言建立一个学生管理系统(使用结构体)_第7张图片

增加学生:
使用c语言建立一个学生管理系统(使用结构体)_第8张图片

显示学生信息:
使用c语言建立一个学生管理系统(使用结构体)_第9张图片

查询学生信息
使用c语言建立一个学生管理系统(使用结构体)_第10张图片

修改学生信息

使用c语言建立一个学生管理系统(使用结构体)_第11张图片

按学号删除:
使用c语言建立一个学生管理系统(使用结构体)_第12张图片

系统帮助及使用说明
使用c语言建立一个学生管理系统(使用结构体)_第13张图片

退出系统

使用c语言建立一个学生管理系统(使用结构体)_第14张图片

保存当前学生信息

使用c语言建立一个学生管理系统(使用结构体)_第15张图片

五.经验归纳
1.在写程序的时候,尽量把实现不同功能的代码放到不同的函数中,这样不仅看起来很流畅美观,修改和使用的时候也很方便。
2.写完程序以后,可以在网上看看其他人所写的程序。对比一下自己与别人的区别,总结一下各自代码的优缺点。
3.写完程序以后,及时的对一些代码进行注释,方便自己和别人理解。

你可能感兴趣的:(使用c语言建立一个学生管理系统(使用结构体))