基于C语言的个人简历录入程序

Prettygirl

发布日期: 2018-10-23 21:16:47 浏览量: 1836
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一 需求分析

此个人简历录入程序可实现相关信息的添加、删除、修改。

  • 通过文本框录入姓名,通过单选按钮选择性别,通过组合框选择专业(计算机,电子,工商等)和文化程度(大专,本科,硕士,博士等),设置“提交”与“取消”两个按键,当用鼠标点击“提交”按键时,在文本框中显示所填写以及选择的信息。当点击“取消”按键退出系统

  • 实现查询与统计功能(如35岁以下计算机专业的人数)

  • 实现存储与读取

二 程序设计

2.1 结构体定义

设计使用结构体数组struct DATA作为成员信息单位,另用一个结构体指针struct DATA *next 标记下一个节点的位置,使用typedef struct DATA data 将struct DATA代替成data,采用malloc函数开辟新节点并存入文件datas.myC中。

  1. struct DATA {
  2. char name[20]; //成员的姓名
  3. sex[20]; //成员的性别
  4. major[50]; //成员的专业
  5. eduStatus[50]; //成员的学历
  6. int age; //成员的年龄
  7. struct DATA *next; //指向下一个节点的结构体指针
  8. };

2.2 功能模块结构设计

三 程序实现

3.1 关键函数

  1. data * readFile(data *); //读取文件中的信息
  2. void displayItem(int); //展示选项界面
  3. data *count(data *); //统计功能
  4. data *displayAll(data *); //展示链表成员
  5. int HowManyPeople(data *); //判断链表中有多少人
  6. data *creatNew(data *); //添加信息功能
  7. data *creatLink(data *); //创建链表
  8. data *addPeople(data *); //在原链表里添加成员
  9. data *deleteAll(data *); //删除所有信息
  10. void writeAddFile(data *); //重新写入新的数据
  11. data *delAStruct(data *, data *);//删除链表里的一个节点
  12. void revise(data *); //修改链表里的一个节点
  13. data *search(data *, char *); //在链表中查找名字相同的结构体
  14. void delFunction(data *); //删除信息功能的函数
  15. void writeFileAll(data *); //将链表里的所有信息写入文件

3.2 各功能模块实现

3.2.1 主函数模块

  1. int main() {
  2. int choice;
  3. data *head, *p;
  4. char hisName[20];
  5. head = (data *)malloc(sizeof(data));
  6. head -> next = NULL;
  7. head = readFile(head); //这里是先读取保存的文件
  8. displayItem(HowManyPeople(head)); //展示选项界面
  9. while (scanf("%d", &choice)) { //当scanf成功接收到一个数字的时候会返回一个正值,满足while里面的条件。若接收到非数字则返回0,就不满足条件,直接退出
  10. system("cls"); //清屏函数,保持界面整洁
  11. switch (choice) { //判断用户的输入的数字
  12. case 1:
  13. getchar();
  14. head = creatNew(head); //调用creatNew函数,创建新链表 或 添加一个节点
  15. break;
  16. case 2:
  17. delFunction(head); //调用delFunction函数,删除整个链表 或 删除链表中指定节点
  18. break;
  19. case 3:
  20. getchar();
  21. revise(head); //调用revise函数,修改某个成员
  22. break;
  23. case 4:
  24. head = displayAll(head);//调用displayAll函数,展示链表中所有数据
  25. break;
  26. case 5:
  27. printf("输入你想查询的成员名字:\n");
  28. getchar(); //在输入1~7选项的时候,还按了一个回车键,这个回车键会让下面的gets获取字符串出错,所以要用getchar()函数把回车键吃掉
  29. gets(hisName);
  30. p = search(head, hisName);//p返回的是查询到的那个人所在的节点的指针,如果返回NULL说明没找到
  31. if (p == NULL)
  32. printf("没有这个人!");
  33. else
  34. printf("姓名:%s\t性别:%s\t年龄:%d\t专业:%s\t文化程度:%s\n",
  35. p -> name, p -> sex, p -> age, p -> major, p -> eduStatus);
  36. break;
  37. case 6:
  38. head = count(head); //调用count函数,统计符合要求的成员
  39. break;
  40. case 7:
  41. printf("正在更新数据,请稍等。");
  42. writeFileAll(head); //调用writeFileAll函数,重新将链表中的数据写入文件
  43. system("cls"); //清屏
  44. printf("谢谢使用,再见!");
  45. sleep(3); //延时函数,在这里是延时三秒
  46. return 0;
  47. }
  48. displayItem(HowManyPeople(head));//展示功能面板
  49. }
  50. return 0;
  51. }

3.2.2 展示可选项目函数模块

  1. /*************************************
  2. *功能:展示现有项目的列表和现有人数 *
  3. *输入:现有人数 *
  4. *返回:空 *
  5. **************************************/
  6. void displayItem(int sum) {
  7. printf("\n\n");
  8. printf("******************************\n");
  9. printf("***欢迎来到个人简历录入程序***\n");
  10. printf("******现在共有%d人的信息******\n", sum);
  11. printf("******************************\n");
  12. printf("** 输入1:添加信息\n");
  13. printf("** 输入2:删除信息\n");
  14. printf("** 输入3:修改信息\n");
  15. printf("** 输入4:展示全部信息\n");
  16. printf("** 输入5:查询个人信息\n");
  17. printf("** 输入6:使用统计功能\n");
  18. printf("** 输入7:退出程序\n");
  19. printf("******************************\n");
  20. }

3.2.3 添加信息功能模块

  1. /***************************
  2. *功能:列表中添加信息功能 *
  3. *输入:要写入的链表头指针 *
  4. *返回:链表的头指针 *
  5. ****************************/
  6. data *creatNew(data *head){
  7. int choice;
  8. printf("** 输入1:在原有成员里添加新成员\n");
  9. printf("** 输入2:删除原有成员并创建新信息\n");
  10. scanf("%d", &choice);
  11. getchar(); //把输入的数字后面的回车键吃掉
  12. switch(choice) { //通过用户输入的数字来调用不同的函数
  13. case 1:
  14. head = addPeople(head); //调用addPeople函数在原有的基础上添加成员
  15. break;
  16. case 2:
  17. head = deleteAll(head); //删除整个链表
  18. head = creatLink(head); //调用creatLink函数来创建新的链表
  19. break;
  20. }
  21. return head;
  22. }

3.2.4 添加信息功能模块.

  1. /***************************
  2. *功能:列表中删除信息功能 *
  3. *输入:要写入的链表头指针 *
  4. *返回:空 *
  5. ****************************/
  6. void delFunction(data *head) {
  7. printf("** 输入1:删除指定成员\n");
  8. printf("** 输入2:删除所有成员\n");
  9. int choice;
  10. char Fname[20];
  11. data *del;
  12. scanf("%d", &choice);
  13. getchar(); //吃掉回车
  14. if (choice == 2)
  15. head = deleteAll(head); //删除整个链表
  16. else {
  17. printf("输入你想删除的名字:\n");
  18. gets(Fname);
  19. del = search(head, Fname); //先找到要删除成员的位置,后删除
  20. while (del == NULL) { //如果del指针指向了一个空的位置,则代表链表中没有要删除的这个成员
  21. printf("没有找到这个人!请重新输入:\n");
  22. gets(Fname);
  23. del = search(head, Fname); //调用查找函数
  24. }
  25. head = delAStruct(head, del); //调用delAStruct函数来删除链表中的一个节点
  26. }
  27. }

3.2.5 删除链表中所有数据模块

  1. /***************************
  2. *功能:删除链表中所有数据 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. ****************************/
  6. data *deleteAll(data *head) {
  7. data *p, *q;
  8. p = head -> next;
  9. while (p != NULL) {
  10. q = p -> next; //指针q用来暂时存放p -> next(也就是p的下一个节点),因为free(p)会把p释放掉,释放以后p -> next就找不到了
  11. free(p);
  12. p = q;
  13. }
  14. remove("datas.myC"); //remove函数的作用是删除电脑中的某个文件,在stdio.h这个头文件中,传入的参数是文件的路径
  15. head -> next = NULL;
  16. return head;
  17. }

3.2.6 创建一个新的链表模块

  1. /*************************
  2. *功能:创建一个新的链表 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. **************************/
  6. data *creatLink(data *head) {
  7. data *p, *q;
  8. q = head;
  9. p = (data *) malloc(sizeof(data));
  10. printf("请输入姓名:(输入非英文结束)\n");
  11. gets(p -> name);
  12. while ((*p -> name >= 'a' && *p ->= name < 'z') //*p -> name中,p -> name是输入的字符串的指针,在前面加了一个*代表取值,取的是字符数组第一个成员的值
  13. || (*p -> name >= 'A' && *p ->= name < 'A')) {
  14. if (search(head, p -> name)){ //调用search函数查询链表中姓名相同的节点,如果没有找到,search函数会返回NULL,这时候if不会成立。
  15. printf("已有相同的姓名,请重新输入姓名:(输入非英文结束)\n");
  16. gets(p -> name);
  17. continue;
  18. }
  19. printf("请输入他/她的性别:\n"); //这里是在输入要填写的内容
  20. gets(p -> sex);
  21. printf("请输入他/她的年龄:\n");
  22. scanf("%d", &p -> age);
  23. getchar();
  24. printf("请输入他/她的专业:\n");
  25. gets(p -> major);
  26. printf("请输入他/她的文化程度:\n");
  27. gets(p -> eduStatus);
  28. q -> next = p; //脸上链表
  29. q = p;
  30. p -> next = NULL;
  31. p = (data *) malloc(sizeof(data)); //申请一块新的内存
  32. printf("请输入姓名:(输入非英文结束)\n");
  33. gets(p -> name);
  34. }
  35. free(p); //如果用户输入了非英文,代表输入结束,则上面申请的新空间不需要录入新信息。这里就把这块不需要用的空间释放掉了
  36. q -> next = NULL; //把链表尾设为NULL
  37. writeFileAll(head); //调用writeFileAll函数,把链表里的所有内容写入文件
  38. return head;
  39. }

3.2.7 在现有链表中添加一个成员模块

  1. /*********************************
  2. *功能:在现有链表中添加一个成员 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. **********************************/
  6. data *addPeople(data * head) {
  7. data *p, *q;
  8. q = head -> next;
  9. p = (data *) malloc(sizeof(data));
  10. printf("请输入姓名:(输入非英文结束)\n"); //输入的这一段和上面的creatLink()函数代码一样,有不懂的可以参照上面的注释
  11. gets(p -> name);
  12. while ((*p -> name >= 'a' && *p -> name <= 'z')
  13. || (*p -> name >= 'A' && *p -> name <= 'Z')) {
  14. if (search(head, p -> name)){
  15. printf("已有相同的姓名,请重新输入姓名:(输入非英文结束)\n");
  16. gets(p -> name);
  17. continue;
  18. }
  19. printf("请输入他/她的性别:\n");
  20. gets(p -> sex);
  21. printf("请输入他/她的年龄:\n");
  22. scanf("%d", &p -> age);
  23. getchar();
  24. printf("请输入他/她的专业:\n");
  25. gets(p -> major);
  26. printf("请输入他/她的文化程度:\n");
  27. gets(p -> eduStatus);
  28. head -> next = p;
  29. p -> next = q; //从链表的头插入,而不是从它的尾插入。在这里从头插入避免了检索整个链表,会更快一些
  30. writeAddFile(p); //这里是把新的数据写入文件的末尾,防止数据丢失
  31. q = p;
  32. p = (data *) malloc(sizeof(data));
  33. printf("请输入姓名:(输入非英文结束)\n");
  34. gets(p -> name);
  35. }
  36. free(p);
  37. return head;
  38. }

3.2.8 统计链表中的人数模块

  1. /*************************
  2. *功能:统计链表中的人数 *
  3. *输入:链表的头指针 *
  4. *返回:链表中的人数 *
  5. **************************/
  6. int HowManyPeople(data *head) {
  7. data *p;
  8. int sum = 0;
  9. for (p = head -> next; p != NULL; p = p -> next) //每有一个链表,总数+1,每个链表代表一个人的信息
  10. sum++;
  11. return sum;
  12. }

3.2.9 输出链表中所有成员的信息模块

  1. /*********************************
  2. *功能:输出链表中所有成员的信息 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. **********************************/
  6. data *displayAll(data *head) {
  7. data *p;
  8. p = head -> next;
  9. while (p != NULL) {
  10. printf("姓名:%s\t性别:%s\t年龄:%d\t专业:%s\t文化程度:%s\n",
  11. p -> name, p -> sex, p -> age, p -> major, p -> eduStatus);
  12. p = p -> next;
  13. }
  14. return head;
  15. }

3.2.10 统计功能模块

  1. /*********************
  2. *功能:统计功能 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. **********************/
  6. data *count(data *head) {
  7. int choice, Fage, a[5] = {0}; //a[5]代表4个选项,1为需要筛选,0为不需要筛选
  8. char Fsex[20], Fmajor[50], FeduStatus[50];
  9. /*设置筛选项目*/
  10. while (1) {
  11. printf("\n\n");
  12. printf("************************\n");
  13. printf("** 输入1:设置年龄最大值\n");
  14. printf("** 输入2:设置性别\n");
  15. printf("** 输入3:设置专业\n");
  16. printf("** 输入4:设置文化程度\n");
  17. printf("** 输入5:开始\n");
  18. printf("** 输入6:取消\n");
  19. printf("************************\n");
  20. scanf("%d", &choice);
  21. switch(choice) { //判断用户的选择
  22. case 1:
  23. printf("请输入最大的年龄:\n");
  24. scanf("%d", &Fage);
  25. a[1] = 1;
  26. printf("设置成功!\n");
  27. break;
  28. case 2:
  29. printf("请输入要求的性别:\n");
  30. getchar(); //这里的getchar()是为了吃掉输入数字时的回车键
  31. gets(Fsex);
  32. a[2] = 1;
  33. printf("设置成功!\n");
  34. break;
  35. case 3:
  36. printf("请输入要求的专业:\n");
  37. getchar();
  38. gets(Fmajor);
  39. a[3] = 1;
  40. printf("设置成功!\n");
  41. break;
  42. case 4:
  43. printf("请输入要求的文化程度:\n");
  44. getchar();
  45. gets(FeduStatus);
  46. a[4] = 1;
  47. printf("设置成功!\n");
  48. break;
  49. case 5:
  50. break;
  51. case 6:
  52. return head;
  53. }
  54. if(choice == 5)
  55. break;
  56. }
  57. /*开始筛选*/
  58. printf("\n\n");
  59. int i, key, sum = 0; //key的初始值为1,代表满足筛选的条件,如果有一个条件不符,则被修改成0.
  60. data *p;
  61. p = head -> next;
  62. while (p != NULL) { //筛选的原理是,遍历整个链表,在每个成员处依次判断a[1~5](数组a代表是否需要筛选),如需要筛选则判断是否与输入的数据相符,不需要筛选则跳过
  63. key = 1;
  64. for (i = 1; i <= 4 && key == 1; i++){
  65. if (a[i] != 1)
  66. continue;
  67. else {
  68. switch (i) { //i 会从 1加到 4,这里会循环 4次,来判断是否需要筛选
  69. case 1:
  70. if (p -> age >= Fage)
  71. key = 0;
  72. break;
  73. case 2:
  74. if (strcmp(p -> sex, Fsex)) //strcmp中的两个指针指向的字符串如果相同,则返回 0.则不执行if中的语句
  75. key = 0;
  76. break;
  77. case 3:
  78. if (strcmp(p -> major, Fmajor))
  79. key = 0;
  80. break;
  81. case 4:
  82. if (strcmp(p -> eduStatus, FeduStatus))
  83. key = 0;
  84. break;
  85. }
  86. }
  87. }
  88. if (key == 1){
  89. printf("姓名:%s\t性别:%s\t年龄:%d\t专业:%s\t文化程度:%s\n",
  90. p -> name, p -> sex, p -> age, p -> major, p -> eduStatus);
  91. sum++; //sum用来统计满足条件的人数
  92. }
  93. else
  94. key = 1;
  95. p = p -> next;
  96. }
  97. printf("符合条件的共有%d人。\n", sum);
  98. return head;
  99. }

3.2.11 读取文件中的信息模块

  1. /*************************
  2. *功能:读取文件中的信息 *
  3. *输入:链表的头指针 *
  4. *返回:链表的头指针 *
  5. *************************
  6. */
  7. data * readFile(data *head) {
  8. FILE * fp;
  9. data *p, *last;
  10. last = head;
  11. if ((fp = fopen("datas.myC", "r")) == NULL) { //r 是以只读的方式打开
  12. head -> next = NULL;
  13. return head;
  14. }
  15. else {
  16. while (!feof(fp)) { //判断fp指针是否指向了文件的末尾
  17. p = (data *) malloc(sizeof(data));
  18. last->next = p;
  19. fscanf(fp, "%s%s%d%s%s\n", p->name, p->sex, &p ->age, p->major, p->eduStatus);
  20. last = p;
  21. }
  22. last->next = NULL;
  23. }
  24. if (fclose(fp) != 0) {
  25. printf("Cannot close ""datas.myC!""");
  26. exit(0);
  27. }
  28. return head;
  29. }

3.2.12 在文件的末尾写入新数据模块

  1. /*******************************
  2. *功能:在文件的末尾写入新数据 *
  3. *输入:要写入的数据链表指针 *
  4. *返回:空 *
  5. ********************************/
  6. void writeAddFile(data *p) {
  7. FILE *fp;
  8. if ((fp = fopen("datas.myC", "a+")) == NULL) { //a+ 是读和写的方式打开,不清空原有的文件
  9. printf("写入失败!");
  10. exit(0);
  11. }
  12. fseek(fp, 0, SEEK_END); //将指针指向文件的末尾
  13. fprintf(fp,"%s %s %d %s %s\n", p -> name, p -> sex, p ->age, p -> major, p -> eduStatus);
  14. if (fclose(fp) != 0) {
  15. printf("Cannot close the file !");
  16. exit(0);
  17. }
  18. }

3.2.13 在文件的末尾写入新数据模块

  1. /***********************************
  2. *功能:将链表里的所有数据写入文件 *
  3. *输入:要写入的数据链表指针 *
  4. *返回:空 *
  5. ************************************/
  6. void writeFileAll(data *head) {
  7. FILE *fp;
  8. data *p;
  9. p = head -> next;
  10. if (head -> next == NULL)
  11. return ;
  12. if ((fp = fopen("datas.myC", "w")) == NULL) { //w 是以只读的方式打开,并且清空原来的文件
  13. printf("写入失败");
  14. exit(0);
  15. }
  16. while (p != NULL) {
  17. fprintf(fp, "%s %s %d %s %s\n", p->name, p->sex, p -> age, p->major, p->eduStatus);
  18. p = p -> next;
  19. }
  20. if (fclose(fp) != 0) {
  21. printf("Cannot close the file !");
  22. exit(0);
  23. }
  24. }

3.2.14 删除链表里的一个节点模块

  1. /***************************************
  2. *功能:删除链表里的一个节点 *
  3. *输入:1.链表的头;2.要删除位置的指针 *
  4. *返回:链表的头 *
  5. ****************************************/
  6. data *delAStruct(data *head, data *del ) {
  7. data *p, *last;
  8. last = head;
  9. p = head -> next;
  10. for (; p != del; p = p -> next) //找到del指针在链表中的位置,并用last指针记录del指针上一个节点的位置
  11. last = p;
  12. last -> next = p -> next; //删除 p节点,并释放它
  13. free(p);
  14. printf("删除成功!\n");
  15. return head;
  16. }

3.2.15 修改信息功能模块

  1. /***************************
  2. *功能:列表中修改信息功能 *
  3. *输入:要写入的链表头指针 *
  4. *返回:空 *
  5. ****************************/
  6. void revise(data *head) {
  7. int choice;
  8. char hisname[20];
  9. data *string;
  10. printf("** 输入你想修改的成员的姓名\n");
  11. gets(hisname);
  12. string = search(head, hisname); //调用search函数查找节点的位置,并用指针string接受这个位置
  13. if (string == NULL) { //如果指针string为空的话,说明没有这个节点
  14. printf("在数据中没有找到这个成员!\n");
  15. return ;
  16. }
  17. printf("** 你想修改哪个地方?:\n");
  18. printf("** 输入1:修改姓名:\n");
  19. printf("** 输入2:修改性别:\n");
  20. printf("** 输入3:修改职业:\n");
  21. printf("** 输入4:修改学历:\n");
  22. printf("** 输入5:修改年龄:\n");
  23. scanf(" %d", &choice);
  24. getchar();
  25. printf("请输入你想修改成的内容:\n");
  26. switch (choice) {
  27. case 1 :
  28. gets(string -> name);
  29. break;
  30. case 2 :
  31. gets(string -> sex);
  32. break;
  33. case 3 :
  34. gets(string -> major);
  35. break;
  36. case 4 :
  37. gets(string -> eduStatus);
  38. break;
  39. case 5:
  40. scanf("%d", &string -> age);
  41. break;
  42. }
  43. printf("修改成功!\n");
  44. }

3.2.16 在链表中查找成员姓名相同的结构体模块

  1. /*****************************************
  2. *功能:在链表中查找成员姓名相同的结构体 *
  3. *输入:1.链表的头;2.要查找的名字的指针 *
  4. *返回:如果找到,返回对应结构体的指针 *
  5. * 如果没找到,返回NULL; *
  6. ******************************************/
  7. data *search(data *head, char *str) {
  8. data *p;
  9. p = head -> next;
  10. while (p != NULL) {
  11. if (strcmp(p -> name, str) == 0)
  12. break;
  13. else
  14. p = p -> next;
  15. }
  16. return p;
  17. }

四 测试运行

4.1 使用手册

  • 此程序为个人简历录入程序

  • 在启动时,程序会自动读取已保存的数据。若未保存过数据,则需要用户自行添加

  • 程序可在原有的成员中添加新的成员

  • 统计功能中,用户可以设置任意个筛选条件,程序会输出符合条件的所有人的数据,并统计总人数

  • 退出程序

4.2 运行流程

第一次启动程序时,显示共有0人的信息,如下图所示:

开始添加信息,输入2,删除原有的成员并创建新的信息,如下图所示:

输入两个人的信息,并按一个符号’@’结束输入,如下图所示:

输入结束后,按4展示刚才输入的数据,如下图所示:

再使用1来再原有的成员里添加新的成员,如下图所示:

按4展示所有数据,刚才的新数据插入成功!如下图所示:

现在开始修改数据,修改的是姓名为heiheihei的成员的年龄,改为14,如下图所示:

展示修改后的成员信息,此处修改成功,如下图所示:

查询功能,输入成员的名字即可查询到他的信息,如下图所示:

统计功能的选项面板如下图所示:

上传的附件 cloud_download 基于C语言的个人简历录入程序.zip ( 565.08kb, 53次下载 )
error_outline 下载需要6点积分

发送私信

一个月总有那么三十几天不想上班

12
文章数
7
评论数
最近文章
eject