2009-07-15 67 views
0

试图做一段时间(布尔)循环后,它失败,因为我看不到向量的内容,因为它们中没有任何内容,我做了一段时间(真正)循环,意图打破如果用户输入一个0.这里是代码的重要部分。可能在外面打破循环?

编辑:工作代码,但是| =意味着什么?

#include "std_lib_facilities.h" 

class Name_pairs 
{ 
public: 
     vector<string>names; 
     vector<double>ages; 
     bool test(); 
     string read_names(); 
     double read_ages(); 
     void print(); 
}; 

string Name_pairs::read_names() 
{ 
     string name; 
    cout << "Enter name: "; 
    cin >> name; 
    names.push_back(name); 
    return name; 
} 

double Name_pairs::read_ages() 
{ 
    double age; 
    cout << "Enter corresponding age: "; 
    cin >> age; 
    ages.push_back(age); 
    cout << endl; 
    return age; 
} 

void Name_pairs::print() 
{ 
    for(int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i) 
      cout << names[i] << " , " << ages[i] << endl; 
} 

bool Name_pairs::test() 
{ 
    if(ages.empty() || names.empty()) return true; 
    if(ages.back() = 0 || names.back() == "0"){ 
          return false;} 
    return true; 
} 


int main() 
{ 
    Name_pairs np; 
    cout << "Enter names and ages. Use 0 to cancel.\n"; 
    bool finished = false; 
    while(!finished){ 
    finished |= "0" == np.read_names(); 
    finished |= 0 == np.read_ages();}   
    np.print(); 
    keep_window_open(); 
} 
+0

我在理解你的代码时遇到了一些麻烦,第二块之后是第三块吗?或者是循环的一部分?如果不太长,你可能会发布整个hte循环体(包括条件)吗? – Falaina 2009-07-15 01:36:32

+0

当然没问题。我会用我试过的布尔测试来发布它。 – trikker 2009-07-15 01:37:17

+0

@Trikker:请请修复您的代码格式。我为你解决了这个问题,但是你的编辑在整个过程中跺脚。 – 2009-07-15 01:42:20

回答

1

如果更改了问题,并查看其倒置它变得相当简单。

更改您的setter方法以实际返回刚输入的值。我还做了年纪的方法的局部变量,以防止副作用爬行:

bool finished = false; 
while(!finished) 
{ 
    finished = finished || "0" == np.read_names(); 
    finished = finished || 0 == np.read_ages(); 
} 

既然你设置你的退出:

Double Name_pairs::read_ages() 
{ 
    Double age; 
    cout << "Enter corresponding age: "; 
    cin >> age; 
    ages.push_back(age); 
    cout << endl; 
    return age; 
} 

然后在循环中,您可以直接返回值测试条件在主要(类型0退出),最好是在那里测试退出条件的一致性。

是我怎么看也无妨......代码更短,更容易理解


编辑我改成反映意见AEM代码。这样使用正确的逻辑运算符。至于级联评估,如果第一个答案是0,那么第二个问题甚至不会被询问(完成评估为真,因此其余部分或语句将不会被评估),因此您必须小心这(如果你期望两个矢量总是具有相同的长度)。然而,我发现自从用户已经表明他想退出后,我认为可用性是明智的,因此在向他询问另一个问题时看到没有用处。

3

那么你可以简单地让每个函数返回一个布尔值,然后在循环中检查函数是否返回false。如果这样突破。

你也可以从函数内部抛出一个错误,在外部抓住它并正确处理它,但我认为这有点极端。我觉得你只是在寻找一个'退出代码'类型的东西。如果是这种情况,我会建议简单地返回一个布尔值并检查是否应该跳出循环。

编辑:所以你更新的代码看起来有点复杂,但是这是我在尽可能返回一个布尔让俗话:

void Name_pairs::read_names() 
{ 
    cout << "Enter name: "; 
    cin >> name; 
    names.push_back(name); 
} 

bool Name_pairs::read_ages() 
{ 
    cout << "Enter corresponding age: "; 
    cin >> age; 

    if (age == 0) 
     return false; 
    ages.push_back(age); 
    cout << endl; 
    return true; 
} 

// Now we can test if its time to break. 
while (true) 
{ 
    np.read_names(); 
    if (!np.read_ages()) 
     break; 
} 
+0

我试过了,但比它看起来更难。 – trikker 2009-07-15 01:30:14

+1

如果你必须至少做一次,可以考虑使用一个`do..while()`循环,这就是他们的目的。 – 2009-07-15 01:37:48

0

您可以让函数返回一个值,然后检查价值并在必要时打破。

您也可以在调用函数后检查读入的值。在这种情况下,它看起来像if(names.back()==“something”)或if(ages.back()== 0)会起作用。

编辑:

你的总体思路罚款(上运行,如果你的退出条件满足其返回false循环的每次迭代测试()),但也有一对夫妇实现错误:

if(ages[bool_counter] = 0 || names[bool_counter] == "0") 

对于第一个条件,您需要“==”而不是“=”。我敢打赌你的编译器警告过你,你通常应该听他的警告:)。您目前的声明是将0分配给[0],而不是将其检查为0。

您应该在尝试取消引用第一个元素之前检查大小,否则,如果您注意到,如果年龄或名称是空的。

因此改变,要

if((ages.size() > 0) && (ages.back() == 0)) || 
    (names.size() > 0) && (names.back() == "0")) 

应该工作,虽然我更喜欢解围对清晰的回应。

0

你可以明确地检查test()如果ages/names是空的,只有做到了“真实”的检查,如果他们不是:

bool Name_pairs::test() { 
    if (ages.empty() || names.empty()) 
     return true; 
    return (ages.back() != 0) && (names.back() != "0"); 
} 
0

“在外面打破循环?” - 这个问题没有意义。如果你在循环之外,就没有必要突破它,因为你已经在它之外了。

我建议阅读基础知识,特别是“序列”,这是这些类型的语言共同的共同点。 http://javascript.about.com/library/blstruc1.htm

然后你可以继续循环 - 它链接在同一页面上。

现在,这个链接描述了Javascript,但是逻辑本质上是一样的,而且编码风格与其他C语言差别不大。

0

a | = b是a = a |的简写。湾 如果a或b是真的,那么a最后是真的。