【问题标题】:Switch Case and For Loop C++Switch Case 和 For 循环 C++
【发布时间】:2014-06-13 03:58:29
【问题描述】:
您好,我有这段代码,但我似乎无法让它工作。循环循环三次,然后 addCourse 假设添加所有三个选择。问题是 addCourse 函数只为所有三个选择添加最后一位。示例:
如果我选择 1 2 3 那么它应该给出:
- 数学
- 量子
- 现实
相反,它给出了:
- 现实
- 现实
- 现实
(这三个都是最后选择的案例3)
我该如何解决这个问题。谢谢你。下面是代码。
for(int p = 0; p < 3; p++)
{
cout << "Please select a course:" <<endl;
cout<<"1. Maths\n";
cout<<"2. Quantum\n";
cout<<"3. Reality\n";
cin >> coursepick;
switch (coursepick)
{
case 1: course= "Maths";
case 2: course= "Quantum";
case 3: course= "Reality";
default: break;
}
cout << "Please insert the course mark:" <<endl;
cin >> mark;
cin.ignore();
phys[0]->addCourse(course,mark);
}
【问题讨论】:
标签:
c++
loops
switch-statement
【解决方案1】:
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}
如果您在每个案例结束时不中断,它只会继续下一个,然后是下一个,然后直到案例 3 并默认中断。
【解决方案2】:
在 C++ 中,case 语句会自动移至下一条。您必须在每个case 之后插入break。
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}
【讨论】:
-
-
-
@Ben:因为 C 深受 Fortran 的影响,Fortran 有 computed GOTOs(或分支表),这与 switch-case 块差不多。
【解决方案3】:
在您的switch 语句中,每个case 都需要一个break 语句。如果没有break 语句,C 将落入下一个案例。你的case语句相当于:
course= "Maths";
course= "Quantum";
course= "Reality";
相反,它必须是:
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}
【解决方案4】:
正如其他帖子中提到的,您需要以关键字“break;”结束每个案例。如果您不希望它渗透到下一个案例中。
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}
Switch 语句具有这种行为,因为有时您希望它过滤多种情况。当多个案例具有相同的结果时,这使您不必重复代码。以下示例显示了 if case 'a' OR case 'A' 的等价物,请执行此操作。如果 case 'b' OR 'B',请执行此操作。
switch (input)
{
case 'a':
case 'A': text = "Letter A"; break;
case 'b':
case 'B': text = "Letter B"; break;
default: text = "Not A or B"; break;
}
【解决方案5】:
Dude,你能为所有的case语句添加Break标签吗?应该是这样的
switch (coursepick)
{
case 1: course= "Maths";
break;
case 2: course= "Quantum";
break;
case 3: course= "Reality";
break;
default: break;
}
如果你不提,它将通过所有案例,最后以防三门课程被现实覆盖。
所以case语句需要break
【解决方案6】:
正如已经说过的,您必须使用break 来作为任何案例标签。
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}
但在任何情况下,代码都是无效的,因为如果用户输入的数字超出了可接受的范围,变量当然不会被分配。但是,您将在语句中使用这个未分配的变量
phys[0]->addCourse(course,mark);
也不清楚为什么变量是在循环外定义的。
我会这样写循环
enum { Maths = 1, Quantum, Reality };
for ( int p = 0; p < 3; p++ )
{
do
{
cout << "\nPlease select a course:" <<endl;
cout<<"1. Maths\n";
cout<<"2. Quantum\n";
cout<<"3. Reality\n";
cin >> coursepick;
if ( !( Maths <= coursepick && coursepick <= Reality ) )
{
cout << "Error. Invalid input. Please repeat" << std::endl;
}
} while ( !( Maths <= coursepick && coursepick <= Reality ) );
switch (coursepick)
{
case Maths: course= "Maths"; break;
case Quantum: course= "Quantum"; break;
case Reality: course= "Reality"; break;
default: abort();
}
cout << "Please insert the course mark:" << endl;
cin >> mark;
cin.ignore();
phys[0]->addCourse( course, mark );
}