在外面可能会打破一个循环?

时间:2009-07-15 01:24:39

标签: c++

尝试制作一个while(bool)循环并且失败因为我无法看到向量的内容,因为它们中没有任何内容,我做了一个while(true)循环,意图突破,如果用户输入一个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();
}

6 个答案:

答案 0 :(得分:3)

嗯,你可以简单地让每个函数返回一个bool,然后在循环中检查函数是否返回false。如果是这样的话。

你也可以从函数中抛出一个错误,从外部捕获它并适当地处理它,但我认为这有点极端。我得到的印象是你正在寻找一个'退出代码'类型的东西。如果是这种情况,我建议简单地返回一个bool并检查是否应该突破循环。

编辑:所以你的更新代码看起来有点复杂,但就我回到bool而言,这就是我所得到的:

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;
}

答案 1 :(得分:1)

如果您更改问题并将其颠倒查看,则会变得非常简单。

更改setter方法以实际返回刚刚输入的值。我还使年龄成为该方法的局部变量,以防止副作用蔓延:

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

然后在循环中,您可以直接测试返回的值:

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

由于您在main中设置退出条件(类型0退出),因此最好在那里测试退出条件以保持一致性。

无论如何我都是这样看的......代码更短更容易理解


编辑我更改了代码以反映评论aem。这样就使用了正确的逻辑运算符。至于级联评估,如果第一个答案是0那么第二个问题甚至不会被问到(完成评估为真,因此不会评估其余的或语句),因此你必须小心这(例如,如果你希望两个Vector总是具有相同的长度)。然而,我发现可用性是明智的,因为用户已经声明他想退出我没有看到他问另一个问题。

答案 2 :(得分:0)

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

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

编辑:

您的一般想法很好(在循环的每次迭代中运行test(),如果满足退出条件则返回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"))

应该有效,尽管为了清晰起见我更喜欢deus的回应。

答案 3 :(得分:0)

如果test() / ages为空,您可以明确签入names,如果不是,则只进行“真实”检查:

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

答案 4 :(得分:0)

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

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

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

现在,这个链接描述了Javascript,但逻辑基本相同,编码风格与其他C类语言几乎没有区别。

答案 5 :(得分:0)

a | = b是a = a |的简写湾 如果a或b为真,则a在结尾处为真。