欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-05 23:12:44
...

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

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

三.程序实现
源代码:
#include<stdio.h> /I/O函数/
#include<stdlib.h> /其它说明/
#include<string.h> /字符串函数/
#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<n;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<n;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<n;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<n-1;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<n+m;j++)//开始增加学生
{
	printf("请输入第%d 个学生的学号:\n",j+1);
	scanf("%s",&students[j].code);
	printf("请输入第%d 个学生的姓名:\n",j+1);
	scanf("%s",&students[j].name);
	printf("请输入第%d 个学生的年龄:\n",j+1);
	scanf("%d",&students[j].age);
	printf("请输入第%d 个学生的性别:\n",j+1);
	scanf(" %s",&students[j].sex);
	printf("请输入第%d 个学生的C语言成绩\n",j+1);
	scanf("%f",&students[j].score[0]);
	printf("请输入第%d 个学生的高等数学成绩:\n",j+1);
	scanf("%f",&students[j].score[1]);
	printf("请输入第%d 个学生的大学英语成绩:\n",j+1);
	scanf("%f",&students[j].score[2]);
}
n+=m;//学生总数加m
printf("信息增加完毕!\n\n");
sort();

}

void del()//删除
{
int i,j,flag=0;
char s1[LEN+1];
printf(“请输入要删除学生的学号:\n”);
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(students[i].code,s1)0)//判断俩个字符串是否相等
{
flag=1;//是否找到该学生的标志
for(j=i;j<n-1;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<n;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<n;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();//界面
}
四.调试、测试及运行结果
调试:
使用c语言建立一个学生管理系统(使用结构体)

字符串的赋值直接采用等号进行,会出现以下错误
使用c语言建立一个学生管理系统(使用结构体)

所以利用strcmp函数对字符串进行赋值
由于在函数menu()中加入清屏功能,所以在执行每一个菜单模块时,输入值后就会立马回到功能菜单那个界面,所以在每一个功能界面的后面加上一个退出选项
使用c语言建立一个学生管理系统(使用结构体)

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

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

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

运行结果:
菜单界面

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

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

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

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

修改学生信息

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

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

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

退出系统

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

保存当前学生信息

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

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