如何在 C++ 中创建 if else 循环而不是多重嵌套?
How create a if else loop in C++ instead of multiple nesting?
我创建了一个 C++ 程序来使用 Dijkstra 算法。
为了在计算中更精确,我创建了一个函数来验证我的 dijkstra 矩阵的 2 个值之间是否存在路径。
我的函数:
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int n = 1;
unsigned int r, s, ta; /* indices courants */
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
//afficher_matrice(tab, rang);
n++;
dijkstra(tab, i - 1, j - 1, rang);
}
else { // (tab[i - 1][j - 1] == 0)
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
unsigned int p, q, r;
for (p = 0; p < rang; p++)
{
for (q = 0; q < rang; q++)
{
for (r = 0; r < rang; r++)
{
puissance_tab[p][q] += tab[p][r] * tab[r][q];
}
}
}
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1,rang);
}
else {
unsigned int s, t, u;
for (s = 0; s < rang; s++)
{
for (t = 0; t < rang; t++)
{
for (u = 0; u < rang; u++)
{
puissance_tab2[s][t] += puissance_tab[s][u] * tab[u][t];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1, rang);
}
else {
unsigned int aaa, ttt, uuu;
for (aaa = 0; aaa < rang; aaa++)
{
for (ttt = 0; ttt < rang; ttt++)
{
for (uuu = 0; uuu < rang; uuu++)
{
puissance_tab3[aaa][ttt] += puissance_tab2[aaa][uuu] * puissance_tab[uuu][ttt];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1, rang);
}
else{
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
}
}
}
cout << endl;
choix(tab,rang);
}
我做了很多if/else嵌套来验证是否存在距离为1、2和3的路径。但是如果路径大于3,则return没有路径在 2 个矩阵值之间。那是因为我嵌套了 if/else。我实现了创建一个循环,你能帮我解决这个问题吗?
整个代码is here, on GitHub.
粗略地看一下您的代码(甚至在尝试理解它之前)就会发现您计算了 puissance_tab3
,并忽略了它。这就是复制粘贴编程的危险。
现在,假设您的意思是 puissance_tab3
,首先要做的是取消嵌套。与其拼出 else
子句,不如立即从 if
:
return
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int n = 1;
unsigned int r, s, ta; /* indices courants */
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
unsigned int p, q, r;
for (p = 0; p < rang; p++) {
for (q = 0; q < rang; q++) {
for (r = 0; r < rang; r++) {
puissance_tab[p][q] += tab[p][r] * tab[r][q];
}
}
}
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1,rang);
return;
}
unsigned int s, t, u;
for (s = 0; s < rang; s++) {
for (t = 0; t < rang; t++) {
for (u = 0; u < rang; u++) {
puissance_tab2[s][t] += puissance_tab[s][u] * tab[u][t];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
unsigned int aaa, ttt, uuu;
for (aaa = 0; aaa < rang; aaa++) {
for (ttt = 0; ttt < rang; ttt++) {
for (uuu = 0; uuu < rang; uuu++) {
puissance_tab3[aaa][ttt] += puissance_tab2[aaa][uuu] * puissance_tab[uuu][ttt];
}
}
}
if (puissance_tab3[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
代码看起来更易于管理。下一步是分解矩阵乘法:
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
matrix_multiply(tab, tab, puissance_tab, rang);
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1,rang);
return;
}
matrix_multiply(puissance_tab, tab, puissance_tab2, rang);
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
matrix_multiply(puissance_tab2, puissance_tab, puissance_tab3, rang);
if (puissance_tab3[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
现在我们快到了。您可以看到希望成为循环的模式。唯一剩下的就是管理这些矩阵。希望你能做到。
不过要提醒一句。我有一个 SWAG,你需要 tab
的连续幂。你计算出完全不同的东西。的确,
puissance_tab = tab * tab = tab ^ 2
puissance_tab2 = puissance_tab * tab = tab ^ 3
puissance_tab3 = puissance_tab2 * puissance_tab = tab ^ 5
不是连续的幂。
我创建了一个 C++ 程序来使用 Dijkstra 算法。 为了在计算中更精确,我创建了一个函数来验证我的 dijkstra 矩阵的 2 个值之间是否存在路径。
我的函数:
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int n = 1;
unsigned int r, s, ta; /* indices courants */
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
//afficher_matrice(tab, rang);
n++;
dijkstra(tab, i - 1, j - 1, rang);
}
else { // (tab[i - 1][j - 1] == 0)
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
unsigned int p, q, r;
for (p = 0; p < rang; p++)
{
for (q = 0; q < rang; q++)
{
for (r = 0; r < rang; r++)
{
puissance_tab[p][q] += tab[p][r] * tab[r][q];
}
}
}
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1,rang);
}
else {
unsigned int s, t, u;
for (s = 0; s < rang; s++)
{
for (t = 0; t < rang; t++)
{
for (u = 0; u < rang; u++)
{
puissance_tab2[s][t] += puissance_tab[s][u] * tab[u][t];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1, rang);
}
else {
unsigned int aaa, ttt, uuu;
for (aaa = 0; aaa < rang; aaa++)
{
for (ttt = 0; ttt < rang; ttt++)
{
for (uuu = 0; uuu < rang; uuu++)
{
puissance_tab3[aaa][ttt] += puissance_tab2[aaa][uuu] * puissance_tab[uuu][ttt];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
//cout << "\n\nAffichage de la matrice a l'ordre " << t - 1;
//afficher_matrice(puissance_tab, rang);
dijkstra(tab, i - 1, j - 1, rang);
}
else{
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
}
}
}
cout << endl;
choix(tab,rang);
}
我做了很多if/else嵌套来验证是否存在距离为1、2和3的路径。但是如果路径大于3,则return没有路径在 2 个矩阵值之间。那是因为我嵌套了 if/else。我实现了创建一个循环,你能帮我解决这个问题吗?
整个代码is here, on GitHub.
粗略地看一下您的代码(甚至在尝试理解它之前)就会发现您计算了 puissance_tab3
,并忽略了它。这就是复制粘贴编程的危险。
现在,假设您的意思是 puissance_tab3
,首先要做的是取消嵌套。与其拼出 else
子句,不如立即从 if
:
return
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int n = 1;
unsigned int r, s, ta; /* indices courants */
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
unsigned int p, q, r;
for (p = 0; p < rang; p++) {
for (q = 0; q < rang; q++) {
for (r = 0; r < rang; r++) {
puissance_tab[p][q] += tab[p][r] * tab[r][q];
}
}
}
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1,rang);
return;
}
unsigned int s, t, u;
for (s = 0; s < rang; s++) {
for (t = 0; t < rang; t++) {
for (u = 0; u < rang; u++) {
puissance_tab2[s][t] += puissance_tab[s][u] * tab[u][t];
}
}
}
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
unsigned int aaa, ttt, uuu;
for (aaa = 0; aaa < rang; aaa++) {
for (ttt = 0; ttt < rang; ttt++) {
for (uuu = 0; uuu < rang; uuu++) {
puissance_tab3[aaa][ttt] += puissance_tab2[aaa][uuu] * puissance_tab[uuu][ttt];
}
}
}
if (puissance_tab3[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
代码看起来更易于管理。下一步是分解矩阵乘法:
void existence_chemin(unsigned int tab[50][50], unsigned int i, unsigned int j, unsigned int rang) {
unsigned int puissance_tab[50][50];
initialisation_matrice_0(puissance_tab);
unsigned int puissance_tab2[50][50];
initialisation_matrice_0(puissance_tab2);
unsigned int puissance_tab3[50][50];
initialisation_matrice_0(puissance_tab3);
if (tab[i - 1][j - 1] != 0) {
cout << endl << " Chemin direct de poids "<< tab[i - 1][j - 1] <<" existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << endl << " Chemin direct entre les sommets " << i << " et " << j << " inexistant.\n Poursuite des recherches en cours ..." << endl;
matrix_multiply(tab, tab, puissance_tab, rang);
if (puissance_tab[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1,rang);
return;
}
matrix_multiply(puissance_tab, tab, puissance_tab2, rang);
if (puissance_tab2[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
matrix_multiply(puissance_tab2, puissance_tab, puissance_tab3, rang);
if (puissance_tab3[i - 1][j - 1] != 0) {
cout << " \nCONCLUSION :\n Chemin existant entre les sommets " << i << " et " << j << "." << endl;
dijkstra(tab, i - 1, j - 1, rang);
return;
}
cout << " \nCONCLUSION :\n Aucun chemin n'existe donc entre les sommets " << i << " et " << j << " sur ce graphe." << endl;
}
现在我们快到了。您可以看到希望成为循环的模式。唯一剩下的就是管理这些矩阵。希望你能做到。
不过要提醒一句。我有一个 SWAG,你需要 tab
的连续幂。你计算出完全不同的东西。的确,
puissance_tab = tab * tab = tab ^ 2
puissance_tab2 = puissance_tab * tab = tab ^ 3
puissance_tab3 = puissance_tab2 * puissance_tab = tab ^ 5
不是连续的幂。