# Array e Stringhe # Inversione di un Array Scrivere un programma che permetta all’utente di inserire un array di numeri **v1**. Il programma copia l’array **v1** al contrario nell’array **v2**. Il programma stampa **v2**. ## Versione base con tre for ```c #include <stdio.h> #define N 100 int main(int argc, char* argv[]){ // Variabili int real_N = N, v1[N] = {0}, v2[N] = {0}, i = 0; // Acquisizione array do { printf("Quanti numeri vuoi inserire? "); scanf("%d", &real_N); } while(real_N < 0 || real_N > N); for(i=0; i<real_N; i++){ printf("Inserire l'elemento in psozione %d: ", i); scanf("%d", &v1[i]); } // Copio l'array al contrario E lo stampo for(i=real_N-1; i>=0; i--){ v2[real_N - i - 1] = v1[i]; } // Stampo l'array copiato al contrario printf("["); for(i=0; i< real_N; i++){ printf(" %d", v2[i]); } printf("]"); return 0; } ``` ## Versione con due for ```c #include <stdio.h> #define N 100 int main(int argc, char* argv[]){ // Variabili int real_N = N, v1[N] = {0}, v2[N] = {0}, i = 0; // Acquisizione array do { printf("Quanti numeri vuoi inserire? "); scanf("%d", &real_N); } while(real_N < 0 || real_N > N); for(i=0; i<real_N; i++){ printf("Inserire l'elemento in psozione %d: ", i); scanf("%d", &v1[i]); } // Copio l'array al contrario E lo stampo printf("["); for(i=real_N-1; i>=0; i--){ v2[real_N - i - 1] = v1[i]; printf(" %d", v1[i]); } printf("]\n"); return 0; } ``` **Bonus:** si può usare un solo `for`? **Bonus:** invece di usare **v1** e **v2**, è possibile usare un solo array? --- # Conversione in Binario Scrivere un programma che permetta all’utente di inserire un numero intero positivo. Scrivere la codifica binaria del numero in un array di lunghezza massima 10. Stampare il numero in binario. ```c // Librerie #include <stdio.h> // MACRO #define N 10 int main(int argc, char* argv[]) { // Variabili int n, bin[N], i; // Acquisizione del numero do { printf("Inserisci un numero tra 0 e 1023: "); scanf("%d", &n); } while (n < 0 || n > 1023); // Conversione for(i = N - 1; i >= 0; i--){ bin[i] = n % 2; n /= 2; } // Stampa for(i = 0; i < N; i++) printf("%d", bin[i]); printf("\n"); return 0; } ``` --- # Coppie di Numeri di cui Uno è il Doppio dell'Altro Scrivere un programma che permetta all’utente di inserire una sequenza di numeri. Il programma cerca successivamente le coppie di numeri per cui il primo è il doppio del secondo e le stampa. ```c #include <stdio.h> #define N 100 int main(int argc, char* argv[]){ // Variabili int real_N, v[N], i, j; // Acquisisco l'array do { printf("Quanti numeri vuoi inserire?: "); scanf("%d", &real_N); } while (real_N < 0 || real_N > N); for(i = 0; i < real_N; i++){ printf("Inserisci l'elemento in posizione %d: ", i); scanf("%d", &v[i]); } // Cerco e stampo le coppie di numeri di cui il primo è il doppio del secondo for(i=0; i<real_N; i++){ for(j=0; j<real_N; j++){ if(v[i] == 2 * v[j]) printf("%d in posizione %d è il doppio di %d in posizione %d.\n", v[i], i, v[j], j); } } return 0; } ``` --- # Set di un Array Scrivere un programma che permetta all’utente di inserire una sequenza di numeri. Il programma salva e stampa il set dei numeri inseriti (i.e., stampa la sequenza senza ripetizioni). ```c #include <stdio.h> #define N 100 int main(int argc, char* argv[]){ // Variabili int real_N, last_number, set[N], i, j, last_set_idx = 0, flag = 0; // Acquisisco quanti numeri do { printf("Quanti numeri vuoi inserire?: "); scanf("%d", &real_N); } while (real_N < 0 || real_N > N); // Acquisisco i numeri for(i = 0; i < real_N; i++){ printf("Inserisci l'elemento in posizione %d: ", i); scanf("%d", &last_number); // Controllo se il numero inserito è già presente nel set flag = 0; for(j=0; j<=last_set_idx; j++){ if(set[j] == last_number){ flag = 1; break; } } // il numero non è presente lo copio e incremento l'indice del set if(!flag){ set[last_set_idx] = last_number; last_set_idx++; } } // Stampo printf("{"); for(i=0; i<last_set_idx; i++){ printf(" %d", set[i]); } printf("}\n"); return 0; } ``` --- # Unione di Set Si scriva un programma che permetta all'utente di inserire due sequenze di numeri interi. Il programma salva e stampa il set unione dei set relativi alle due sequenze di numeri inseriti. ```c // Librerie #include <stdio.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili int v1[N], v2[N], v3[N], len1 = 0, len2 = 0, len3 = 0, i, z, flag = 0; // Acquisizione primo array do { printf("Quanti numeri vuoi inserire nel primo set: "); scanf("%d", &len1); } while (len1 < 0 || len1 > N); for(i = 0; i < len1; i++){ printf("Inserisci l'elemento del primo set in posizione %d: ", i); scanf("%d", &v1[i]); } // Acquisizione secondo array do { printf("Quanti numeri vuoi inserire nel secondo set: "); scanf("%d", &len2); } while (len2 < 0 || len2 > N); for(i = 0; i < len2; i++){ printf("Inserisci l'elemento del secondo in posizione %d: ", i); scanf("%d", &v2[i]); } // Calcolo dell'unione // Inserisco i valori del primo array for(i=0; i<len1; i++){ // controllo di non averlo già inserito flag = 0; for(z=0; z<len3; z++){ if(v3[z] == v1[i]){ flag = 1; break; } } // se non l'ho già inserito lo faccio if(!flag){ v3[len3] = v1[i]; len3++; } // controllo che la lunghezza non ecceda la dimensione massima N if(len3 >= N){ printf("Lunghezza massima ecceduta!\n"); return -1; } } // Inserisco i valori del secondo array for(i=0; i<len2; i++){ // controllo di non averlo già inserito flag = 0; for(z=0; z<len3; z++){ if(v3[z] == v2[i]){ flag = 1; break; } } // se non l'ho già inserito lo faccio if(!flag){ v3[len3] = v2[i]; len3++; } // controllo che la lunghezza non ecceda la dimensione massima N if(len3 >= N){ printf("Lunghezza massima ecceduta!\n"); return -1; } } // Stampo l'unione printf("L'unione dei due set è:\n"); printf("{"); for(z = 0; z < len3; z++) printf(" %d", v3[z]); printf("}\n"); return 0; } ``` --- # Intersezione di Set Si scriva un programma che permetta all'utente di inserire due sequenze di numeri interi. Il programma salva e stampa il set intersezione dei set relativi alle due sequenze di numeri inseriti. ```c // Librerie #include <stdio.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili int v1[N], v2[N], v3[N], len1 = 0, len2 = 0, len3 = 0, i, j, z, flag = 0; // Acquisizione primo array do { printf("Quanti numeri vuoi inserire nel primo set: "); scanf("%d", &len1); } while (len1 < 0 || len1 > N); for(i = 0; i < len1; i++){ printf("Inserisci l'elemento del primo set in posizione %d: ", i); scanf("%d", &v1[i]); // controllo di non averlo già inserito [...] } // Acquisizione secondo array do { printf("Quanti numeri vuoi inserire nel secondo set: "); scanf("%d", &len2); } while (len2 < 0 || len2 > N); for(i = 0; i < len2; i++){ printf("Inserisci l'elemento del secondo in posizione %d: ", i); scanf("%d", &v2[i]); // controllo di non averlo già inserito [...] } // Calcolo dell'intersezione for(i = 0; i < len1; i++){ for(j = 0; j < len2; j++){ // controllo se v1[i] == v2[j] if(v1[i] == v2[j]){ // controllo se ho gia messo l'elemento in v3 flag = 0; for(z = 0; z < len3; z++){ if(v3[z] == v1[i]){ flag = 1; break; } } // se non l'ho già messo lo inserisco if(!flag){ v3[len3] = v1[i]; len3++; } } } } // Stampo l'intersezione printf("L'intersezione dei due set è:\n"); printf("{"); for(z = 0; z < len3; z++) printf(" %d", v3[z]); printf("}\n"); return 0; } ``` --- # Concatenazione di Stringhe Scrivere un programma che permetta all’utente di prendere in input due stringhe. Il programma concatena le due stringhe e stampa il risultato a schermo. ## Versione base ```c #include <stdio.h> #include <string.h> #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N], s3[N]; int len1, len2; // Acquisizione stringa 1 printf("Inserire la prima stringa (MAX %d LETTERE): ", N-1); gets(s1); len1 = strlen(s1); // Acquisizione stringa 2 printf("Inserire la seconda stringa (MAX %d LETTERE): ", N-1); gets(s2); len2 = strlen(s2); // Concatenazione if(len1 + len2 < N) { strcpy(s3, s1); strcat(s3, s2); printf("%s\n", s3); } else printf("La concatenazione di '%s' e '%s' eccede la misura massima.\n", s1, s2); return 0; } ``` ## Versione con due sole stringhe ```c #include <stdio.h> #include <string.h> #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N]; int len1, len2; // Acquisizione stringa 1 printf("Inserire la prima stringa (MAX %d LETTERE): ", N-1); gets(s1); len1 = strlen(s1); // Acquisizione stringa 2 printf("Inserire la seconda stringa (MAX %d LETTERE): ", N-1); gets(s2); len2 = strlen(s2); // Concatenazione if(len1 + len2 < N) { strcat(s1, s2); printf("%s\n", s1); } else printf("La concatenazione di '%s' e '%s' eccede la misura massima.\n", s1, s2); return 0; } ``` ## Versione con due sole stringhe e senza variabili di lunghezza ```c #include <stdio.h> #include <string.h> #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N]; // Acquisizione stringa 1 printf("Inserire la prima stringa (MAX %d LETTERE): ", N-1); gets(s1); // Acquisizione stringa 2 printf("Inserire la seconda stringa (MAX %d LETTERE): ", N-1); gets(s2); // Concatenazione if(strlen(s1) + strlen(s2) < N) { strcat(s1, s2); printf("%s\n", s1); } else printf("La concatenazione di '%s' e '%s' eccede la misura massima.\n", s1, s2); return 0; } ``` --- # Stringhe Palindrome Scrivere un programma che permetta all’utente di inserire una stringa. Il programma verifica se la stringa è palindroma oppure no. ## Versione base ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N]; int i, len1; // Acquisizione stringa printf("Inserire una stringa (MAX %d LETTERE): ", N-1); scanf("%s", s1); // Salvo il numero di lettere nella stringa len1 = (int)strlen(s1); // Verifica che la stringa sia palindroma // Copio la stringa inserita al contrario in una stringa di appoggio for(i = 0; i < len1; i++){ s2[i] = s1[len1 - i - 1]; } // Inserisco il terminatore di stringa s2[len1] = '\0'; printf("%s\n", s2); // Verifico che la stringa inserita sia uguale alla sua controparte invertita if(strcmp(s1, s2) == 0) printf("La stringa inserita è palindroma.\n"); else printf("La stringa inserita NON è palindroma.\n"); return 0; } ``` ## Versione migliorata ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s[N]; int i, len, flag = 0; // Acquisizione stringa printf("Inserire una stringa (MAX %d LETTERE): ", N-1); scanf("%s", s); // Salvo il numero di lettere nella stringa len = (int)strlen(s); // Verifica che la stringa sia palindroma for(i = 0; i < len/2; i++){ if(s[i] != s[len - i - 1]){ flag = 1; break; } } if(flag) printf("La stringa inserita NON è palindroma.\n"); else printf("La stringa inserita è palindroma.\n"); return 0; } ``` --- # Split di Stringa Scrivere un programma che consenta di inserire una serie di caratteri (senza spazio). Il programma deve stampare 3 sequenze: 1. cifre pari inserite dall’utente (nell’ordine in cui sono state inserite) 2. cifre dispari inserite dall’utente (nell’ordine in cui sono state inserite) 3. tutti gli altri caratteri meno che cifre pari e dispari (nell’ordine in cui sono stati inseriti) ## Versione base ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s[N], pari[N], dispari[N], tuttoilresto[N]; int cp = 0, cd = 0, ct = 0, i, len; // Acquisizione stringa printf("Inserisci una sequenza di caratteri: "); scanf("%s", s); len = (int)strlen(s); // Divisione in sequenze for(i = 0; i < len; i++){ switch (s[i]) { case '0': case '2': case '4': case '6': case '8': pari[cp] = s[i]; cp++; break; case '1': case '3': case '5': case '7': case '9': dispari[cd] = s[i]; cd++; break; default: tuttoilresto[ct] = s[i]; ct++; break; } } // Stampo printf("Cifre pari: "); for(i = 0; i < cp; i++) printf("%c", pari[i]); printf("\n"); printf("Cifre dispari: "); for(i = 0; i < cd; i++) printf("%c", dispari[i]); printf("\n"); rintf("... e poi: "); for(i = 0; i < ct; i++) printf("%c", tuttoilresto[i]); printf("\n"); return 0; } ``` ## Versione con stampa migliorata ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s[N], pari[N], dispari[N], tuttoilresto[N]; int cp = 0, cd = 0, ct = 0, i, len; // Acquisizione stringa printf("Inserisci una sequenza di caratteri: "); scanf("%s", s); len = (int)strlen(s); // Divisione in sequenze for(i = 0; i < len; i++){ switch (s[i]) { case '0': case '2': case '4': case '6': case '8': pari[cp] = s[i]; cp++; break; case '1': case '3': case '5': case '7': case '9': dispari[cd] = s[i]; cd++; break; default: tuttoilresto[ct] = s[i]; ct++; break; } } // Rendo le sequenze stringhe pari[cp] = '\0'; dispari[cd] = '\0'; tuttoilresto[ct] = '\0'; // Stampo printf("Cifre pari: %s\n", pari); printf("Cifre dispari: %s\n", dispari); printf("... e poi: %s\n", tuttoilresto); return 0; } ``` --- # Anagrammi Si scriva un programma che permetta all’utente di inserire due stringhe. Il programma verifica se le stringhe sono anagrammi. **Bonus:** si analizzi il caso in cui si accettino stringhe con spazi e implementare la verifica che NON tiene conto degli spazi bianchi e del fatto che alcune lettere sono maiuscole o minuscole. ## Versione base ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N]; int count1[256] = {0}, count2[256] = {0}, i, len1, len2, flag = 0; // Acquisizione stringa 1 printf("Inserisci la prima stringa: "); scanf("%s", s1); fflush(stdin); // Salvo la lunghezza della prima stringa len1 = (int)strlen(s1); // Acquisizione stringa 2 printf("Inserisci la seconda stringa: "); scanf("%s", s2); // Salvo la lunghezza della seconda stringa len2 = (int)strlen(s2); // Verifico che le stirnghe abbiano la stessa lunghezza if(len1 != len2){ printf("Le stringhe inserite NON sono anagrammi.\n"); return 0; } // Conto la frequenza dei caratteri in s1 e in s2 // Nota: si usa len1 in quanto se si è arrivati fino a qui le stringhe hanno la stessa lunghezza for(i = 0; i < len1; i++){ count1[s1[i]]++; count2[s2[i]]++; } // Controllo che tutte le frequenze siano uguali for(i = 0; i < 256; i++){ if(count1[i] != count2[i]){ flag = 1; break; } } if(flag) printf("Le stringhe inserite NON sono anagrammi.\n"); else printf("Le stringhe inserite sono anagrammi.\n"); return 0; } ``` ## Versione migliorata ```c // Librerie #include <stdio.h> #include <string.h> // MACRO #define N 100 int main(int argc, char* argv[]) { // Variabili char s1[N], s2[N]; int count[256] = {0}, i, len1, len2, flag = 0; // Acquisizione stringa 1 printf("Inserisci la prima stringa: "); scanf("%s", s1); fflush(stdin); // Salvo la lunghezza della prima stringa len1 = (int)strlen(s1); // Acquisizione stringa 2 printf("Inserisci la seconda stringa: "); scanf("%s", s2); // Salvo la lunghezza della seconda stringa len2 = (int)strlen(s2); // Verifico che le stirnghe abbiano la stessa lunghezza if(len1 != len2){ printf("Le stringhe inserite NON sono anagrammi.\n"); return 0; } // Conto la frequenza dei caratteri in s1 e in s2 // Nota: si usa len1 in quanto se si è arrivati fino a qui le stringhe hanno la stessa lunghezza for(i = 0; i < len1; i++){ count[s1[i]]++; count[s2[i]]--; } // Controllo che tutte le frequenze siano uguali for(i = 0; i < 256; i++){ if(count[i] != 0){ flag = 1; break; } } if(flag) printf("Le stringhe inserite NON sono anagrammi.\n"); else printf("Le stringhe inserite sono anagrammi.\n"); return 0; } ```