博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
包裹系统编写以及过程中发现的错误
阅读量:5921 次
发布时间:2019-06-19

本文共 12115 字,大约阅读时间需要 40 分钟。

1 #include 
2 #include
3 using namespace std; 4 5 typedef enum iStatus { Sendtothewarehouse, Hasstarted, Ontheway, Arriveatthewarehouse, Hasbeendistributed, Hasbeenreceived } Status; 6 typedef enum iworkerStatus { Working, Vacation }workerStatus; 7 class Person 8 { 9 private: 10 string name; 11 string PhoneNUM; 12 string address; 13 public: 14 Person(){} 15 Person(string name1, string PhoneNUM1, string address1) :name(name1), PhoneNUM(PhoneNUM1), address(address1) {}; 16 Person(const Person &aq) { 17 name = aq.name; 18 PhoneNUM = aq.PhoneNUM; 19 address = aq.address; 20 } 21 string getname() { 22 return name; 23 } 24 void setP(string name2, string PhoneNUM2, string address2) { 25 name = name2; 26 PhoneNUM = PhoneNUM2; 27 address = address2; 28 29 } 30 void dispaly() { 31 cout << " 姓名:" << name << endl; 32 cout << " 电话:" << PhoneNUM << endl; 33 cout << " 地址:" << address << endl; 34 } 35 }; 36 class Package { 37 public: 38 Package() {}; 39 friend class Sender; 40 Package(const Package& it1) { 41 recipient=it1.recipient; 42 sender=it1.sender; 43 ID = it1.ID; 44 weight = it1.weight; 45 cost = it1.cost; 46 status = it1.status; 47 48 } 49 Package(Person recipient2, Person sender2, string ID, long weight, 50 double cost, Status status) :recipient(recipient2), sender(sender2), ID(ID), weight(weight), cost(cost), status(status) {}; 51 void SetPackage(Person recipient3, Person sender3, string ID3, long weight3, 52 double cost3, Status status3) 53 { 54 recipient = recipient3;sender = sender3;ID = ID3;weight = weight3;cost = cost3;status = status3; 55 }; 56 Person getre() { 57 return recipient; 58 } 59 Person getse() { 60 return sender; 61 } 62 string getID() { 63 return ID; 64 }; 65 Status getStatus() { 66 return status; 67 }; 68 void dispaly() { 69 cout << "*****************包裹信息*****************" << endl; 70 cout << "收件人信息:" << endl; 71 recipient.dispaly(); 72 cout << "发件人信息:" << endl; 73 sender.dispaly(); 74 cout << "包裹编号:" << ID << endl; 75 cout << "包裹重量:" << weight << endl; 76 cout << "包裹费用:" << cost << endl; 77 cout << "包裹状态:" << status << endl; 78 cout << "*****************************************" << endl; 79 } 80 81 protected: 82 Person recipient; 83 Person sender; 84 string ID; 85 long weight; 86 double cost; 87 Status status; 88 }; 89 class Link { 90 public: 91 Package pac; 92 Link *next; 93 Link(Package elemval, Link* nextval = NULL) { pac = elemval;next = nextval; } 94 Link(Link* nextval = NULL) { next = nextval; } 95 }; 96 class package_list { 97 private: 98 Link *head; 99 Link *tail;100 Link *curr;101 int cnt;102 void create() {103 curr = head = tail = new Link;104 cnt = 0;105 };106 void removeall() {107 while (head != NULL) {108 curr = head;109 head = head->next;110 delete curr;111 }112 }113 public:114 package_list() {115 create();116 };117 void clear() { removeall(); create(); }118 void delete_pac() {119 curr = head;120 while(tail!=curr){121 if ((curr->pac).getStatus() == Hasbeenreceived) {122 if (tail == curr->next) { tail = curr; }123 Link* temp = curr->next;124 curr->next = curr->next->next;125 delete temp;126 cnt--;127 curr = curr->next;128 }129 }130 };131 132 void change(string ID) {133 curr = head;134 while (curr != tail&&curr->next->pac.getID() !=ID) {135 curr = curr->next;136 137 }138 if (curr == tail) { cout << "包裹中没有此ID"<
> nam >> phoneNU >> addre;144 Person recipient3(nam, phoneNU, addre);145 cout << "请输入此包裹修改后的发件人信息"<
> nam >> phoneNU >> addre;147 Person sender3(nam, phoneNU, addre);148 cout << "请输入此包裹修改后的ID,重量,价值,状态" << endl;;149 long weight3;150 double cost3;151 Status status3;152 cin >> weight3 >> cost3 >> (int&)status3;153 154 curr->next->pac.SetPackage(recipient3, sender3, ID3, weight3,155 cost3, status3);156 }157 158 }159 160 void append(Package it) {161 tail = tail->next = new Link(it, NULL);162 cnt++;163 }164 165 166 Package* search_re(string name) {167 curr = head;168 for (int i = 0;curr->next != NULL;i++) {169 if ((curr->pac).getre().getname() == name) return &curr->next->pac;170 curr = curr->next;171 }172 cout<<"未找到";173 return NULL;174 }175 Package* search_se(string name) {176 curr = head;177 for (int i = 0;curr->next != NULL;i++) {178 if ((curr->pac).getse().getname() == name) return &curr->next->pac;179 curr = curr->next;180 }181 cout<<"未找到";182 return NULL;183 }184 Package* search_ID(string ID) {185 curr = head;186 for (int i = 0;curr->next != NULL;i++) {187 if ((curr->next->pac).getID() == ID) return &curr->next->pac;188 else curr = curr->next;189 }190 cout<<"未找到";191 return NULL;192 }193 void dispaly() {194 curr = head;195 while (curr->next != NULL) {196 (curr->next->pac).dispaly();197 curr = curr->next;198 }199 }200 };201 class Sender :public Person {202 public:203 Sender() {}204 Sender(string name, string PhoneNUM, string address, workerStatus ws) :Person(name, PhoneNUM, address), ws(ws) {}205 void set(string name3, string PhoneNUM3, string address3, workerStatus ws3) {206 ws = ws3;207 setP(name3, PhoneNUM3,address3);208 }209 void dispalySender() {210 cout<<"**************快递员信息*****************"<
append(pack);219 }220 void deletePa(package_list* list) {221 return list->delete_pac();222 }223 Package* findPac_se(string name, package_list* list) {224 return list->search_se(name);225 }226 Package* findPac_re(string name, package_list* list) {227 return list->search_re(name);228 }229 Package* findPac_ID(string IDnum, package_list* list) {230 return list->search_ID(IDnum);231 }232 void showPac(package_list* list) { list->dispaly(); }233 void changePac(string ID5, package_list* list) { list->change(ID5); }234 235 private:236 workerStatus ws;237 };238 class mange {239 public:240 mange (){}241 void showSender(Sender* sen) { sen->dispalySender(); }242 void mashowPac(package_list* list) { list->dispaly(); }243 void machangePac(string ID6, package_list* list) { list->change(ID6); }//除此之外可以添加修改快递员信息的接口244 };245 246 void main()247 { 248 string namemain, phonemain, addressmain;249 int n,m;250 workerStatus wstatus;251 package_list pl;252 Sender S1;253 cout << "请输入快递员姓名,电话,地址,工作状态(输入整数0为工作,1为放假,)" << endl;254 cin >> namemain >> phonemain >> addressmain >> (int&)wstatus;255 S1.set(namemain, phonemain, addressmain, wstatus);256 cout << "请问您有几个包裹信息需要填写" << endl;257 cin >> m;258 Package *pp = new Package[m];//创建包裹的对象数组259 for (int j = 0;j < m;j++)260 {261 cout << "请输入收件人姓名,电话,地址"<
> namemain1 >> phonemain1 >> addressmain1;267 Person recone(namemain1, phonemain1, addressmain1);268 cout << "请输入发件人姓名,电话,地址"<
> namemain2 >> phonemain2 >> addressmain2;271 Person secone(namemain2, phonemain2, addressmain2);272 cout << "请输入包裹ID,重量,费用,状态(0为Sendtothewarehouse,1为 Hasstarted,2为 Ontheway,3为 Arriveatthewarehouse,4为 Hasbeendistributed, 5为Hasbeenreceived )" << endl;273 cin >> ID0 >> wei >> cost8 >> (int&)ss;//如何接受enum类型:274 pp[j].SetPackage(recone, secone, ID0, wei, cost8, ss);275 pl.append(pp[j]);276 }277 mange master;278 master.showSender(&S1);//管理员显示快递员信息279 cout<
>ID;284 Package* P1 =S1.findPac_ID(ID,&pl);285 P1->dispaly();286 string rename;287 string sename;288 cin>>rename;289 Package *P2=S1.findPac_re(rename,&pl);290 P2->dispaly();291 cin>>sename;292 Package *P3=S1.findPac_se(sename,&pl);293 P3->dispaly();294 delete [] pp;295 system("pause");296 }
View Code

该程序是我们C++的一个实验,为期一周,所以简单的做了一下,其中有很多没有完善的地方。

main函数为测试函数,测试结果为:

 


 

1.程序中对enum的输出只是简单的使用数字代替,因为enum类型是int整型,如果想让它输出字符串类型可以使用如下方法:

(转自http://blog.chinaunix.net/uid-20412333-id-1950066.html)
typedef enum {North,East,South,West} directionT;
在程序中定义了变量
directionT dir=North;
如果想用
printf("The direction is %s",dir);
之类的语句直接输出
The direction is North
是做不到的,无论采用%s或%d,或者在dir前加强制类型转换。
 
所以可能的解决办法是使用函数
1 char * StringDirectionT(directionT dir) 2 { 3         switch(dir) 4         { 5                 case North : return "North"; 6                 case East  : return "East"; 7                 case South : return "South"; 8                 case West  : return "West"; 9                 default    : printf("Illegal direction value!\n;10         }11 }
然后用语句
printf("The direction is %s \n",StringDirectionT(dir));

上面程序中可以在display中针对输入的整型数值采用上述函数(该函数声明为全局函数)转换为想要输出的中文字符串。enum类型最好使用英文字符,中文可能会报错。

2.name(name)是初始化特有的,赋值必须使用等号。

3.转自http://www.cnblogs.com/xiaorenwu702/p/5794330.html

new和不new的区别

1 #include 
2 using namespace std; 3 4 5 class A 6 { 7 private: 8 int n; 9 public:10 A(int m):n(m)11 {12 }13 ~A(){}14 };15 16 int main()17 {18 A a(1); //栈中分配19 A b = A(1); //栈中分配20 A* c = new A(1); //堆中分配21   delete c;22 return 0;23 }

第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关:

这里面有几个问题:

1.堆和栈最大可分配的内存的大小
2.堆和栈的内存管理方式
3.堆和栈的分配效率

首先针对第一个问题,一般来说对于一个进程栈的大小远远小于堆的大小,在linux中,你可以使用ulimit -s (单位kb)来查看一个进程栈的最大可分配大小,一般来说不超过8M,有的甚至不超过2M,不过这个可以设置,而对于堆你会发现,针对一个进程堆的最大可分配的大小在G的数量级上,不同系统可能不一样,比如32位系统最大不超过2G,而64为系统最大不超过4G,所以当你需要一个分配的大小的内存时,请用new,即用堆。

其次针对第二个问题,栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。 堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。

由上可知,但我们需要的内存很少,你又能确定你到底需要多少内存时,请用栈。而当你需要在运行时才知道你到底需要多少内存时,请用堆。

最后针对第三个问题,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多

由上可知,能用栈则用栈。

1 #include 
2 #include
3 void main() 4 { 5 int n,*p,i,j,m; 6 printf("本程序可对任意个整数排序;\n"); 7 printf("请输入整数的总个数: "); 8 scanf("%d",&n); 9 p=(int *)calloc(n,sizeof(int)); //运行时决定内存分配大小10 if(p==0) {11 printf("分配失败!\n"); 12 exit(1); 13 }

4.关于对象指针和对象引用

首先必须明白

1 int i =10;  2 int &j = i;  //&符号紧随类型名出现,它是声明的一部分,j是一个引用。  3 int *p;     //*符号紧随类型名出现,它是声明的一部分,p是一个指针。  4 p = &i;    //&符号出现在表达式之中,是一个取地址符号。  5 *p = i;    //*符号出现在表达式之中,是一个解引用符  6 int &j2 = *p;   //&是声明的一部分,*是解引用符。

在上面程序中

1 Package* search_ID(string ID) {2         curr = head;3         for (int i = 0;curr->next != NULL;i++) {4             if ((curr->next->pac).getID() == ID) return &curr->next->pac;5             else curr = curr->next;6         }7         cout<<"未找到";8         return NULL;9     }

一开始我使用package作为返回类型,报错:不是所有控件路径都有返回值;因为如果没找到的话,就没办法返回一个正确的类对象,所以我改成了指针,这样可以返回NULL。

程序中Package类中为了得到收件人发件人信息直接返回了类对象,这是可行的。

1 Person getre() {2         return recipient;3     }

 

转载于:https://www.cnblogs.com/zzy-2017/p/6915947.html

你可能感兴趣的文章
async/await封装使用mysql
查看>>
C++类对象成员例程
查看>>
LightOJ 1356 Prime Independence( Hopcroft–Karp Bipartite算法)
查看>>
开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
查看>>
CentOS6.5安装Redis数据库
查看>>
Android Looper和Handler
查看>>
Spring MVC 学习笔记 二 spring mvc Schema-based configuration
查看>>
通过点击网页链接打开应用程序——自定义协议
查看>>
论文笔记:Attention Is All You Need
查看>>
PHP 无限极分类下拉列表实现
查看>>
推荐几本经典的JS书籍
查看>>
Silverlight之我见——DataGrid数据验证
查看>>
Office2010从第三页开始设置页码
查看>>
pku 2983 Is the Information Reliable? 差分约束
查看>>
NYOJ 73
查看>>
HDOJ-1176 免费馅饼[DP入门]
查看>>
linux下cat命令详解
查看>>
一个使用EF进行查改的样例
查看>>
深度剖析Byteart Retail案例:服务定位器模式
查看>>
Gridview,Repeater和datalist的区别
查看>>