钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

C语言实现员工管理系统

3.员工管理系统v1,实现一个员工信息管理系统,员工信息包括:姓名、工号、工资. 姓名为不超过30个字符的字符串,工号是长度为5的字符串,假设员工数量不超过100人.
功能包括:

(1)员工信息增加;
(2)员工信息删除;
(3)查询员工信息:通过工号或者姓名
(4)输出所有员工信息,按照工资排序,按照工号排序.

数据的存储

用三个指针数组分别存储各项信息就好了(现在用结构体就超纲了).
需要注意的是存入数据前要申请内存.
删除数据后要释放内存.

数据的读入

需要注意的是姓名之间可能出现空格(出现换行符是不讲武德, 建议拖出去毙了), 所以用scanf()读入姓名信息可能出现问题.
这里用fgets()读入.

用法:

1
2
3
fgets(字符串, 最大长度, 流);
//从标准输入流中读取最多len个字符(包括'\0')存入s中
fgets(s, len, stdin);

fgets()读入的数据中可能会带上’\n’, 所以这里需要把换行符去掉.
基本思路是找到换行符,将其换成空字符’\0’.

代码如下:

1
2
3
4
//strchr(), 返回字符串中第一个匹配处
char *find = strchr(s, '\n');
if (find)
*find = '\0';

关于指针踩的坑

读入字符串需要处理换行符, 于是自己封装了一个新的读入函数 getname() (虽然写到后面也开始用来读工号了).

1
void getname(char **, int); 

这里用二级指针不用一级指针是因为函数是会修改指针值(涉及内存空间申请)的, 一级指针传参(我们可以将一级指针看成一个变量)就又陷入了实参与形参的问题了.

查找

遍历比对即可, 这里简单介绍一下strcmp()函数.

1
strcmp(s1, s2); //比较两个字符串, s1 == s2返回0, s1 < s2返回负值, s1 > s2返回正值

删除

首先查找元素, 然后将后方元素整体前移, 原来的最后一个元素指向NULL, 否则旧数组尾和新数组尾会指向同一个地址(想一想后果是什么), 最后记得释放掉被删除的数据对应的内存.

排序

数据量小,冒泡排序即可.

输出

通过域宽控制符可以实现左对齐或者右对齐.
例: %15s, 最小域宽为15, 右对齐,不足补空格.
例: %-15s, 同上, 不过是左对齐.

C++写法

并没有代码(才不是太懒了没有写)

string类型

可以直接复制, 加减, 比较.

sort()

不会吧,sort()的作用和用法还要讲?

Lambda表达式

Lambda表达式用于定义并创建匿名函数.
举例:

1
2
3
sort(A, A + n, [](T x, T y){
return x > y;
});

总结

string、sort()和lambda表达式真的香.

完整代码