Voici le code:
while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
break;
}
}
if (....)
{
......
break;
}
}
}
Il y a beaucoup des boucles 'for' et 'while' qui sont imbriqu=E9es et il
y a aussi de 'break'.
- Est ce que on peut r=E9duire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'int=E9resse au temps d'ex=E9cution le moins
possible ?
- Est ce que 'break' corresponde =E0 quelle boucle dans le hi=E9rarchie
dans ce code ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bertrand Lenoir-Welter
> - Est ce que on peut réduire le nombre de ces boucles 'while' et 'for' et rendre le code plus performant ? ce n'est pas possible de l'optimiser surtout je m'intéresse au temps d'exécution le moins possible ?
Là, ça dépend de ce que vous voulez faire, et en particulier de ce qu'il y a dans vos conditions. Si elles sont disjointes, vous ne réduirez pas grand-chose. Si les if() et les while() ont des conditions identiques ou sous-jacentes, alors il y a peut-être moyen de réduire. L'optimisation consiste surtout à ne pas revérifier une condition qui vient déjà d'être vérifiée et qui ne peut pas avoir changé entre-temps.
Ce n'est pas parce qu'il y a beaucoup de boucles imbriquées que le code n'est pas optimal.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie dans ce code ?
"break" fait un saut juste après l'accolade fermante du niveau courant.
- On peut fixer 'break' de quelle boucle ?
Eh ?
> - Est ce que on peut réduire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'intéresse au temps d'exécution le moins
possible ?
Là, ça dépend de ce que vous voulez faire, et en particulier de ce qu'il
y a dans vos conditions. Si elles sont disjointes, vous ne réduirez pas
grand-chose. Si les if() et les while() ont des conditions identiques ou
sous-jacentes, alors il y a peut-être moyen de réduire. L'optimisation
consiste surtout à ne pas revérifier une condition qui vient déjà d'être
vérifiée et qui ne peut pas avoir changé entre-temps.
Ce n'est pas parce qu'il y a beaucoup de boucles imbriquées que le code
n'est pas optimal.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie
dans ce code ?
"break" fait un saut juste après l'accolade fermante du niveau courant.
> - Est ce que on peut réduire le nombre de ces boucles 'while' et 'for' et rendre le code plus performant ? ce n'est pas possible de l'optimiser surtout je m'intéresse au temps d'exécution le moins possible ?
Là, ça dépend de ce que vous voulez faire, et en particulier de ce qu'il y a dans vos conditions. Si elles sont disjointes, vous ne réduirez pas grand-chose. Si les if() et les while() ont des conditions identiques ou sous-jacentes, alors il y a peut-être moyen de réduire. L'optimisation consiste surtout à ne pas revérifier une condition qui vient déjà d'être vérifiée et qui ne peut pas avoir changé entre-temps.
Ce n'est pas parce qu'il y a beaucoup de boucles imbriquées que le code n'est pas optimal.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie dans ce code ?
"break" fait un saut juste après l'accolade fermante du niveau courant.
- On peut fixer 'break' de quelle boucle ?
Eh ?
Pierre Maurette
glinsat2011, le 08/11/2009 a écrit :
Bonjour,
Voici le code: while (...) { .... for (...) { .... while (....) { if (....) { .... break; }
} if (....) { ...... break; } } }
Il y a beaucoup des boucles 'for' et 'while' qui sont imbriquées et il y a aussi de 'break'.
Je ne trouve pas que la structure de boucles soit spécialement tarabiscotée. Le while extérieur peut parcourir des pages, ou des fichiers. Le for des lignes dans chacun de ces fichiers. Et le while intérieur parcourt des caractères dans la ligne.
- Est ce que on peut réduire le nombre de ces boucles 'while' et 'for' et rendre le code plus performant ? ce n'est pas possible de l'optimiser surtout je m'intéresse au temps d'exécution le moins possible ?
On ne peut pas améliorer cet algorithme systématiquement, il est sain. Peut-être peut-on améliorer le code mais nous ne le connaissons pas. On peut s'amuser à raisonner. Il faudra commencer à vérifier la nécessité des break. Si par exemple le second break disparait, on pourra envisager de fusionner les boucles while extérieure et for. Un peu comme si au lieu de parcourir un tableau par lignes puis chaque ligne par colonne, on parcourait le tableau par élément directement. Ça n'apporte pas nécessairement un gain de performance, d'ailleurs.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie dans ce code ?
[je réponds sur la base du C, mais ça s'applique certainement à tous les langages qui s'en inspirent, à ceci près qu'il peut exister dans ces langages d'autres types de boucles]
Le premier break termine la boucle while intérieure en cours. Attention, une boucle while repartira lors de l'itération suivante de la boucle for.
Le second break termine la boucle for en cours. Attention, une boucle for repartira lors de l'itération suivante de la boucle while extérieure.
Le comportement est:
while (...) { .... for (...) { .... while (....) { if (....) { .... goto break1; //break; }
Un break termine l'exécution de la plus "petite" boucle (ou d'un switch) le contenant. Une boucle ici est exclusivement - en C - un for, un while ou un do..while.
Un if/break dans le while intérieur ne peut terminer ni la boucle for, ni la boucle while extérieure. Un if/break dans la boucle for ne peut terminer le while extérieur. Pour faire ça, il faudrait positionner une variable, faire le break, tester la variable dans la oucle immédiatement supérieure pour éventuellement faire un break, et ainsi de suite. Bref certainement quelque chose de tout à fait illisible. La solition est alors un ... goto vers un label au nom bien choisi. La principale précaution d'emploi du goto est de ne *jamais* poster un tel code dans un forum ;-)
Par exemple si votre "code" était:
while (...) { .... terminate = 0; for (...) { .... while (....) { if (....) { terminate = 1; break; } } if(terminate) { break; } }
Vous pourriez faire:
while (...) { .... for (...) { .... while (....) { ..... if (....) { goto finfor; } ..... } } finfor: ; }
- On peut fixer 'break' de quelle boucle ?
What ?
-- Pierre Maurette
glinsat2011, le 08/11/2009 a écrit :
Bonjour,
Voici le code:
while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
break;
}
}
if (....)
{
......
break;
}
}
}
Il y a beaucoup des boucles 'for' et 'while' qui sont imbriquées et il
y a aussi de 'break'.
Je ne trouve pas que la structure de boucles soit spécialement
tarabiscotée. Le while extérieur peut parcourir des pages, ou des
fichiers. Le for des lignes dans chacun de ces fichiers. Et le while
intérieur parcourt des caractères dans la ligne.
- Est ce que on peut réduire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'intéresse au temps d'exécution le moins
possible ?
On ne peut pas améliorer cet algorithme systématiquement, il est sain.
Peut-être peut-on améliorer le code mais nous ne le connaissons pas.
On peut s'amuser à raisonner. Il faudra commencer à vérifier la
nécessité des break. Si par exemple le second break disparait, on
pourra envisager de fusionner les boucles while extérieure et for. Un
peu comme si au lieu de parcourir un tableau par lignes puis chaque
ligne par colonne, on parcourait le tableau par élément directement. Ça
n'apporte pas nécessairement un gain de performance, d'ailleurs.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie
dans ce code ?
[je réponds sur la base du C, mais ça s'applique certainement à tous
les langages qui s'en inspirent, à ceci près qu'il peut exister dans
ces langages d'autres types de boucles]
Le premier break termine la boucle while intérieure en cours.
Attention, une boucle while repartira lors de l'itération suivante de
la boucle for.
Le second break termine la boucle for en cours. Attention, une boucle
for repartira lors de l'itération suivante de la boucle while
extérieure.
Le comportement est:
while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
goto break1; //break;
}
Un break termine l'exécution de la plus "petite" boucle (ou d'un
switch) le contenant. Une boucle ici est exclusivement - en C - un for,
un while ou un do..while.
Un if/break dans le while intérieur ne peut terminer ni la boucle for,
ni la boucle while extérieure. Un if/break dans la boucle for ne peut
terminer le while extérieur. Pour faire ça, il faudrait positionner une
variable, faire le break, tester la variable dans la oucle
immédiatement supérieure pour éventuellement faire un break, et ainsi
de suite. Bref certainement quelque chose de tout à fait illisible. La
solition est alors un ... goto vers un label au nom bien choisi. La
principale précaution d'emploi du goto est de ne *jamais* poster un tel
code dans un forum ;-)
Par exemple si votre "code" était:
while (...)
{
....
terminate = 0;
for (...)
{
....
while (....)
{
if (....)
{
terminate = 1;
break;
}
}
if(terminate)
{
break;
}
}
Vous pourriez faire:
while (...)
{
....
for (...)
{
....
while (....)
{
.....
if (....)
{
goto finfor;
}
.....
}
}
finfor: ;
}
Voici le code: while (...) { .... for (...) { .... while (....) { if (....) { .... break; }
} if (....) { ...... break; } } }
Il y a beaucoup des boucles 'for' et 'while' qui sont imbriquées et il y a aussi de 'break'.
Je ne trouve pas que la structure de boucles soit spécialement tarabiscotée. Le while extérieur peut parcourir des pages, ou des fichiers. Le for des lignes dans chacun de ces fichiers. Et le while intérieur parcourt des caractères dans la ligne.
- Est ce que on peut réduire le nombre de ces boucles 'while' et 'for' et rendre le code plus performant ? ce n'est pas possible de l'optimiser surtout je m'intéresse au temps d'exécution le moins possible ?
On ne peut pas améliorer cet algorithme systématiquement, il est sain. Peut-être peut-on améliorer le code mais nous ne le connaissons pas. On peut s'amuser à raisonner. Il faudra commencer à vérifier la nécessité des break. Si par exemple le second break disparait, on pourra envisager de fusionner les boucles while extérieure et for. Un peu comme si au lieu de parcourir un tableau par lignes puis chaque ligne par colonne, on parcourait le tableau par élément directement. Ça n'apporte pas nécessairement un gain de performance, d'ailleurs.
- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie dans ce code ?
[je réponds sur la base du C, mais ça s'applique certainement à tous les langages qui s'en inspirent, à ceci près qu'il peut exister dans ces langages d'autres types de boucles]
Le premier break termine la boucle while intérieure en cours. Attention, une boucle while repartira lors de l'itération suivante de la boucle for.
Le second break termine la boucle for en cours. Attention, une boucle for repartira lors de l'itération suivante de la boucle while extérieure.
Le comportement est:
while (...) { .... for (...) { .... while (....) { if (....) { .... goto break1; //break; }
Un break termine l'exécution de la plus "petite" boucle (ou d'un switch) le contenant. Une boucle ici est exclusivement - en C - un for, un while ou un do..while.
Un if/break dans le while intérieur ne peut terminer ni la boucle for, ni la boucle while extérieure. Un if/break dans la boucle for ne peut terminer le while extérieur. Pour faire ça, il faudrait positionner une variable, faire le break, tester la variable dans la oucle immédiatement supérieure pour éventuellement faire un break, et ainsi de suite. Bref certainement quelque chose de tout à fait illisible. La solition est alors un ... goto vers un label au nom bien choisi. La principale précaution d'emploi du goto est de ne *jamais* poster un tel code dans un forum ;-)
Par exemple si votre "code" était:
while (...) { .... terminate = 0; for (...) { .... while (....) { if (....) { terminate = 1; break; } } if(terminate) { break; } }
Vous pourriez faire:
while (...) { .... for (...) { .... while (....) { ..... if (....) { goto finfor; } ..... } } finfor: ; }