Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Stampa su txt lettere casuali non ripetute.

    Salve, sto cercando di scrivere un programma che mi stampi su file .txt questa stringa:

    else if (y == 'x') y = 'x1';

    con x e x1 delle lettere dell'alfabeto (inglese) casuali per 13 volte (essendo 26 lettere), in modo da utilizzarle tutte, senza ovviamente ripetizioni.


    codice:
    #include <stdio.h>#include<stdlib.h>
    #include <time.h>
    
    
    
    
    int main()
    {
        FILE *fd;
        char let1, let2;
        int cont = 65;
        int i = 0;
        int c = 0;
        int casual;
        int random;
        int array[25];
        int lettera[25];
        
        fd=fopen("rullo.txt", "w");
        
        if( fd==NULL ) { //open if error
        perror("Errore in apertura del file");
        return 0;
        }//End if error
        
        srand(time(NULL));//For random funcion
        
        while(cont <= 90 ){//open while cont
                
                up:
                
                i = 0;
                
                random = rand() % 26;//because rand() %65 + 90 don't work 
                random = random + 65;//
                array[c] = random;
                
                while(i < c){// open i < c
                        if(array[i] == random)goto up;
                        i = i + 1;
                        }//edn while i < c
                        
                here:
                
                i = 0;
                
                casual = rand() % 26;
                casual = casual + 65;
                lettera[c] = casual;
                
                while(i < c){//open while
                        if(lettera[i] == casual)goto here;
                        i = i + 1;
                        }//end while 
                        
                i = 0;
                
                while(i <= c){
                        if(lettera[c] == array[i])goto here;
                        i = i + 1;
                        }
                        
                if(casual == random)goto here;
                        
                let1 = (char)(casual);
                let2 = (char)(random);
                
                fprintf(fd, "\nelse if (y == '%c') y = '%c';", let1, let2);
    
    
                cont = cont + 1;
                c = c + 1;
                }//end while cont
             
    
    
    return 0;
        
        
    }

    Il problema è che tutte le volte mi stampa 15 righe con quindi due lettere ripetute. Le lettere e le linee "errate" non sono sempre le stesse, non riesco proprio a capire, anche se magari sintatticamente scorretto (autodidatta XD) mi sembra che la logica dovrebbe funzionare, disperso nell'oblio . Grazie in anticipo.

    p.s. un aiutino anche per " because 'rand() %65 + 90' don't work " è ben accetto XD Anche qui leggendo su internet la scritto così dovrebbe darmi numeri casuali tra 65 e 90 invece non lo fa.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Che complicato ./.
    Non ho tempo di capire ora, puoi comprendere tu questo intanto!
    codice:
    #include <stdio.h>#include <stdbool.h>
    #include <stdlib.h>
    #include <time.h>
    
    
    int main(void) {
    	srand(time(NULL));
    	int i, r;
    	bool check[26];
    	for(i = 0; i < 26; i++) check[i] = false;
    	i = 0;
    	while(i < 26) {
    		r = rand() % 26;
    		if(check[r]) continue;
    		i++;
    		check[r] = true;
    		printf("%c\n", 'A'+r);
    	}
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Per pescare elementi senza ripetizione si può usare un metodo più efficiente...

    http://forum.html.it/forum/showthrea...1#post25151909
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Grazie ad entrambi, domani cercherò di capire la soluzione di MItaly.
    Scara95 ti amo XD veramente uno spettacolo , sfruttando il tuo metodo sono riuscito a farlo anche in maniera semplice

    codice:
    #include <stdio.h>
    #include<stdlib.h>
    #include <time.h>
    
    int main(){
        
        int a1[25];
        int i = 0;
        int c = 0;
        int d = 1;
        int r1, r2;
        FILE *fd;
        
        fd=fopen("rullo.txt", "w");
        
        if( fd==NULL ) { //open if error
        perror("Errore in apertura del file");
        return 0;
        }//End if error
        
        srand(time(NULL));//For random funcion
        
        while(d <= 26){
                
                fprintf(fd, "case %d:", d);
        
        while(i < 26){
                a1[i] = 0;
                i = i + 1;
                }
                
        i = 0;
        
        while(c < 13){  // open while c < 26
                
                r1 = rand() % 26;
                
                if(a1[r1] == 1) continue;
                
                a1[r1] = 1;
                r2 = rand() % 26;
                
                if(a1[r2] == 1){
                          
                          a1[r1] = 0;
                          continue;
                          
                          }
                          
                c = c + 1;      
                a1[r2] = 1;
                if(c == 1)fprintf(fd, "\nif(y == '%c') y = '%c';", 'A'+r1, 'A'+r2);
                fprintf(fd, "\nelse if(y == '%c') y = '%c';", 'A'+r1, 'A'+r2);
                
                } //end while c < 26    
                
                d = d + 1;
                c = 0;
                fprintf(fd, "\nbreak;");
                fprintf(fd, "\n\n");
                
                }
                
        
        return 0;
    }

    Però sarei comunque curioso, se qualcuno riuscisse a capirlo, per quale motivo il primo codice si comporta in quella maniera strana (a questo punto è mera curiosità )

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Onizuka8 Visualizza il messaggio

    p.s. un aiutino anche per " because 'rand() %65 + 90' don't work " è ben accetto XD Anche qui leggendo su internet la scritto così dovrebbe darmi numeri casuali tra 65 e 90 invece non lo fa.
    Ehm no, quell'espressione restituisce un numero tra 90 compreso e (65+90) escluso.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Ah perfetto grazie, dovevo utilizzare rand() % 25 + 65 XD.
    @MItaly Ho visto il codice che mi hai linkato solo una domanda, come mai utilizzi unsigned int invece che "semplici" int?

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Onizuka8 Visualizza il messaggio
    Ah perfetto grazie, dovevo utilizzare rand() % 25 + 65 XD.
    @MItaly Ho visto il codice che mi hai linkato solo una domanda, come mai utilizzi unsigned int invece che "semplici" int?
    Siccome i numeri random non saranno mai negativi, utilizzando un unsigned int puoi utilizzare un range più ampio.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.