职工管理系统——动态数组实现
2015-08-09 22:44
447 查看
职工管理系统
职工管理系统运行说明
maincpp
my_arraycpp
my_filecpp
mainh
my_arrayh
my_fileh
运行说明
dir显示目录从C盘进入E盘: E:
动态建立一个文件,进入将要运行的文件夹下的Debug文件夹中,输入.exe文件的名和后缀,+ 2个空格建。
dat文件的名字。
如:\Debug>proj1.exe ..\test.dat
然后,就可以运行程序了。
也就是说,这个程序的运行是从控制台进去的
main.cpp
//main.cpp #include<stdio.h> #include<stdlib.h> #include"my_file.h" #include"my_array.h" #include"main.h" void menu() { printf("***********职工信息管理系统*************\n"); printf(" 0.exit\n"); printf("1.Read file 2.Save file\n"); printf("3.Insert 4.Delete\n"); printf("5.Display 6.Delete All\n"); printf("7.SortNo 8.DispNo\n"); printf("9.SortDepno 10.DispDepno\n"); printf("11.SortSalary 12.DispSalary\n"); printf("****************************************\n"); } int main(int argc, char *argv[]) { int array_size = 2; EmpType *emp = NULL; emp = (EmpType *)malloc(sizeof(EmpType) * array_size); emp[0].pno = emp[0].pdepno = emp[0].psalary = -1; int n=0, choose; //n:数组中元素的个数; while(1) { menu(); scanf("%d", &choose); getchar(); switch(choose) { case 0: printf("您已退出职工管理系统^_^\n"); return 0; break; case 1: ReadFile(&emp, &n, &array_size, argv[1]); break; case 2: SaveFile(emp, n, argv[1]); break; case 3: Insert(&emp, &n, &array_size); break; case 4: Delete(&emp, &n, &array_size); break; case 5: Display(emp, n); break; case 6: DelAll(emp, &n, &array_size, argv[1]); case 7: SortNo(emp, n); break; case 8: DispNo(emp, n); break; case 9: SortDepno(emp, n); break; case 10: DispDepno(emp, n); break; case 11: SortSalary(emp, n); break; case 12: DispSalary(emp, n); break; default: printf("输入错误,请重新输入!\n"); } }//while return 0; }
my_array.cpp
//my_array.cpp #include<stdio.h> #include<string.h> #include<stdlib.h> #include"main.h" Status Insert(EmpType * *emp, int *n, int *array_size) { (*n)++; //元素个数加1;下标为0的位置不放元素。 if((*n) >= (*array_size)) //是否重新分配存储空间; { (*array_size) = (*n) + 10; (*emp) = (EmpType*)realloc((*emp), sizeof(EmpType) * (*array_size)); } printf("请输入职工信息:\n"); printf("no:"); scanf("%d", &(*emp)[*n].no); getchar(); printf("name:"); scanf("%s", &(*emp)[*n].name); getchar(); printf("depno:"); scanf("%d", &(*emp)[*n].depno); getchar(); printf("salary:"); scanf("%f", &(*emp)[*n].salary); getchar(); (*emp)[0].pno = (*emp)[0].pdepno = (*emp)[0].psalary = -1; //排序失效; return OK; } Status Delete(EmpType * *emp, int *n, int *array_size) { if((*n) == 0) { printf("emp empty!\n"); return ERR; } int no; printf("input the no:"); scanf("%d", &no); for(int i = 0; i <= (*n); i++) { if((*emp)[i].no == no) //将最后一个元素前移,避免移动大量元素的操作; { (*emp)[i].no = (*emp)[*n].no; (*emp)[i].depno = (*emp)[*n].depno ; (*emp)[i].salary = (*emp)[*n].salary ; strcpy((*emp)[i].name, (*emp)[*n].name); (*n)--; break; } } if(i > (*n) + 1) printf("Cannot find the emp\n"); if((*n) < (*array_size) - 10) //回收多余的空间; { (*array_size) = (*n) + 10; (*emp) = (EmpType*)realloc((*emp), sizeof(EmpType) * (*array_size)); } (*emp)[0].pno = (*emp)[0].pdepno = (*emp)[0].psalary = -1; //排序失效; return OK; } Status Display(EmpType emp[], int n) { if(n == 0) { printf("emp is empty!\n"); return OK; } printf("no\tname\tdepno\tsalary\n"); for(int i = 1; i <= n; i++) { printf("%d\t%s\t%d\t%.2f\n", emp[i].no ,emp[i].name , emp[i].depno ,emp[i].salary ); } return OK; } Status SortNo(EmpType emp[], int n) //直接插入排序(默认升序) { int i, j; if(n == 0) { printf("emp is empty!\n"); return OK; } if(emp[0].pno != -1) { printf("sorted!\n"); return OK; } emp[0].pno = 1; //构造有序序列; emp[1].pno = -1; //向有序序列中插入存储顺序中的第i个元素; for(i = 2; i <= n; i++) //遍历每一个将要插入的元素 { j = 0; while(emp[j].pno != -1 && emp[emp[j].pno].no < emp[i].no )//在有序序列中寻找合适的插入位置; { j = emp[j].pno; } emp[i].pno = emp[j].pno; emp[j].pno = i; } return OK; } Status DispNo(EmpType emp[], int n) { int i; printf("no\tname\tdepno\tsalary\n"); for(i = emp[0].pno; i != -1; i = emp[i].pno) { printf("%d\t%s\t%d\t%.2f\n", emp[i].no ,emp[i].name , emp[i].depno ,emp[i].salary ); } return OK; } Status SortDepno(EmpType emp[], int n) { int i, j; if(n == 0) { printf("emp is empty!\n"); return OK; } if(emp[0].pdepno != -1) { printf("sorted!\n"); return OK; } emp[0].pdepno = 1; //构造有序序列; emp[1].pdepno = -1; //向有序序列中插入存储顺序中的第i个元素; for(i = 2; i <= n; i++) //遍历每一个将要插入的元素 { j = 0; while(emp[j].pdepno != -1 && emp[i].depno > emp[emp[j].pdepno].depno ) //在有序序列中寻找合适的插入位置; { j = emp[j].pdepno; } emp[i].pdepno = emp[j].pdepno; emp[j].pdepno = i; } return OK; } Status DispDepno(EmpType emp[], int n) { int i, j; printf("no\tname\tdepno\tsalary\n"); for(i = emp[0].pdepno; i != -1; i = emp[i].pdepno) { printf("%d\t%s\t%d\t%.2f\n", emp[i].no ,emp[i].name , emp[i].depno ,emp[i].salary ); } return OK; } Status SortSalary(EmpType emp[], int n) { int i, j; if(n == 0) { printf("emp is empty!\n"); return OK; } if(emp[0].psalary != -1) { printf("sorted!\n"); return OK; } emp[0].psalary = 1; //构造有序序列; emp[1].psalary = -1; //向有序序列中插入存储顺序中的第i个元素; for(i = 2; i <= n; i++) //遍历每一个将要插入的元素 { j = 0; while(emp[j].psalary != -1 && emp[i].salary > emp[emp[j].psalary].salary ) //在有序序列中寻找合适的插入位置; { j = emp[j].psalary; } emp[i].psalary= emp[j].psalary; emp[j].psalary = i; } return OK; } Status DispSalary(EmpType emp[], int n) { int i, j; printf("no\tname\tdepno\tsalary\n"); for(i = emp[0].psalary; i != -1; i = emp[i].psalary) { printf("%d\t%s\t%d\t%.2f\n", emp[i].no ,emp[i].name , emp[i].depno ,emp[i].salary ); } return OK; } /* Status SortNo(EmpType emp[], int n)//(默认升序)使用一个临时数组进行排序 { int temp[MaxSize]; int i, j; for(i = 1; i <= n; i++) { temp[i] = emp[i].no; } sort(temp + 1, temp + n + 1);//排序 emp[0].pno = temp[1]; for(i = 1; i <= n; i++)//用下标将排序好的元素连起来; { for(j = 1; j <= n; j++) { if(temp[i] == emp[j].no) { if(i == n) emp[j].pno = -1; else if(i == 1) emp[0].pno = j; else emp[j].pno = j + 1; } } } return OK; }*/
my_file.cpp
//my_file.cpp #include<stdio.h> #include<stdlib.h> #include"main.h" Status ReadFile(EmpType * *emp, int *n, int *array_size, char *filename) { FILE *fp = NULL; long len; int i; if((fp = fopen(filename, "rb")) == NULL) //以只读方式打开二进制文件; { printf("数据文件不能打开\n"); return ERR; } fseek(fp, 0, 2); //文件位置指针移到文件尾;0:偏移量;2:偏移起始位置。(0:SEE_SET;1:SEEK_CUR;2:SEEK_END) len = ftell(fp); //计算文件长度; rewind(fp); //文件位置指针移到文件首,fseek(fp, 0, 0) (*n) = len / sizeof(EmpType); //n求出文件中的记录个数; (*n)--; if((*n) == 0) { (*emp)[0].pno = (*emp)[0].pdepno = (*emp)[0].psalary = -1;//初始化,-1代表未排序 return OK; } if((*n) >= (*array_size)) //重新分配存储空间; { (*n) = (*array_size) + 10; (*emp) = (EmpType *)realloc((*emp), sizeof(EmpType) * (*array_size)); } if((*n) != 0) { for(i = 0; i <= (*n); i++) //将文件的数据读到emp中,n+1次循环,emp[0]不记录数据,只记录排序结果; { fread(&(*emp)[i], sizeof(EmpType), 1, fp); } } fclose(fp); return OK; } Status SaveFile(EmpType emp[], int n, char *filename)//将emp数组存入数据文件 { int i; FILE *fp = NULL; if((fp = fopen(filename, "wb")) == NULL) { printf("数据文件不能打开\n"); return OK; } if(n > 0) { for(i = 0; i <= n; i++) { fwrite(&emp[i], sizeof(EmpType), 1, fp); } } fclose(fp); return OK; } Status DelAll(EmpType emp[], int *n, int *array_size, char *filename) { char ch; printf("Are you sure?(y:yes, n:no)\n"); scanf("%c", &ch); if(ch == 'n' || ch == 'N') { return OK; } FILE *fp = NULL; if((fp = fopen(filename, "wb")) == NULL) { printf(">>数据文件不能打开\n"); return OK; } emp[0].pno = emp[0].depno = emp[0].psalary = -1; //初始化,-1代表未排序 (*n) = 0; fclose(fp); return OK; }
main.h
//main.h #ifndef main_h #define main_h #define OK 0 #define ERR 1 typedef int Status; typedef struct node { int no; char name[20]; int depno; float salary; int pno, pdepno, psalary; }EmpType; #endif
my_array.h
//my_array.h Status Insert(EmpType* *emp, int *n, int *array_size); Status Delete(EmpType* *emp, int *n, int *array_size); Status Display(EmpType emp[], int n); Status SortNo(EmpType emp[], int n); Status DispNo(EmpType emp[], int n); Status SortDepno(EmpType emp[], int n); Status DispDepno(EmpType emp[], int n); Status SortSalary(EmpType emp[], int n); Status DispSalary(EmpType emp[], int n);
my_file.h
//my_file.h #ifndef my_file_h #define my_file_h #include"main.h" Status ReadFile(EmpType* *emp, int *n, int *array_size, char *filename); Status SaveFile(EmpType emp[], int n, char *filename); Status DelAll(EmpType emp[], int *n, int *array_size, char *filename); #endif
相关文章推荐
- java线性表排序示例分享
- php线性表的入栈与出栈实例分析
- C++语言实现线性表之数组实例
- C语言线性表的顺序表示与实现实例详解
- C++语言实现线性表之链表实例
- 简单介绍线性表以及如何实现双链表
- Go语言实现顺序存储的线性表实例
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 结构之美:定义一个线性表
- 结构之美:线性表的查找、插入与删除操作
- 线性表的概念、结构与基本操作
- 结构之美:线性表的链式存储结构——链表
- 线性表的几个链式储存结构介绍
- 数据结构_线性表
- 深入分析 Linux 内核链表
- 第03话:线性表的顺序存储结构
- 第02话:线性表的抽象数据类型ADT定义
- 第01话:线性表的概念与定义
- 线性表-顺序表-数据结构java版
- 大学数据结构(c++版) 王红梅版 疑惑——第二章