Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Grazie per la pillola

  2. #12
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Dunque ho completato il mio problema, ma ho questa situazione:
    quando compilo e mando in esecuzione, mi esce per un secondo la schermata vuota del DOS e poi si chiude....il getch l'ho messo e nn è qui il problema ma mi sono accorto che il tutto deriva dal fatto che ripeto otto volte la procedura regina().
    Si perchè provando ad eseguirla sei volte, funziona, ho l'esecuzione e il tutto va correttamente (quindi mi posiziona le sei regine correttamente) ma se ripeto sette o + volte nn va.....
    Perchè???

    posto il programma completo, dove in grassetto ho messo il codice che sicuramente funziona e nn influisce sul mio problema:

    codice:
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.c>
    
    //dichiaro la matrice 8X8 per la scacchiera
    const int n=8;
    int sc[n][n];
    int i, j, rip;
    void generazione_scacchiera(void);
    void regina(void);
    int criga(int);
    int ccolonna(int);
    int cdp(int,int);
    int cds(int,int);
    void visualizzazione(void);
    
    int main(){
      //genero la scacchiera
      generazione_scacchiera();
      //ripeto per otto volte regina() per posizionare otto regine
      for(rip=0;rip<=8;rip++)
         regina();
      //visualizzo la scacchiera
      visualizzazione();
      getch();
      return 0;
    }
    
    void generazione_scacchiera(void){
           for(i=0;i<=n-1;i++)
              for(j=0;j<=n-1;j++)
                  if((i%2)==0){
                      if((j%2)==0)
                         sc[i][j]=0;
                      else
                         sc[i][j]=1;
                  }
                  else{
                      if((j%2)==0)
                         sc[i][j]=1;
                      else
                         sc[i][j]=0;
                  }
    }
    
    
    void regina(void){
           i=(rand()%8);
           j=(rand()%8);
           if( (criga(i)==1) && (ccolonna(j)==1) && (cdp(i,j)==1) && (cds(i,j)==1) )
               sc[i][j]=10;
           else
               regina();
    }
    
    int criga(int x){
           int k, occupato=0;
           for(k=0;k<=n-1;k++){
                if(sc[x][k]==10)
                    occupato=1;
           }
           if(occupato==1)
                   return 2;
           else
                   return 1;
    }
    
    int ccolonna(int x){
           int k, occupato=0;
           for(k=0;k<=n-1;k++){
                if(sc[k][x]==10)
                   occupato=1;
           }
           if(occupato==1)
                   return 2;
           else
                   return 1;
    }
    
    int cdp(int x, int y){
       int k, m, occupato=0;
        if(x>y){
          for( k=x-y, m=0 ; (k<=n-1)&&(m<=n-1) ; k++,m++ )
            if(sc[k][m]==10)
                  occupato=1;
        }
        else{
          for(k=0, m=y-x ; (k<=n-1)&&(m<=n-1) ; k++,m++)
            if(sc[k][m]==10)
                  occupato=1;
        }
        if(occupato==1)
                   return 2;
           else
                   return 1;
    }
    
    int cds(int x,int y){
       int k, m, occupato=0;
         if(x+y < 8){
            for(k=0, m=x+y; (k<=n-1)&&(m>=0); k++, m--)
                if(sc[k][m]==10)
                  occupato=1;
         }
         else{
            for(k=x+y-7, m=7; (k<=n-1)&&(m>=0); k++, m--)
                if(sc[k][m]==10)
                  occupato=1;
         }
         if(occupato==1)
                   return 2;
           else
                   return 1;
    }
    
    
    void visualizzazione (void){
        for(i=0;i<=7;i++){
            gotoxy(17,1+(i*3));
            cout<<"_______________________________________________";
            gotoxy(16,2+(i*3));
            cout<<"|     |     |     |     |     |     |     |     |";
            gotoxy(16,3+(i*3));
            cout<<"|     |     |     |     |     |     |     |     |";
            gotoxy(17,4+(i*3));
            cout<<"-----------------------------------------------";
        }
    
        for(i=0;i<=n-1;i++){
         for(j=0;j<=n-1;j++){
             gotoxy(19+(j*6),3+(i*3));
             if(sc[i][j]==10)
                 cout<<"R ";
             if(sc[i][j]==1)
                 cout<<"N ";
             if(sc[i][j]==0)
                 cout<<"- ";
         }
       }
    }

    Aiutatemi

  3. #13
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    Il problema non è nel codice ma nella logica del programma!
    Ti ho già detto che se procedi casualmente senza metodo non avrai un risultato senza una grande dose di fortuna.
    Al 6°-7°-8° passaggio, il programma non trova piuò posizioni libere visto che sono già tutte occupate, c'è una risorsività infinita e superi i limiti dello stack.
    Ti conviene preparare un metodo(come il mio) o almeno un controllo se è tutto occupato.
    Ti conviene anche cambiare stile di programmazione, orientandoti più verso le classi.


  4. #14
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Originariamente inviato da edriv
    Il problema non è nel codice ma nella logica del programma!
    Ti ho già detto che se procedi casualmente senza metodo non avrai un risultato senza una grande dose di fortuna.
    Al 6°-7°-8° passaggio, il programma non trova piuò posizioni libere visto che sono già tutte occupate, c'è una risorsività infinita e superi i limiti dello stack.
    Ti conviene preparare un metodo(come il mio) o almeno un controllo se è tutto occupato.
    Ti conviene anche cambiare stile di programmazione, orientandoti più verso le classi.


    Bhe io ho scritto il prog secondo le mie capacità, lo studio delle classi ancora nn l'ho affrontato...sono appena arrivato alle funzioni
    quindi mi sà che per il momento questo è l'unico metodo che mi è possibile....
    Come fare per gestire lo stack e liberarlo ?
    Per lo meno vorrei concludere il mio prog

  5. #15
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    Si può fare anche senza le classi (anzi va benissimo, forse meglio).
    Non puoi liberare lo stack perchè è indispensabile per la ricorsività.
    Potresti eliminare la ricorsione che è completamente inutile (usando un ciclo while), ma otterresti un ciclo semi-infinito.
    Nel senso che anche se il programma continuasse a cacolare senza problemi, non troveresti mai una soluzione perchè procedendo sempre a caso la probabilità di azzeccarla sarebbe bassissima, dell'ordine di 1/(2^64) come esempio...

  6. #16
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Originariamente inviato da edriv
    Si può fare anche senza le classi (anzi va benissimo, forse meglio).
    Non puoi liberare lo stack perchè è indispensabile per la ricorsività.
    Potresti eliminare la ricorsione che è completamente inutile (usando un ciclo while), ma otterresti un ciclo semi-infinito.
    Nel senso che anche se il programma continuasse a cacolare senza problemi, non troveresti mai una soluzione perchè procedendo sempre a caso la probabilità di azzeccarla sarebbe bassissima, dell'ordine di 1/(2^64) come esempio...


    Ho capito...grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.