尝试制作一个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();
}
答案 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在结尾处为真。