2013-10-10 67 views
2
#include<iostream> 
#include<conio.h> 
#include<math.h> 
#include<vector> 
#include<iterator> 
#include<string> 
using namespace std; 

int main() { 
    int k=0; 
    string s; 

    cout<<"string "; 

    getline(cin,s);    //taking in a string from the user 

    float n=s.size();   //storing size of string 

    int f=floor((sqrt(n))); //floor of square root of input string 

    int c=ceil((sqrt(n))); //ceiling 

    int m=f*c;    //storing product of f and c 

    vector< vector<string> > vec(n<=m?f:++f, vector<string>(c)); //makes a 2d vector 
                    //depending on user's 
                    //string length 


    for(int i=0;n<=m?i<f:i<++f;i++)  //looping acc to user's input and assigning 
    { 
     for(int j=0;j<c;j++)   //string to a matrix 
     { 
      if(k<s.size()) 
      { 
       vec[i][j]=s[k]; 
       k++; 
      } 
     } 
    } 



    for(int j=0;j<c;j++)  //printing the vector 
     { 

    { 
     for(int i=0;n<=m?i<f:i<++f;i++) 

      cout<<vec[i][j]; 

    }cout<<" "; 
     } 

getch();   

} 

它不工作爲N> M作爲用於長度爲8個字符的字符串它使2 * 3從而不能括在基體中的整個字符串的矢量和這就是爲什麼我使用三元以便在遇到像這樣的情況時製作更大尺寸的矢量。 。那麼我做錯了什麼?基本模糊處理程序

我只會寫出整個問題。

One classic method for composing secret messages is called a square code. The spaces are removed from the english text and the characters are written into a square (or rectangle). The width and height of the rectangle have the constraint, 

    floor(sqrt(word)) <= width, height <= ceil(sqrt(word)) 

    The coded message is obtained by reading down the columns going left to right. For example, the message above is coded as: 

    imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau 


    Sample Input: 

    chillout 

    Sample Output: 

    clu hlt io 
+3

你可以a)很好地格式化代碼,b)解釋算法的原理思想。猜測出代碼是耗時的(即使工作不正常,但) – dornhege

+1

這段代碼是不可讀的Phylulu mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn –

+1

爲Cthulu參考+1。 ;) – abelenky

回答

2

這不會解決您的整個問題,但我仍然認爲這很重要。你似乎誤解了三元論的運作方式。讓我們來觀察它的用途在這裏的一個:

for (int i = 0; n <= m ? i < f : i < ++f; i++) {} 
//    ^^^^^^^^^^^^^^^^^^^^^^^^ <--- not the intended outcome 

這不會起作用,因爲三元的返回側不「大棒」本身的地方。換句話說,i < fi < ++f都不會直接放在for循環中。相反,它會給你一個

要明白它的真正作用,首先需要明白三元是另一種做if-else的方法。上述三元,投入的if-else形式,看起來是這樣的:

if (n <= m) 
    i < f; // left side of the ":" 
else 
    i < ++f; // right side of the ":" 

讓我們進一步把它分解:

i < f 

這是做低於的if比較。因此,根據個人價值觀,您將收到0(假)或1(真)。

所以,在你的for循環,這將發生:

for (int i = 0; 1; i++) {} 
//   ^<--- if comparison returns true 

for (int i = 0; 0; i++) {} 
//   ^<--- if comparison returns false 

所以,你的榜樣,你需要循環之前找到f值。你可以使用三元的那部分,但只有當你明白它。否則,請使用其他方法查找f(預定數值)。一旦找到它,然後你可以把i < f放入for-loop。

+0

你如何評論代碼?我上面的評論很難理解「現在」。 – Angersmash

+0

@Ratul:在文本之間加一個反引號(')。 – Jamal

+0

我在循環之前已將值存儲在'f'中,例如讓字符串長度爲8.因此f將存儲'(floor(sqrt(8)))'即'2'和'c = 3 '和'm = 2 * 3',即'6'。現在將大小賦值給vector。vector中的三元將檢查是否(8 <= 6)'(row = 2)else row = ++ f ie 3)'然後for循環將根據創建的向量工作,也就是'i <2'(如果爲true)或'i <3'(如果爲false) – Angersmash