3.员工管理系统v1,实现一个员工信息管理系统,员工信息包括:姓名、工号、工资.
姓名为不超过30个字符的字符串,工号是长度为5的字符串,假设员工数量不超过100人.
功能包括: > (1)员工信息增加; > (2)员工信息删除; >
(3)查询员工信息:通过工号或者姓名 >
(4)输出所有员工信息,按照工资排序,按照工号排序.
数据的存储
用三个指针数组分别存储各项信息就好了(现在用结构体就超纲了).
需要注意的是存入数据前要申请内存 .
删除数据后要释放内存 .
数据的读入
需要注意的是姓名之间可能出现空格(出现换行符是不讲武德,
建议拖出去毙了), 所以用scanf()读入姓名信息可能出现问题.
这里用fgets()读入. > 用法: 1 2 3 fgets (字符串, 最大长度, 流);fgets (s, len, stdin);
fgets()读入的数据中可能会带上'', 所以这里需要把换行符去掉.
基本思路是找到换行符,将其换成空字符'\0'. > 代码如下: 1 2 3 4 char *find = strchr (s, '\n' ); if (find) *find = '\0' ;
> ### 关于指针踩的坑
读入字符串需要处理换行符, 于是自己封装了一个新的读入函数 getname()
(虽然写到后面也开始用来读工号了). 1 void getname (char **, int ) ;
这里用二级指针不用一级指针是因为函数是会修改指针值(涉及内存空间申请)的,
一级指针传参(我们可以将一级指针看成一个变量)就又陷入了实参与形参的问题了.
查找
遍历比对即可, 这里简单介绍一下strcmp()函数.
删除
首先查找元素, 然后将后方元素整体前移, 原来的最后一个元素指向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表达式真的香.
完整代码
点我查看完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 #include <stdio.h> #include <string.h> #include <stdlib.h> int p_num = 0 ; int *pay[103 ]; char *name[103 ], *job_num[103 ];void add () ;void del () ;void swap (int , int ) ;void sort1 () ;void sort2 () ;void search () ;int search0 () ;int search1 (const char *) ;int search2 (const char *) ;void print () ;void print0 (int , int ) ;void getname (char **, int ) ;int main () { for (;;){ printf ("请输入操作: \n" ); printf ("A: 增加员工信息\nD: 删除员工信息\n" ); printf ("S: 查询员工信息\nP: 输出所有员工信息\nE: 退出\n" ); char n; scanf ("%c" , &n); getchar (); if (n == 'A' ) add (); else if (n == 'D' ) del (); else if (n == 'S' ) search (); else if (n == 'P' ) print (); else if (n == 'E' ) break ; else printf ("\n错误操作!\n\n" ); } return 0 ; } void add () { printf ("请输入员工姓名: \n" ); getname (&name[p_num], 19 ); printf ("请输入员工工号\n" ); if (job_num[p_num] == NULL ) job_num[p_num] = malloc (sizeof (char [9 ])); scanf ("%s" , job_num[p_num]); printf ("请输入员工工资\n" ); if (pay[p_num] == NULL ) pay[p_num] = malloc (sizeof (int )); scanf ("%d" , pay[p_num]); getchar (); printf ("成功添加: \n" ); print0 (p_num, p_num + 1 ); p_num++; } void del () { int num = search0 (); if (num == -1 ){ printf ("查无此人!\n" ); return ; } printf ("即将删除: \n" ); print0 (num, num + 1 ); char *name_temp = name[num]; char *job_num_temp = job_num[num]; int *pay_temp = pay[num]; for (int i = num; i < p_num - 1 ; i++){ name[i] = name[i + 1 ]; job_num[i] = job_num[i + 1 ]; pay[i] = pay[i + 1 ]; } free (name_temp); free (job_num_temp); free (pay_temp); name[p_num - 1 ] = NULL ; job_num[p_num - 1 ] = NULL ; pay[p_num - 1 ] = NULL ; p_num--; printf ("成功删除!\n" ); } void swap (int a, int b) { char *name_temp = name[a]; char *job_num_temp = job_num[a]; int *pay_temp = pay[a]; name[a] = name[b]; job_num[a] = job_num[b]; pay[a] = pay[b]; name[b] = name_temp; job_num[b] = job_num_temp; pay[b] = pay_temp; } void sort1 () { for (int i = 0 ; i < p_num - 1 ; i++){ for (int j = 0 ; j < p_num - 1 - i; j++){ if (strcmp (job_num[j], job_num[j + 1 ]) > 0 ) swap (j, j + 1 ); } } } void sort2 () { for (int i = 0 ; i < p_num - 1 ; i++){ for (int j = 0 ; j < p_num - 1 - i; j++){ if (*pay[j] < *pay[j + 1 ]) swap (j, j + 1 ); } } } void search () { int num = search0 (); if (num == -1 ){ printf ("查无此人!\n" ); return ; } print0 (num, num + 1 ); } int search0 () { printf ("请选择模式: \n" ); printf ("A: 姓名\n" ); printf ("B: 工号\n" ); int num; for ( ; ; ){ char n; scanf ("%c" , &n); getchar (); if (n == 'A' ){ char *s = NULL ; getname (&s, 19 ); num = search1 (s); break ; } else if (n == 'B' ){ char *s = NULL ; getname (&s, 9 ); num = search2 (s); break ; } else { printf ("错误操作!\n请重新选择模式\n" ); } } return num; } int search1 (const char * s) { int a = -1 ; for (int i = 0 ; i < p_num; i++){ if (strcmp (s, name[i]) == 0 ) return i; } return a; } int search2 (const char * s) { int a = -1 ; for (int i = 0 ; i < p_num; i++){ if (strcmp (s, job_num[i]) == 0 ) return i; } return a; } void print () { printf ("请选择排序模式: \n" ); printf ("A: 工号\n" ); printf ("B: 工资\n" ); for ( ; ; ){ char n; scanf ("%c" , &n); getchar (); if (n == 'A' ){ sort1 (); print0 (0 , p_num); break ; } else if (n == 'B' ){ sort2 (); print0 (0 , p_num); break ; } else { printf ("错误操作!\n请重新选择模式\n" ); } } } void print0 (int a, int b) { printf ("----------------------------------------\n" ); printf ("姓名 |工号 |工资\n" ); for (int i = a; i < b; i++){ printf ("%-15s|%-15s|%d\n" , name[i], job_num[i], *pay[i]); } printf ("----------------------------------------\n" ); } void getname (char **s, int len) { if (*s == NULL ) *s = (char *)malloc (sizeof (char [len])); fgets (*s, len, stdin); char *find = strchr (*s, '\n' ); if (find) *find = '\0' ; }