Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #define SIZE 10
- #define DIM 33
- char rand_lett();
- void str_gen(char **array, int**mask, int user);
- void print_str(char **array, int user);
- void free_all(char **array, int **mask, int user, FILE *x);
- void read_file(FILE *x, char *name);
- void confronta(char **array, int** mask, int user, FILE *x);
- void mask_changer(int **mask, char **array, int user, int mode);
- int main(int argc, char **argv){
- int x = 0; //user input NUMERO STRINGHE
- if(argc!=3){
- printf("Inserire tre argomenti, in ordine : \"name programma\" \"numero stringhe\" \"name file\"\n");
- return 0;
- }
- FILE *fp; //puntatore al file
- fp = fopen(argv[2], "r");
- if(fp == NULL){
- printf("Impossibile aprire il file\n");
- return 0;
- }
- read_file(fp, argv[2]);
- x = atoi(argv[1]);
- 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
- int** check = malloc(x*(sizeof(int*)));
- str_gen(arr,check,x);
- print_str(arr,x);
- confronta(arr, check, x, fp);
- free_all(arr, check, x, fp);
- return 0;
- }
- char rand_lett() { //funzione per la creazione di un nummero corrispondente al valore ascii dell'alfabeto
- char val = rand() % 52;
- if (val < 26) {
- val += 'a';
- } else {
- val -= 26;
- val += 'A';
- }
- return val;
- }
- void str_gen(char **array, int**mask, int user){
- int n = 0; //random lunghezza stringa
- for(int i = 0; i <user; i++){
- n = rand() %SIZE + 4;
- char* str = malloc(n*(sizeof(char))+1);
- int* num = malloc(n*(sizeof(int))+1);//maschera creata per utilizzo dei caratteri 0) il carattere è utilizzabile
- //1) il carattere è stato utilizzato per una parola non ancora compiuta 2) il carattere è stato utilizzato per completare una parola
- for(int j = 0; j <= n; j++){
- num[j] = 0;
- if(j==n){
- str[j] = '\0';
- }
- else{
- str[j] = rand_lett(); //numero random compreso tra 65 e 90 e compreso tra 97 e 122
- }
- }
- array[i] = str;
- mask[i] = num;
- }
- }
- void print_str(char **array, int user){
- printf("Il programma genera le stringhe:\n\n");
- for (int i = 0; i < user; i++){
- char *p = array[i];
- for(int j = 0; j < strlen(p); j++){
- printf("%c", p[j]);
- printf(" ");
- }
- printf("\n");
- }
- printf("\n\n");
- }
- void free_all(char **array,int **mask, int user, FILE *x){
- for(int i = 0; i < user; i++){
- free(*(array+i));
- free(*(mask+i));
- }
- free(mask);
- free(array);
- fclose(x);
- }
- void read_file(FILE *x, char *name){
- printf("IL file %s contiene le parole:", name);
- printf("\n\n");
- char file_str [DIM];
- while(fscanf(x, "%[^\n]\n", file_str)!=EOF){
- printf("%s\n", file_str);
- }
- rewind(x);
- printf("\n\n\n");
- }
- void confronta(char **array, int** mask, int user, FILE *x){
- int len = 0;
- int count = 0;
- int flag = 0;
- int word_count = 0;
- char file_str[DIM];
- while(fscanf(x, "%[^\n]\n", file_str)!=EOF){ //prende ogni parola dal file
- len = strlen(file_str); // prende la lunghezza della parola selezionata
- for(int i = 0; i < len; i++){ // questo ciclo seleziona ogni lettera della parola presa dal file
- for(int n = 0; n < user; n ++){ // prende ogni elemento dell'array di puntatori per le stringhe random
- 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
- flag = 0;
- break;
- }
- char *p = array[n]; //creo un ptr a char, e passo passo, gli do le stringhe generate random
- int *a = mask[n];
- for(int j = 0; j < strlen(p); j++){ //questo ciclo esamina ogni lettera di una stringa generata random fino all'ultimo carattere
- if(file_str[i] == p[j]&& a[j] == 0){ //confornto la lettera della parola del file con ogni lettera di una stringa
- count++; //se trovo una corrispondenza incremento un counter
- flag++; //trovata una corrispondenza, do il valore uno al flag che serve a rompere i cicli, e passare alla lettera della parola successiva
- a[j] = 1;
- break; //rompo questo ciclo e ritorno a quello in cui do a p la stringa successiva
- }
- } // fine del ciclo che confronta una lettera della parola, con tutte le lettere dela stringa random
- } // fine del ciclo che percorre tutto l'array di puntatori
- //controllata ogni stringa random con la lettera della parola...
- if(count != len){ //...se una lettera di una parola non trova corrispondenza, è inutile verificare le altre
- mask_changer(mask, array, user, 2);
- count = 0;
- break; // rompo quindi il ciclo e ottengo una nuova parola
- }
- } // fine del ciclo che passa alla lettera successiva
- if(count == len){ //se vedo che ogni lettera ha trovato una corrispondenza
- mask_changer(mask, array, user, 1);
- printf("%s\n", file_str);
- count = 0;
- word_count++; //incremento il numero di parole possibili
- break;
- }
- } //fine del while che prende ogni parola
- if(word_count == 0){
- printf("Non è stato possibile generare nessuna parola\n");
- }
- else{
- printf("Si possono generare %d parole:\n", word_count);
- }
- }
- void mask_changer(int **mask, char **array, int user, int mode){
- for (int i = 0; i < user; i++){
- int *num = mask[i];
- for(int j = 0; j < (sizeof(num)/sizeof(int)); j++){
- if(num[j] == 1){
- if(mode == 1)
- num[j] = 2;
- }
- else if(mode == 2){
- num[j] = 0;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement