目录
实现学生管理系统
第一步:结构体声明
第二步:重命名结构体
第三步:限定可以存储的最大学生数目
第四步:定义结构体指针数组和定义一个整型变量存放当前的人数
第五步:设计欢迎界面
第六步:设计菜单界面
第七步:获取用户的选择
第八步:根据用户的选择实现对应的功能,分支语句
第一个功能:添加信息
第二个功能:显示信息
第三个功能:修改信息
第四个功能:删除信息
第五个功能:查找信息
第六个功能:退出系统
完整参考代码
今天是C语言笔试复习的最后一篇了!主要是实现学生管理系统!坚持就是胜利!
下一个阶段是数据结构!敬请期待!
说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。
这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。
注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。
我们正式开始:
实现学生管理系统
用结构体指针数组来写,数组中的每个元素都是指针,每个指针指向的对象是结构体
一般来说,管理系统都包含学生信息,和“增删改查”这些管理操作。
整体参考代码会放在文章最后。
以下是步骤分解:
第一步:结构体声明
第二步:重命名结构体
第三步:限定可以存储的最大学生数目
第四步:定义结构体指针数组和定义一个整型变量存放当前的人数
#include <stdio.h>
#include <stdlib.h>//system/exit/malloc的头文件
#include <unistd.h>//sleep的头文件
#include <string.h>//strlen的头文件
//结构体声明
struct Student
{
int id;
char name[32];
int age;
char tel[12];
};
//注意:结构体的声明不能直接在结构体当中初始化
typedef struct Student stu;//重命名结构体为stu
//限定可以储存的最大学生数目
#define MAX 1024
//定义结构体指针数组
stu* g_info[MAX]={0};//数组用来存放学生信息(的地址)
int g_count=0;//表示当前的的人数
第五步:设计欢迎界面
void welcome()
{
system("clear");//清屏
printf("---------------------------------------------------------\n\n");
printf("\t\t欢迎使用学生管理系统\n\n");
printf("---------------------------------------------------------\n\n");
sleep(2);//睡眠2s
}
第六步:设计菜单界面
void menu()
{
system("clear");//清屏
printf("---------------------------------------------------------\n\n");
printf("\t\t1.添加信息 2.显示信息\n\n");
printf("\t\t3.修改信息 4.删除信息\n\n");
printf("\t\t5.查找信息 6.退出系统\n\n");
printf("---------------------------------------------------------\n\n");
}
第七步:获取用户的选择
menu();
scanf("%d",&choice);
第八步:根据用户的选择实现对应的功能,分支语句
switch(choice)
{
case 1://添加信息
add_info();
break;
case 2://显示信息
show_info();
break;
case 3://修改信息
modify_info();
break;
case 4://删除信息
delete_info();
break;
case 5://查找信息
find_info();
break;
case 6://退出系统
exit(0);
break;
default:
printf("输入有误\n");
}
第一个功能:添加信息
void add_info()
{
printf("请输入 学号 姓名 年龄 电话\n");
g_info[g_count]=(stu*)malloc(sizeof(stu)*1);//申请空间
if(NULL==g_info[g_count])
{
printf("申请失败\n");
exit(1);
}
int flag=1;
while(flag)
{
//获取信息
scanf("%d%s%d%s",&g_info[g_count]->id,g_info[g_count]->name,&g_info[g_count]->age,g_info[g_count]->tel);
//判断电话的长度
if(strlen(g_info[g_count]->tel)!=11)
{
printf("输入的电话信息有误,请重新输入...\n");
continue;//重新开始scanf环节
}
//判断电话是否重复
int i;
for(i=0;i<g_count;i++)
{
if(strcmp(g_info[i]->tel,g_info[g_count]->tel)==0)
{
printf("电话重复,请重新输入...\n");
flag=1;
break;//退出for循环
}
}
//电话没有重复且是11位
if(i==g_count)
{
flag=0;//退出while循环
}
}
g_count++;
printf("添加信息成功\n");
sleep(2);
}
第二个功能:显示信息
void show_info()
{
//将学生信息按照学号排序,冒泡排序
int i,j;
stu*tmp;
for(i=0;i<g_count-1;i++)
{
for(j=0;j<g_count-1-i;j++)
{
//通过结构体指针间接比较指针所指向的结构体的成员id
if(g_info[j]->id>g_info[j+1]->id)
{
//交换地址
tmp=g_info[j];
g_info[j]= g_info[j+1];
g_info[j+1]=tmp;
}
}
}
//设计表头
printf("%5s %5s %5s %15s\n","学号","姓名","年龄","电话");
//排序好之后打印出来
for(i=0;i<g_count;i++)
{
printf("%5d %5s %5d %15s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
}
sleep(2);
}
第三个功能:修改信息
void modify_info()
{
printf("请输入要修改人员的学号\n");
int id;
flag:
scanf("%d",&id);
int i;
//遍历所有结构体中的学号
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
printf("当前信息如下:\n");
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
printf("请输入新信息\n");
int flag=1;
while(flag)
{
//获取信息
scanf("%d%s%d%s",&g_info[i]->id,g_info[i]->name,&g_info[i]->age,g_info[i]->tel);
//判断电话的长度
if(strlen(g_info[i]->tel)!=11)
{
printf("输入的电话信息有误,请重新输入...\n");
continue;//重新开始scanf环节
}
//判断和前面的人和后面的人的电话是否重复,跳过自己
int j;
for(j=0;j<g_count;j++)
{
if(i==j)//跳过自己
continue;
if(strcmp(g_info[i]->tel,g_info[j]->tel)==0)
{
printf("电话重复,请重新输入...\n");
flag=1;
break;//退出for循环
}
}
//电话没有重复且是11位
if(j==g_count)
{
flag=0;//退出while循环
}
}
printf("修改成功\n");
sleep(2);
return;//结束函数
}
}
if(i==g_count)
{
printf("学号不存在\n");
goto flag;
}
}
第四个功能:删除信息
void delete_info()
{
printf("请输入要删除的学生学号:\n");
int id;
scanf("%d",&id);
int i,j;
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
free(g_info[i]);//将g_info[i]指向的那块内存释放掉
//后面的往前覆盖
for(j=0;j<g_count-i-1;j++)
{
g_info[i+j]=g_info[i+1+j];
}
g_count--;//人数减1
printf("删除成功\n");
sleep(2);
return;
}
}
printf("学号不存在\n");
sleep(2);
}
第五个功能:查找信息
void find_info()
{
printf("根据学号查找(1)还是根据姓名查找(2)\n");
int choice;
scanf("%d",&choice);
int i;
if(1==choice)
{
printf("请输入查找人的学号:\n");
int id;
scanf("%d",&id);
//遍历
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
sleep(2);
return;
}
}
printf("学号不存在\n");
sleep(2);
}
else if(2==choice)
{
printf("请输入学生的姓名\n");
char name[32]={0};
scanf("%s",name);
for(i=0;i<g_count;i++)
{
if(!strcmp(name,g_info[i]->name))//如果相等,即0,取反即1,1即真
{
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
sleep(2);
return;
}
}
printf("输入的姓名有误\n");
sleep(2);
}
}
第六个功能:退出系统
case 6://退出系统
exit(0);
完整参考代码
#include <stdio.h>
#include <stdlib.h>//system/exit/malloc的头文件
#include <unistd.h>//sleep的头文件
#include <string.h>//strlen的头文件
//结构体声明
struct Student
{
int id;
char name[32];
int age;
char tel[12];
};
//注意:结构体的声明不能直接在结构体当中初始化
typedef struct Student stu;//重命名结构体为stu
//限定可以储存的最大学生数目
#define MAX 1024
//定义结构体指针数组
stu* g_info[MAX]={0};//数组用来存放学生信息(的地址)
int g_count=0;//表示当前的的人数
void welcome()
{
system("clear");//清屏
printf("---------------------------------------------------------\n\n");
printf("\t\t欢迎使用学生管理系统\n\n");
printf("---------------------------------------------------------\n\n");
sleep(2);//睡眠2s
}
void menu()
{
system("clear");//清屏
printf("---------------------------------------------------------\n\n");
printf("\t\t1.添加信息 2.显示信息\n\n");
printf("\t\t3.修改信息 4.删除信息\n\n");
printf("\t\t5.查找信息 6.退出系统\n\n");
printf("---------------------------------------------------------\n\n");
}
void add_info()
{
printf("请输入 学号 姓名 年龄 电话\n");
g_info[g_count]=(stu*)malloc(sizeof(stu)*1);//申请空间
if(NULL==g_info[g_count])
{
printf("申请失败\n");
exit(1);
}
int flag=1;
while(flag)
{
//获取信息
scanf("%d%s%d%s",&g_info[g_count]->id,g_info[g_count]->name,&g_info[g_count]->age,g_info[g_count]->tel);
//判断电话的长度
if(strlen(g_info[g_count]->tel)!=11)
{
printf("输入的电话信息有误,请重新输入...\n");
continue;//重新开始scanf环节
}
//判断电话是否重复
int i;
for(i=0;i<g_count;i++)
{
if(strcmp(g_info[i]->tel,g_info[g_count]->tel)==0)
{
printf("电话重复,请重新输入...\n");
flag=1;
break;//退出for循环
}
}
//电话没有重复且是11位
if(i==g_count)
{
flag=0;//退出while循环
}
}
g_count++;
printf("添加信息成功\n");
sleep(2);
}
void show_info()
{
//将学生信息按照学号排序,冒泡排序
int i,j;
stu*tmp;
for(i=0;i<g_count-1;i++)
{
for(j=0;j<g_count-1-i;j++)
{
//通过结构体指针间接比较指针所指向的结构体的成员id
if(g_info[j]->id>g_info[j+1]->id)
{
//交换地址
tmp=g_info[j];
g_info[j]= g_info[j+1];
g_info[j+1]=tmp;
}
}
}
//设计表头
printf("%5s %5s %5s %15s\n","学号","姓名","年龄","电话");
//排序好之后打印出来
for(i=0;i<g_count;i++)
{
printf("%5d %5s %5d %15s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
}
sleep(2);
}
void modify_info()
{
printf("请输入要修改人员的学号\n");
int id;
flag:
scanf("%d",&id);
int i;
//遍历所有结构体中的学号
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
printf("当前信息如下:\n");
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
printf("请输入新信息\n");
int flag=1;
while(flag)
{
//获取信息
scanf("%d%s%d%s",&g_info[i]->id,g_info[i]->name,&g_info[i]->age,g_info[i]->tel);
//判断电话的长度
if(strlen(g_info[i]->tel)!=11)
{
printf("输入的电话信息有误,请重新输入...\n");
continue;//重新开始scanf环节
}
//判断和前面的人和后面的人的电话是否重复,跳过自己
int j;
for(j=0;j<g_count;j++)
{
if(i==j)//跳过自己
continue;
if(strcmp(g_info[i]->tel,g_info[j]->tel)==0)
{
printf("电话重复,请重新输入...\n");
flag=1;
break;//退出for循环
}
}
//电话没有重复且是11位
if(j==g_count)
{
flag=0;//退出while循环
}
}
printf("修改成功\n");
sleep(2);
return;//结束函数
}
}
if(i==g_count)
{
printf("学号不存在\n");
goto flag;
}
}
void delete_info()
{
printf("请输入要删除的学生学号:\n");
int id;
scanf("%d",&id);
int i,j;
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
free(g_info[i]);//将g_info[i]指向的那块内存释放掉
//后面的往前覆盖
for(j=0;j<g_count-i-1;j++)
{
g_info[i+j]=g_info[i+1+j];
}
g_count--;//人数减1
printf("删除成功\n");
sleep(2);
return;
}
}
printf("学号不存在\n");
sleep(2);
}
void find_info()
{
printf("根据学号查找(1)还是根据姓名查找(2)\n");
int choice;
scanf("%d",&choice);
int i;
if(1==choice)
{
printf("请输入查找人的学号:\n");
int id;
scanf("%d",&id);
//遍历
for(i=0;i<g_count;i++)
{
if(g_info[i]->id==id)
{
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
sleep(2);
return;
}
}
printf("学号不存在\n");
sleep(2);
}
else if(2==choice)
{
printf("请输入学生的姓名\n");
char name[32]={0};
scanf("%s",name);
for(i=0;i<g_count;i++)
{
if(!strcmp(name,g_info[i]->name))//如果相等,即0,取反即1,1即真
{
printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
sleep(2);
return;
}
}
printf("输入的姓名有误\n");
sleep(2);
}
}
int main()
{
welcome();
int choice;
while(1)
{
menu();
scanf("%d",&choice);
switch(choice)
{
case 1://添加信息
add_info();
break;
case 2://显示信息
show_info();
break;
case 3://修改信息
modify_info();
break;
case 4://删除信息
delete_info();
break;
case 5://查找信息
find_info();
break;
case 6://退出系统
exit(0);
break;
default:
printf("输入有误\n");
}
}
return 0;
}
以上代码只是基础版本,有待更加完善,大家有时间可以自己发挥!
到此C语言笔试复习就结束了,下一个阶段是学习数据结构,敬请期待!
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言。
如果想要进微信交流群可添加微信,备注“进群”!
QQ交流群群号:963138186
欢迎点击下方,订阅本栏目↓↓↓