#include <stdio.h> #include <string.h> #include <stdlib.h> char* leggi_input (){ char* stringa =(char*) calloc(101, sizeof(char)); int current; int i = 0; int j = 0; // for (i = 0; i < 101; i++){ while (((current = getchar()) != EOF) && (current != '\n') && (i < 101)) { i = i + 1; if ((current == ' ') && ((j == 0) || (stringa [j-1] == ' '))){ j = j - 1; } else stringa[j] = tolower(current); j = j + 1; } // end While if ((j-1 >= 0) && (stringa[j-1] == ' ')) j = j - 1; stringa[j] = '\0'; return stringa; } int conta_parole (char* stringa) { int i = 0; int parole = 1; if (stringa == NULL) return 0; for (i = 0; stringa[i] != '\0'; i++) if ((stringa[i] == ' ') && (stringa[i+1] != '\0')) parole = parole + 1; return parole; } void trova_anagrammi (char* stringa, int numero_parole, char* pattern) { int i = 0; int inizio = 0; // mantiene indice al primo carattere del token corrente int corrente = 0; // mantiene contatore alla parola corrente int no_anagrammi = 1; // ruolo di booleano per verifica finale if (!stringa || !pattern) { // nel caso uno dei due sia vuoto printf("Non ci sono anagrammi\n"); return; } for(i = 0; (i < strlen(stringa)) && (corrente < numero_parole); i++) { if (stringa[i] == ' ') { // caso carattere spazio char* parola_corrente = (char*) calloc((i-inizio+1),sizeof(char)); int j; // contatore caratteri successivi che precedono il // carattere spazio for (j = 0; j< (i-inizio); j++){ parola_corrente[j]=stringa[inizio+j]; // copia in parola_corrente // il token precedente a ' ' } parola_corrente[j] = '\0'; // termina la parola corrente if (anagramma (pattern, parola_corrente)) { // controllo se anagramma printf("%s\n", parola_corrente); // stampa parola corrente no_anagrammi = 0; } free(parola_corrente); // libera la memoria del puntatore parola_corrente inizio = i+1; // pone inizio del seguente token al carattere // succesisvo a ' ' corrente = corrente + 1; // } } if (no_anagrammi) printf("Non ci sono anagrammi\n"); return; } int anagramma(char* Pattern, char* Parola){ if (strlen(Pattern)==strlen(Parola)) // controllo lunghezza stringhe if ((strspn(Pattern, Parola) == strlen(Pattern)) && // controllo se tutti i char di Parola stanno in Pattern e viceversa (strspn(Parola, Pattern) == strlen(Pattern))) return 1; return 0; } int main () { char* testo = leggi_input(); char pattern[101]; int nr_parole = conta_parole(testo); scanf("%s",pattern); trova_anagrammi (testo, nr_parole, pattern); if (testo != NULL) free(testo); return 1; }
#include <stdio.h> #include <string.h> #include <stdlib.h> /* Legge n numeri con virgola da standard input e ritorna il vettore che li contiene. */ double* leggi_numeri (int n) { int i = 0; // contatore ciclo for double* numeri = NULL; // vettore che conterra' i numeri if (n == 0) return NULL; if (!(numeri = calloc(n, sizeof(float)))) // allocazione di memoria return NULL; for (i = 0; i < n; i++){ double num_corrente; scanf("%f", &num_corrente); numeri[i] = num_corrente; } return numeri; } /* Prende in input un vettore di double, la sua dimensione dim e un indice b < dim. Scambia l'ultimo numero del vettore con quello che si trova alla casella b*/ void switch_numbers(double* numeri, int dim, int b) { double appoggio = numeri[dim-1]; numeri[dim-1] = numeri[b]; numeri[b] = appoggio; return; } /* Prende in input un vettore di double e la sua dimensione n e ritorna il vettore con i numeri ordinati. */ double* selection_sort(double* numeri, int n) { int index_massimo = 0; int i = 0; // contatore ciclo for if (n == 1) return numeri; for (i = 0; i < n; i++) { if (numeri[index_massimo] < numeri[i]) index_massimo = i; } if (index_massimo) switch_numbers(numeri, n, index_massimo); // pone il massimo alla // casella n-1 (alla fine) return selection_sort(numeri, n-1); // chiamata ricorsiva agli n-1 // numeri piu' piccoli del vettore } int conta_differenti (double* numeri, int n) { int i = 0; // contatore ciclo for int conta = (n != 0); // mantiene numero numeri differenti numeri = selection_sort(numeri, n); // ordina i numeri for (i = 1; i < n; i++){ if (numeri[i-1] != numeri[i]) conta = conta + 1; } return conta; } int main () { char numero [150]; int n = 0; int differenti = 0; double* numeri = NULL; scanf("n = %s", numero); n = atoi (numero); numeri = leggi_numeri (n); differenti = conta_differenti (selection_sort(numeri, n), n); printf("%d\n", differenti); return 1; }
#include <stdio.h> int main () { char stringa[150]; char numero[150]; int n = 0; scanf("%s %s", stringa, numero); // legge la stringa, tralascia gli // spazi, legge la sequenza di numeri n = atoi(numero); // trasforma la sequenza di numeri in intero while (0 < n--) printf("%s\n", stringa); // stampa la stringa n volte return 1; }
#include <stdio.h> #include <stdlib.h> #include <string.h> char* vigenere_semplice (char* stringa, int gap) { int lunghezza = strlen(stringa); char* nuova_stringa = (char*) calloc(lunghezza, sizeof(char)); int i; // contatore ciclo for nuova_stringa [lunghezza] = '\0'; gap = gap % 26; // se gap e' piu' grande di 26 (o piu' piccolo di // -26) lo trasforma in (gap mod 26) if (gap < 0) gap = 26 + gap; // se gap < 0 lo trasforma in uno > 0 for (i = 0; i < lunghezza; i++){ if (!isalpha(stringa[i])) return ""; char curr_char; // mantiene il carattere corrente int k = ((i + gap + (tolower(stringa[i])-'a')) % 26 )+'a'; curr_char = (char) k; nuova_stringa[i] = curr_char; } return nuova_stringa; }-- JulindaStefa - 14 Nov 2007
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica |
|