# 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;
}
```