Newsgroup: it.comp.lang.c
Titolo: cicli for innestati

ciao a tutti,
devo costruire un programma  in cui sono presenti  N  cicli  FOR innestati
del tipo:
for(i=0; i<val; i++)
    for(j=0; j<val; j++)
        for(k=0; k<val; k++)
            espessione;
il problema è che il numero N di cicli  FOR da innestare  varia. N è un
valore fornito in input.
É possibile costruire una funzione che innesti il numero  N desiderato di
cicli FOR?
Grazie a tutti !!!


wrotg:

Non c'e' nessun modo migliore per fare quello che devi?
Comuqnue ti presento 1 idea:
come struttura di appoggio usi
int contatori[N]  //allocato dinamicamente se non ti piace cosi'
inizializzi tutto a un valore minimo di default (0 da quanto ho capito
dal tuo codice).
Poi fai una funzione che incrementi il contatore come segue e la
richiami sempre
int funzione (int * contatori, int maxval, int N)
{
  // parto da N e scendo
  while (N > 0) {
    if (contatore[N] < maxval) {
      contatore[N]++;  //il livello corrente
      return 0; //ha trovato il livello giusto
    else
      contatore[N] = 0;
      N--;
  }
  if (N == 0) return -1; //ho completato il ciclo mettendo maxval
nella prima vololla
  return 0;
}
Non garantisco che funzioni perche' non l'ho provata, ma l'idea e'
giusta (sorattutto saranno sbagliati i controlli per far terminare il
ciclo temo).
Al primo passo settare contatori[N] a 1, al secondo metterci 2... al
passo nval mettere contatori[N-1] a 1 e contatori[N] a 0 (resettarlo
in pratica).
In pratica covrebbe sistemarti l'array di appoggio come lo stato della
variabili i, j, k nel ciclo postato da te e farli incrementare nello
stesso modo.
La funzione viene chiamata finche' non si verifica la condizione di
termnazione (return -1) e per ogni volta esegui "espressione" :)
Paolo :)

kelis wrote:

Direi che una delle soluzioni piu' semplici sfrutta la ricorsione:
void nested_for(int index[], int depth) {
  if (depth==0)
    espressione;
  else {
     int i;
     for (i=0; i<val; i++) {
       index[depth-1]=i;
       nested_for(index, depth-1);
     }
}
int main() {
  const int MaxN=10;
  int i[MaxN]; // permesso da C99 ;-)
  int N=MaxN;
  nested_for(i,N);
}
Ho scritto il codice al volo, quindi e' probabile che ci siano degli 
errori. Per accedere ai valori dei vari indici basta riferirsi in modo 
appropriato all'array "index" (una soluzione alternativa era di renderlo 
static all'interno della funzione, ma ho preferito passarlo come 
parametro). Ho dato per scontato che ti servisse accedere ai singoli indici 
dei vari cicli for, altrimenti bastava un semplice elevamento a potenza di 
value.
Curiosta': a cosa ti serve?
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

Curiosta': a cosa ti serve?
Per esempio, per calcolare gli anagrammi di una parola.
<CODE>
#include <stdio.h>
const char *parola = "bus" ;
int main()
{
    int i;
    for (i = 0; i < 3; i++)
    {
        int j;
        for (j = 0; j < 3; j++)
        {
            if (j != i) 
            {
               int k;
               for (k = 0; k < 3; k++)
               {
                   if ((k != j) && (k != i))
                   {
                      printf( "%c%c%c\n", parola[i],
                                          parola[j],
                                          parola[k]);
                   }
               }  
            } 
        }        
    }
    return 0;
}
</CODE>
-- 
Andrea Laforgia - walkietalkie(at)
libero.it

 Per esempio, per calcolare gli anagrammi di una parola.
 
io per calcolare gli anagrammi di una parola avrei usato direttamente un 
procedimento ricorsivo, senza dover passare per cicli N-nested (che, come 
abbiamo visto, si risolvono in una ricorsione...).


abbiamo visto, si risolvono in una ricorsione...).
Bravo.
Non e' detto, pero', che tutti usino lo stesso metodo.


 Bravo.
wow, un "Bravo" da A.L.; credo che stampero' questo post e lo incorniciero' 
accanto al diploma ;-)))



e io, come al solito, rimango viola di invidia...  :-)
ciao
donCiccio

accanto al diploma ;-)))
Diploma ? sei sicuro ?
Si dice "incornicero'".
;)
