/* =============================================================== */ /* CORSO DI PROGRAMMAZIONE IN C (C89) */ /* Claudio Fornaro */ /* Ver. 3 - 2021 */ /* 14-Funzioni_Soluzioni.txt */ /* =============================================================== */ /* =============================================================== */ /* 1 */ /* =============================================================== */ #include #include #include #define NUM 10 double log2(double valore); int main() { int i; double a; for (i=0; i #include #define NUM 10 int contacifre(int n); int main() { int i; int x; for (i=0; i #include #define NUM 10 double radice(double valore, double precisione); int main() { int i; double x, e; for (i=0; i prec); return xn; } /* =============================================================== */ /* 4 */ /* =============================================================== */ #include #include #define DIM1 8 #define DIM2 10 double media(double vettore[], int lunghezza); int main() { int i; double a[DIM1], b[DIM2]; printf("Inserire %d valori per a:\n", DIM1); for (i=0; i #include #define MAXNUM 100 #define ERRORE -1 #define OK 0 int leggiVett(int vet[], int *n); void inverti(int vettore[], int n); void visualVett(int v[], int n); int main() { int vet[MAXNUM]; int dim; /* viene passato l'indirizzo di n */ if (leggiVett(vet, &dim) == ERRORE) { printf("Errore lettura dati.\n"); return EXIT_FAILURE; } inverti(vet, dim); visualVett(vet, dim); return EXIT_SUCCESS; } /*--------------------------------------------------------*/ /* n passato per riferimento per essere restituito al main */ int leggiVett(int vet[], int *n) { int i; do { printf("Dimensione del vettore: "); scanf ("%d", n); /* notare che manca la & */ }while(*n < 1 || *n > MAXNUM); for(i=0; i<*n; i++) { printf("Introduci vet[%d] = ", i); if(scanf ("%d", &vet[i]) != 1) return ERRORE; /* es. inserito una lettera */ } return OK; } /*--------------------------------------------------------*/ void inverti(int vettore[], int n) { int i; int temp; for(i=0; i < n/2 ; i++) { temp = vettore[i]; vettore[i] = vettore[n-1-i]; vettore[n-1-i]=temp; } } /*--------------------------------------------------------*/ void visualVett(int v[], int n) { int i; for(i=0; i #include #include #define MAXNUM 100 void rovescia(char []); /* nel prot. il nome puo' essere omesso */ int main() { char v[MAXNUM]; printf("Introduci la stringa: "); gets(v); rovescia(v); printf("%s\n", v); return EXIT_SUCCESS; } /*--------------------------------------------------------*/ void rovescia(char s[]) { int i, len; char t; len=strlen(s); for (i=0; i #include #include #define MAXNUM 100 int contastr(char *stringa_dove_cercare, char *stringa_da_cercare); int main() { char v[MAXNUM], w[MAXNUM]; printf("Introduci la stringa dove cercare: "); gets(v); printf("Introduci la stringa da cercare: "); gets(w); printf("La stringa e' stata trovata %d volte\n", contastr(v,w)); return EXIT_SUCCESS; } /*--------------------------------------------------------*/ int contastr(char *a, char *x) { int len, cont=0; len=strlen(x); while (*(a+len-1) != '\0') /* ultimo chr di a valutato da */ if (strncmp(a++, x, len) == 0) /* strncmp */ cont++; return cont; } /* soluzione alternativa int contastr(char *a, char *x) { int i, j, lena, lenx, cont=0; lena=strlen(a); lenx=strlen(x); for (i=0; i #include #include #define MAXNUM 100 void undup(char *); int main() { char stringa[MAXNUM]; printf("Introduci la stringa: "); gets(stringa); undup(stringa); printf("La stringa senza i duplicati e':\n%s\n", stringa); return EXIT_SUCCESS; } /*--------------------------------------------------------*/ void undup(char *s) { int i, j; int len; int k; /* indice dell'ultima posizione con chr non duplicati */ len = (int)strlen(s); k = 0; /* il primo non puo' essere duplicato e ha indice 0 */ for (i=1; i=0 && s[j] != s[i]; j--) ; if (j<0) /* se non lo trova, j arriva a -1 */ s[++k] = s[i]; } s[++k] = '\0'; /* termina la stringa */ } /* Altra soluzione */ void undup(char *s) { int i; int len; /* lunghezza stringa in input */ int k; /* indice dell'ultima posizione con chr non duplicati */ char car[256] = {0}; /* tutti i flag sono inizializzati a 0 */ len = (int)strlen(s); k = -1; /* si posiziona prima del primo carattere */ for (i=0; i=0 && s[j] != s[i]; j--) ; if (j>=0) /* se lo trova, j e' >= 0 */ s[i] = '\0'; } /* ora copia tutti i caratteri escludendo quelli di codice \0 */ k=-1; for (i=0; i #include #define MAXNUM 10 void ordina(int vettore[], int lunghezza, int ordinamento); int main() { int v[MAXNUM]; int i, len, ord; printf("Quanti elementi? "); scanf("%d", &len); for (i=0; i v[j]) { t=v[i]; v[i]=v[j]; v[j]=t; } else if (ord==0 && v[i] < v[j]) { t=v[i]; v[i]=v[j]; v[j]=t; } } /* Nota La funzione ordina si potrebbe condensare in questa: void ordina(int v[], int len, int ord) { int i, j; int t; for (i=0; i v[j] || ord==0 && v[i] < v[j]) { t=v[i]; v[i]=v[j]; v[j]=t; } } Ricercando l'efficienza, possiamo considerare che se poniamo: X = (ord==1) Y = (v[i] < v[j]) la condizione puo' essere scritta X && !Y || !X && Y (in algebra booleana si scrive XY'+X'Y). E' vero che !(v[i]=v[j] e non a v[i]>v[j], ma l'effetto di questa differenza e' lo scambio dei valori uguali, cosa che aggiunge una trascurabile inefficienza. L'espressione booleana XY'+X'Y equivale a: A EXOR B. In C non esiste l'operatore logico EXOR, tuttavia esiste quello bitwise che può essere utilizzato se X e Y valgono 0 o 1. Essendo questo il caso (infatti X e Y sono il risultato di un confronto), la condizione finale puo' essere scritta: (ord==1) ^ (v[i] #include #define MAXCOLONNE 10 #define MAXRIGHE1 8 #define MAXRIGHE2 12 double media(double M[][MAXCOLONNE], int righe, int colonne); int main() { int i, j; double Mx1[MAXRIGHE1][MAXCOLONNE]; double Mx2[MAXRIGHE2][MAXCOLONNE]; printf("Inserire i valori per Mx1:\n"); for (i=0; i #include #define MAXNUM 100 void sommaVett(const int a[], const int b[], int r[], int n); int main() { int x[MAXNUM]; int y[MAXNUM]; int risultato[MAXNUM]; int n; int i; do { printf("Lunghezza dei vettori? "); scanf("%d", &n); }while (n<1 || n>MAXNUM); for (i=0; i #include #include #include #define MAX 100 #define FILENAME "C:\\Parole.txt" /* MODIFICARE OPPORTUNAMENTE */ void ordina(char []); void inMinuscolo(char[]); int main() { char stringa[MAX], parola[MAX], parolaOrdinata[MAX]; FILE *fp; printf("Parola di cui cercare gli anagrammi: "); gets(stringa); inMinuscolo(stringa); /* la mette in minuscolo */ ordina(stringa); /* riordina alfabeticamente i caratteri */ if ( (fp=fopen(FILENAME,"r")) == NULL ) { fprintf(stderr, "Non posso aprire il file %s\n", FILENAME); return EXIT_FAILURE; } if (fscanf(fp, "%s", parola) == EOF) /* primo valore */ { fprintf(stderr, "File %s vuoto\n", FILENAME); return EXIT_FAILURE; } do { strcpy(parolaOrdinata, parola); inMinuscolo(parolaOrdinata); /* la mette in minuscolo */ ordina(parolaOrdinata); /* riordina alfabet. i chr */ if (strcmp(stringa,parolaOrdinata) == 0) printf("%s\n", parola); }while(fscanf(fp, "%s", parola) != EOF); fclose(fp); return EXIT_SUCCESS; } /*--------------------------------------------------------*/ void inMinuscolo(char s[]) { int i; for (i=0; s[i] != '\0'; i++) s[i] = (char)tolower(s[i]); } /*--------------------------------------------------------*/ void ordina(char s[]) /* selection sort */ { int i, j, jmin, len; char t; len = strlen(s); for (i=0; i #include #include #include #define MAXVETT 10 #define MAXSTRING 80 int parseToIntVect(char *stringa, int vett[], int n); int main() { int v[MAXVETT]; char s[MAXSTRING]; int i, n; printf("Introdurre stringa da analizzare:\n"); gets(s); n = parseToIntVect(s, v, MAXVETT); printf("Letti %d valori:\n", n); for (i=0; i0) /* se k==0 significa che non ha letto alcun valore */ t[k]='\0'; vett[cont++]=atoi(t); }while(i #include #include #define MAXCIFRE 1000 void moltiplica(char a[], int la, char x, char r[]); void aggiungiZeri(char a[], int la, int quanti); void somma(char a[], char b[], int cifre); int main() { int i, j; char p[MAXCIFRE+1], s[MAXCIFRE+1], q; char ris[MAXCIFRE*2+1]={0}, t[MAXCIFRE*2+1]={0}; int lp, ls, lris; printf("Primo numero (max %d cifre): ", MAXCIFRE); gets(p); printf("Secondo numero (max %d cifre): ", MAXCIFRE); gets(s); lp=strlen(p); ls=strlen(s); lris = lp+ls; /* la lunghezza di e' al massimo lp+ls */ /* poiche' il risultato ha in genere piu' cifre e poiche' una stringa puo' essere ampliata solo al fondo, si inverte la posizione di ciascuna cifra cosi' che p[0] contenga la cifra meno significativa (LSD), ossia quella di potenza 0, lo stesso viene fatto per la stringa s */ for (i=0, j=lp-1; i */ somma(ris, t, lp+i+1); /* all'iterazione i, e' la max lunghezza sia di ris sia di t */ } /* il numero di cifre finale e' composto o da o da cifre, per conoscerlo basta verificare se la prima cifra (MSD, che pero' e' a destra perche' invertita) e' 0 */ if (ris[lris-1]==0) lris--; /* solo se il risultato e' zero, il primo carattere e' 0, quindi si eliminano tutti gli altri zeri impostando lris a 1 per visualizzare uno zero solo */ if (ris[lris-1]==0) lris=1; /* ri-inverte la posizione dei caratteri in modo che il primo sia il MSD, notare che la stringa e' gia' terminata da un \0 grazie all'inizializzazione di ris */ for (i=0, j=lris-1; i per e mette il risultato in , serve passare la lunghezza di in quanto avendo trasformato i caratteri '0' in valori 0, questi coincidono con il '\0' e quindi non si puo' piu' usare strlen */ void moltiplica(char a[], int la, char x, char r[]) { int i, m, riporto; /* non serve azzerare , poiche' la moltiplicazione produce tante cifre quante sono quelle di e l'eventuale altra cifra viene impostata dall'ultimo riporto (eventualmente 0) */ riporto=0; for (i=0; i zeri a destra del numero , essendo stato capovolto (LSD in a[0]), questo si ottiene aggiungendo degli zeri all'inizio della stringa */ void aggiungiZeri(char a[], int la, int quanti) { int i; for (i=la-1; i>=0; i--) a[i+quanti]=a[i]; for (i=quanti-1 ; i>=0; i--) a[i]=(char)0; } /*--------------------------------------------------------*/ /* somma e e mette il risultato in , si limita a cifre (non ce ne sono di piu' in quanto e' la somma dei risultati parziali, quindi e' piu' lungo di ) */ void somma(char a[], char b[], int la) { int i, riporto, m; riporto=0; for (i=0; i