while (cKind != 'T' && cKind != 'M') { cout << "Input error! Please enter T or M." << endl; cout << "If Time please enter T. If Money please enter M." << endl; cin.clear(); cin.ignore(100000, '\n'); cin >> cKind; }无法退出循环
时间: 2024-02-01 14:02:45 浏览: 65
如果在使用上述代码进行输入判断时,无法退出循环,可能是因为输入缓冲区中还存在其他字符,导致`cin >> cKind`读取到了错误的输入,从而导致循环无法退出。可以尝试在`cin >> cKind`语句之前,先进行一次输入缓冲区的清空操作,例如:
```c++
while (cKind != 'T' && cKind != 'M') {
cout << "Input error! Please enter T or M." << endl;
cout << "If Time please enter T. If Money please enter M." << endl;
cin.clear();
cin.ignore(100000, '\n');
// 先清空输入缓冲区
cin >> cKind;
}
```
这样可以确保`cin >> cKind`读取到的是正确的输入,避免循环无法退出的问题。
相关问题
这个循环为什么无法终止while (cKind != 'T' && cKind != 'M') { cout << "Input error! Please enter T or M." << endl; cout << "If Time please enter T. If Money please enter M." << endl; cin >> cKind; }
这个循环可能无法终止的原因可能是因为输入缓冲区中包含了除'T'和'M'以外的其他字符,导致程序无法正确判断输入的字符。这种情况下,可以使用以下方法解决问题:
1. 在读取cKind之前,使用cin.clear()函数清空输入缓冲区。
2. 在读取cKind之前,使用cin.ignore()函数忽略之前输入的字符。
修改后的代码如下:
```c++
double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) {
double dTorM = numeric_limits<double>::infinity();
while (cKind != 'T' && cKind != 'M') {
cout << "Input error! Please enter T or M." << endl;
cout << "If Time please enter T. If Money please enter M." << endl;
cin.clear(); // 清空输入缓冲区
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略之前输入的字符
cin >> cKind;
}
if (cKind == 'T') {
ArcNode* pT = G.vertices[nStart].Firstarc;
if (pT == NULL) {
return dTorM;
}
for (; pT != NULL; pT = pT->nextArc) {
if (pT->nAdjvex == nEnd) {
if (pT->Information.dTime < dTorM) {
dTorM = pT->Information.dTime;
}
}
}
}
else if (cKind == 'M') {
ArcNode* pM = G.vertices[nStart].Firstarc;
if (pM == NULL) {
return dTorM;
}
for (; pM != NULL; pM = pM->nextArc) {
if (pM->nAdjvex == nEnd) {
if (pM->Information.dCost < dTorM) {
dTorM = pM->Information.dCost;
}
}
}
}
return dTorM;
}
```
怎么修改这个算法double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) { double dTorM = INFINITY*1.0; if (cKind == 'T' || cKind == 'M') { if (cKind == 'T') { ArcNode* pT = G.vertices[nStart].Firstarc; for (; pT != NULL; pT = pT->nextArc) { if (pT->nAdjvex == nEnd) { if (pT->Information.dTime < dTorM) dTorM = pT->Information.dTime; } } } else{ ArcNode* pM = G.vertices[nStart].Firstarc; for (; pM != NULL; pM = pM->nextArc) { if (pM->nAdjvex == nEnd) { if (pM->Information.dCost < dTorM) dTorM = pM->Information.dCost; } } } return dTorM; } else { cout << "Input error! Please enter T or M." << endl; cout << " If Time please enter T. If Money please enter M." << endl; cin >> cKind; return GetWeight(G, nStart, nEnd, cKind); } }
可以按照以下方式修改算法:
1. 在输入参数时,添加一个循环,直到用户输入的参数为'T'或'M'为止。如果用户输入的不是这两个字符,则输出错误信息并要求用户重新输入,直到输入正确为止。
2. 在计算最小权值时,将dTorM的初值设为无穷大,以确保最小权值的准确性。
3. 在遍历邻接表的过程中,先判断邻接表是否为空,如果为空,则直接返回无穷大。如果不为空,则继续遍历邻接表。
修改后的代码如下:
```c++
double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) {
double dTorM = numeric_limits<double>::infinity();
while (cKind != 'T' && cKind != 'M') {
cout << "Input error! Please enter T or M." << endl;
cout << "If Time please enter T. If Money please enter M." << endl;
cin >> cKind;
}
if (cKind == 'T') {
ArcNode* pT = G.vertices[nStart].Firstarc;
if (pT == NULL) {
return dTorM;
}
for (; pT != NULL; pT = pT->nextArc) {
if (pT->nAdjvex == nEnd) {
if (pT->Information.dTime < dTorM) {
dTorM = pT->Information.dTime;
}
}
}
}
else if (cKind == 'M') {
ArcNode* pM = G.vertices[nStart].Firstarc;
if (pM == NULL) {
return dTorM;
}
for (; pM != NULL; pM = pM->nextArc) {
if (pM->nAdjvex == nEnd) {
if (pM->Information.dCost < dTorM) {
dTorM = pM->Information.dCost;
}
}
}
}
return dTorM;
}
```
阅读全文