Soluzioni esercizi Homework 2
Esercizio 1
#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;
}
Eserzicio 2
#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;
}
Esercizio 3
#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;
}
Esercizio 4
#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