针对在校大学生的C语言入门学习——学生管理系统
- 有了前面的链表作为数据结构,接下来我们就开始学生管理系统的项目。项目的功能主要就是对学生信息的增、删、改、查。我简单画了一个图来表达一下我们的需求。
- 主界面显示学生的信息,可以根据姓名和各科的成绩升序降序排序。修改、删除、添加都会切换到其他界面进行。数据的持久化我就使用C语言的文件读写来实现。
学生结构体封装
typedef struct Student
{
char name[32];
float language;
float english;
float math;
}Student;
- 结构体包含存放名字的字符数组和语数外三科成绩。这里要强调的是我们不可以在结构体中定义一个指针变量来保存名字。比如
char* name
这样是错误的。因为指针变量只能保存地址,不能保存字符串。
界面切换
- 每个界面都要定义一个函数。但是切换界面的时候如果只是简单的函数调用,那程序就太不灵活了。我使用函数指针的形式来实现界面的切换。请看下面代码。
int mainMenu();
int addMenu();
int updateMenu();
int removeMenu();
int(*currentMenu)() = mainMenu;
int main(void)
{
while(1)
{
if(currentMenu())
break;
}
return 0;
}
int mainMenu()
{
}
int addMenu()
{
}
int updateMenu()
{
}
int removeMenu()
{
}
- currentMenu是函数指针,在项目中它将会指向每个界面函数。main函数中使用currentMenu来执行各个界面。每个界面在结束之前要给currentMenu指向下一个界面,然后结束当前界面的函数。界面函数的返回值是1就结束整个程序,否则继续执行下一个界面。下面我把几个界面函数添加一些显示内容和切换的操作。
-
主菜单
#define MEIN_MENU_ITEMS 3
void mainMenuShow(int cursor)
{
char* menus[] = {
"添加学生信息","修改学生信息","删除学生信息"};
printf(" --------------------------------- \n");
printf("| Welcome to use |\n");
printf("| Sea Student Manage System |\n");
printf(" --------------------------------- \n");
printf("input: 1 up 2 down 3 ok\n");
int i;
for(i = 0;i < MEIN_MENU_ITEMS;i++)
{
if(i == cursor)
printf("*%s\n", menus[i]);
else
printf("%s\n",menus[i]);
}
}
int mainMenu()
{
int cursor = 0;
while(1)
{
mainMenuShow(cursor);
int ctrl;
scanf("%d",&ctrl);
}
}
int cursorCtrl(int* cursor)
{
int ctrl;
scanf("%d", &ctrl);
switch(ctrl)
{
case 1://上移
*cursor = *cursor==0?MEIN_MENU_ITEMS-1:*cursor-1;
return 0;
case 2://下移
*cursor = *cursor==MEIN_MENU_ITEMS-1?0:*cursor+1;
return 0;
case 3://ok
return 1;
}
}
- 函数返回0表示用户操作的是up和down,返回1表示用户操作的是ok。下面请看mainMenu中的调用。
int mainMenu()
{
int cursor = 0;
while(1)
{
mainMenuShow(cursor);
if(cursorCtrl(&cursor))
{
}
}
}
- 接下来我们封装用户选中ok的时候的函数。目前只有三件事可做,那就是分别切换到不同的界面。
int mainMenuCtrl(int cursor)
{
switch(cursor)
{
case 0://跳转到 添加学生信息界面
currentMenu = addMenu;
return 1;
case 1://跳转到 修改学生信息界面
currentMenu = updateMenu;
return 1;
case 2://跳转到 删除学生信息界面
currentMenu = removeMenu;
return 1;
}
}
- 函数返回1表示要切换界面,返回0表示不切换界面。目前我们只做切换界面的功能。下面是另外三个界面的简单实现。
int mainMenu()
{
int cursor = 0;
while(1)
{
mainMenuShow(cursor);
if(cursorCtrl(&cursor))
{
if(mainMenuCtrl(cursor))
{
return 0