Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    problema combinazioni generatore di parole con numeri linguaggio c

    Ringraziandovi degli aiuti che mi sono stati offerti le altre volte che ho postato
    sul forum,ho ancora bisogno di voi .

    il linguaggio come da titolo e' c e uso djgpp

    Il programma deve generare con i numeri ogni possibile combinazione da poter formare
    con lettere abbinate delle parole.

    Per esempio il numero 2 della matrice card e con RIGA impostata a 7 deve dare un massimo di combinazioni che corrispondono a 3^7=2187 e cio 3 sono lettere abbinate a 2(abc) e 7 sono le volte che viene composto il numero.

    Il problema e' questo che se faccio con il numero 7(pqrs) o 9(wxyz) la potenza diventa 4^7=16384 e il risultato si blocca dopo aver fatto circa 5400 combinazioni.
    La stessa cosa avviene se scrivi 8 numeri con tre lettere che come potenza e' 3^8=6561.

    Per farla breve sembra che superato all'incirca le 5400 combinazioni il programma vada in panne.

    Non capisco il motivo, forse c'e' qualcosa nel programma che io non riesco a vedere.
    Percio mi rimetto alla vostra clemenza.

    l'immagine sotto mostra in esecuzione il numero 2(abc) combinazioni 2187 e il numero 9(wxyz) combinazioni 16384

    l'immagine del 9 non e' tagliata e' che il programma chiude l'esecuzione a quel punto.
    io ho fatto una prova inserendo una variabile contatore ed ho notato che si blocca dopo aver fatto circa 5400 combinazioni.

    http://img11.imageshack.us/img11/8669/combinazioni.jpg

    inserisco il programma sperando che sia comprensibile dato che l'ho creato io e essendo un principiante gli errori sono dietro l'angolo



    codice:
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define RIGA 7
    #define COLONNA 5
    
    
    int count=0;
     void sposta(char controlla[][COLONNA],int i,int j);
     void combina(char numero[][COLONNA],char controlla[][COLONNA]);
     void copia(char numero[][COLONNA],char controlla[][COLONNA],int partenza,int fine); 
     void abbina(char numero[][COLONNA], char controlla[][COLONNA]);
    
    
    main(){
    	int riga=0, muovi=0, digita=0;
    	char tel[15], c[2]={' ','\0'};
    	char telefono[RIGA][COLONNA], controlla[RIGA][COLONNA];
    	char card[10][COLONNA]={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    
    	gets(tel);
    	while(muovi<RIGA){
    		c[0]=tel[muovi];
    		digita=atoi(c);
    		strcpy(&telefono[riga][0],&card[digita][0]);
    		strcpy(&controlla[riga][0],&card[digita][0]);
    		++riga;
    		++muovi;
    	}
    	
    	combina(telefono,controlla);
    	printf("\nCombinazioni N.%d\n",count);
    
    }
    
    
    
    void sposta(char controlla[][COLONNA],int i,int j){
    	char copia;
    	int x=0;
    	int totale=0;
    	int colonna;
    	totale=strlen(&controlla[i][0]);
    	colonna=totale;
    
    		while(totale>0 && x<colonna-1){
    
    		   copia=controlla[i][x];
    		   controlla[i][x]=controlla[i][x+1];
    		   controlla[i][x+1]=copia;
    		   ++x;
    		   --totale;
    		}    
    		
    		controlla[i][x]='0';
    		controlla[i][x+1]='\0';
    }
    
    void combina(char numero[][COLONNA],char controlla[][COLONNA]){
        int i,j;
    	int conta=0;
    	
      	 while(conta<RIGA){
    	  
    	  printf("%c",controlla[conta][0]);
    	  ++conta;
    	}  
          ++count;
    	  printf("\n");
    	
    		
         abbina(numero,controlla);
    	
    }
    
    void copia(char numero[][COLONNA],char controlla[][COLONNA],int partenza,int fine){
        int i,j;
    	
    	for(i=partenza;i<RIGA;i++){
    		for(j=0;j<COLONNA;j++){
    		  memcpy(&controlla[i][j],&numero[i][j],4);
    		}
        }
    	
    }	
    
    void abbina(char numero[][COLONNA], char controlla[][COLONNA]){
        int muovi=0,stop=0;
    
    		for(muovi=0;muovi<RIGA;muovi++){
                		  			
    
    		 if(controlla[(RIGA-1)-muovi][1]!='0' && controlla[(RIGA-1)-muovi][1]!='\0' ){
    			
    				 sposta(controlla,(RIGA-1)-muovi,0);
    				 copia(numero,controlla,(RIGA-1)-muovi+1,0);
    				 stop=1;
    				 muovi=RIGA+1;
    		    }
    		}
    		
    		if(stop==1) 
           	combina(numero,controlla);
    		 
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho esaminato approfonditamente il programma ma ho notato che dalla funzione "combina" chiami la funzione "abbina" e da quest'ultima chiami nuovamente la "combina".

    Se questo comportamento ricorsivo è voluto, potrebbe essere la causa del problema. Dato che queste chiamate ricorsive occupano tanto stack e lo stack è limitato, potresti avere il comportamento anomalo che noti.

    In questo caso per rimediare dovresti aumentare lo stack disponibile, tramite una opzione che dipende dal compilatore/linker che usi.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    intanto ti ringrazio per avermi risposto subito.

    si io volevo proprio scriverlo cosi pero' dato che penso che potresti aver ragione tu forse provero' a scriverlo in modo differente non essendo in grado di modificare il compilatore che uso

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non devi modificare il compilatore (ci mancherebbe) ... devi modificare l'opzione riguardante lo spazio riservato allo stack dal linker.

    Anche se, riscrivendolo in maniera iterativa e non ricorsiva, risolvi comunque ed eviti questi problemi.

    P.S. Per il tuo compilatore potresti provare a modificare, all'inizio del codice, la variabile locale che determina lo spazio dello stack

    unsigned _stklen = 1048576 * 64;

    e provare se il programma si ferma nello stesso punto ... (dovrebbe fermarsi dopo ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ok allora lo scrivero' in modo iterativo

    oregon volevo ringraziarti perche anche un'altra volta mi hai aiutato.

    sei sempre veloce e preciso nel rispondere e considerato che lo fai gratis ti fa onore

    allora faro come dici ci sentiamo alla prossima

  6. #6
    scusa non avevo letto l'aggiunta della tua risposta allora provero come dici tu

  7. #7
    GRANDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    CHE SCHIAPPA CHE SONO TU CON UNA SOLA VARIABILE HAI RISOLTO IL PROBLEMA

    ancora grazie

  8. #8
    uso djgpp
    Uhm, djgpp genera eseguibili DOS, forse sarebbe il caso di passare a qualcosa di un po' più aggiornato...
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    per Mitaly.

    ho appena installato mingw anche se essendo un principiante non ho ben capito la differenza con djgpp dato che per eseguirlo devo sempre aprire il prompt dei comandi.

    Da quello che ho capito mi sembra piu potente di djgpp dato che per esempio con il programma che ho scritto qui lo esegue senza bloccarsi anche se non uso la variabile consigliatami da oregon

    comunque colgo l'occasione per ringraziare anche te dato che in una mia domanda precedente mi avevi aiutato

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quella variabile gestisce lo stack solo per djgpp non per mingw.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.