c加加动态数组加无限内存人员管理系统
C语言基础-实现动态数组并增加内存管理

C语⾔基础-实现动态数组并增加内存管理⽤C语⾔实现⼀个动态数组,并对外暴露出对数组的增、删、改、查函数(可以存储任意类型的元素并实现内存管理)这⾥我的编译器就是xcode分析:模拟存放⼀个 People类有2个属性字符串类型:姓名整型:年龄array 结构体应当有数组长度:length 空间:capacity 存储对象:value(任意类型)构造⼀个任意对象类.拥有retainCount属性.为内存计数器使⽤⼀次retainCount+1,当retainCount为0时释放该对象指向的内存贴出部分代码// Object.h#ifndef Object_h#define Object_h#include <stdio>//定义结构体typedef struct Object{int retainCount;}Object;//宏定义⽅法⽅便书写#define OBJECTRETAIN(obj) objectRetain((Object*)obj)#define OBJECTRELEASE(obj) objectRelease((Object*)obj)#define GETRETAINCOUNT(obj) getRetainCount((Object*)obj)void objectRetain(Object *obj);void objectRelease(Object *obj);int getRetainCount(Object *obj);#endif /* Object_h */// Object.c#include "Object.h"#include <stdlib>void objectRetain(Object *obj) {obj->retainCount ++;// printf("retain计数+1 = %d\n",obj->retainCount);}void objectRelease(Object *obj) {obj->retainCount --;if (obj->retainCount <= 0) {free(obj);}// printf("retain计数-1 = %d\n",obj->retainCount);}//获得当前计数int getRetainCount(Object *obj) {return obj->retainCount;}下⾯开始封装.⾸先是对原始数据的封装.1. 将char* 字符串类型封装成String// String.h#ifndef String_h#define String_h#include <stdio>typedef struct String{int retainCount;char *value;}String;String* newString(char* value);char* getStringValue(String* ins);#endif /* String_h */// String.c#include "String.h"#include <stdlib>#include "Object.h"String* newString(char* value){String *str = malloc(sizeof(String));OBJECTRETAIN(str);str->value = value;return str;}char* getStringValue(String* ins){return ins->value;}2.将年龄的类型int封装成Interger// Integer.h#ifndef Integer_h#define Integer_h#include <stdio>typedef struct Integer{int retainCount;int value;}Integer;Integer* newInteger(int value);int getIntegerValue(Integer* ins);#endif /* Integer_h */// Integer.c#include "Integer.h"#include <stdlib>#include "Object.h"Integer *newInteger(int value) {Integer *new = malloc(sizeof(Integer));OBJECTRETAIN(new);new->value = value;return new;}int getIntegerValue(Integer* ins) {return ins->value;}3.定义数组中存放的类包含 name 和 age 属性// People.h#ifndef People_h#define People_h#include <stdio>#include "Integer.h"#include "String.h"typedef struct People{int retainCount;String* name;Integer* age;}People;People* newPeople(String *name,Integer *age);String* getName(People* people);Integer* getAge(People* people);#endif /* People_h */// People.c#include "People.h"#include <stdlib>#include "Object.h"People* newPeople(String *name,Integer *age){People *newP = malloc(sizeof(People));OBJECTRETAIN(newP);newP->age = age;newP->name = name;return newP;}String* getName(People* people){return people->name;}Integer* getAge(People* people){return people->age;}4.准备⼯作都做完 ,下⾯我们来实现数组Array// Array.h#ifndef Array_h#define Array_h#include <stdio>#include "People.h"#include "Object.h"typedef Object* AnyObject;typedef struct Array{int length;int capacity;AnyObject *value;}Array;Array* newArray();//增加数组元素void addElement(Array *array,AnyObject value);//删除Array* removeIndexAt(Array *arry,int index);//插⼊Array* insertIndexAt(Array *array,AnyObject value,int index);//查找AnyObject getValueIndexAt(Array *array,int index);//获取数组长度int getArrayLength(Array *array);//销毁void destroyArray(Array *array);//打印void printArray(Array *arr);#endif /* Array_h */// Array.c#include "Array.h"#include <string>#include <stdlib>#include <assert>//分配空间static AnyObject* allocMemoryByCapacity(Array *arr){return malloc(sizeof(AnyObject) * arr->capacity);}//创建数组Array* newArray(){Array *arr = malloc(sizeof(Array));arr->length = 0;arr->capacity = 32;arr->value = allocMemoryByCapacity(arr);return arr;}//获取数组长度int getArrayLength(Array *array){return array->length;}//增加元素void addElement(Array *array,AnyObject value){if (array->length >= array->capacity) {array->capacity *= 2;AnyObject *oldValue = array->value;memcpy(array->value, oldValue, array->length*sizeof(AnyObject)); free(oldValue);}OBJECTRETAIN(value);array->value[array->length] = value;array->length++;}//删除元素Array* removeIndexAt(Array *arry,int index){assert(index >= 0 && index < arry>length); //断⾔防⽌越界OBJECTRELEASE(getValueIndexAt(arry, index));arry->length -- ;for (int i = index-1; i < arry>length; i++) {arry->value[i] = arry->value[i+1];}return arry;}//在指定位置增加元素Array* insertIndexAt(Array *array,AnyObject value,int index){if (array->length >= array->capacity) {array->capacity *= 2;AnyObject *oldValue = array->value;memcpy(array->value, oldValue, array->length*sizeof(AnyObject));free(oldValue);}array->length++;//插⼊指定位置array->value[index-1] = value;//将元素后移for (int i = index; i < array>length; i++) {array->value[array->length] = array->value[array->length-i];}OBJECTRETAIN(value);return array;}//获取某个元素AnyObject getValueIndexAt(Array *array,int index){assert(index >= 0 && index < array>length);return array->value[index];}//销毁void destroyArray(Array *array){free(array->value);free(array);printf("数组被销毁\n");}//打印结果void printArray(Array *arr){for (int i = 0; i < arr>length; i++) {printf("位置:%d,姓名:%s,年龄:%d\n",i, getStringValue(getName((People*)getValueIndexAt(arr, i))),getIntegerValue(getAge((People*)getValueIndexAt(arr, i)))); }}接下来就可以来测试数据了.// main.m#import <Foundation>#import "People.h"#import "Array.h"#import "Object.h"int main(int argc, const char * argv[]) {@autoreleasepool {Array *arr = newArray();People *p0 = newPeople(newString("张三"), newInteger(20));People *p1 = newPeople(newString("李四"), newInteger(16));People *p2 = newPeople(newString("王五"), newInteger(17));People *p3 = newPeople(newString("赵⼆"), newInteger(14));People *p4 = newPeople(newString("林三"), newInteger(22));People *p5 = newPeople(newString("⼩明"), newInteger(18));People *p6 = newPeople(newString("⼩红"), newInteger(25));People *p7 = newPeople(newString("⼩⽅"), newInteger(11));People *p8 = newPeople(newString("⼩花"), newInteger(19));People *p9 = newPeople(newString("⼩兔"), newInteger(22));People *p10 = newPeople(newString("新⼈"), newInteger(23));//增加元素addElement(arr, (Object *)p0);addElement(arr, (Object *)p1);addElement(arr, (Object *)p2);addElement(arr, (Object *)p3);addElement(arr, (Object *)p4);addElement(arr, (Object *)p5);addElement(arr, (Object *)p6);addElement(arr, (Object *)p7);addElement(arr, (Object *)p8);addElement(arr, (Object *)p9);//释放内存OBJECTRELEASE((Object*) p0);OBJECTRELEASE((Object*) p1);OBJECTRELEASE((Object*) p2);OBJECTRELEASE((Object*) p3);OBJECTRELEASE((Object*) p4);OBJECTRELEASE((Object*) p5);OBJECTRELEASE((Object*) p6);OBJECTRELEASE((Object*) p7);OBJECTRELEASE((Object*) p8);OBJECTRELEASE((Object*) p9);printf("增加10个元素\n");printArray(arr);printf("删除第3个元素\n");//删除第数组中某⼀个元素removeIndexAt(arr, 3);printArray(arr);printf("插⼊P10成为第4个元素\n");//插⼊insertIndexAt(arr, (Object *)p10, 4);printArray(arr);OBJECTRELEASE((Object*) p10);printf("查找第5个元素\n");//index从0开始查找第5个元素 index=4printf("位置:%d,姓名:%s,年龄:%d\n",4, getStringValue(getName((People*)getValueIndexAt(arr, 4))),getIntegerValue(getAge((People*)getValueIndexAt(arr, 4)))); //销毁数组destroyArray(arr);}return 0;}看下结果吧。
c语言实现职工管理系统

简单的职工管理系统主要实现以下功能:(1) 新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中.(2) 删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中查询符合某些条件的职工。
(4)修改:检索某个职工对象,对其某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
要求:职工信息包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
实现提示:(1)由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入内存。
(2)对职工对象中的"姓名"按字典顺序进行排序。
(3)对排序后的职工对象进行增、删、查询、修改、排序等操作。
源代码:#include〈stdio。
h〉#include<stdlib.h〉#include<string。
h>#include <locale.h〉#define I 100static char tempstr[20]; /*用于临时存储输入信息的数组*/static struct staff{int num;char name[20];char sex;long byear;//birth year 出生年月long iyear;//imploy year 工作年月char education[20];char duty[20];char address[20];char phone[20];struct staff *next;}*head=NULL,*thisn,*newn,sta[I]={0},temp; /*temp用于交换的中间量*/void cin(void); /*输入信息*/int identify(int num);/*对职工号是否重复进行验证*/void cout(void);/*输出信息*/void sort(void);/*查询排序*/void del(void); /*删除职工信息*/int record(void);/*将文件中的数据录入结构体数组中*/void iyear(int j); /*按工作年月排序*/void education(int j); /*按学历排序*/void modify(void); /*修改职工信息*/void descending(void);/*学历降序输出*/void ascending(void);/*学历升序输出*/void printmsg(int i);/*输出信息*/void seek(void);//查询员工信息int main(void){int flag=1;while(flag){system(”cls”); /*清屏*/printf(”欢迎登陆职工信息管理系统!\n”);printf(" 【1】输入职工信息【2】输出职工信息\n”);printf(”【3】信息查询排序【4】删除职工信息\n");printf(" 【5】修改职工信息【6】查询职工信息\n”);printf("请输入以上数字,选择相应的功能:");switch (getchar()){case ’1':cin();break;/*调用输入信息的函数*/case ’2’:cout();break;/*调用输出信息的函数*/case '3':sort();break; /*调用排序的函数*/case '4’:del();break; /*调用删除职工信息函数*/case '5':modify();break; /*调用修改职工信息的函数*/case '6':seek();break; //查询员工信息default:flag=0;break; /*跳出循环体,结束程序*/}}return 0;}void cin(void) /*输入信息的函数*/{FILE *fp;int receive; /*接收返回值*/if((fp=fopen("information.txt","a+"))==NULL)/*为读写打开一个文本文件*/{printf(”文件打开错误\n");exit(1); /*关闭所有文件,终止正在执行的程序,待用户检查出错误,修改后再运行*/}newn=(struct staff *)malloc(sizeof(struct staff));if(head==NULL)/*连接链表*/{head=newn;thisn=newn;thisn—>next=NULL;}else{thisn=head;while(thisn-〉next!=NULL)thisn=thisn-〉next;thisn—>next=newn;thisn=newn;}getchar(); /*接收缓冲区中选择菜单时多余的回车*/ fputc(’\n’,fp);/*每次记录信息前先换行*/printf("请输入职工号:");gets(tempstr);thisn-〉num=atoi(tempstr); /*atoi()将字符串转换成整型数*/receive=identify(thisn—>num);while(receive){printf("请输入职工号:”);gets(tempstr);thisn->num=atoi(tempstr);receive=identify(thisn->num);}fputs(tempstr,fp);fputs(" ",fp); /*信息排版的需要*/printf("请输入姓名:");gets(thisn->name);fputs(thisn->name,fp);fputs(””,fp);printf(”请输入性别(填F或M):”);thisn—〉sex=getchar();getchar();fputc(thisn-〉sex,fp);fputs(””,fp);printf("请输入出生年月(如199001):”);gets(tempstr);thisn—>byear=atoi(tempstr);fputs(tempstr,fp);fputs(" ”,fp);printf(”请输入工作年月(如199001):");gets(tempstr);thisn—>iyear=atoi(tempstr);fputs(tempstr,fp);fputs(" ",fp);printf(”请输入学历(博士、硕士、本科、大专、高中、中专、初中、小学、其他):");gets(thisn-〉education);fputs(thisn—〉education,fp);fputs(””,fp);printf(”请输入职务:”);gets(thisn->duty);fputs(thisn-〉duty,fp);fputs(" ",fp);printf(”请输入地址:");gets(thisn-〉address);fputs(thisn—>address,fp);fputs(" ",fp);printf("请输入电话号码:”);gets(thisn-〉phone);fputs(thisn-〉phone,fp);thisn—〉next=NULL;fclose(fp);system(”cls");/*清屏*/}int identify(int num)/*对职工号是否重复进行验证*/{FILE *fp;int i;if((fp=fopen("information。
C语言课程设计 职工信息管理系统 结构体数组实现程序源代码

//C语言课程设计职工信息管理系统—结构体数组实现#include <stdio.h>#include <stdlib.h>#include <string.h>struct employee{char num[10];char name[15];char sex[5];char bm[20];char zc[20];int gz;};int read_file(struct employee em[]);void menu();void write_file(struct employee em[]);void add();void select(); //查看职工所有信息void zc_query(); //按职称查询void num_del(); //按工号删除void tongji(); //统计void sort(); //排序void num_modify(); //按工号修改职工信息void save(); //保存信息void disp(); //显示职工信息void fh(); //返回主菜单struct employee em[300]; //这个数组用来保存所有的职工信息和文件里面的一致int Number=0; //记录总的职工人数也就是数组/文件里面的职工人数void menu(){printf("\t***********************************************************************\n");printf("\t* *\n");printf("\t* 职工信息管理系统_结构体数组实现*\n");printf("\t* *\n");printf("\t* [1] 增加职工信息 [2] 查看职工信息 *\n");printf("\t* [3] 查找职工信息 [4] 删除职工信息 *\n");printf("\t* [5] 统计 [6] 职工工资排列 *\n");printf("\t* [7] 修改职工信息 [8] 保存职工信息 *\n");printf("\t* [9] 显示职工信息 [0] 退出系统 *\n");printf("\t* *\n");printf("\t***********************************************************************\n");}void main(){int choose=0;FILE *fp=NULL;char yesorno;if((fp=fopen("employee1.txt","rb+"))==NULL){printf("\n=========>提示:文件不存在,是否要创建一个?(y/n)\n");scanf("%c",&yesorno);if(yesorno=='y'||yesorno=='Y'){//这里仅为了建立文件fp=fopen("employee1.txt","wb+");fclose(fp); //关闭fp所指的文件,释放文件缓冲区}elseexit(0);}else{Number=read_file(em); //要是文件已经有数据将数据初始化到数组中}system("cls");while(1){menu();printf("\t\t====>请选择:");scanf("%d",&choose);system("cls");switch(choose){case 0:exit(0); //退出break;case 1:add();fh();//增加职工信息 break;case 2:select();fh();//查看职工信息 break;case 3:zc_query();fh();// 查找break;case 4:num_del();fh();//删除break;case 5:tongji();fh();//统计break;case 6:sort();fh();//排序break;case 7:num_modify();fh();//修改后返回 break;case 8:save();fh();//保存break;case 9:disp();fh();break;//显示default:break;}fflush(stdin);getchar();system("cls");}}void save(){printf("\t=====程序在运行时已自动保存.....\n");}void fh(){printf("\t===>按Enter键返回主菜单\n");}void num_modify() //修改职工信息{FILE *fp=NULL;char gh[60];int i=0;int changeIndex=0; //changeIndex 改变标记int index=0;printf("请输入要修改的职工工号:");scanf("%s",gh);for (i=0;i<Number;i++){if (strcmp(gh,em[i].num)==0) //比较输入工号和数组中已有工号{changeIndex=i; //保存要修改的人的下标break;}}printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[changeIndex].num,em[chan geIndex].name,em[changeIndex].sex,em[changeIndex].bm,em[changeIndex]. zc,em[changeIndex].gz);printf("请重新输入该职工信息");printf("工号:");scanf("%s",em[changeIndex].num);printf("姓名:");scanf("%s",em[changeIndex].name);printf("性别:");scanf("%s",em[changeIndex].sex);printf("部门:");scanf("%d",em[changeIndex].bm);printf("职称:");scanf("%s",em[changeIndex].zc);printf("工资:");scanf("%d",&em[changeIndex].gz);//信息修改后重新更新文件里面的数据以保持数据一致性fp=fopen("employee1.txt","wb+");for (i=0;i<Number;i++){fwrite(&em[i],sizeof(struct employee),1,fp); //把ptr所指向n*size个字节输入到fp所指向的文件中}fclose(fp);printf("\t=======>修改成功\n");}void disp() //输出所有职工信息{int i=0;for (i=0;i<Number;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void sort()//排序{struct employee t;int wantNUmber=0;int i=0;int j=0;int k=0;for(i=0;i<Number-1;i++){k=i;for(j=i+1;j<Number;j++){if(em[j].gz>em[k].gz)k=j;}if(k!=i){t=em[i];em[i]=em[k];em[k]=t;}}printf("你想输出前几名职工的信息:");scanf("%d",&wantNUmber);if (wantNUmber>Number){wantNUmber=Number;}printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for(i=0;i<wantNUmber;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i].sex, em[i].bm,em[i].zc,em[i].gz);}}void tongji()//统计{int i,m,k,max,min;double sum=0.0;for(i=0;i<Number;i++){sum=sum+em[i].gz;}printf("全体职工的总工资为:%f\n",sum);printf("平均工资为:%f\n",sum/Number);i=0;m=0;max=0;max=em[m].gz;for(i=1;i<Number;i++){if (em[i].gz>max)m=i;max=em[m].gz;}printf("最高工资为:%d\n",max);printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[m].num,em[m].name,em[m]. sex,em[m].bm,em[m].zc,em[m].gz);i=0;k=0;min=0;min=em[0].gz;for(i=1;i<Number;i++){if (em[i].gz<min)k=i;min=em[k].gz;}printf("最低工资:%d\n",min);printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[k].num,em[k].name,em[k]. sex,em[k].bm,em[k].zc,em[k].gz);}void num_del()//按工号删除FILE *fp=NULL;char gh[60];int i=0;int j=0;printf("请输入要删除的职工工号:");scanf("%d",gh);for(i=0;i<Number;i++){if (strcmp(gh,em[i].num)==0) //如果查找到就删除{for (j=i;j<Number-1;j++){em[j]=em[j+1];}Number--;}}//将剩余数据写入文件重新一写的方式打开文件把以前的数据擦除了fp=fopen("employee1.dat","wb");for (i=0;i<Number;i++){fwrite(&em[i],sizeof(struct employee),1,fp);}fclose(fp);printf("删除成功;\n");}void zc_query()//按职称查找{char zc[20];int i=0;printf("请输入要查找职工职称:");scanf("%s",zc);system("cls");printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for (i=0;i<Number;i++){if (strcmp(zc,em[i].zc)==0){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void select()//查看职工{int i=0;printf("以下是全部职工信息\n");printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for(i=0;i<Number;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void add()//增加职工{int numberTemp=0;int i=0;struct employee temp; //临时保存信息printf("请输入要增加职工信息的个数:");scanf("%d",&numberTemp);for(i=0;i<numberTemp;i++){printf("输入第%d个职工信息\n",i+1);printf("工号:");scanf("%s",temp.num);printf("姓名:");scanf("%s",);printf("性别:");scanf("%s",temp.sex);printf("部门:");scanf("%s",temp.bm);printf("职称:");scanf("%s",temp.zc);printf("工资:");scanf("%d",&temp.gz);em[Number++]=temp; //将刚添加的写入到数组write_file(&temp); //将刚添加的写入到文件}printf("添加成功\n");}void write_file(struct employee *em){FILE *fp=NULL;fp=fopen("employee1.txt","rb+");fwrite(em,sizeof(struct employee),1,fp);fclose(fp);}int read_file(struct employee em[]){FILE *fp=NULL;int i=0;fp=fopen("employee1.txt","rb");while(fread(&em[i],sizeof(struct employee),1,fp)) i++;fclose(fp);return i;}。
C++公司人员管理系统

C++课程设计报告公司人员管理系统姓名:班级:学号:指导教师:成绩:完成时间:完成地点:一、设计题目(问题)描述和要求1.题目:公司人员管理系统2.问题描述:某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。
现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
要求:(1)其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
(2)程序对所有人员有提升级别的功能(3)月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。
(4)能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息二、系统分析与模块设计根据问题描述和要求,系统要求能够按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。
确定程序至少应该具备如下功能:“查询人员”、“增加人员”、“删除人员”、“数据存盘”基本模块。
系统既然具有“数据存盘”功能-人员数据可以保存到磁盘文件,那么也就意味着今后可以从磁盘文件读出人员数据,所以系统增加了“人员数据装入”模块,以方便用户使用、避免数据重复录入。
考虑到系统实现简捷,人员数据文件采用文本文件,人员数据文件名:Person.txt。
做为一个完整系统,除了具有增加人员,删除人员信息模块,还应该具有修改人员相关信息的功能,所以本系统设计时考虑增加“修改人员”模块。
考虑到根据编号查找人员信息功能在“删除人员”、“修改人员”等模块都使用,所以可以考虑设置为一个模块。
考虑到系统要求人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
这样就要求人员编号在增加人员时自动生成(增加1)且不重复。
根据这个要求,可以考虑设置一个全局量:“当前最大编号”,每增加一个人员,当前最大编号自动增1,然后新增加人员使用这个编号。
为了保证系统能记忆这个编号,可以使用一个数据文件保存当前这个编号。
C++课程设计公司人员管理系统

设计小型公司的人员信息管理系统,它涵盖了面向对象程序设计的基本方法,具有存储,查询功能,某小型公司,主要有4类人员:经理,兼职技术人员,销售经理和兼职推销员。
现在,需要存储这些人员的姓名,编号,级别,当月薪水,计算月薪总额并显示全部信息。
月薪计算方法:经理拿固定工资8000兼职技术人员按每小时100元领取月薪兼职推销月的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%#include<iostream。
h〉#include<string。
h>class employee{protected:char *name;int individualempNo;int grade;float accumpay;static int employeeNo;public:employee();~employee();virtual void pay()=0;virtual void promote(int increment=0);virtual void displaystatus()=0;};class technician:public employee{private:float hourlyrate;int workhours;public:technician();void promote(int);void pay();void displaystatus();};class manager:virtual public employee {protected:float monthlypay;public:manager();void promote(int);void pay();void displaystatus();};class salesman:virtual public employee {protected:float commrate;float sales;public:salesman();void promote(int);void pay();void displaystatus();};class salesmanager:public manager,public salesman {public:salesmanager();void promote(int);void pay();void displaystatus();};int employee::employeeNo=1000;employee::employee(){char namestr[50];cout〈<"请输入一个雇员的姓名:”;cin〉>namestr;name=new char[strlen(namestr)+1];strcpy(name,namestr);individualempNo++;grade=1;accumpay=0.0;}employee::~employee(){delete[]name;}void employee::promote(int increment){grade+=increment;}technician::technician(){hourlyrate=100;}void technician::promote(int){employee::promote(2);}void technician::pay(){cout〈〈”请输入"〈<name〈<”本月的工作时数:";cin〉>workhours;accumpay=hourlyrate*workhours;cout<〈”兼职技术人员”<<name<〈"编号"<<individualempNo〈〈"本月工资"〈<accumpay〈〈endl;}void technician::displaystatus(){cout〈< ”兼职技术人员"〈〈name〈〈”编号"<<individualempNo〈〈"级别为"〈<grade〈<"级,已付本月工资”〈〈accumpay〈〈endl;}salesman::salesman(){commrate=0。
公司人员管理系统C++程序

公司人员管理系统实现对公司人员按姓名或者编号显示、查找、增加、删除和保存各类人员信息的操作。
具体要求及应提交的材料某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。
现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
要求:其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
程序对所有人员有提升级别的功能薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成,销售经理既拿固定月薪也领取销售提成。
能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息在基本要求达到后,可设计出比较友好的界面(如下拉菜单),也可用VC++ ClassWizard 设计(选作)。
#include <iostream.h>#include <iomanip.h>#include <string.h>#include <fstream.h>const int Maxr=100;class Employee //职工类{int tag;//删除标记int no;//职工编号char name[20];char zw[20];//职工姓名int salary;//职工工资public:Employee(){}char *getname() {return name;}//获取名字int gettag() {return tag;}//获取标记int getno() {return no;}//获取编号int getsalary(){return salary;}void setzw(char q[])//设置名字{strcpy(zw,q);}void setname(char na[])//设置名字{strcpy(name,na);}void getsalary(int sa){salary=sa;}void delna(){tag=1;}//删除void addemp(int n,int sa,char *na,char *q)//增加{tag=0;no=n;salary=sa;strcpy(name,na);strcpy(zw,q);}void disp()//显示职工信息{cout<<"│"<<setw(10)<<no<<"│"<<setw(10)<<name<<"│"<<setw(10)<<salary<<"│"<<setw(10)<<zw<<"│"<<endl;cout<<"├—————┼—————┼—————┼—————┤"<<endl;}};class Database//职工数据类{int top;Employee read[Maxr];public:Database()//将职工信息从employee.txt读取到read[]中{ Employee s;top=-1;fstream file("employee.txt",ios::in);while (1){file.read((char *)&s,sizeof(s));if (!file) break;top++;read[top]=s;}file.close();}void clear()//删除所有{top=-1;}int addemp (int n, int sa,char *na,char*q) //增加职工{Employee *p=query(n);if (p==NULL){top++;read[top].addemp(n,sa,na,q);return 1;}return 0;}Employee *query(int empid){for (int i=0;i<=top;i++)if (read[i].getno()==empid && read[i].gettag()==0) return &read[i];return NULL;}Employee *query1(char empna[20]){for (int i=0;i<=top;i++)if ((read[i].getname()==empna) && read[i].gettag()==0) return &read[i];return NULL;}void disp() //职工信息显示{for (int i=0;i<=top;i++)read[i].disp();}void empdata();~Database() //将read[]中的信息读如到employee.txt中{fstream file("employee.txt",ios::out);for (int i=0;i<=top;i++)if (read[i].gettag()==0)file.write((char *)&read[i],sizeof(read[i]));file.close();}};void Database::empdata()//职工维护{int choice=1;int m=1;int b=1;char rname[20];int empid; int empsa;char q[20];Employee *r;while (choice!=0){cout<<"职工维护1:新增2:更改3:删除4:查找5:显示6:全删0:退出=>"; cin>>choice;switch (choice){case 1:cout<<setw(50)<<" ┌—————————————┐\n";c out<<setw(50)<<" │ 请选择您所需的操作│\n";cout<<setw(50)<<" │ 经理:1,并按回车键│\n";cout<<setw(50)<<" │ 业务经理:2,并按回车键│\n";cout<<setw(50)<<" │ 普通职工:3,并按回车键│\n";cout<<setw(50)<<" └—————————————┘\n";cin>>m;while(m!=0){switch(m){case 1:cout<<"输入经理编号:";cin>>empid;cout<<"输入奖金: ";cin>>empsa;cout<<"输入经理姓名:";cin>>rname;addemp(empid,8000+empsa,rname,"经理");break;case 2:cout<<"输入业务经理编号:";cin>>empid;cout<<"输入月提成: ";cin>>empsa;cout<<"输入业务经理姓名:";cin>>rname;addemp(empid,4000+empsa,rname,"业务经理");break;case 3:cout<<"输入职工编号:";cin>>empid;cout<<"输入工资: ";cin>>empsa;cout<<"输入职工姓名:";cin>>rname;addemp(empid,empsa,rname,"普通职工");break;}break;}break;case 2:cout<<"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout<<"该职工不存在"<<endl;break;}cout<<"输入新的工资:"<<endl;cin>>empsa;r->getsalary(empsa);cout<<"请输入新的职务"<<endl;cin>>q;r->setzw(q);addemp(empid,empsa,rname,q);break;case 3:cout<<"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout<<"该读者不存在"<<endl;break;}r->delna();break;case 4:cout<<setw(50)<<" ┌—————————————┐\n"; cout<<setw(50)<<" │ 请选择您所需的操作│\n";cout<<setw(50)<<" │ 按编号查找1,并按回车键│\n"; cout<<setw(50)<<" │ 返回2,并按回车键│\n";cout<<setw(50)<<" └—————————————┘\n"; cin>>b;while(b!=0){switch(b){case 1:cout<<"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout<<"该职工不存在"<<endl;break;}cout<<"├—————┼—————┼—————┼—————┤"<<endl;cout<<"│"<<setw(10)<<"编号"<<"│"<<setw(10)<<"姓名"<<"│"<<setw(10)<<"工资"<<"│"<<setw(10)<<"职务"<<"│"<<endl;cout<<"├—————┼—————┼—————┼—————┤"<<endl;r->disp();break;case 2:break;}break;}break;case 5:cout<<"├—————┼—————┼—————┼—————┤"<<endl;cout<<"│"<<setw(10)<<"编号"<<"│"<<setw(10)<<"姓名"<<"│"<<setw(10)<<"工资"<<"│"<<setw(10)<<"职务"<<"│"<<endl;cout<<"├—————┼—————┼—————┼—————┤"<<endl;disp();break;case 6:clear();break;}}}void main(){int choice=1;Database EmpDB;while(choice!=0){cout<<"********************************************************************************"<<endl;cout<<endl;cout<<endl;cout<<setw(20)<<"******************************欢迎使用职工管理系统******************************"<<endl; cout<<endl;cout<<endl;cout<<setw(50)<<" ┌—————————————┐\n"; cout<<setw(50)<<" │ 请选择您所需的操作│\n";cout<<setw(50)<<" │ │\n";cout<<setw(50)<<" │ 操作1,并按回车键│\n";cout<<setw(50)<<" │ │\n";cout<<setw(50)<<" │ 返回0,并按回车键│\n";cout<<setw(50)<<" └—————————————┘\n"; cin>>choice;switch(choice){case 1:while(1){cout<<setw(20);EmpDB.empdata();break;break;}}}}。
C、C++之动态数组的实现

C、C++之动态数组的实现C、C++之动态数组的实现本篇博客基于笔者本⼈正在学习的C++上机课程作业,主要代码由C语⾔构成。
由于C语⾔没有 string 、vector、valarray等完善的类,所以在实现动态数组时,需要⾃⾏考虑内存的分配和管理,C语⾔中,对内存管理的函数如malloc、realloc、free等被包括在 < malloc .h >头⽂件中。
关于这些函数使⽤的具体实例,可以参考这篇⽂章:具体实现时,使⽤了某些 C++ 的特有语法,如在for循环⾥定义变量,这是C语⾔不允许的,但由于现有现有编译器⼀般都同时⽀持,因此不特别注明下⾯会贴出实验课上所⽤的测试代码,针对测试代码,可以发现,实现⼀个动态数组不难,因为已经有现成的函数可以调⽤,⽽针对数组的操作较多,需要逐⼀讨论测试⽂件如下:// LibArray.cpp : 定义控制台应⽤程序的⼊⼝点。
//// 实验内容:// 1:使⽤C语⾔实现⼀个长度可扩充的数组(包含必要的数据结构及函数);// 2:要求能存放任意类型的数据(建议先实现存储整形的代码,之后改写成适应任意类型的代码);// 3:所写程序需能通过测试程序// 4:除本⽂件(测试⽂件)之外,其他⽂件(如CLibArray.cpp及CLibArray.h⽂件)、以及⼯程由同学⾃⼰建⽴。
过程中可翻书,可查看msdn。
// 实验⽬的:// 1:熟悉相关的指针操作, 复习动态内存的相关操作.// 2:理解C程序如何实现数据类型和围绕数据类型上操作的集合// 3:为未来理解类实现的数组vector做准备// 只提交CLibArray.cpp及CLibArray.h#include "stdafx.h"#include <assert.h>#include<stdlib.h>#include "CLibArray.h"int _tmain(int argc, _TCHAR* argv[]){CArray array;array_initial(array);array_recap(array, 10);assert(array_capacity(array) == 10);//////////////////////////////////////////////////////////////////////////for (int i = 0; i < 20; ++i){array_append(array, i);}assert(array_size(array) == 20);for (int i = 0; i < array_size(array); ++i){assert(array_at(array, i) == i);}//////////////////////////////////////////////////////////////////////////CArray array2, array3;array_initial(array2);array_initial(array3);array_copy(array, array2);assert(array_compare(array, array2) == true);array_copy(array, array3);assert(array_compare(array, array3) == true);//////////////////////////////////////////////////////////////////////////array_insert(array2, 2, 3);assert(array_compare(array, array2) == false);//////////////////////////////////////////////////////////////////////////array_at(array3, 2) = 5;assert(array_compare(array, array3) == false);//////////////////////////////////////////////////////////////////////////array_destroy(array);array_destroy(array2);array_destroy(array3);return 0;}可以看出,⾸先要确定 CArray 的具体类型,以 int 型为例,动态数组具有可变的容量(capacity,已分配空间)和实际⼤⼩(size,已使⽤的空间),⽽malloc等函数的参数要求都是指针,因此,可以把 CArray 定义为结构体:// defination of CArraytypedef struct CArray{int* arrayhead;int size;int capacity;}CArray;注意,在结构体中(c++中,结构体可以看做是简单的类),是不允许初始化普通成员的,因为上述代码只是给出此类型的定义,⽽没有定义实际的变量。
C++课程设计员工管理系统

cin>>num1;
switch (num1) //用 switch 语句控制函数跳转
{
case 1:insert ();break;
case 2:average ();break;
case 3:number ();break;
case 4:check ();break;
case 5:information ();break;
5. 各操作截图
--------------------------------------------------------------5~7
6. 调试过程中出现的问题及解决方案
-----------------------------------------------------------------8
{
cout<<"编号为"<<Inf[i].NO<<endl;
cout<<"姓名为"<<Inf[i].Name<<endl;
cout<<"年龄为"<<Inf[i].Age<<endl;
4
"<<'\n';
北京工商大学课程设计报告
cout<<"性别为"<<Inf[i].Sex<<endl; } } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c加加动态数组加无限内存人员管理
系统
”信息与计算科学”专业
《C++语言程序设计》课程设计
班级计算科学
姓名
学号
指导教师
设计日期·春·19周~20周
( 一) 、设计菜单选择程序。
菜单是应用程序的界面, 经过控制语句改变程序执行的顺序, 设计菜单是程序设计的基础。
本设计分两步:
第一步: 设计一个菜单程序。
1.菜单内容: 程序运行后, 给出3个菜单项的内容和输入提示, 如下:
1)利用克莱姆法则求解线性方程组
2)统计一篇英文文章的单词数
3)退出程序
第二步: 为上述菜单项配上相应的功能。
2.程序优缺点:
优点: 采用了动态开辟二维数组, 传递不知道大小的二维数组, 程序规范, 可读性强。
缺点:采用递归算法, 增加了程序的时间复杂度。
3.代码段:
#include<iostream>
#include<string>
#include <stdlib.h>
#include<windows.h>
using namespace std;
double **open_up(int row,int line);
double Price(int row,int line,double *a);
void Head();
void Cramer();
void Statis_Words();
int main()
{
char ch; // 选择变量
while(1)
{
Head();
cout<<"\t\t选择要进行的程序: "<<endl;
ch = cin.get();
cout<<endl;
switch(ch)
{
case '1':system("cls");Cramer();break;
case '2':system("cls");Statis_Words();break;
case '3':system("cls"); cout << " 退出程序" << endl; exit(0);break; default :system("cls");cout<<"\t\t 输入有误 "<<endl;
}
cin.get();
}。