2014-02-14 64 views
1

https://developers.google.com/edu/c++/getting-started#exercises-and-projectsC++谷歌的入門練習#4

我指行使#4 - 橫幅

我有一個小麻煩了解如何做到這一點的工作。我爲每個字母創建了不同的功能,「F」「R」&「E」。

「F」,例如:

void printF(){ 
cout<<"FFFFF"<<endl; 
cout<<"F"<<endl; 
cout<<"FFF"<<endl; 
cout<<"F"<<endl; 
cout<<"F"<<endl; 
} 

據我所知,這是行不通的,因爲沒有辦法打印這樣的事情,然後打印在它旁邊的另一項權利。有人可以從概念上解釋或提供我如何打印「免費」一詞的例子嗎?謝謝

+0

你想打印彼此相鄰的行,而不是一個接一個地打印?這將是一個問題,因爲控制檯窗口很小。 – 2014-02-14 01:49:22

回答

2

您可以將您的字母創建爲std::string陣列。爲了一致性,它是五個字符串,長度爲五個字符。您可以使用像get_font_letter這樣的功能來選擇當前字母。有更好的方法來做到這一點,但如果你只關心這個詞,那麼現在應該沒問題。我建議你做一些類似於「字體數據庫」的地方,你可以在文本文件中繪製和索引這些字母。

#include <iostream> 
#include <vector> 

std::string f[] = { 
    "FFFFF", 
    "F ", 
    "FFF ", 
    "F ", 
    "F ", 
}; 

std::string r[] = { 
    "RRRRR", 
    "R R", 
    "RRRR ", 
    "RRR ", 
    "R RR", 
}; 

std::string e[] = { 
    "EEEEE", 
    "E ", 
    "EEE ", 
    "E ", 
    "EEEEE", 
}; 

std::string* get_font_letter(const char& c) 
{ 
    if (c == 'F') return f; 
    if (c == 'R') return r; 
    if (c == 'E') return e; 
} 

您不需要二維std::vector。您可以將每行連同一個空格拼成一塊。

int main() 
{ 
    std::string word = "FREE"; 
    std::vector<std::string> v; 
    v.resize(5); 
    for (unsigned int i = 0; i < 5; i++) 
    { 
     std::string row = ""; 
     for (auto it = word.begin(); it != word.end(); ++it) 
     { 
      auto letter = get_font_letter(*it); 
      row += letter[i] + " "; 
     } 
     v.push_back(row); 
    } 
    for (auto it = v.begin(); it != v.end(); ++it) 
     std::cout << *it << "\n"; 
} 

輸出:

FFFFF RRRRR EEEEE EEEEE 
F  R R E  E  
FFF RRRR EEE EEE 
F  RRR E  E  
F  R RR EEEEE EEEEE 
+0

我不能說我完全理解這裏的一切。我將不得不通過這些路線來理解這些概念。但這是一個很好的例子,非常感謝。 – Dan

+0

@remyabel完全OT:我沒有得到您的個人資料圖片正確(描述中給出的)!如果您願意,可以通過我的電子郵件自由回答! (upvoted這個雖然只是看起來不錯) –

1

沒有給你完整的解決方案,因爲你顯然有學習,這將是我的策略:字符串

使用矢量(或2-d陣列)來表示一個字母。然後建立這些向量的列表以表示字符串,並按字符串打印所有向量字符串(打印所有向量的第一個字符串,然後第二個等)。單個琴絃應該具有恆定的長度並提供一定的間距。

1

這是我在這個例子中那樣。

  1. 首先我想創建像printA)()剛剛在這個問題的細節描述的功能(,printB。但我意識到同樣的問題。另外,這意味着我們需要爲字母和符號中的每個字母創建超過26個這樣的功能。所以,沒有使用這種方法。

  2. 我認爲這封信的尺寸是5x5。我們需要什麼點陣打印機。它在字符串中打印每個字母的第一行點,然後打印下一行的第二行點等等。我們打印的字母不是點而需要相同的符號。例如,如果我們打印H,點將是'H'。

  3. 那麼,如何以最少的代碼行和更少的複雜性來做到這一點? 我決定爲行創建位標記。考慮到連續有5個點,可能會有32個組合。像 - 10000,11000,11100等 在實現這個過程中,我開始知道我們不需要那麼多來定義字母表中的字母。像這樣的東西 -

    const unsigned char EOne = 0x1F; // 000 11111 const unsigned char BOne = 0x1E; // 000 11110

我給了直觀的名稱來bitFlags知道他們在信中屬於。 這裏是關於bitflags好的信息 - http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/

  • 下一步是創建在字母表的每個字母的設計。象 -

    const unsigned char A[5] = {AOne, ATwo, EOne, AFiv, AFiv}; const unsigned char B[5] = {BOne, AFiv, BOne, AFiv, BOne}; const unsigned char J[5] = {~EThr, ~BOne, ~BOne, AFiv, ~AFiv};

  • 所以,這形成的字母設計A,B,C .. Z.

  • 在下一步驟,可以在字母和他們的設計之間創建地圖。

  • 當用戶輸入要打印的字符串時,在5次迭代的for循環中,可以在其設計中使用第0個字母:第0個bitflag,第1個字母:第1個bitflag在其設計中。第n個字母:第1個bitflag其設計。 再次,第0個字母:第1個位標誌,第1個字母:第1個位標誌,第n個字母:第1個位標誌,直到您打印所有5行。

  • 如何處理bitflag?我使用std :: bitset並測試每一位以便打印或留下空白區域。 lineBits是特定字母設計行的位標。

    std :: bitset < 8> bits(lineBits);

    // Since we have only 5x5 letter, we start with leftmost bit (4th) to rightmost (0th) 
    for(int bitpos = 4; bitpos >= 0; bitpos--) 
    { 
        if(bits.test(bitpos)) 
        { 
         cout << letter; 
         outFile << letter; // In file. 
        } 
        else 
        { 
         cout << " "; 
         outFile << " "; // In file. 
        } 
    } 
    
  • 這種方式,因爲代碼降低線,我可以打印任何字符串。因爲,我使用地圖,很容易打印正在打印的字母的符號。

    FFFFF RRRR EEEEE EEEEE ZZZZZ Y Y 
    F  R R E  E   Z Y Y 
    FFF RRRR EEE EEE  Z  Y  
    F  R R E  E  Z  Y  
    F  R RR EEEEE EEEEE ZZZZZ Y 
    

    需要一段時間來設計所有字母。讓我知道如何改善這個代碼。