Ciclo for in due variabli

di il
34 risposte

Ciclo for in due variabli

Salve ragazzi,

avevo un problema con un ciclo for (che fra poco vi spiego) e ho provato a cercare una soluzione in rete che, a quanto pare non c'è, però...ho trovato questo forum...a dir poco mostruoso!! (in senso positivo)... organizzato molto bene e con una vastissima gamma di argomenti che mi incuriosiscono.

Dunque, il mio problema (premetto che non sono un esperto del linguaggio c e c++ ,ho solo fatto un paio di esami all'università) è questo:

ho due numeri (A e B) che inserisco da tastiera alla macchina;
ho due numeri (a e b) che la macchina mi deve restituire come risultato e
ho due condizioni che tali numeri (a e b) devono rispettare, in funzione di (A e B).

la mia idea era: creare un ciclo for "in due variabili". Ovvero modificare in qualche modo la sintassi: for (int i=0, i<x, i++) {...} in modo tale che per ogni coppia di valori (i,j), che sarebbe (a,b), la macchina deve verificare effettivamente sono valgono le condizioni imposte dal problema. Si può dunque modificare il ciclo for per questo scopo, oppure ho sbagliato completamente il ragionamento?

p.s. perdonatemi se non ho rispettato qualche regola del regolamento essendo novello, anzi ditemelo che rimedio subito. Grazie

34 Risposte

  • Re: Ciclo for in due variabli

    Non ho capito cosa vorresti fare e soprattutto non ne ho capito il perché.

    Secondo me dovresti fare un esempio pratico, soprattutto per quel che riguarda le condizioni di cui parli.
  • Re: Ciclo for in due variabli

    E' un pezzo di un programma più grande. Devo trovare due numeri (a,b) che rispettano delle condizioni legate a due numeri fissati (A,B).
    
    float A, B, a, b;
    cout<<"Inserire il numero A:";
    cin>>A;
    cout<<"Inserire B:";
    cin>>B;
    
    Le condizioni sono:

    a*A-a-b>a+b
    b*B-b-a>a+b

    Ora io non so più cosa scrivere.
    Se scrivo una cosa del genere:
    
    int x; //non importa quanto valga x
    for(int i=0, i<x, i++) {....}
    
    la macchina verifica per ogni i (associato per esempio ad a) se la prima condizione è vera.
    Ma questa sintassi non va bene perché sono due le variabili: a e b. La mia macchina deve mettere valori diversi sia ad a che a be finchè non sono rispettate entrambe le condizioni.
  • Re: Ciclo for in due variabli

    Guarda ... secondo me un programma non ha senso.

    E' una questione matematica ... imposta due disequazioni da quei criteri e il relativo sistema ... Le soluzioni saranno identificate da un piano e i valori al suo interno saranno valori possibili da utilizzare per A e B in funzione di x e y ... (ho lontani ricordi e potrei sbagliarmi ...)
  • Re: Ciclo for in due variabli

    Ho provato a risolvere il relativo sistema...ma le variabili dipendono l'una dall'altra, non puoi risolverlo se non ne fissi almeno una! Se per esempio risolvi rispetto ad "a"..."b" dipende da "a"... è circolo vizioso..se non metto a e b non posso trovare le soluzioni.
  • Re: Ciclo for in due variabli

    Per questo ho pensato ad un ciclo che che inserisca diversi valori in a e in b contemporaneamente finché non sono verificate contemporaneamente le due condizioni.
  • Re: Ciclo for in due variabli

    Devi usare due cicli di quale uno annidato.
    
    For ( a=0 ; a < A; a++)
        for( b = 0; b < B ; b++)
            if (miacondizione) return o goto
    
    Scusa per il codice ma dal minicell non riesco a fare meglio,non trovo nemmeno le graffe!
    Per uscire dal ciclo annidato senza retur é ammesso l'uso della goto.
  • Re: Ciclo for in due variabli

    Quindi posso usare a e b come se fossero i miei "indici" che variano?!
    Cioè nella sintassi: for (int i=0, i<x, i++){...} posso considerare a e b proprio uguali ad i ?!
    
    For ( a=0 ; a < A; a++)
        for( b = 0; b < B ; b++)
            if (miacondizione) return o goto
    
    Ma visto che ho due condizioni che devono valere contemporaneamente non dovrei inserire i comandi booleani?
  • Re: Ciclo for in due variabli

    Scusatemi se mi intrometto nella discussione.
    ma perchè usi o vorresti usare un ciclo for?
    quando puoi usare un semplice comando while ?
    esempio:
    
    int i=0;
    int a,A,b,B,c,d,e;
    while (i==0)
    {
    c=a+b;
    d=(a*A)-(a-b); e=(b*B)-(a-b);
    if (d>c)&&(e>c) { i=1; // serve per uscire dal ciclo }
    else { a++; b++; /ed altre operazioni che vuoi }
    }
    
    naturalmente questo e solo un esempio che puoi adattare facilmente l tuo caso.
    spero di esserti stato d'aiuto
  • Re: Ciclo for in due variabli

    Beh mi sembra una soluzione ottimale ma ti spiego il perché:
    siccome è un estratto di un problema economico l'utente deve scegliere una massimo per a e b o meglio a+b deve essere minore di un certo valore x deciso dall'utente. Per questo ho pensato ad un ciclo for...il while, invece, continuerà all'infinito a provare finchè non trova a e b. La mia macchina invece mi deve dire: guarda, esistono a e b che rispettano le condizioni e tali che a+b sia minore di x; oppure mi deve dire: non esistono a e b che rispettano quelle condizione e tali che a+b sia minore di x (però può darsi che esistano se a+b è maggiore di x, ma non importa perchè l'utente ha deciso che a+b al massimo sia x). Quindi la macchina mi deve dire se esiste la coppia (a,b), e se esiste può esisterne una sola oppure più di una (senza contare quelle ottenute per proporzione). E' qui vabbè ci sta un'altra condizione da dare alla macchina per farle scegliere il valore più grande che ha trovato per a e b che rispettano le condizioni e tali che a+b sia minore di x.
    Quindi...posso imporre con il while un lime massimo (sembra un'eresia), per esempio in questo modo:
    
    int i=0,;
    int a,A,b,B,c,d,e,x;
    while (i==0)
    {
    c=a+b<x;  */ oppure:  c=a+b;
                                     c<x;    /*   
    d=(a*A)-(a+b); e=(b*B)-(a+b);
    if (d>c)&&(e>c) { i=1; cout<<"">>i; // se scrivo così me li stampa a video? }
    else { a++; b++; /ed altre operazioni che vuoi }
    }
    
  • Re: Ciclo for in due variabli

    Usando solo un ciclo otterrai che tutti i valori di "a" sarranno uguali a tutti quelli di "b" non riuscendo mai ad ottenere valori tipo "a=1 b=2" ma avrai sempre "a=1,b=1","a=2,b=2" quindi non si avranno tutte le possibili soluzioni.
    La tecnica piu semplice è
    
    
    int main()
    {
        int A = 10;
        int B = 32;
    
        int a,b;
    
        for ( a = 0; a < A; a++ )
        {
            for ( b= 0; b < B; b++ )
            {
                if ( (a * A - a - b > a + b) && (b * B - b - a > a + b) )
                    goto OKL;
            }
        }
    
        // NON TROVATO
        return -1;
    
        OKL:
        //trovato
        return 0;
    
    }
    
    E per non aver ripetizioni:
    
    int main()
    {
        int A = 10;
        int B = 32;
    
        int a,b;
    
        for ( a = 0; a < A; a++ )
        {
            for ( b = a; b < B; b++ )
            {
                if ( (a * A - a - b > a + b) && (b * B - b - a > a + b) )
                    goto OKL;
            }
        }
    
        // NON TROVATO
        return -1;
    
        OKL:
        //trovato
        return 0;
    
    }
    
    Ora cerca di riadattarlo meglio, magari creando una funzione che accetti A e B e ritorni a e b.
  • Re: Ciclo for in due variabli

    Ma A e B non li fisso io, li fissa l'utente quindi creo la funzione che accetti A e B. OK.
    
        int A, B;
    
        cout<<"Inserire A: ";
        cin>>A;
        cout<<"Inserire B: ";
        cin>>B;
    
    
    Ma a e b possono essere più grandi di A e B, non posso mettere nel ciclo a<A e b<B, perchè sicuramente (essendo un problema economico) saranno più grandi di A e B. L'unica cosa che non possono essere è essere maggiore di a+b. Ma non posso mettere nel ciclo a<a+b e b<a+b. Giusto?
    
        int a,b;
    
        for ( a = 0; a < (a+b); a++ )
        {
            for ( b= 0; b < (a+b); b++ )
            {
                if ( (a * A - a - b > a + b) && (b * B - b - a > a + b) )
                    goto OKL;
            }
        }
    
        // NON TROVATO
        return -1;
    
        OKL:
        //trovato
        return 0;
    
    
  • Re: Ciclo for in due variabli

    Esatto, devi comunque dargli un limite altrimenti lui lavora all'infinito.
    Imponi un limite massimo per a e per b che naturalmente esisterà!
  • Re: Ciclo for in due variabli

    No....non esiste un limite massimo per a e un limite massimo per b... esiste un solo limite massimo ed è dato da a+b. Questo è il problema...Il concetto economico è che il cristiano deve fare due investimenti: un investimento a e un investimento b. Il cristiano non da un massimo per l'investimento a un massimo per l'investimento b, dice solo che la somma dei due investimenti non deve superare una certa cifra x.
  • Re: Ciclo for in due variabli

    Per esempio... il cristiano deve investire 100. Massimo 100. Quindi a+b=100. Ciò vuol dire che nei casi estremi a=100 e b=0 e viceversa... quindi il massimo per a è 100 e il massimo per b è 100.
    Ma io non so quanto è il massimo...lo decide il cristiano che usa il programma.
    Quindi io dovrei mettere nel ciclo for questo:
    for (a=0, a<(a+b), a++){...}
    che mi sembra di capire non si possa fare. Potrei fare una cosa del genere:
    
    int Y;
    
    Y=a+b; //con a e b inserita da tastiera dall'utente
    
    e poi scrivere:
    for (a=0, a<Y, a++){...}
    Ma credo che sia solo spostare il problema perchè comunque Y dipende da a e da b.
Devi accedere o registrarti per scrivere nel forum
34 risposte