Advertisement
vitoindelicato46

Untitled

Jan 12th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.86 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 user);
  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.   str_gen(arr,check,x);
  37.   print_str(arr,x);
  38.   confronta(arr, check, x, fp);
  39.  
  40.   free_all(arr, check, x, fp);
  41.   return 0;
  42. }
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61. char rand_lett() {  //funzione per la creazione di un nummero corrispondente al valore ascii dell'alfabeto
  62.     char val = rand() % 52;
  63.     if (val < 26) {
  64.         val += 'a';
  65.     } else {
  66.         val -= 26;
  67.         val += 'A';
  68.     }
  69.     return val;
  70. }
  71.  
  72.  
  73.  
  74.  
  75.  
  76. void str_gen(char **array, int**mask, int user){
  77.   int n = 0; //random lunghezza stringa
  78.   for(int i = 0; i <user; i++){
  79.     n = rand() %SIZE + 4;
  80.     char* str = malloc(n*(sizeof(char))+1);
  81.     int* num = malloc(n*(sizeof(int))+1);//maschera creata per utilizzo dei caratteri 0) il carattere è utilizzabile
  82.     //1) il carattere è stato utilizzato per una parola non ancora compiuta 2) il carattere è stato utilizzato per completare una parola
  83.     for(int j = 0; j <= n; j++){
  84.       num[j] = 0;
  85.       if(j==n){
  86.         str[j] = '\0';
  87.       }
  88.       else{
  89.       str[j] = rand_lett(); //numero random compreso tra 65 e 90 e compreso tra 97 e 122
  90.       }
  91.     }
  92.     array[i] = str;
  93.     mask[i] = num;
  94.   }
  95. }
  96.  
  97.  
  98.  
  99.  
  100.  
  101. void print_str(char **array, int user){
  102.     printf("Il programma genera le stringhe:\n\n");
  103.     for (int i = 0; i < user; i++){
  104.       char  *p = array[i];
  105.       for(int j = 0; j < strlen(p); j++){
  106.         printf("%c", p[j]);
  107.         printf(" ");
  108.       }
  109.       printf("\n");
  110.   }
  111.   printf("\n\n");
  112. }
  113.  
  114.  
  115.  
  116.  
  117.  
  118. void free_all(char **array,int **mask, int user, FILE *x){
  119.   for(int i = 0; i < user; i++){
  120.     free(*(array+i));
  121.     free(*(mask+i));
  122.   }
  123.  free(mask);
  124.  free(array);
  125.  fclose(x);
  126. }
  127.  
  128.  
  129.  
  130.  
  131.  
  132. void read_file(FILE *x, char *name){
  133.   printf("IL file %s contiene le parole:", name);
  134.   printf("\n\n");
  135.   char file_str [DIM];
  136.   while(fscanf(x, "%[^\n]\n", file_str)!=EOF){
  137.     printf("%s\n", file_str);
  138.   }
  139.   rewind(x);
  140.   printf("\n\n\n");
  141. }
  142.  
  143.  
  144.  
  145.  
  146. void confronta(char **array, int** mask, int user, FILE *x){
  147.   int len = 0;
  148.   int count = 0;
  149.   int flag = 0;
  150.   int word_count = 0;
  151.   char file_str[DIM];
  152.  
  153.  
  154.   while(fscanf(x, "%[^\n]\n", file_str)!=EOF){ //prende ogni parola dal file
  155.     len = strlen(file_str); // prende la lunghezza della parola selezionata
  156.     for(int i = 0; i < len; i++){ // questo ciclo seleziona ogni lettera della parola presa dal file
  157.  
  158.       for(int n = 0; n < user; n ++){ // prende ogni elemento dell'array di puntatori per le stringhe random
  159.         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
  160.             flag = 0;
  161.             break;
  162.         }
  163.         char *p = array[n]; //creo un ptr a char, e passo passo, gli do le stringhe generate random
  164.         int *a = mask[n];
  165.  
  166.         for(int j = 0; j < strlen(p); j++){ //questo ciclo esamina ogni lettera di una stringa generata random fino all'ultimo carattere
  167.           if(file_str[i] == p[j]&& a[j] == 0){ //confornto la lettera della parola del file con ogni lettera di una stringa
  168.             count++; //se trovo una corrispondenza incremento un counter
  169.             flag++; //trovata una corrispondenza, do il valore uno al flag che serve a rompere i cicli, e passare alla lettera della parola successiva
  170.             a[j] = 1;
  171.             break; //rompo questo ciclo e ritorno a quello in cui do a p la stringa successiva
  172.           }
  173.         } // fine del ciclo che confronta una lettera della parola,  con tutte le lettere dela stringa random
  174.       } // fine del ciclo che percorre tutto l'array di puntatori
  175.       //controllata ogni stringa random con la lettera della parola...
  176.       if(count != len){ //...se una lettera di una parola non trova corrispondenza, è inutile verificare le altre
  177.         mask_changer(mask, array, user, 2);
  178.         count = 0;
  179.         break; // rompo quindi il ciclo e ottengo una nuova parola
  180.       }
  181.     } // fine del ciclo che passa alla lettera successiva
  182.     if(count == len){ //se vedo che ogni lettera ha trovato una corrispondenza
  183.       mask_changer(mask, array, user, 1);
  184.       printf("%s\n", file_str);
  185.       count = 0;
  186.       word_count++; //incremento il numero di parole possibili
  187.       break;
  188.     }
  189.   } //fine del while che prende ogni parola
  190.   if(word_count == 0){
  191.     printf("Non è stato possibile generare nessuna parola\n");
  192.  
  193.   }
  194.   else{
  195.     printf("Si possono generare %d parole:\n", word_count);
  196.  
  197.   }
  198. }
  199.  
  200.  
  201.  
  202.  
  203.  
  204. void mask_changer(int **mask, char **array, int user, int mode){
  205.   for (int i = 0; i < user; i++){
  206.     int  *num = mask[i];
  207.     for(int j = 0; j < (sizeof(num)/sizeof(int)); j++){
  208.       if(num[j] == 1){
  209.         if(mode == 1)
  210.         num[j] = 2;
  211.         }
  212.         else if(mode == 2){
  213.           num[j] = 0;
  214.         }
  215.       }
  216.     }
  217.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement