Ciclo for

di il
8 risposte

Ciclo for

Ciao a tutti, avrei bisogno di un aiuto per convertire questa roba in un (o più, non so) cicli for
(sì, è una parte di codice che verifica se c'è una tombola nel tabellone)
if ((M[0][0] != 0) and (M[0][1] != 0) and (M[0][2] != 0) and (M[0][3] != 0) and (M[0][4] != 0) and 
			(M[1][0] != 0) and (M[1][1] != 0) and (M[1][2] != 0) and (M[1][3] != 0) and (M[1][4] != 0) and
			(M[2][0] != 0) and (M[2][1] != 0) and (M[2][2] != 0) and (M[2][3] != 0) and (M[2][4] != 0) or

			(M[0][5] != 0) and (M[0][6] != 0) and (M[0][7] != 0) and (M[0][8] != 0) and (M[0][9] != 0) and
			(M[1][5] != 0) and (M[1][6] != 0) and (M[1][7] != 0) and (M[1][8] != 0) and (M[1][9] != 0) and
			(M[2][5] != 0) and (M[2][6] != 0) and (M[2][7] != 0) and (M[2][8] != 0) and (M[2][9] != 0) or

			(M[3][0] != 0) and (M[3][1] != 0) and (M[3][2] != 0) and (M[3][3] != 0) and (M[3][4] != 0) and
			(M[4][0] != 0) and (M[4][1] != 0) and (M[4][2] != 0) and (M[4][3] != 0) and (M[4][4] != 0) and
			(M[5][0] != 0) and (M[5][1] != 0) and (M[5][2] != 0) and (M[5][3] != 0) and (M[5][4] != 0) or

			(M[3][5] != 0) and (M[3][6] != 0) and (M[3][7] != 0) and (M[3][8] != 0) and (M[3][9] != 0) and
			(M[4][5] != 0) and (M[4][6] != 0) and (M[4][7] != 0) and (M[4][8] != 0) and (M[4][9] != 0) and
			(M[5][5] != 0) and (M[5][6] != 0) and (M[5][7] != 0) and (M[5][8] != 0) and (M[5][9] != 0) or

			(M[6][0] != 0) and (M[6][1] != 0) and (M[6][2] != 0) and (M[6][3] != 0) and (M[6][4] != 0) and
			(M[7][0] != 0) and (M[7][1] != 0) and (M[7][2] != 0) and (M[7][3] != 0) and (M[7][4] != 0) and
			(M[8][0] != 0) and (M[8][1] != 0) and (M[8][2] != 0) and (M[8][3] != 0) and (M[8][4] != 0) or

			(M[6][5] != 0) and (M[6][6] != 0) and (M[6][7] != 0) and (M[6][8] != 0) and (M[6][9] != 0) and
			(M[7][5] != 0) and (M[7][6] != 0) and (M[7][7] != 0) and (M[7][8] != 0) and (M[7][9] != 0) and
			(M[8][5] != 0) and (M[8][6] != 0) and (M[8][7] != 0) and (M[8][8] != 0) and (M[8][9] != 0))
			{
			cout << "\n\n\t\t\t\t\tTOMBOLA!";
			tombola = 1;
			}

8 Risposte

  • Re: Ciclo for

    Prova tu
    
     for(i=0;i<6;i++){
       int tot = 0;
       for(j=0;j<3;j++)
           for(k=0;k<5;k++)
             if(...)
                 tot++;
       if(tot == 15){
          ...
          break;
       }
     }
    
  • Re: Ciclo for

    Weierstrass ha scritto:


    Prova tu
    
     for(i=0;i<6;i++){
       int tot = 0;
       for(j=0;j<3;j++)
           for(k=0;k<5;k++)
             if(...)
                 tot++;
       if(tot == 15){
          ...
          break;
       }
     }
    
    ci sono in parte riuscito, ma la tombola la fa solo alla prima cartella...
    devo lavorare sui contatori J e K per "controllare" le altre 5 cartelle o c'è altro che mi sto perdendo?
    for (i = 0; i < 6; i++) 
    	{
    		int tot = 0;
    		for (j = 0; j < 3; j++)
    			for (k = 0; k < 5; k++)
    				if (M[j][k] != 0) {
    					tot++;
    				}
    
    				if (tot == 15) {
    					cout << "\n\n\t\t\t\t\tTOMBOLA!";
    					break;
    				}
    		
    	}
  • Re: Ciclo for

    
    if (M[(i/2)*3+j][(i&1)*5+k]) {
    
    Ridefinisci M[][][] se vuoi evitare divisione e resto per due
  • Re: Ciclo for

    Weierstrass ha scritto:


    
    if (M[(i/2)*3+j][(i&1)*5+k]) {
    
    Ridefinisci M[][][] se vuoi evitare divisione e resto per due
    aspetta, non sto capendo xD
    questo è il programma completo, a scuola lo stiamo facendo passo dopo passo, per questo ancora mancano ambo ecc
    #include <iostream>
    using namespace std;
    
    int i, j, k;
    int cinquina = 0;
    void tombo();
    void cinqui();
    void tabellone();
    void azzeraMatrice();
    void inserisciNumero();
    int r, c, n;
    int M[9][10];
    int main()
    {
    	azzeraMatrice();
    	tabellone();
    	inserisciNumero();
    
    }
    
    void cinqui()
    {
    	for (int i = 0; i < 9; i++)
    	{
    		if ((M[i][0] != 0) and (M[i][1] != 0) and (M[i][2] != 0) and (M[i][3] != 0) and (M[i][4] != 0) or
    			(M[i][5] != 0) and (M[i][6] != 0) and (M[i][7] != 0) and (M[i][8] != 0) and (M[i][9] != 0))
    		{
    			cout << "\n\n\t\t\t\t\tCinquina!";
    			cinquina = 1;
    		}
    		
    	}
    }
    
    
    void tabellone()
    {
    	cout<<"\n\n\t\t\t\t-- GIOCO DELLA TOMBOLA --";
    	cout<<"\n\n";
    	cout<<"\n\t_________________________________________________________________________";
    	for (int i = 0; i < 9; i++) {
    		cout << "\n\n";
    
    		for (int j = 0; j < 10; j++) {
    			cout << "\t" << M[i][j];
    		}
    	}
    	cout<<"\n\t_________________________________________________________________________";
    }
    
    
    void azzeraMatrice()
    {
    	for (r = 0; r < 9; r++) {  //azzeramento matrice
    		for (c = 0; c < 10; c++) {
    			M[r][c] = 0;
    		}
    	}
    }
    
    
    void inserisciNumero()
    {
    	for (int i = 0; i < 9; i++) {
    		for (int j = 0; j < 10; j++) {
    			cout << "\n\n\t\t\t\tInserisci numero --> ";
    			cin >> n;
    			system("cls");
    			tabellone();
    			r = (n - 1) / 10;
    			c = (n - 1) % 10;
    			M[r][c] = n;
    			tombo();
    			if (cinquina == 0) cinqui();
    		}
    	}
    }
    
    
    void tombo()
    {
    	for (i = 0; i < 6; i++) 
    	{
    		int tot = 0;
    		for (j = 0; j < 3; j++)
    			for (k = 0; k < 5; k++)
    				if (M[j][k] != 0) {
    					tot++;
    				}
    
    				if (tot == 15) {
    					cout << "\n\n\t\t\t\t\tTOMBOLA!";
    					break;
    				}
    				
    	}
    
    }
  • Re: Ciclo for

    Te l'ho scritto cosa devi mettere nell'if
    Avrebbe avuto più senso un tabellone M[6][3][5], con M[9][10] devi usare delle formule.

    In ogni caso puoi anche lasciare la soluzione originale, perché ti risparmia le istruzioni dei for e sicuramente non ci sarà mai una tombola con un totale di elementi diverso da 90
  • Re: Ciclo for

    Weierstrass ha scritto:


    Te l'ho scritto cosa devi mettere nell'if
    Avrebbe avuto più senso un tabellone M[6][3][5], con M[9][10] devi usare delle formule.

    In ogni caso puoi anche lasciare la soluzione originale, perché ti risparmia le istruzioni dei for e sicuramente non ci sarà mai una tombola con un totale di elementi diverso da 90
    dove devo metterlo
    if (M[(i/2)*3+j][(i&1)*5+k]) {
    ?

    edit: come non detto, l'ho fatto, grazie
    ora potrei avere una spiegazione su questa formula M[(i/2)*3+j][(i&1)*5+k] perchè non mi è chiarissima?
    in particolare non so minimamente cosa sia i&1, nel dubbio chiedo subito se c'è anche un modo più semplice per scrivere la formula
  • Re: Ciclo for

    Hai ragione. Avrei dovuto scrivere "%2" che è il resto della divisione per 2 . "&1" è un modo più efficace di scrivere il resto per due, così come ">>1" sarebbe un modo più efficace di scrivere il quoziente della divisione per due.
    Quoziente e resto di i diviso 2 ti dicono da che parte devi iniziare a contare con j e k nel tuo tabellone per ricostruire le sei schede - sono le stesse operazioni che faresti a mente intuitivamente

    Al posto di i potresti usare altre due variabili m e n che vanno da 0 a 2 e da 0 a 1
  • Re: Ciclo for

    Weierstrass ha scritto:


    Hai ragione. Avrei dovuto scrivere "%2" che è il resto della divisione per 2 . "&1" è un modo più efficace di scrivere il resto per due, così come ">>1" sarebbe un modo più efficace di scrivere il quoziente della divisione per due.
    Quoziente e resto di i diviso 2 ti dicono da che parte devi iniziare a contare con j e k nel tuo tabellone per ricostruire le sei schede - sono le stesse operazioni che faresti a mente intuitivamente
    grazie mille
Devi accedere o registrarti per scrivere nel forum
8 risposte