遞歸 編程題#2: 文件結構“圖”(Coursera 程序設計與算法 專項課程4 算法基礎 郭煒、劉家瑛;switch case後接多行語句)

編程題#2: 文件結構“圖”

來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最後成績。)

注意: 總時間限制: 1000ms 內存限制: 65536kB

描述
在計算機上看到文件系統的結構通常很有用。Microsoft Windows上面的”explorer”程序就是這樣的一個例子。但是在有圖形界面之前,沒有圖形化的表示方法的,那時候最好的方式是把目錄和文件的結構顯示成一個”圖”的樣子,而且使用縮排的形式來表示目錄的結構。比如:
ROOT
|    dir1
|     |     file1
|     |     file2
|     |     file3
|     dir2
|     dir3
|     |     file1
file1
file2
這個圖說明:ROOT目錄包括兩個文件和三個子目錄。第一個子目錄包含3個文件,第二個子目錄是空的,第三個子目錄包含一個文件。

輸入
你的任務是寫一個程序讀取一些測試數據。每組測試數據表示一個計算機的文件結構。每組測試數據以’*’結尾,而所有合理的輸入數據以’#’結尾。一組測試數據包括一些文件和目錄的名字(雖然在輸入中我們沒有給出,但是我們總假設ROOT目錄是最外層的目錄)。在輸入中,以’]’表示一個目錄的內容的結束。目錄名字的第一個字母是’d’,文件名字的第一個字母是’f’。文件名可能有擴展名也可能沒有(比如fmyfile.dat和fmyfile)。文件和目錄的名字中都不包括空格。

輸出
在顯示一個目錄中內容的時候,先顯示其中的子目錄(如果有的話),然後再顯示文件(如果有的話)。文件要求按照名字的字母表的順序顯示(目錄不用按照名字的字母表順序顯示,只需要按照目錄出現的先後顯示)。對每一組測試數據,我們要先輸出”DATA SET x:”,這裏x是測試數據的編號(從1開始)。在兩組測試數據之間要輸出一個空行來隔開。

你需要注意的是,我們使用一個’|’和5個空格來表示出縮排的層次。

樣例輸入

file1
file2
dir3
dir2
file1
file2
]
]
file4
dir1
]
file3
*
file2
file1
*
#

樣例輸出

DATA SET 1:
ROOT
|        dir3
|        |        dir2
|        |        file1
|        |        file2
|        dir1
file1
file2
file3
file4
DATA SET 2:
ROOT
file1
file2

提示
一個目錄和它的子目錄處於不同的層次
一個目錄和它的裏面的文件處於同一層次

程序解答:

#include <iostream>  
#include <string>
#include <set>  
using namespace std;

int n = 0;//層數  
int m = 1;//第幾組數據  
bool have_print;
bool stop = false;

void print(){
    if (have_print == false){
        have_print = true;
        if (m != 1) 
            cout << endl;
        cout << "DATA SET " << m << ":" << endl << "ROOT" << endl;
    }
}

void fun(void){
    string str;
    set<string> s;
    while (cin >> str){
        switch (str[0]){
        case '#':
            stop = true;
            return;
        case 'f':
            print();
            s.insert(str);
            break;
        case 'd':
            print();
            n++;
            for (int i = 0; i<n; i++){
                cout << "|     ";
            }
            cout << str << endl;
            fun();
            break;
        case ']':
            for (set<string>::iterator i = s.begin(); i != s.end(); i++){
                for (int j = 0; j<n; j++){
                    cout << "|     ";
                }
                cout << *i << endl;
            }
            n--;
            return;
        case '*':
            for (set<string>::iterator i = s.begin(); i != s.end(); i++){
                cout << *i << endl;
            }
            m++;
            return;
        }
    }
}

int main(){
    while (!stop){
        have_print = false;
        fun();
    }

    return 0;
}

本文轉載自:http://blog.csdn.net/bh1998/article/details/74936422

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章