1 实践项目

本课程我们学习了Linux C程序设计,学习在Linux系统下使用C语言编程。那么,我们就可以使用C语言来开发应用程序。

我们使用C语言来开发一个“学生信息管理系统”,可以管理学生的信息。

那么,在这个软件系统中,我们要充分使用C语言的各个知识点,加深对C语言编程的学习。所以,我们列举几个需要实践操作的知识点:

  1. 函数的使用,对软件功能模块进行划分,不同的功能使用不同的函数来定义;
  2. 源文件和头文件的使用;不同的功能模块,使用不同的文件来封装;
  3. 结构体的使用,使用结构体来定义操作的对象,管理一个对象的数据和行为;
  4. 函数指针的使用,在结构体中定义函数指针成员,模拟对象的行为;
  5. 文件的操作,系统管理的学生信息,存储到文件中,所以,学习文件的创建和读写操作;
  6. 顺序表的使用;使用数组来管理学生信息;
  7. 链表的使用;使用链表来管理学生信息;
  8. 学习面向对象编程的思路,在软件设计中,我们把需要操作的数据封装成对象,对象有自己的数据和行为。所以,我们定义一个管理员对象,管理员可以对学生信息进行增加、删除、修改的操作。管理员的这些操作,可以定义为函数指针,指向不同的函数。

所以,通过学习这个“学生信息管理系统”软件,我们可以加深对C语言编程的理解。而且,作者给出的思路是“面向对象编程”的思路,读者一开始,就可以理解C语言实现面向对象编程的过程。

软件启动运行如下:

可以看到,编译程序:

gcc main.c manager.c array.c list.c public.c student.c -o exe

编译得到exe可执行程序,然后,执行 ./exe 程序。可以看到,这是一个学生信息管理系统,支持管理员的登陆,支持学生信息的查找、增加、删除、修改功能。

后续我们有课程,学习“Linux系统编程”,学习了Linux系统编程之后,我们可以编写更加复杂的系统软件,例如,开发一个网络服务器等等。

2 软件需求分析

我们开发一个学生信息管理系统,要求实现如下的功能模块:

  1. 学生信息的管理,由一个管理员来操作;
  2. 管理员的操作权限,有对学生信息的查询、增加、删除、修改功能;
  3. 管理员需要使用用户名和密码登陆系统;
  4. 管理的学生信息,支持数组的管理;
  5. 管理的学生信息,支持链表的管理;
  6. 代码同时支持顺序表和链表的操作,可以通过函数指针,指向不同的操作;

我们把学生信息管理系统软件,分解成这些功能需求。

那么,我们就使用C语言来开发程序,实现这些软件需求。

3 软件代码概要设计

在上一章节中,我们分析了“学生信息管理系统”软件的需求,分析出软件需要实现的功能模块。那么,下面,我们来分析每一个功能模块的实现方式。

首先,我们从整体上分析软件的设计,该软件涉及到什么对象,每个对象之间有什么操作。那么,可以概括如下:

  1. 学生信息对象,该对象存储一个学生的信息;
  2. 学生信息集合,管理所有学生信息对象的集合;
  3. 学生信息的集合,使用数组来定义;
  4. 学生信息的集合,使用链表来定义;
  5. 管理员对象,可以管理学生的信息,支持学生信息的查询、增加、删除、修改的操作;
  6. 管理员对象,需要用户名和密码的验证,才可以登陆和使用系统;

所以,我们对软件进行分析,抽象出软件功能涉及到的对象。然后,通过这些对象的操作,实现一个完整的软件系统。

例如,管理员对象的操作,支持系统的登陆,对学生信息的查询、增加、删除、修改功能。就是基于管理员对象进行操作,实现一个软件的功能设计。所以,这也就是一个面向对象编程的思想。然后操作,都是基于对象进行设计。

所以,我们使用结构体来定义对象类型,在结构体中使用函数指针来定义对象的行为。

4 管理员的定义

在学生信息管理系统中,任何操作都是由“管理员”来执行。管理员登陆到系统,然后,对学生信息进行查询、增加、删除、修改的操作。

所以,我们可以定义管理员的类型如下:

//========================================

//管理者的结构体;

//========================================

struct manager

{

struct array_set stud_array; //学生集合的 数组结构;

//================

//stud_list是一个链表结点,当作链表的表头来使用;

//================

struct list_node stud_list; //学生集合的 链表结构;

int is_login; //标记是否登陆系统成功, 0 -- 没有登陆, 1 -- 登陆;

//================

//定义函数指针;

//================

//增加一个学生信息;

int (*pfunc_stud_add)(struct manager* pm, struct stud* ps);

//删除一个学生信息;

int (*pfunc_stud_del)(struct manager* pm, unsigned int number);

//修改一个学生的信息;

int (*pfunc_stud_modify)(struct manager* pm, struct stud* ps);

//初始化学生的信息,加载到对应的集合中;

int (*pfunc_stud_init)(struct manager* pm);

//学生信息存储到文件中;

int (*pfunc_stud_store)(struct manager* pm);

//输出学生的信息;

void (*pfunc_stud_print)(struct manager* pm);

//根据学号, 获取一个学生的信息;

int (*pfunc_stud_get)(struct manager* pm, unsigned int number, struct stud* ps);

};

可以看到,我们定义了struct manager管理员类型。然后,定义该对象如下:

//========================================

//定义全局对象, 是学生信息的管理者;

//========================================

struct manager stud_manager;

然后,我们对软件系统的操作,都是由整个管理员来进行。所以,在main函数中,定义如下:

//========================================

//程序的入口地址;

//========================================

int main(int argc, char* argv[])

{

...

//==================

//初始化学生信息管理者对象;

//下面的操作,都是由学生信息管理者进行操作;

//==================

if(manager_init(&stud_manager))

return 1;

//==================

//进入循环工作;

//==================

while(-1 != step)

{

print_usage(); //输出操作手册;

LOG("====== ====== ======\n");

LOG("%s", TEXT_INPUT_OPE);

memset(buf, 0, 16);

scanf("%s", buf);//获取用户输入的操作步骤;

step = atoi(buf); //把字符串转换成数值;

//==================

//判断用户输入怎么样的操作,然后,执行相应的动作;

//==================

switch(step)

{

case 1: manager_login(&stud_manager); break;

case 2: manager_show_student(&stud_manager);break;

case 3: manager_add_student(&stud_manager);break;

case 4: manager_del_student(&stud_manager);break;

case 5: manager_modify_student(&stud_manager);break;

case 6: step = -1; break; //设置退出循环的标记,结束程序运行;

default:

LOG("%s\n", TEXT_INPUT_ERR);

break;

}//end switch

}//end while

...

}

所以,可以看到,很多操作,都是基于stud_manager对象进行操作。其中,管理员的操作,通过函数指针来指定操作函数,例如:

//========================================

//设置管理者的函数指针, 指向数组 或者 链表的操作函数;

//========================================

void manager_init_set_func(struct manager* pm)

{

#if 0

//====================

//配置使用数组管理;

//====================

pm->pfunc_stud_add = array_stud_add;

pm->pfunc_stud_del = array_stud_del;

pm->pfunc_stud_modify = array_stud_modify;

pm->pfunc_stud_init = array_stud_init;

pm->pfunc_stud_store = array_stud_store;

pm->pfunc_stud_print = array_stud_print;

pm->pfunc_stud_get = array_stud_get;

#else

//====================

//配置使用链表管理;

//====================

pm->pfunc_stud_add = list_stud_add;

pm->pfunc_stud_del = list_stud_del;

pm->pfunc_stud_modify = list_stud_modify;

pm->pfunc_stud_init = list_stud_init;

pm->pfunc_stud_store = list_stud_store;

pm->pfunc_stud_print = list_stud_print;

pm->pfunc_stud_get = list_stud_get;

#endif

}

所以,我们给管理员对象的函数指针,定义指向不同的函数,那么,可以调用不同的函数来操作。

例如,查询显示学生信息的函数如下:

//========================================

//显示所有学生信息;

//========================================

int manager_show_student(struct manager* pm)

{

//===================

//判断管理员是否已经登陆,如果没有登陆,就返回,不允许继续操作;

//===================

if(!manager_is_login(pm))

return 1;

pm->pfunc_stud_print(pm); //通过函数指针,输出所有学生的信息;

return 0;

}

例如,通过pfunc_stud_print函数指针,调用指向的函数。

我们在这个软件中,对学生信息的管理,使用数组和链表来管理。所以,可以通过函数指针的设置,定义使用不同的数据管理方式。

通过这个代码,我们学习函数指针的定义和使用。通过函数指针,可以给结构体的对象指定一个函数。

学生信息使用数组管理

在代码中,我们定义array.c和array.h文件来管理“数组”的操作。使用数组来管理学生信息,如下:

在array.h头文件中,对外引出操作函数,如下:

int array_stud_add(struct manager* pm, struct stud* ps);

int array_stud_del(struct manager* pm, unsigned int number);

int array_stud_modify(struct manager* pm, struct stud* ps);

int array_stud_init(struct manager* pm);

int array_stud_store(struct manager* pm);

void array_stud_print(struct manager* pm);

int array_stud_get(struct manager* pm, unsigned int number, struct stud* ps);

然后,设置给管理员对象的函数指针,如下:

//====================

//配置使用数组管理;

//====================

pm->pfunc_stud_add = array_stud_add;

pm->pfunc_stud_del = array_stud_del;

pm->pfunc_stud_modify = array_stud_modify;

pm->pfunc_stud_init = array_stud_init;

pm->pfunc_stud_store = array_stud_store;

pm->pfunc_stud_print = array_stud_print;

pm->pfunc_stud_get = array_stud_get;

所以,最终管理员可以通过函数指针,调用这些函数。以数组的方式,管理学生信息。

学生信息使用链表管理

在代码中,我们定义list.c和list.h文件来管理“链表”的操作。使用链表来管理学生信息,如下:

在list.h头文件中,对外引出操作函数,如下:

int list_stud_add(struct manager* pm, struct stud* ps);

int list_stud_del(struct manager* pm, unsigned int number);

int list_stud_modify(struct manager* pm, struct stud* ps);

int list_stud_init(struct manager* pm);

int list_stud_store(struct manager* pm);

void list_stud_print(struct manager* pm);

int list_stud_get(struct manager* pm, unsigned int number, struct stud* ps);

然后,设置给管理员对象的函数指针,如下:

//====================

//配置使用链表管理;

//====================

pm->pfunc_stud_add = list_stud_add;

pm->pfunc_stud_del = list_stud_del;

pm->pfunc_stud_modify = list_stud_modify;

pm->pfunc_stud_init = list_stud_init;

pm->pfunc_stud_store = list_stud_store;

pm->pfunc_stud_print = list_stud_print;

pm->pfunc_stud_get = list_stud_get;

所以,最终管理员可以通过函数指针,调用这些函数。以链表的方式,管理学生信息。

7 文件操作

在“学生信息管理软件”中,需要对学生信息进行存储。所以,需要使用文件来存储学生信息。那么,有如下的操作:

  1. 打开文件,读取数据。查询学生信息的时候,需要把文件中的数据读取处理;
  2. 打开文件,写入数据。当增加一个学生信息的时候,需要把学生信息写入到文件中;

而且,在系统登陆操作中,需要用户名和密码的验证。我们预先把用户名和密码保存到pwd.txt文件中。

那么,管理员登陆系统的时候,就读取pwd.txt文件中的信息。对比用户输入的用户名和密码信息。

所以,在这个程序中,我们学习文件的操作。

8 软件编译运行

编写了代码之后,我们可以编译、运行程序,如下:

gcc main.c manager.c array.c list.c public.c student.c -o exe

此时,编译出exe程序,然后,执行软件,如下:

可以看到,运行一个学生信息管理系统软件。支持管理员的登陆,管理员可以对学生信息进行查询、增加、删除、修改的操作。

所以,首先,我们创建pwd.txt文件,存放管理员登陆的用户名和密码。如下:

那么,登陆系统的操作如下:

此时,输入步骤1,然后,输入登陆的用户名和密码,提示用户登陆成功!

然后,输入步骤3,增加一个学生的信息。所以,我们输入学生的信息。然后,再执行步骤2,查询学生的信息,如下图:

可以看到,我们添加了一个学生的信息。然后,我们可以修改和删除学生的信息,注意:修改一个学生信息的时候,修改相同学号的学生信息。如下图:

可以看到,学号16280这一个学生的信息,被修改过来了。接下来,我们删除学生信息,如下:

可以看到,输入步骤4,然后,输入需要删除学生信息的学号,最终,提示删除成功。然后,再查询学生信息,没有信息可以查询。

读者可以自行修改代码,测试软件的运行,加深对C语言的学习和使用。

9 总结

本章节我们实践开发了一个“学生信息管理系统”软件,使用C语言来开发一个软件系统。我们结合结构体和函数指针的应用,使用面向对象的设计思想,进行软件设计。

读者可以在这个软件的基础上进行扩展,完善更多的功能。加深对C语言编程的学习。在后续的课程中,我们学习“Linux系统编程”,可以开发出更复杂的软件系统。

读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

学生信息管理系统 C语言程序设计相关推荐

  1. c语言程序设计课程设计学生信息管理系统,C语言程序设计课程设计报告----学生信息管理系统.doc...

    河南理工大学计算机学院 <C语言程序设计>课程设计报告 题目: 学生信息管理系统 专业: 计算机科学与技术 班级: 计算机XX班 学号: 311009033232 姓名: ***** 日期 ...

  2. 学生信息管理系统c 语言程序设计报告,C语言程序设计报告(学生信息管理系统)[1].txt...

    C语言程序设计报告(学生信息管理系统)[1].txt C CCCC * * * * * * * * * * * * * * * * .3 3 .4 1. .4 2. 4 3. 4 4. .5 飺 .5 ...

  3. 用c语言录入3组学生数据编程,学生信息管理系统C语言编程

    学生信息管理系统C语言编程 [问题描述] 学生信息的管理是每个学校必须具有的管理功能,主要是对学生的基本情况及学习成绩等方面的管理.该系统模拟一个简单的学生管理系统,要求对文件中所存储的学生数据进行各 ...

  4. 显示学生信息的C语言,学生信息管理系统C语言.doc

    学生信息管理系统C语言 学生信息管理系统 摘要 由于学校规模进一步扩大,学生人数逐年上升,学生信息的管理也变得越来越复杂,切实有效的把学生信息管理系统引入学校教务管理中,对于促进学校管理制度和提高学校 ...

  5. c语言编程项目实践报告快递管理系统,学生成绩管理系统C语言程序设计实践报告.doc...

    学生成绩管理系统C语言程序设计实践报告 (此文档为word格式,下载后您可任意编辑修改!) 中南大学 C语言程序设计实践报告 题 目 学 生 成 绩 管 理 系 统 学生姓名 木雕小象 指导教师 × ...

  6. 学生信息管理系统(C++语言版)

    学生信息管理系统(C语言版) #include "stdio.h" #include "bios.h" #include "conio.h" ...

  7. 学生信息管理系统c语言课设,学生信息管理系统C语言课设.doc

    学生信息管理系统C语言课设 目录 一.需求分析2 二.概要设计2 三.详细设计4 四.调试分析9 五.用户手册9 六.测试数据9 七.附录10 一.需求分析学生学籍管理系统用数据文件存放学生的学籍,可 ...

  8. 学生信息管理系统(C语言版本+源码)

    学生信息管理系统(C语言版本) 有需要的可以自行下载 链接:https://download.csdn.net/download/qq_52889967/14955434 源码在后面 java+数据库 ...

  9. c语言学生信息管理ppt,学生信息管理系统(C语言、含代码解释).ppt

    学生信息管理系统(C语言.含代码解释) 第3章 脂类代谢 脂类的分布与生理功能 脂类的消化与吸收 血脂 甘油三酯的中间代谢 类脂代谢 脂类代谢紊乱 3.1 脂类的分布和生理功能 3.1.1 脂类的分布 ...

最新文章

  1. vue 关闭弹如何销毁子组件_vue中的eventBus会产生内存泄漏吗
  2. 7月15号day7总结
  3. 挺过最艰难的2018,我终将长大
  4. 稀疏矩阵的加,减,乘,转置
  5. 三线压力传感器原理_电喷摩托车进气压力传感器原理与检测
  6. session用户账号认证(一个用户登陆,踢出前一个用户)
  7. Enterprise Architect(EA)画UML之用例图,敲详细讲解+实战举例
  8. 与英语密切联系的计算机专业,计算机专业英语
  9. easySearch:一款聚合资源搜索神器
  10. Canonical Address
  11. 得到app文稿导出_得到-app分析
  12. 关于JavaScript谷歌浏览器报错常见问题
  13. 语法长难句-----简单句
  14. linux服务器自动断开,解决centos7服务器用ssh连接老是自动断开问题
  15. 桥 Gym100712H Bridges
  16. Git 常用命令练习
  17. 网页播放视频没有进度条怎么可以实现倍速播放
  18. 引用腾讯视频 php代码,调用腾讯视频播放器APi代码
  19. 微信小程序集成实时音视频通话功能
  20. 我的Java学习之路(七)-- 模拟考试系统

热门文章

  1. Unity 使用SpriteRenderer和TextMeshPro制作血条
  2. 微信小程序——WXS 模块
  3. 5.2 综合案例- 继电器控制
  4. 【课件制作软件】Focusky教程 | 对齐工具快刀斩乱麻
  5. C语言判断平年和闰年源码
  6. Unity3D_HDRP项目代码修改天空球
  7. spark sql 出现 java.lang.RuntimeException: serious problem
  8. VMWare15安装MacOS系统及设置分辨率
  9. emulator-5556 offline问题解决方案
  10. Python网络爬虫学习笔记(二)基本库的使用