2013-10-08 52 views
-1

因此,今天我決定使用向量編寫一個簡單的直方圖,然而當我編寫這個程序並編譯它時,輸出顯示了一個永不結束的「*」。C++試圖創建直方圖

#include <iostream> 
#include <conio.h> 
#include <ios> 
#include <vector> 
#include <algorithm> 


using std::cout; 
using std::vector; 
using std::cin; 
using std::endl; 



int main() 
{ 
int x; 
double k; 
cout<<"How many range would you like = "; 
    cin>>x; 
vector<double> number; //All data was being stored here 
cout<<"Input the number to be included in histogram = "; 
while(cin>>k) 
number.push_back(k); 


x = x*10; 
sort(number.begin(), number.end()); 


for(int i=0;i<x;i+=10) // Problem is on this loop statement, but I can't fix it. 
{ 
    vector<double>::size_type u = 0; 
    cout<<i<<"-"<<i+9<<" = "; //The range, Intended to put the "*" besides it. 
    while(u < number.size()) 
    { 
     if(number[u]<=i+9 && number[u]>=i) 
     cout<<"*"; //For showing how many numbers on that range 
     else 
      u++; 

    } 
    cout<<endl; 
} 

getch(); 
return 0; 
    } 

沒有顯示,只有永不落幕的「」第一個範圍的錯誤。(例如,當程序編譯,我輸入的數據,並顯示「0-9 = ** * ****「它只是繼續重複而不去下一行。任何建議來解決這個問題? 編輯:我試圖使用迭代器之前,但它有這個相同的輸出

+4

'else u ++;'?刪除其他。 – user1810087

+0

非常感謝你itwasntpete!我仍然需要對自己的邏輯進行更多的訓練。 – Kurangceret

回答

1

所以,在你的while循環...

if(number[u]<=i+9 && number[u]>=i) 
    cout<<"*"; 

您已得到該代碼。問題是,在while循環內,您僅在if elseelse部分增加u。因此,如果您進入while循環,並且此if條件返回true,它將永遠保持true。您將陷入執行cout<<"*";while循環中,因爲您無需在此處更改u的值。

+0

是的,我忽略了這麼簡單的事情。感謝您輸入nhgrif! – Kurangceret

+1

設置斷點是尋找這樣簡單錯誤的好方法。有了斷點,你很快就會發現u的值永遠不會改變。 – nhgrif

1

這裏的問題:

if(number[u]<=i+9 && number[u]>=i) 
    cout<<"*"; //For showing how many numbers on that range 
else 
    u++; 

一旦你找到一個範圍內的號碼,else意味着你不會移動到下一個數字;你會留在那裏,永遠打印*

您可以簡單地刪除else;或者你可以構建它作爲一個for循環,這可能使其更顯然是正確:

for (size_t u = 0; u < number.size(); ++u) 

,或者2011年以來,一種新型for循環:

for (double n : number) { 
    if (n < i+10 && n >= i) { 
     cout << "*"; 
    } 
} 

我也參加了的自由修正邏輯,以便例如9.5不被排除。