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

    [C]Generare numeri senza ripeterli

    Ciao a tutti.
    Devo implementare un algoritmo che generi numeri da inserire in un vettore, ma senza mai generare numeri uguali.
    In pratica genero un primo numero e lo inserisco nella prima cella del mio vettore. Genero il secondo numero ke andrà nella seconda cella, ma dovrà essere diverso dal primo generato e cosi via.
    In pratica devo riempire un vettore con dei numeri casuali presi in un range tra 0 e un N preso in input.
    Per generare i numeri pensavo alla funzione srand. Ma come posso risolvere il problema delle ripetizioni? in pratica devo creare una permutazione..

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    La funzione genRPerm prende com input un intero positivo n e restituisce un array di interi in cui gli n numeri da zero a n-1 sono disposti casualmente:

    codice:
    #include <stdlib.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Perfetto!
    Grazie per l'aiuto!

  4. #4
    Originariamente inviato da anx721
    La funzione genRPerm prende com input un intero positivo n e restituisce un array di interi in cui gli n numeri da zero a n-1 sono disposti casualmente:

    codice:
    #include <stdlib.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }
    Ho provato ad utilizzare il codice,ma mi da un sacco di errori.Siccome non sono una cima in C, potresti darmi una mano?
    Dovrei implementare nella main, una scanf che prenda un n in input e infine un ciclo for per stampare tutto il vettore come risultato..Ti ringrazio veramente tanto se puoi aiutarmi!

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }
    
    int main(){
    	unsigned int n = 0;
    	printf("Inserire il numero di numeri da generare: ");
    	scanf("%d", &n);
    	int *perm = genRPerm(n);
    	int i;
    	printf("\n\nPermutazione generata:\n\n");
    	for(i = 0; i < n; i++)
    		printf("%d  ", perm[i]);
    	free(perm);
    	return 0;
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  6. #6
    Originariamente inviato da anx721
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }
    
    int main(){
    	unsigned int n = 0;
    	printf("Inserire il numero di numeri da generare: ");
    	scanf("%d", &n);
    	int *perm = genRPerm(n);
    	int i;
    	printf("\n\nPermutazione generata:\n\n");
    	for(i = 0; i < n; i++)
    		printf("%d  ", perm[i]);
    	free(perm);
    	return 0;
    }

  7. #7
    Ho provato il codice, ma mi da errori.. Tu hai provato a compilarlo e lanciarlo?



    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }
    
    int main(){
    	unsigned int n = 0;
    	printf("Inserire il numero di numeri da generare: ");
    	scanf("%d", &n);
    	int *perm = genRPerm(n);
    	int i;
    	printf("\n\nPermutazione generata:\n\n");
    	for(i = 0; i < n; i++)
    		printf("%d  ", perm[i]);
    	free(perm);
    	return 0;
    }
    gli errori ke mi da sono i seguenti:

    H:\prog\prog.c(15) : warning C4018: '<' : signed/unsigned mismatch
    H:\prog\prog.c(26) : error C2143: syntax error : missing ';' before 'type'
    H:\prog\prog.c(27) : error C2143: syntax error : missing ';' before 'type'
    H:\prog\prog.c(29) : error C2065: 'i' : undeclared identifier
    H:\prog\prog.c(29) : warning C4018: '<' : signed/unsigned mismatch
    H:\prog\prog.c(30) : error C2065: 'perm' : undeclared identifier
    H:\prog\prog.c(30) : error C2109: subscript requires array or pointer type
    H:\prog\prog.c(31) : warning C4022: 'free' : pointer mismatch for actual parameter 1
    Error executing cl.exe.

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    certo. funziona. che erorre hai? di compilazione? o a runtime?

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  9. #9
    Vedi sopra...

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Per evitare i warning sul tipo usa il codice che ti metto sotto; per il resto penso che hai fatto un errore di copia incolla; o se no VisualC non funziona bene...


    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    
    void swap(int *a, int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    int * genRPerm(unsigned int n){
    	int *vect = (int *)malloc(n * sizeof(int));
    	unsigned int i;
    	for(i = 0; i < n; i++)
    		vect[i] = i;
    	for (i = n-1;i >= 0;i--)
    	swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
    	return vect;
    }
    
    int main(){
    	unsigned int n = 0;
    	printf("Inserire il numero di numeri da generare: ");
    	scanf("%d", &n);
    	int *perm = genRPerm(n);
    	unsigned int i;
    	printf("\n\nPermutazione generata:\n\n");
    	for(i = 0; i < n; i++)
    		printf("%d  ", perm[i]);
    	free(perm);
    	return 0;
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.