1. 程式人生 > >包裹系統編寫以及過程中發現的錯誤

包裹系統編寫以及過程中發現的錯誤

img 進程虛擬地址 com 排序 pri 集中 價值 oid efault

技術分享
  1 #include <iostream>
  2 #include <string>
  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"<<endl; } 139 else { 140 cout << "請輸入此包裹修改後的收件人信息" << endl;; 141 string nam, phoneNU, addre,ID3; 142 143 cin >> nam >> phoneNU >> addre; 144 Person recipient3(nam, phoneNU, addre); 145 cout << "請輸入此包裹修改後的發件人信息"<<endl;; 146 cin >> 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<<"**************快遞員信息*****************"<<endl; 211 cout << "快遞員信息:" << endl; 212 Person::dispaly(); 213 cout << "當前工作狀態:" << ws << endl; 214 cout<<"*****************************************"<<endl; 215 } 216 void enPackage(Package pack, package_list* list) 217 { 218 list->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 << "請輸入收件人姓名,電話,地址"<<endl; 262 long wei; 263 double cost8; 264 Status ss; 265 string namemain1, phonemain1, addressmain1; 266 cin >> namemain1 >> phonemain1 >> addressmain1; 267 Person recone(namemain1, phonemain1, addressmain1); 268 cout << "請輸入發件人姓名,電話,地址"<<endl; 269 string namemain2, phonemain2, addressmain2,ID0; 270 cin >> 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<<endl; 280 master.mashowPac(&pl);//管理員顯示包裹信息 281 cout<<endl; 282 string ID;//以下測試查找包裹 283 cin>>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 <iostream>
 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 <stdio.h>
 2 #include <stdlib.h>  
 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     }

包裹系統編寫以及過程中發現的錯誤