如何修改double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) { else { cout << "error,please input again" << endl; cout << " If Time please enter T. If Money please enter M." << endl; cin >> cKind; double dTorM = GetWeight(G, nStart, nEnd, cKind); return dTorM; } }
时间: 2024-01-26 14:05:15 浏览: 79
可以修改为以下代码:
```c++
double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) {
double dTorM = 0.0;
if (cKind == 'T' || cKind == 'M') {
// 根据用户输入的类型,获取对应边的权值
if (cKind == 'T') {
dTorM = G.arcs[nStart][nEnd].time;
} else {
dTorM = G.arcs[nStart][nEnd].money;
}
} else {
// 处理用户输入错误的情况
cout << "Input error! Please enter T or M." << endl;
cin >> cKind;
dTorM = GetWeight(G, nStart, nEnd, cKind);
}
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;
}
```
这个循环为什么无法终止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;
}
```
阅读全文