數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——樹(shù)的遍歷文件目錄結(jié)構(gòu)的顯示_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b>  樹(shù)的遍歷</b></p><p><b>  目 錄</b></p><p><b>  1 設(shè)計(jì)題目1</b></p><p><b>  2 設(shè)計(jì)分析

2、2</b></p><p><b>  3 設(shè)計(jì)實(shí)現(xiàn)4</b></p><p>  4.2 測(cè)試輸入13</p><p>  4.3 正確輸出14</p><p>  4.4 實(shí)際輸出16</p><p>  5 分析與探討17</p><p>  

3、5.1 測(cè)試結(jié)果分析17</p><p>  5.2 探討與改進(jìn)17</p><p><b>  6 設(shè)計(jì)小結(jié)17</b></p><p>  1 設(shè)計(jì)題目 </p><p>  給出Unix下目錄和文件信息,要求編程實(shí)現(xiàn)將其排列成一定縮進(jìn)的樹(shù)。具體要求如下。</p><p>

4、<b>  輸入要求:</b></p><p>  輸入數(shù)據(jù)包含幾個(gè)測(cè)試方案。每一個(gè)案例由幾行組成,每一行都代表了目錄樹(shù)的層次結(jié)構(gòu)。第一行代表目錄的根節(jié)點(diǎn)。若是目錄節(jié)點(diǎn),那么它的孩子節(jié)點(diǎn)將在第二行中被列出,同時(shí)用一對(duì)圓括號(hào)“()”界定。同樣,如果這些孩子節(jié)點(diǎn)鐘某一個(gè)也是目錄的話,那么這個(gè)目錄所包含的內(nèi)容將在隨后的一行中列出,有一對(duì)圓括號(hào)將首位界定。目錄的輸入格式為:*name size,文件

5、的輸入格式為:name size,其中*代表當(dāng)前節(jié)點(diǎn)的目錄,name代表文件或目錄的名稱(chēng),由一串長(zhǎng)度不大于10的字符組成,并且name字符串中不能包含有‘(’,‘)’,‘[’,‘]’,‘*’。size是該文件/目錄的大小,為大于0的整數(shù)。每一個(gè)案例中最多只能包含10層,每一層最多有10個(gè)文件/目錄。</p><p><b>  輸出要求:</b></p><p>  

6、對(duì)每一個(gè)測(cè)試案例,輸出時(shí)要求:第d層的文件/目錄名前面需要插入8*d個(gè)空格,兄弟節(jié)點(diǎn)之間要在同一列上。不要使用Tab(制表符)來(lái)統(tǒng)一輸出的縮進(jìn)。每一個(gè)目錄的大小(size)是它包含的所有子目錄和文件大小以及它自身大小的總和。</p><p><b>  輸入例子:</b></p><p><b>  */usr1</b></p>&

7、lt;p>  (*mark 1 *alex 1)</p><p>  (hw.c3 *course 1)(hw.c 5)</p><p>  (aa.txt 12)</p><p><b>  */usr 1</b></p><p><b>  ()</b></p><p&

8、gt;  表示含有兩個(gè)不同的根目錄,目錄名都是/usr,第一個(gè)根目錄/usr下包含mark和alex兩個(gè)子目錄,mark目錄下包含大小為3的文件hw.c和子目錄course,alex目錄下有一個(gè)大小為5的文件hw.c,子目錄course下包含文件aa.txt,其大小為12;第二個(gè)根目錄/usr下為空。</p><p><b>  輸出例子:</b></p><p> 

9、 |_*usr[24]</p><p>  |_*mark[17]</p><p>  | |_hw.c[3]</p><p>  | |_*course[13]</p><p>  | |_aa.txt[12]</p><p>  |_*alex[6]</p>

10、<p><b>  |_hw.c[5]</b></p><p>  |_*/usr[1]</p><p><b>  2 設(shè)計(jì)分析</b></p><p>  目錄結(jié)構(gòu)是一種典型的樹(shù)形結(jié)構(gòu),為了方便對(duì)目錄的查找、遍歷等操作,可以選擇孩子兄弟雙親鏈表來(lái)存儲(chǔ)樹(shù)的結(jié)構(gòu)。程序中要求對(duì)目錄的大小進(jìn)行重新計(jì)算,根據(jù)用戶的輸

11、入來(lái)建立相應(yīng)的孩子兄弟雙親鏈表,最后輸出樹(shù)形結(jié)構(gòu)??梢砸靡粋€(gè)Tree類(lèi),將樹(shù)的構(gòu)造、銷(xiāo)毀、目錄的大小重新計(jì)算(reSize)、建立樹(shù)形鏈表結(jié)構(gòu)(parse)、樹(shù)形結(jié)構(gòu)輸出(outPut)等一系列操作都封裝起來(lái),同時(shí)對(duì)于每一個(gè)樹(shù)的節(jié)點(diǎn),它的私有變量除了名稱(chēng)(Name)、大小(Size)和層數(shù)(Depth)之外,根據(jù)孩子兄弟雙親鏈表表示的需要,還要設(shè)置三個(gè)指針,即父指針(Tree*parent)、下一個(gè)兄弟指針(Tree*NextSibl

12、ing)和第一個(gè)孩子指針(Tree*FirstChild)。</p><p>  1.建立樹(shù)形鏈表結(jié)構(gòu)的函數(shù)parse()</p><p>  根據(jù)輸入來(lái)確定樹(shù)形關(guān)系時(shí),首先讀取根節(jié)點(diǎn)目錄/文件名和大小值,并根據(jù)這些信息建立一個(gè)新的節(jié)點(diǎn);然后讀入后面各行信息,對(duì)于同一括號(hào)中的內(nèi)容,即具有相同父節(jié)點(diǎn)的那些節(jié)點(diǎn)建立兄弟關(guān)聯(lián)。這個(gè)函數(shù)實(shí)際上是采取遍歷建立樹(shù)形鏈表結(jié)構(gòu)。</p>&l

13、t;p>  定義一個(gè)Tree*類(lèi)型的數(shù)組treeArray[],用來(lái)存放目錄的節(jié)點(diǎn)信息,并定義兩個(gè)整型變量head和rear,head值用來(lái)標(biāo)記當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)位置,每處理完一對(duì)括號(hào),head需要增加1,即下一對(duì)待處理括號(hào)的父節(jié)點(diǎn)在treeArray[]中要往后移一個(gè)位置。如果當(dāng)前處理的節(jié)點(diǎn)是目錄類(lèi)型,則將它放在treeArray[]數(shù)組中,rear是treeArray[]的下標(biāo)變量,加入一個(gè)目錄節(jié)點(diǎn)信息,rear就增加1;如果是

14、文件類(lèi)型的目錄,則需要按照Name和Size建立一個(gè)樹(shù)的節(jié)點(diǎn),并和head所指的父節(jié)點(diǎn)建立關(guān)聯(lián),但是不用放入treeArray[]中。</p><p>  為進(jìn)一步說(shuō)明這個(gè)樹(shù)形鏈表結(jié)構(gòu)的構(gòu)成,可參考圖3-1。</p><p>  treeArray[]</p><p>  圖3-1通過(guò)parse()構(gòu)建的數(shù)據(jù)結(jié)構(gòu)事例</p><p>  它是

15、根據(jù)如下的具體輸入例子所形成的結(jié)構(gòu)示意。</p><p><b>  輸入:</b></p><p><b>  */usr1</b></p><p>  (*mark 1 *alex 1)</p><p>  (hw.c3 *course 1)(hw.c 5)</p><p&g

16、t;  (aa.txt 12)</p><p>  形成的數(shù)據(jù)結(jié)構(gòu)如圖2.5所示。</p><p>  2.目錄大小重新計(jì)算函數(shù)reSize()</p><p>  輸入數(shù)據(jù)中對(duì)目錄大小的初始值一般為1,而目錄的真正大小應(yīng)該是自身的大小和它包含的所有文件及子目錄的大小之和。因此,在計(jì)算目錄大小的時(shí)候,需要遍歷它下面所有的文件和子目錄,可以采用遞歸嵌套的后序遍歷方式。

17、另外要注意,采用孩子兄弟雙親鏈表表示時(shí),父目錄下的所有子目錄和子文件都在該父目錄的左子樹(shù)上(右子樹(shù)第一個(gè)節(jié)點(diǎn)是該目錄的兄弟節(jié)點(diǎn)),所以白努力的時(shí)候只需要遍歷目錄對(duì)的左子樹(shù)即可。</p><p>  3.輸出樹(shù)形結(jié)構(gòu)的函數(shù)outPut()</p><p>  輸出是一個(gè)先序遍歷的過(guò)程。為完成對(duì)樹(shù)形的輸出,兄弟目錄之間需要相同的縮進(jìn),用‘|’上下相連,而父子目錄或父目錄和子文件之間需要設(shè)定正確

18、的縮進(jìn),子目錄或子文件要比父目錄向右縮進(jìn)8個(gè)空格。設(shè)置一個(gè)標(biāo)志數(shù)組flag[11](每個(gè)目錄下最大的層次數(shù)為10),當(dāng)前Tree*temp指針?biāo)傅墓?jié)點(diǎn)如果有兄弟節(jié)點(diǎn),則置flag數(shù)組值為1,否則置為0;并由此節(jié)點(diǎn)反復(fù)查詢它的祖先節(jié)點(diǎn)的情況,直到根節(jié)點(diǎn)為止。輸出時(shí),遇到flag[]=1時(shí),屏幕輸出“| ”,表明是兄弟節(jié)點(diǎn);遇到flag[]=0則輸出“ ”, 有相同的縮進(jìn),而子節(jié)點(diǎn)總比父節(jié)點(diǎn)向右縮進(jìn)8個(gè)空格。</p>

19、<p>  4.消除輸入中多余空格的函數(shù)skipWhiteSpace(string &s,int *i)</p><p>  從用戶輸入數(shù)據(jù)中讀入一行后,調(diào)用該函數(shù)來(lái)跳過(guò)s字符串中s[i]之后的空格,以方便后面的處理。</p><p>  此外,關(guān)于讀入目錄名稱(chēng)、大小,以及將string類(lèi)型的Size值轉(zhuǎn)換成int類(lèi)型的函數(shù)的實(shí)現(xiàn),相對(duì)比較簡(jiǎn)單,此處不再贅述。</

20、p><p><b>  3 設(shè)計(jì)實(shí)現(xiàn)</b></p><p>  利用visual c++,新建一個(gè)c++文件,將以下代碼輸入。</p><p>  #include <string></p><p>  #include <iostream></p><p>  #inclu

21、de <fstream></p><p>  using namespace std;</p><p>  string s = "";</p><p>  int startPos = 0;</p><p>  ofstream outfile;</p><p>  ifstream

22、infile;</p><p>  /**構(gòu)造Tree類(lèi)**/</p><p>  class Tree{</p><p>  string Name; /* 樹(shù)的根結(jié)點(diǎn)名稱(chēng) */</p><p>  int Size; /* 樹(shù)的大小,用于統(tǒng)計(jì)這棵樹(shù)本身及其包含的所以子樹(shù)大小的總和*/</p><p&

23、gt;  Tree* FirstChild; /* 指向它的第一個(gè)孩子結(jié)點(diǎn) */</p><p>  Tree* NextSibling; /* 指向它的下一個(gè)兄弟結(jié)點(diǎn) */</p><p>  Tree* parent; /* 指向雙親結(jié)點(diǎn) */</p><p><b>  public:</b></p><p

24、>  Tree(string Name = "", int Size = 0);/* 構(gòu)造函數(shù) */</p><p>  void parse(); /* 根據(jù)輸入數(shù)據(jù)來(lái)建立樹(shù)形結(jié)構(gòu) */</p><p>  void reSize(); /* 重新統(tǒng)計(jì)樹(shù)結(jié)點(diǎn)的大小 */</p><p>  void outPut()

25、;/* 輸出樹(shù)形結(jié)構(gòu) */</p><p>  ~Tree(); /* 析構(gòu)函數(shù) */</p><p><b>  };</b></p><p>  /*** 樹(shù)結(jié)點(diǎn)數(shù)組treeArray[],以及用來(lái)標(biāo)注雙親結(jié)點(diǎn)位置的head和目錄結(jié)點(diǎn)的rear***/</p><p>  Tree* tre

26、eArray[100];</p><p>  int head = 0, rear = 0;</p><p>  /*** 建立只有一個(gè)結(jié)點(diǎn)的樹(shù),其三個(gè)指針域均為空 ***/</p><p>  Tree::Tree(string Name, int Size){</p><p>  this->Name = Name;</p&g

27、t;<p>  this->Size = Size;</p><p>  FirstChild = NULL;</p><p>  NextSibling = NULL;</p><p>  parent = NULL;</p><p><b>  }</b></p><p>

28、  /*** 析構(gòu)函數(shù),刪除同一根結(jié)點(diǎn)下的各個(gè)子結(jié)點(diǎn),釋放空間 ***/</p><p>  Tree::~Tree()</p><p><b>  {</b></p><p>  Tree* temp;</p><p>  Tree* temp1;</p><p>  temp = FirstC

29、hild;</p><p>  while(temp != NULL)</p><p><b>  {</b></p><p>  temp1 = temp;</p><p>  temp = temp->NextSibling;</p><p>  delete temp1;</p&

30、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  /* 先序遍歷根結(jié)點(diǎn)下的所有結(jié)點(diǎn),將每一個(gè)結(jié)點(diǎn)的Size值都加到根結(jié)點(diǎn)的Size中去**/</p><p>  void Tree::reSize()</p><p><b> 

31、 {</b></p><p>  Tree* temp = this;</p><p>  /*** 如果當(dāng)前的結(jié)點(diǎn)沒(méi)有孩子結(jié)點(diǎn),則它的Size值不變,即為輸入時(shí)候的值 ***/</p><p>  if(temp->FirstChild != 0){</p><p>  temp = temp->FirstChild

32、;</p><p>  while(temp != 0){</p><p>  temp->reSize();</p><p>  Size += temp->Size;</p><p>  temp = temp->NextSibling;</p><p><b>  }</b>

33、;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /***檢查Name中有無(wú)非法字符**************/</p><p>  bool checkName(string s)</p><p><b> 

34、 {</b></p><p>  if(s[0]!='*' && s.length() > 10)</p><p>  return false;</p><p>  if(s[0]=='*' && s.length() > 11)</p><p>  r

35、eturn false;</p><p>  if(s[0]!='*' && (s[0]=='(' || s[0]==')' || s[0]=='[' || s[0]==']'))</p><p>  return false;</p><p>  for(int i=1

36、;i<s.length();i++){</p><p>  if(s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]=='[' || s[i]==']')</p><p>  return false;</p><p><b>  }&

37、lt;/b></p><p>  return true;</p><p><b>  }</b></p><p>  /*** 按照先序遍歷的方式有縮進(jìn)地來(lái)輸出樹(shù)形結(jié)構(gòu) ***/</p><p>  void Tree::outPut()</p><p><b>  {</

38、b></p><p>  Tree* temp; /*用來(lái)指向當(dāng)前結(jié)點(diǎn)的祖先結(jié)點(diǎn)*/</p><p>  Tree* temp1;</p><p>  bool flag[11];/*用來(lái)標(biāo)志輸出縮進(jìn)、層次情況的數(shù)組*/</p><p><b>  int i;</b></p><p>  

39、outfile.open("output.txt",ios::app);</p><p>  if(!outfile){</p><p>  cout<<"cannot append the output file.\n";</p><p><b>  exit(0);</b></p&g

40、t;<p><b>  }</b></p><p>  if(!checkName(Name)){</p><p>  cout<<"input error!--"<<Name<<endl;</p><p><b>  exit(0);</b></

41、p><p><b>  }</b></p><p>  outfile<<"|_"<<Name<<"["<<Size<<"]\n";</p><p>  outfile.close();</p><p> 

42、 /* 輸出當(dāng)前的結(jié)點(diǎn)信息 */</p><p>  temp1= FirstChild;/* 用來(lái)指向當(dāng)前結(jié)點(diǎn)的子結(jié)點(diǎn) */</p><p>  while(temp1 != NULL)</p><p><b>  {</b></p><p>  outfile.open("output.txt",

43、ios::app);</p><p>  if(!outfile){</p><p>  cout<<"cannot append the output file.\n";</p><p><b>  exit(0);</b></p><p><b>  }</b>&

44、lt;/p><p><b>  i = 0;</b></p><p>  temp = temp1;</p><p>  while(temp->parent != NULL)</p><p><b>  {</b></p><p>  /*當(dāng)前temp指針?biāo)傅慕Y(jié)點(diǎn)如果有

45、兄弟結(jié)點(diǎn),則置flag數(shù)組值為1,否則置為0;并由此結(jié)點(diǎn)反復(fù)查詢它的祖先結(jié)點(diǎn)的情況,直到根結(jié)點(diǎn)為止*/</p><p>  if(i>=10){</p><p>  //檢查當(dāng)前的父目錄包含的子文件(或目錄數(shù))是否大于10;</p><p>  cout<<"input error!--dictionary contains more t

46、han 10 levels."<<endl;</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  temp = temp->parent;</p><p>  if(temp->NextSibling !

47、= NULL)</p><p>  flag[i++] = true;</p><p><b>  else</b></p><p>  flag[i++] = false;</p><p><b>  }</b></p><p>  /*兄弟結(jié)點(diǎn)之間有相同的縮進(jìn),子結(jié)點(diǎn)比父

48、結(jié)點(diǎn)向右縮進(jìn)8個(gè)空格*/</p><p>  while(i--)</p><p><b>  {</b></p><p>  if(flag[i] == true)</p><p>  outfile<<"| ";</p><p><b> 

49、 else</b></p><p>  outfile<<" "; </p><p><b>  }</b></p><p>  outfile.close();</p><p>  temp1->outPut();</p>&l

50、t;p>  temp1 = temp1->NextSibling;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*** 跳過(guò)字符串s中,第(*i)個(gè)之后多余的空格 ***/</p><p>  void skipWhiteSpac

51、e(string& s, int* i)</p><p><b>  {</b></p><p>  while(s[*i] == '\t' || s[*i] == ' ')</p><p><b>  (*i)++;</b></p><p><b>

52、;  }</b></p><p>  /*** 獲取輸入行中一對(duì)'()'之間的字符串,即為同一雙親結(jié)點(diǎn)下的子結(jié)點(diǎn) ***/</p><p>  string getSubDir(string& line, int* startPos)</p><p><b>  {</b></p><p&

53、gt;  string res = "";</p><p>  skipWhiteSpace(line,startPos);</p><p>  while(line[*startPos] != ')')</p><p>  res += line[(*startPos)++];</p><p>  res

54、 += line[(*startPos)++];</p><p>  skipWhiteSpace(line, startPos);</p><p>  return res;</p><p><b>  }</b></p><p>  /*** 由于用戶輸入時(shí)候目錄的大小Size值為String類(lèi)型,因此需要將它轉(zhuǎn)變成

55、integer類(lèi)型***/</p><p>  int stringToNum(string s)</p><p><b>  {</b></p><p>  int num = 0;</p><p>  unsigned int i = 0;</p><p>  while(i < s.l

56、ength())</p><p><b>  {</b></p><p>  num *= 10;</p><p>  num += s[i++] - '0';</p><p><b>  }</b></p><p>  return num;</p&g

57、t;<p><b>  }</b></p><p>  /*** 提取目錄/文件的名稱(chēng) ***/</p><p>  string getName(string& s, int* i)</p><p><b>  {</b></p><p>  string name = &q

58、uot;";</p><p>  while(s[*i] != ' ' && s[*i] != '\t')</p><p>  name += s[(*i)++];</p><p>  return name;</p><p><b>  }</b></p&

59、gt;<p>  /*** 提取目錄/文件的大小,然后將string類(lèi)型轉(zhuǎn)換成integer類(lèi)型 ***/</p><p>  int getSize(string&s, int* i)</p><p><b>  {</b></p><p>  string size = "";</p>

60、<p>  while((unsigned int)(*i) < s.length() && s[*i] != ' ' && s[*i] != '\t' && s [*i] != ')')</p><p>  size += s[(*i)++];</p><p>  retur

61、n stringToNum(size);</p><p><b>  }</b></p><p>  /*** 根據(jù)用戶的輸入字符串來(lái)構(gòu)建樹(shù)的結(jié)構(gòu) ***/</p><p>  void Tree::parse()</p><p><b>  {</b></p><p>  

62、Tree* temp;</p><p>  string line;</p><p>  string name;</p><p><b>  int size;</b></p><p>  /***head值用來(lái)標(biāo)記當(dāng)前結(jié)點(diǎn)的雙親結(jié)點(diǎn)位置;如果當(dāng)前處理的結(jié)點(diǎn)是目錄類(lèi)型,則將它放在treeArray[]數(shù)組中,下標(biāo)用re

63、ar來(lái)記錄;如果是文件類(lèi)型的目錄,只需要按照name和size建立一個(gè)樹(shù)的結(jié)點(diǎn),但是不用放入treeArray[]中 ***/</p><p>  while(getline(infile,line,'\n'))</p><p><b>  {</b></p><p>  startPos = 0;</p><

64、;p><b>  while(1)</b></p><p><b>  {</b></p><p>  s = getSubDir(line, &startPos);</p><p>  int i = 1;</p><p>  skipWhiteSpace(s, &i);&l

65、t;/p><p>  if(s[i] != ')')</p><p><b>  {</b></p><p>  skipWhiteSpace(s,&i);</p><p>  name = getName(s,&i);</p><p>  skipWhiteSpace

66、(s,&i);</p><p>  size = getSize(s,&i);</p><p>  temp = treeArray[head%100]->FirstChild = new Tree(name,size);</p><p>  temp->parent = treeArray[head%100];</p>

67、<p>  if(name[0] == '*')</p><p>  treeArray[(rear++)%100] = temp;</p><p>  skipWhiteSpace(s,&i);</p><p><b>  }</b></p><p>  while(s[i] != &

68、#39;)')</p><p><b>  {</b></p><p>  skipWhiteSpace(s,&i);</p><p>  name = getName(s,&i);</p><p>  skipWhiteSpace(s,&i);</p><p> 

69、 size = getSize(s,&i);</p><p>  temp->NextSibling = new Tree(name,size);</p><p>  skipWhiteSpace(s,&i);</p><p>  temp = temp->NextSibling;</p><p>  temp-&

70、gt;parent = treeArray[head%100];</p><p>  if(name[0] == '*')</p><p>  treeArray[(rear++)%100] = temp;</p><p><b>  }</b></p><p><b>  head ++;&l

71、t;/b></p><p>  /***測(cè)試是否一行掃描完畢***/</p><p>  if((unsigned int)startPos >= line.length())</p><p><b>  break;</b></p><p><b>  }</b></p>

72、<p>  /***只有一個(gè)根結(jié)點(diǎn)的情況***/</p><p>  if(head == rear)</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p

73、>  ///////////////////////////////////////////////////////////</p><p>  //**** 主測(cè)試文件main.cpp******/////</p><p>  //////////////////////////////////////////////////////////</p><p>

74、;  int main()</p><p><b>  {</b></p><p>  Tree* fileTree;</p><p><b>  string s;</b></p><p>  string name;</p><p><b>  int size

75、;</b></p><p>  outfile.open("output.txt");</p><p>  if(!outfile){</p><p>  cout<<"cannot open the output file!\n";</p><p><b>  exi

76、t(0);</b></p><p><b>  }</b></p><p>  outfile<<"The result is as follows:\n";</p><p>  outfile.close();</p><p>  infile.open("inpu

77、t.txt",ios::out);</p><p>  if(!infile){</p><p>  cout<<"cannot open the input file!\n";</p><p><b>  exit(0);</b></p><p><b>  }<

78、;/b></p><p>  while(getline(infile,s,'\n'))</p><p><b>  {</b></p><p>  int i = 0;</p><p>  skipWhiteSpace(s, &i);</p><p>  name

79、 = getName(s,&i);</p><p>  skipWhiteSpace(s,&i);</p><p>  size = getSize(s,&i);</p><p>  fileTree = new Tree(name, size);</p><p>  if(name[0] == '*'

80、)</p><p><b>  {</b></p><p>  treeArray[rear++] = fileTree;</p><p>  fileTree->parse();</p><p><b>  }</b></p><p>  fileTree->r

81、eSize();</p><p>  fileTree->outPut();</p><p>  delete fileTree;</p><p><b>  }</b></p><p>  infile.close();</p><p><b>  return 0;</b

82、></p><p><b>  }</b></p><p><b>  4測(cè)試方法</b></p><p><b>  4.1測(cè)試目的</b></p><p>  為了測(cè)試程序的正確性,需要分別測(cè)試它在正常情況和異常情況下的表現(xiàn)情況。</p><p&g

83、t;  正常情況下的輸入數(shù)據(jù)要求是:目錄的初始大小一般設(shè)為1,目錄名中不能包含‘(’,‘)’,‘[’,‘]’和‘*’這些字符,加入多余的空格不影響最后的輸出結(jié)果;同一父目錄下的兄弟節(jié)點(diǎn)用一對(duì)圓括號(hào)括起來(lái);同一層上的不同父節(jié)點(diǎn)下的子節(jié)點(diǎn)均列在同一行中,但按照父節(jié)點(diǎn)的不同永圓括號(hào)加以界定。</p><p><b>  4.2 測(cè)試輸入</b></p><p><b&

84、gt;  */usr 1</b></p><p>  (*mark 1 *alex 1)</p><p>  (hw.c 3 *course 1) (hw.c 5)</p><p>  (aa.txt 12)</p><p><b>  */usr 1</b></p><p><

85、b>  ()</b></p><p>  */usr000009 1</p><p>  (*mark 1 *alex 1 *bill 1)</p><p>  (*book 1 *course 1 junk.c 6) (junk.c 8) (*work 1 *course 1)</p><p>  (ch1.r 3 ch2

86、.r 2 ch3.r 4) (*cop3530 1) () (*cop3212 1)</p><p>  (*fall96 1 *spr97 1 *sum97 1) (*fall96 1 *fall97 1)</p><p>  (syl.r 1) (syl.r 5) (syl.r 2) (grades 3 prog1.r 4 prog2.r 1) (prog2.r 2 prog1.r 7

87、 grades 9)</p><p><b>  4.3 正確輸出</b></p><p>  The result is as follows:</p><p>  |_*/usr[24]</p><p>  |_*mark[17]</p><p>  | |_hw.c[3]<

88、/p><p>  | |_*course[13]</p><p>  | |_aa.txt[12]</p><p>  |_*alex[6]</p><p><b>  |_hw.c[5]</b></p><p>  |_*/usr[1]</p>

89、<p>  |_*/usr000009[72]</p><p>  |_*mark[30]</p><p>  | |_*book[10]</p><p>  | | |_ch1.r[3]</p><p>  | | |_ch2.r[2]</p><p&

90、gt;  | | |_ch3.r[4]</p><p>  | |_*course[13]</p><p>  | | |_*cop3530[12]</p><p>  | | |_*fall96[2]</p><p>  | |

91、 | |_syl.r[1]</p><p>  | | |_*spr97[6]</p><p>  | | | |_syl.r[5]</p><p>  | | |_*sum97[3]</p&

92、gt;<p>  | | |_syl.r[2]</p><p>  | |_junk.c[6]</p><p>  |_*alex[9]</p><p>  | |_junk.c[8]</p><p>  |_*bill[32]</p>

93、<p>  |_*work[1]</p><p>  |_*course[30]</p><p>  |_*cop3212[29]</p><p>  |_*fall96[9]</p><p>  | |_grades[3]</p><p>  | |_prog1.r[4]</

94、p><p>  | |_prog2.r[1]</p><p>  |_*fall97[19]</p><p>  |_prog2.r[2]</p><p>  |_prog1.r[7]</p><p>  |_grades[9]</p><p>  保存此文件,命名為“Tree”,在此文

95、件夾中新建一個(gè)名為“input”的文本文件,在此文件中鍵入“測(cè)試輸入”的代碼,經(jīng)過(guò)運(yùn)行可以在“Tree”文件夾中找到一個(gè)名為“output”的文本文件,詳細(xì)結(jié)果如下圖3-2所示。</p><p><b>  圖3-2</b></p><p>  在output文件中即可顯示程序的輸出結(jié)果。</p><p><b>  4.4 實(shí)際輸出

96、 </b></p><p><b>  見(jiàn)圖3-3</b></p><p><b>  圖3-3</b></p><p><b>  5 分析與探討</b></p><p>  5.1 測(cè)試結(jié)果分析 </p><p>  下表1-1為三組異常

97、的測(cè)試數(shù)據(jù)。</p><p><b>  表1-1</b></p><p><b>  5.2 探討與改進(jìn)</b></p><p>  在輸入測(cè)試結(jié)構(gòu)分析中的輸入數(shù)據(jù)時(shí),出現(xiàn)了輸出錯(cuò)誤的提示,因?yàn)槟夸浐臀募胁荒艹霈F(xiàn)‘(’,‘)’,‘[’,‘]’,‘*’等符號(hào),只需要將這些符號(hào)改掉,改為允許輸入的符號(hào)即可,因此,在得到正確

98、的輸出結(jié)果中,正確的輸入是它的前提。</p><p><b>  6 設(shè)計(jì)小結(jié)</b></p><p>  通過(guò)本次課程設(shè)計(jì)實(shí)驗(yàn),我很好的鍛煉了理論聯(lián)系實(shí)際,與具體項(xiàng)目、課題相結(jié)合的程序設(shè)計(jì)能力。既讓我懂得了怎樣把理論運(yùn)用于實(shí)際,又讓我懂得了在實(shí)踐中遇到問(wèn)題怎么樣用理論去解決。我深刻的體會(huì)到,學(xué)好《數(shù)據(jù)結(jié)構(gòu)》這門(mén)課僅僅通過(guò)課堂教學(xué)或平時(shí)的自學(xué)獲取理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論