2013-12-03 53 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