Advertisement
vitoindelicato46

Untitled

Jan 12th, 2019
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #define SIZE 10
  6. #define DIM 33
  7.  
  8. char rand_lett();
  9. void str_gen(char **array, int**mask, int user);
  10. void print_str(char **array, int **mask, int user, int mode);
  11. void free_all(char **array, int **mask, int user, FILE *x);
  12. void read_file(FILE *x, char *name);
  13. void confronta(char **array, int** mask, int user, FILE *x);
  14. void mask_changer(int **mask, char **array, int user, int mode);
  15.  
  16. int main(int argc, char **argv){
  17.  
  18.   int x = 0; //user input NUMERO STRINGHE
  19.   if(argc!=3){
  20.     printf("Inserire tre argomenti, in ordine : \"name programma\"  \"numero stringhe\" \"name file\"\n");
  21.     return 0;
  22.     }
  23.  
  24.   FILE *fp; //puntatore al file
  25.   fp = fopen(argv[2], "r");
  26.   if(fp == NULL){
  27.     printf("Impossibile aprire il file\n");
  28.     return 0;
  29.     }
  30.  
  31.   read_file(fp, argv[2]);
  32.  
  33.   x = atoi(argv[1]);
  34.   char** arr = malloc(x*(sizeof(char*))); //THIS WORKS DON'T TOUCH   CREAZIONE ARRAY DI PUNTATORI, OGNI CELLA DELL'ARRAY CONTERRÀ L'INDIRIZZO DI MEMORIA DI UN ARRAY DI CARATTERI
  35.   int** check = malloc(x*(sizeof(int*)));
  36.  
  37.   str_gen(arr,check,x);
  38.   print_str(arr,check,x,1);
  39.   confronta(arr, check, x, fp);
  40.   printf("\n");
  41.   print_str(arr, check, x, 2);
  42.  
  43.   free_all(arr, check, x, fp);
  44.   return 0;
  45. }
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. char rand_lett() {  //funzione per la creazione di un nummero corrispondente al valore ascii dell'alfabeto
  65.     char val = rand() % 52;
  66.     if (val < 26) {
  67.         val += 'a';
  68.     } else {
  69.         val -= 26;
  70.         val += 'A';
  71.     }
  72.     return val;
  73. }
  74.  
  75.  
  76.  
  77.  
  78.  
  79. void str_gen(char **array, int**mask, int user){
  80.   int n = 0; //random lunghezza stringa
  81.   for(int i = 0; i <user; i++){
  82.     n = rand() %SIZE + 4;
  83.     char* str = malloc(n*(sizeof(char))+1);
  84.     int* num = malloc(n*(sizeof(int))+1);//maschera creata per utilizzo dei caratteri 0) il carattere è utilizzabile
  85.     //1) il carattere è stato utilizzato per una parola non ancora compiuta 2) il carattere è stato utilizzato per completare una parola
  86.     for(int j = 0; j <= n; j++){
  87.       num[j] = 0;
  88.       if(j==n){
  89.         str[j] = '\0';
  90.       }
  91.       else{
  92.       str[j] = rand_lett(); //numero random compreso tra 65 e 90 e compreso tra 97 e 122
  93.       }
  94.     }
  95.     array[i] = str;
  96.     mask[i] = num;
  97.   }
  98. }
  99.  
  100.  
  101.  
  102.  
  103.  
  104. void print_str(char **array, int **mask, int user, int mode){
  105.     if (mode ==1){
  106.      printf("Il programma genera le stringhe:\n\n");
  107.    }
  108.    if (mode == 2){
  109.      printf("Caratteri rimasti: \n");
  110.    }
  111.     for (int i = 0; i < user; i++){
  112.       char *p = array[i];
  113.        int *c = mask[i];
  114.       for(int j = 0; j < strlen(p); j++){
  115.         if(mode == 2 && c[j] == 0){
  116.          printf("%c", p[j]);
  117.          printf(" ");
  118.         }
  119.        if(mode == 1){
  120.          printf("%c", p[j]);
  121.          printf(" ");
  122.        }
  123.      }
  124.       if(mode == 1)
  125.       printf("\n");
  126.     }
  127.  
  128.   printf("\n\n");
  129. }
  130.  
  131.  
  132.  
  133.  
  134.  
  135. void free_all(char **array,int **mask, int user, FILE *x){
  136.   for(int i = 0; i < user; i++){
  137.     free(*(array+i));
  138.     free(*(mask+i));
  139.   }
  140.  free(mask);
  141.  free(array);
  142.  fclose(x);
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149. void read_file(FILE *x, char *name){
  150.   printf("IL file %s contiene le parole:", name);
  151.   printf("\n\n");
  152.   char file_str [DIM];
  153.   while(fscanf(x, "%[^\n]\n", file_str)!=EOF){
  154.     printf("%s\n", file_str);
  155.   }
  156.   rewind(x);
  157.   printf("\n\n\n");
  158. }
  159.  
  160.  
  161.  
  162.  
  163. void confronta(char **array, int** mask, int user, FILE *x){
  164.   int len = 0;
  165.   int count = 0;
  166.   int flag = 0;
  167.   int word_count = 0;
  168.   char file_str[DIM];
  169.   char **list = malloc(DIM*sizeof(char*));
  170.  
  171.  
  172.   while(fscanf(x, "%[^\n]\n", file_str)!=EOF){ //prende ogni parola dal file
  173.     len = strlen(file_str); // prende la lunghezza della parola selezionata
  174.     count = 0;
  175.     for(int i = 0; i < len; i++){ // questo ciclo seleziona ogni lettera della parola presa dal file
  176.  
  177.       for(int n = 0; n < user; n ++){ // prende ogni elemento dell'array di puntatori per le stringhe random
  178.         if(flag == 1){ //se il flag del ciclo successivo si è attivato, ovvero si è trovata una corrispondenza, riporto il flag a 0 e rompo questo ciclo, passando così alla lettera successiva
  179.             flag = 0;
  180.             break;
  181.         }
  182.         char *p = array[n]; //creo un ptr a char, e passo passo, gli do le stringhe generate random
  183.         int *a = mask[n];
  184.  
  185.         for(int j = 0; j < strlen(p); j++){ //questo ciclo esamina ogni lettera di una stringa generata random fino all'ultimo carattere
  186.           if(file_str[i] == p[j]&& a[j] == 0){ //confornto la lettera della parola del file con ogni lettera di una stringa
  187.             count++; //se trovo una corrispondenza incremento un counter
  188.             flag++; //trovata una corrispondenza, do il valore uno al flag che serve a rompere i cicli, e passare alla lettera della parola successiva
  189.             a[j] = 1;
  190.             break; //rompo questo ciclo e ritorno a quello in cui do a p la stringa successiva
  191.           }
  192.         } // fine del ciclo che confronta una lettera della parola,  con tutte le lettere dela stringa random
  193.       } // fine del ciclo che percorre tutto l'array di puntatori
  194.       //controllata ogni stringa random con la lettera della parola...
  195.       if(count == 0){ //...se una lettera di una parola non trova corrispondenza, è inutile verificare le altre
  196.         mask_changer(mask, array, user, 2);
  197.         count = 0;
  198.         break; // rompo quindi il ciclo e ottengo una nuova parola
  199.       }
  200.     } // fine del ciclo che passa alla lettera successiva
  201.     if(count == len){ //se vedo che ogni lettera ha trovato una corrispondenza
  202.       word_count++; //incremento il numero di parole possibili
  203.       mask_changer(mask, array, user, 1);
  204.       char *word = malloc(len*(sizeof(char)+1));
  205.       strcpy(word, file_str);
  206.     //  list = realloc(list, word_count*sizeof(char*));
  207.       list[word_count-1] = word;
  208.       count = 0;
  209.  
  210.     }
  211.   } //fine del while che prende ogni parola
  212.   if(word_count == 0){
  213.     printf("Non è stato possibile generare nessuna parola\n");
  214.  
  215.   }
  216.   else{
  217.     printf("Si possono generare %d parole:\n", word_count);
  218.     for(int i = 0; i < word_count; i++){
  219.       char *f = list[i];
  220.       printf("%s\n", f);
  221.     }
  222.   }
  223.   for(int i = 0; i<=word_count; i++){
  224.     free(list[i]);
  225.   }
  226.   free(list);
  227. }
  228.  
  229.  
  230.  
  231.  
  232.  
  233. void mask_changer(int **mask, char **array, int user, int mode){
  234.   for (int i = 0; i < user; i++){
  235.     int  *num = mask[i];
  236.     for(int j = 0; j < (sizeof(num)/sizeof(int)); j++){
  237.       if(num[j] == 1){
  238.         if(mode == 1)
  239.         num[j] = 2;
  240.         }
  241.         else if(mode == 2){
  242.           num[j] = 0;
  243.         }
  244.       }
  245.     }
  246.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement