Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle imbriqués;

3 réponses
Avatar
Tanguy Briançon
Bonjour,

Soit a<=b deux entiers et c un autre entier.
Soit int t[c];
Je voudrais faire une sorte de boucle sur tout les t tel que
a<=t[1]<=t[2]....t[c]<=b. Si c est fixé il n'y a pas de problème:

for(t[1]=a,b,a++){for t[2]=t[1],...
for(t[c]=t[c-1],b,...

Mais si on ne connait pas c, comment faire? Une idée?

3 réponses

Avatar
Richard Delorme
Le 15/06/2012 01:12, Tanguy Briançon a écrit :
Bonjour,

Soit a<=b deux entiers et c un autre entier.
Soit int t[c];
Je voudrais faire une sorte de boucle sur tout les t tel que
a<=t[1]<=t[2]....t[c]<=b. Si c est fixé il n'y a pas de problème:

for(t[1]=a,b,a++){for t[2]=t[1],...
for(t[c]=t[c-1],b,...

Mais si on ne connait pas c, comment faire? Une idée?



J'ai pas trop compris le problème. Les a, b, t[c] sont des bornes fixes
(constantes) ou des variables ? Que signifie
for (t[1]=a,b,a++)
En C, j'aurais plutôt écrit quelque chose comme
for (t[1] = a; t[1] <= b; ++t[1])

Sinon je pense que la solution à ton problème est la récursion, avec
quelque chose comme ici (je prends les t comme des bornes fixes):

void loop(const int t[], const int c, const int i) {
int j;
if (i < c) {
for (j = t[i - 1]; j < t[i]; ++j) {
loop(t, c, i + 1);
// code manquant utilisant j ?
}
}
}

--
Richard
Avatar
Tanguy Briançon
On 15/06/2012 08:34, Richard Delorme wrote:
Le 15/06/2012 01:12, Tanguy Briançon a écrit :
Bonjour,

Soit a<=b deux entiers et c un autre entier.
Soit int t[c];
Je voudrais faire une sorte de boucle sur tout les t tel que
a<=t[1]<=t[2]....t[c]<=b. Si c est fixé il n'y a pas de problème:

for(t[1]=a,b,a++){for t[2]=t[1],...
for(t[c]=t[c-1],b,...

Mais si on ne connait pas c, comment faire? Une idée?





Bonjour,

Mon message était en effet très mal formulé et bourré de fautes...

J'ai pas trop compris le problème. Les a, b, t[c] sont des bornes fixes
(constantes) ou des variables ? Que signifie
for (t[1]=a,b,a++)
En C, j'aurais plutôt écrit quelque chose comme
for (t[1] = a; t[1] <= b; ++t[1])



Oui en effet... Les borrnes sont a,b,c. t est l'indice de la boucle.
Je veux faire une boucle sur tout les t tels que
a<=t[1]<=.....<=t[c]<=b.

Petite question quelle différence dans le troisième
argument de la boucle for entre ++t[1] et t[1]++?

Sinon je pense que la solution à ton problème est la récursion, avec
quelque chose comme ici (je prends les t comme des bornes fixes):



Je n'ai pas compris ton code...
Je veux pourtant faire une boucle sur les t. Sinon que signifie le
const?

Désolé pour ces questions idiotes...


void loop(const int t[], const int c, const int i) {
int j;
if (i < c) {
for (j = t[i - 1]; j < t[i]; ++j) {
loop(t, c, i + 1);
// code manquant utilisant j ?
}
}
}

Avatar
Richard Delorme
Le 15/06/2012 09:45, Tanguy Briançon a écrit :
On 15/06/2012 08:34, Richard Delorme wrote:
Le 15/06/2012 01:12, Tanguy Briançon a écrit :
Bonjour,

Soit a<=b deux entiers et c un autre entier.
Soit int t[c];
Je voudrais faire une sorte de boucle sur tout les t tel que
a<=t[1]<=t[2]....t[c]<=b. Si c est fixé il n'y a pas de problème:

for(t[1]=a,b,a++){for t[2]=t[1],...
for(t[c]=t[c-1],b,...

Mais si on ne connait pas c, comment faire? Une idée?





Bonjour,

Mon message était en effet très mal formulé et bourré de fautes...

J'ai pas trop compris le problème. Les a, b, t[c] sont des bornes fixes
(constantes) ou des variables ? Que signifie
for (t[1]=a,b,a++)
En C, j'aurais plutôt écrit quelque chose comme
for (t[1] = a; t[1] <= b; ++t[1])



Oui en effet... Les borrnes sont a,b,c. t est l'indice de la boucle.
Je veux faire une boucle sur tout les t tels que
a<=t[1]<=.....<=t[c]<=b.

Petite question quelle différence dans le troisième
argument de la boucle for entre ++t[1] et t[1]++?



++t[1] est équivalent à
t[1] <- t[1] + 1
retourner t[1]

t[1]++ à :
tmp <- t[1]
t[1] <- t[1] + 1
retourner tmp

en théorie, t[1]++ est donc plus compliqué que ++t[1], en pratique les
optimisateurs savent supprimer du code qui n'est pas utilisé et les deux
sont équivalent.


Sinon je pense que la solution à ton problème est la récursion, avec
quelque chose comme ici (je prends les t comme des bornes fixes):



Je n'ai pas compris ton code...



si je comprends, tu veux quelque chose comme :

void loop(const int a, const int b, const int c, int t[], cont int i) {
if (i <= c) {
for (t[i] = a; i <= b; ++t[i]) {
loop(t[i], b, c, t, i + 1):
}
}
}

int main(void)
{
int t[12];

loop(1, 42, 11, t, 1);
}




Je veux pourtant faire une boucle sur les t. Sinon que signifie le
const?



que l'on peut lire la valeur de la variable mais qu'on ne peut pas la
modifier. L'intérêt est que l'on sait si une valeur reste fixe ou peu
être modifié dans le programme. Ça permet aussi au compilateur de mieux
optimiser le programme, mais c'est secondaire.


Désolé pour ces questions idiotes...


void loop(const int t[], const int c, const int i) {
int j;
if (i < c) {
for (j = t[i - 1]; j < t[i]; ++j) {
loop(t, c, i + 1);
// code manquant utilisant j ?
}
}
}