2013-12-03 102 views
1

值的量我有一個結構伯爵表中的C++

struct number{ 
int value; 
}; 

number numbers[1000]; 

我有一個for循環輸入值,當用戶決定離開添加面板斷離,該功能工作正常。我得到另一個for循環顯示輸入的數據,做這項工作(種),因爲它需要我使用系統(「暫停」);否則循環會不斷地輸入包含循環外部cout的函數中的所有內容。

void ListNumbers(){ 
    system("cls"); 
    cout << "\t\t\tArray: Numbers" << endl;; 
    cout << "Value" << endl; 
    for (int i = 0; i < 1000; i++){ 
     if (NULL == numbers[i].value) 
      break; 
     cout << numbers[i].value << endl; 


    } 
    cout << "\n\nAmount of records: " << sizeof(numbers)/sizeof(numbers[0]) << endl; 
    system("pause"); 

我想讓程序列出表中當前充滿數據的記錄/索引的數量。目前它顯示數據庫中的記錄總量(是1000)。此外如果可能的話,固定顯示循環的方法,所以我不需要使用系統暫停將非常讚賞。

+2

在用戶輸入記錄時保留記錄數,當您打印出來時,只打印與輸入一樣多的記錄。更好的是,使用'std :: vector'而不是一個數組,並且它會保持它包含的項目的數量。 –

回答

0

對於初學者來說,在找到第一個與您所要的內容不一致的NULL後,您會跳出循環。您應該使用if..else遞增每個非NULL值的計數器。您不希望中斷,因爲您希望循環檢查表中的每個條目。在循環外的cout中,顯示您正在遞增的計數器。你可以使用一些基本的數學來確定NULL變量的數量。你對sizeof的使用看起來很奇怪,因爲你已經知道數組是1000.這只是產生數字1000的一種奇特方式,你可以將它存儲在一個常量中並重用。

我不明白爲什麼你認爲你需要系統暫停。我看不到程序的其餘部分,所以我假設你想在控制檯窗口關閉之前暫停。那麼你可以啓動一個命令提示符,只需從cmd窗口運行exe。然後它不會關閉。它會關閉,因爲從調試器運行時,IDE將在完成運行程序後關閉控制檯。取決於你的IDE,可能有一個解決方案,但你需要告訴我們你正在使用的IDE,或者只是谷歌搜索該搜索的IDE名稱的問題。

+0

我使用系統暫停,因爲沒有它,顯示功能開始無休止地循環。不知道如何解決它。我想出了一種方法來做到這一點,現在一旦滿足NULL值,如果將顯示cout <<「記錄數量:」<< i;然後打破似乎工作正常。 – user3026386

1

你不應該檢查整數值支票:

if (NULL == numbers[i].value) 

有一個明確的意圖,如:

if (0 == numbers[i].value) 

使用std ::用於創建動態數組向量,不要限制自己大小爲1000.

聲明:

cout << "\n\nAmount of records: " <<sizeof(numbers)/sizeof(numbers[0]) 

您正在將sizeof數組除以第一個數字元素的大小。這種劃分是不變的,只會根據sizeof(int)而變化。

0

據我瞭解,你要執行以下操作:

  • 輸出有效的項目。
  • 計算有效項目。
  • 統計所有項目。

我通常會實施什麼,我想你想是這樣的:

#include <iterator> 
#include <algorithm> 
#include <iostream> 

struct number 
{ 
    int value; 
}; 

std::ostream& operator << (std::ostream& os, const number& n) 
{ 
    return os << n.value; 
} 

number numbers[] = { {1}, {0}, {2}, {0}, {3}, {0}, {4}, {0} }; 

template <class T, std::size_t N> 
T* begin(T (&array)[N]) 
{ 
    return array; 
} 
template <class T, std::size_t N> 
T* end(T (&array)[N]) 
{ 
    return array+N; 
} 

template <class T, std::size_t N> 
std::size_t itemCount(T (&array)[N]) 
{ 
    return N; 
} 


bool is_zero(const number& n){ return(n.value == 0); } 
bool is_not_zero(const number& n){ return(!is_zero(n)); } 

void listNumbers() 
{ 
    std::cout << "Valid values are:" << std::endl; 
    std::remove_copy_if(begin(numbers), end(numbers), 
    std::ostream_iterator<number>(std::cout, "\t"), is_zero); 
    std::cout << std::endl; 

    std::iterator_traits<number*>::difference_type count = 
    std::count_if(begin(numbers), end(numbers), is_not_zero); 
    std::cout << "There is " << count 
      << " items with valid values out of a possible sequence of " 
      << itemCount(numbers) << "." << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    listNumbers(); 
    return 0; 
} 

我在幾個典型的C++的概念,你可能會考慮例如使用標準算法做的工作丟爲你。我個人會使用矢量而不是數組,並使用成員函數(或lambda)的綁定來檢查值是否不爲零(或反之亦然),但我已經使用了數組和非成員函數來獲取這個想法。

+0

向OP道歉,我沒有很好地讀過這個問題。我修改了我的解決方案以使用結構。 –

+0

你的方法可能會工作,但它超越了我在C++方面的技能,我有大量的知識。我必須充分理解我遇到的問題的解決方案,但是我給了你一大筆努力,你付出了很多努力!//編輯,該死的我甚至不能給予upvotes:/ – user3026386