Guida Compatta Ripasso
Guida Compatta Ripasso
---
---
1. **Verifica Input:** Ciclo `do-while` per imporre $a \ge 1$, $b \ge 1$ e $a < b$.
2. **Somma delle Cifre:** Si usa il ciclo `while(n > 0)` estratte con `% 10` e tagliate con `/ 10`.
3. **Controllo Harshad:** Se `numero % somma == 0`, incrementa il contatore.
4. **Stampa:** Ciclo `for` finale per stampare "gioia" un numero di volte pari al contatore.
### Codice C
```c
#include
int main() {
int a, b;
int contatore_harshad = 0;
// Verifica divisibilita
if (i % somma_cifre == 0) {
contatore_harshad++;
}
}
// 3. Stampa "gioia"
for (int i = 0; i < contatore_harshad; i++) {
printf("gioia\n");
}
return 0;
}
```
---
* **Struct:** `struct veicolo { char targa[15]; int chilometraggio; char modello[30]; };`
* **Univocità targa:** Durante l'inserimento, scorrere l'array per verificare che la targa non esista già.
* **Funzioni stringa:** Utilizzare `strcmp` per confrontare le stringhe e `strstr` per cercare sottostringhe (`cercaTarga`).
* **Scrittura File:** Aprire il file `[Link]` in modalità `"w"` con `fopen` e scrivere con `fprintf`.
### Codice C
```c
#include
#include
struct veicolo {
char targa[15];
int chilometraggio;
char modello[30];
};
do {
univoca = 1;
printf("Inserisci targa: ");
scanf("%s", [Link]);
return v;
}
fclose(f);
printf("Risultati salvati su [Link]\n");
}
void ordinaEStampa() {
// Bubble sort decrescente
struct veicolo temp;
struct veicolo copia[MAX_VEICOLI];
for (int i = 0; i < num_veicoli; i++) copia[i] = flotta[i];
int main() {
int scelta = 0;
if (scelta == 1) {
if (num_veicoli < MAX_VEICOLI) {
flotta[num_veicoli] = inserisciVeicolo();
num_veicoli++;
} else {
printf("Flotta piena!\n");
}
} else if (scelta == 2) {
char mod[30];
printf("Inserisci modello: ");
scanf("%s", mod);
cercaModello(mod);
} else if (scelta == 3) {
int min, max;
printf("Inserisci min e max km: ");
scanf("%d %d", &min;, &max;);
cercaChilometraggio(min, max);
} else if (scelta == 4) {
char cod[3];
printf("Inserisci codice targa (max 2 car): ");
scanf("%s", cod);
cercaTarga(cod);
} else if (scelta == 5) {
ordinaEStampa();
}
}
return 0;
}
```
---
1. **Generazione Casuale:** Utilizzare `srand(time(NULL))` e la formula `(rand() % 12) + 1` per simulare un dado a 12 facce.
2. **I/O Simultaneo:** Aprire `[Link]` e scrivere sia a schermo con `printf` sia nel file con `fprintf`.
3. **Condizione di arresto:** Il ciclo `do-while` si arresta quando la somma è compresa nell'intervallo $[5, 10]$.
### Codice C
```c
#include
#include
#include
int main() {
srand(time(NULL));
do {
dado1 = (rand() % 12) + 1; // Valore tra 1 e 12
dado2 = (rand() % 12) + 1;
somma = dado1 + dado2;
} while (somma < 5 || somma > 10); // Continua finché NON è tra 5 e 10
fclose(f);
printf("Terminato! Somma finale compresa tra 5 e 10.\n");
return 0;
}
```
---
* **Radice Intera:** Trovata mediante un ciclo `while` incrementando `y` finché $(y+1)^2 \le n$. Non si usa `math.h`.
* **Numero Triangolare:** Un numero $k$ è triangolare se la quantità $\frac{\sqrt{8k + 1} - 1}{2}$ è un intero preciso (ossia senza resto nell'estrazione della radice intera).
### Codice C
```c
#include
return 0;
}
```
---
1. **Generazione Range:** Per valori compresi tra 5 e 50: `(rand() % (50 - 5 + 1)) + 5`.
2. **Media Intera Inferiore:** La divisione tra interi in C (`somma / M`) esegue automaticamente il troncamento inferiore.
3. **Ricerca:** Scorrere l'array con una flag `trovato` per verificare la presenza del valore di media.
### Codice C
```c
#include
#include
#include
#define M 10
int main() {
srand(time(NULL));
int arr[M];
int somma = 0;
int trovato = 0;
for (int i = 0; i < M; i++) {
if (arr[i] == media) {
trovato = 1;
break;
}
}
if (trovato) {
printf("La media COINCIDE con almeno un elemento dell'array.\n");
} else {
printf("La media NON coincide con alcun elemento dell'array.\n");
}
return 0;
}
```
---
* **Definizione di Similitudine:** Due stringhe $s_1$ e $s_2$ sono simili se almeno l'85% dei caratteri distinti di $s_1$ compaiono in $s_2$ **E** l'85% dei caratteri distinti di $s_2$ compaiono in $s_1$.
* **Funzione Ausiliaria:** Una funzione helper calcola la percentuale di caratteri di $s_1$ presenti in $s_2$.
### Codice C
```c
#include
#include
int main() {
char s1[MAX];
do {
printf("Inserisci la prima stringa (almeno 3 caratteri): ");
scanf("%s", s1);
} while (strlen(s1) < 3);
int scelta;
printf("Scegli un'opzione:\n1. Confronta con una seconda stringa\n2. Confronta con le parole del file [Link]\nScelta: ");
scanf("%d", &scelta;);
if (scelta == 1) {
char s2[MAX];
printf("Inserisci la seconda stringa: ");
scanf("%s", s2);
if (sono_simili(s1, s2)) {
printf("%s e %s sono simili!\n", s1, s2);
} else {
printf("%s e %s NON sono simili!\n", s1, s2);
}
} else if (scelta == 2) {
FILE *f = fopen("[Link]", "r");
if (f == NULL) {
printf("Errore apertura file [Link]\n");
return 1;
}
char parola_file[MAX];
int trovata_simile = 0;
while (fscanf(f, "%s", parola_file) != EOF) {
if (sono_simili(s1, parola_file)) {
printf("La stringa %s e' simile alla parola del file: %s\n", s1, parola_file);
trovata_simile = 1;
break;
}
}
fclose(f);
if (!trovata_simile) {
printf("Nessuna parola simile trovata nel file.\n");
}
}
return 0;
}
```
---
* **MCD/MCM:** Algoritmo di Euclide per il Massimo Comune Divisore (`MCD`), usato poi per calcolare il Minimo Comune Multiplo ($mcm(a,b) = \frac{a \cdot b}{MCD(a,b)}$) e per la semplificazione.
* **Successione Irriducibile:** Generare frazioni $n/d$ tra $0$ e $1$ ordinate per $d$ crescente e $n$ crescente, con $MCD(n, d) == 1$.
### Codice C
```c
#include
struct frazione {
int numeratore;
int denominatore;
};
void successione(int n) {
int stampati = 0;
int d = 2;
int main() {
int scelta = 0;
while (scelta != 4) {
printf("\n--- CALCOLATRICE FRAZIONI ---\n1. Somma\n2. Prodotto\n3. Successione\n4. Esci\nScelta: ");
scanf("%d", &scelta;);
if (scelta == 1 || scelta == 2) {
struct frazione f1, f2, res;
printf("Inserisci Frazione 1 (num den): ");
scanf("%d %d", &[Link];, &[Link];);
printf("Inserisci Frazione 2 (num den): ");
scanf("%d %d", &[Link];, &[Link];);
printf("Risultato: ");
stampa(res);
printf(" (Valore decimale: %.2f)\n", valoreDecimale(res));
} else if (scelta == 3) {
int n;
printf("Quanti elementi stampare? ");
scanf("%d", &n;);
successione(n);
}
}
return 0;
}
```
---
### Codice C
```c
#include
int numeroPrimo(int n) {
if (n < 2) return 0;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
int numeroMersenne(int n) {
if (!numeroPrimo(n)) return 0;
int p = 2;
int val = 0;
while ((val = potenza(2, p) - 1) <= n) {
if (val == n) return 1;
p++;
}
return 0;
}
int main() {
int r;
do {
printf("Inserisci r > 1: ");
scanf("%d", &r;);
} while (r <= 1);
int curr = r + 1;
while (1) {
if (numeroMersenne(curr)) {
printf("%d primo di Mersenne\n", curr);
break; // Arresto alla prima occorrenza
} else if (numeroPrimo(curr)) {
printf("%d primo\n", curr);
} else {
printf("%d\n", curr);
}
curr++;
}
return 0;
}
```
---
* **Sottosequenza:** Calcolare la somma dei quadrati delle cifre e memorizzare ogni termine in un array per tracciare le ripetizioni.
* **Arresto:** Se si raggiunge il valore `1` il numero è **felice**. Se si trova un numero già presente nell'array, è **infelice**.
### Codice C
```c
#include
int somma_quadrati_cifre(int n) {
int somma = 0;
while (n > 0) {
int cifra = n % 10;
somma += cifra * cifra;
n /= 10;
}
return somma;
}
int main() {
int n0;
printf("Inserisci un numero intero positivo: ");
scanf("%d", &n0;);
int sequenza[100];
int lungh = 0;
int corrente = n0;
int felice = -1; // 1 = felice, 0 = infelice
if (corrente == 1) {
felice = 1;
break;
}
sequenza[lungh - 1] = corrente;
}
if (felice == 1) {
printf("Il numero %d e' FELICE. Lunghezza sequenza: %d\n", n0, lungh);
} else {
printf("Il numero %d e' INFELICE. Lunghezza sequenza: %d\n", n0, lungh);
}
return 0;
}
```
---
* Verificare che due vettori $U$ e $V$ di dimensione $n$ soddisfino l'uguaglianza $\sum u_i^m = \sum v_i^m$ per ogni grado $m$ da $1$ a $k$.
### Codice C
```c
#include
int main() {
int n, k;
int U[NMAX], V[NMAX];
printf("Inserisci dimensione n (<= %d) e grado k: ", NMAX);
scanf("%d %d", &n;, &k;);
int e_soluzione = 1;
if (sommaU != sommaV) {
e_soluzione = 0;
break;
}
}
if (e_soluzione) {
printf("Le due sequenze SONO una soluzione per il problema di grado %d.\n", k);
} else {
printf("Le due sequenze NON sono una soluzione.\n");
}
return 0;
}
```
---
### Codice C
```c
#include
int main() {
int matricesudoku[9][9] = {0};
int errori = 0;
while (!OK) {
printf("[%d][%d] Inserisci valore (1-9): ", r, c);
scanf("%d", &val;);
```
---
* **Unione ($A \cup B$):** Copiare gli elementi di $A$, poi inserire gli elementi di $B$ che non compaiono già nell'unione.
* **Intersezione ($A \cap B$):** Inserire solo gli elementi di $A$ presenti anche in $B$.
* **Differenza ($A \setminus B$):** Inserire gli elementi di $A$ assenti in $B$.
### Codice C
```c
#include
#define N 5
int main() {
int A[N], B[N];
// 1. UNIONE
int unione[2 * N], len_u = 0;
for (int i = 0; i < N; i++) {
if (!presente(unione, len_u, A[i])) unione[len_u++] = A[i];
}
for (int i = 0; i < N; i++) {
if (!presente(unione, len_u, B[i])) unione[len_u++] = B[i];
}
// 2. INTERSEZIONE
int inters[N], len_i = 0;
for (int i = 0; i < N; i++) {
if (presente(B, N, A[i]) && !presente(inters, len_i, A[i])) {
inters[len_i++] = A[i];
}
}
// 3. DIFFERENZA (A \ B)
int diff[N], len_d = 0;
for (int i = 0; i < N; i++) {
if (!presente(B, N, A[i]) && !presente(diff, len_d, A[i])) {
diff[len_d++] = A[i];
}
}
// Stampa Risultati
printf("\nUnione: ");
if (len_u == 0) printf("VUOTO");
else for (int i = 0; i < len_u; i++) printf("%d ", unione[i]);
printf("\nIntersezione: ");
if (len_i == 0) printf("VUOTO");
else for (int i = 0; i < len_i; i++) printf("%d ", inters[i]);
printf("\nDifferenza: ");
if (len_d == 0) printf("VUOTO");
else for (int i = 0; i < len_d; i++) printf("%d ", diff[i]);
printf("\n");
return 0;
}
```
---
* Un generatore $g$ per $n$ soddisfa la relazione $g + D(g) = n$, dove $D(g) < n$.
* È sufficiente verificare tutti i valori di $g$ nell'intervallo $[1, n-1]$. Se nessuno soddisfa la relazione, $n$ è un **self-number**.
### Codice C
```c
#include
int somma_cifre(int g) {
int somma = 0;
while (g > 0) {
somma += g % 10;
g /= 10;
}
return somma;
}
int main() {
int n;
do {
printf("Inserisci un numero positivo n: ");
scanf("%d", &n;);
} while (n <= 0);
if (generatore != -1) {
printf("Il generatore di %d e' %d\n", n, generatore);
} else {
printf("%d e' un self-number (non possiede generatore)\n", n);
}
return 0;
}
```
---
### Codice C
```c
#include
if (num_dot_after_at != 1) return 0;
if (idx_dot == idx_at + 1) return 0; // Nessun carattere tra '@' e '.'
if (idx_dot == len - 1) return 0; // Nessun carattere dopo '.'
return 1;
}
int main() {
char email[30];
int tentativi = 0;
```
---
### Codice C
```c
#include
#include
#include
#define NUM 5
#define LB 2
#define UB 14
int main() {
srand(time(NULL));
int A[NUM], B[NUM];
while (1) {
printf("\nInserisci %d elementi per B: ", NUM);
int tutto_zero = 1;
int prod_scalare = 0;
for (int i = 0; i < NUM; i++) {
prod_scalare += A[i] * B[i];
}
if (prod_scalare == 0) {
printf("I due vettori SONO ortogonali!\n");
} else {
printf("NON ortogonali (Prodotto scalare = %d)\n", prod_scalare);
}
}
return 0;
}
```
---
### Codice C
```c
#include
#include
struct ingrediente {
char nome[15];
float calorie_kg;
float prezzo_kg;
};
struct ricetta {
char titolo[30];
char ingredienti_necessari[20][15];
float quantita[20]; // in hg
int tempo;
int difficolta;
};
void stampaRicettaDaPosizione(int p) {
printf("Ricetta: %s | Tempo: %d min | Difficolta': %d\n", ricette[p].titolo, ricette[p].tempo, ricette[p].difficolta);
printf("Lista ingredienti:\n");
for (int i = 0; i < 20; i++) {
if (ricette[p].quantita[i] > 0) {
printf("- %s %.2f hg\n", ricette[p].ingredienti_necessari[i], ricette[p].quantita[i]);
}
}
}
float prezzoRicetta(int p) {
float totale = 0.0;
for (int i = 0; i < 20; i++) {
if (ricette[p].quantita[i] > 0) {
for (int j = 0; j < 100; j++) {
if (strcmp(ricette[p].ingredienti_necessari[i], ingredienti[j].nome) == 0) {
totale += (ricette[p].quantita[i] / 10.0) * ingredienti[j].prezzo_kg;
}
}
}
}
return totale;
}
void stampaRicettaDaPuntatore(struct ricetta *r) {
if (r == NULL) return;
printf("Ricetta: %s | Tempo: %d min | Difficolta': %d\n", r->titolo, r->tempo, r->difficolta);
}
int main() {
char nome_r[30];
printf("Inserisci nome ricetta: ");
scanf("%s", nome_r);
char nome_i[15];
printf("\nInserisci nome ingrediente: ");
scanf("%s", nome_i);
return 0;
}
```
---
### Codice C
```c
#include
#include
#define N 5
struct sala {
char nome_sala[6];
int num_posti_totali;
int num_posti_liberi;
char film[20];
};
void stampa_dettaglio_sale() {
for (int i = 0; i < N; i++) {
printf("Sala %s - Posti tot: %d - Posti liberi: ", multisala[i].nome_sala, multisala[i].num_posti_totali);
if (multisala[i].num_posti_liberi == 0) {
printf("ESAURITI");
} else {
printf("%d", multisala[i].num_posti_liberi);
}
printf(" - Film: %s\n", multisala[i].film);
}
}
int main() {
int scelta = -1;
while (scelta != 0) {
printf("\n*** MENU MULTISALA ***\n1. Elenco sale\n2. Prenota\n3. Cerca film\n4. Sala piu' piena\n0. Esci\nScelta: ");
scanf("%d", &scelta;);
if (scelta == 1) stampa_dettaglio_sale();
else if (scelta == 2) {
int tot_liberi = 0;
for (int i = 0; i < N; i++) tot_liberi += multisala[i].num_posti_liberi;
if (tot_liberi == 0) {
printf("Tutte le sale sono esaurite! Prenotazioni bloccate.\n");
} else {
char s[6]; int p;
printf("Nome sala e posti da prenotare: ");
scanf("%s %d", s, &p;);
prenotazione(s, &p;);
}
} else if (scelta == 3) {
char f[20];
printf("Nome film: ");
scanf("%s", f);
sale_comuni(f);
} else if (scelta == 4) {
struct sala piena = sala_piu_piena();
printf("La sala piu' piena e' %s (%d posti liberi)\n", piena.nome_sala, piena.num_posti_liberi);
}
}
return 0;
}
```
---
### Codice C
```c
#include
#define N 4
#define M 4
struct insegnamento {
char denominazione[15];
int h_req;
int id;
};
struct prof {
char cognome[15];
int libero; // 1 = Lunedi', ...
int id_insegnamento;
};
int orario[5][10];
while (!ok) {
printf("Cognome, giorno libero (1-5), ID insegnamento: ");
scanf("%s %d %d", [Link], &[Link];, &[Link];_insegnamento);
ok = 1;
for (int i = 0; i < attuali; i++) {
if (profs[i].id_insegnamento == p.id_insegnamento) {
printf("Insegnamento gia' assegnato ad un altro docente! Riprova.\n");
ok = 0;
break;
}
}
}
return p;
}
void stampaRecap() {
int totale_ore = 0;
int ore_giorno[5] = {0};
int max_giorno = 0;
for (int g = 1; g < 5; g++) {
if (ore_giorno[g] > ore_giorno[max_giorno]) max_giorno = g;
}
int main() {
struct insegnamento insegnamenti[N];
struct prof professori[M];
// Inserimento lezioni
for (int i = 0; i < N; i++) {
int id_curr = insegnamenti[i].id;
int giorno_vietato = -1;
orario[g][h] = id_curr;
}
}
stampaRecap();
return 0;
}
```
---
* **Maratona:** Calcolare i minuti totali come $\text{stagioni} \times \text{episodi} \times \text{durata}$ e convertirli in $Ore = M / 60$ e $Minuti = M \% 60$.
* **Playlist:** Uso di `strstr` per verificare la presenza della sottostringa `key` nel nome della serie.
### Codice C
```c
#include
#include
struct serietv {
char nome[20];
int stagioni;
int episodi_per_stagione;
int durata_episodio;
};
void consigliaMaratona() {
if (num_serie == 0) return;
int max_idx = 0;
int max_ep = elenco[0].stagioni * elenco[0].episodi_per_stagione;
int main() {
int scelta = -1;
while (scelta != 0) {
printf("\n**** App serietv-mania ****\n1 - Nuova serie\n2 - Consigliami maratona\n3 - Crea playlist\n0 - Esci\nScelta: ");
scanf("%d", &scelta;);
if (scelta == 1) {
elenco[num_serie++] = inserisciSerieTv();
} else if (scelta == 2) {
consigliaMaratona();
} else if (scelta == 3) {
char k[10];
printf("Inserisci parola chiave: ");
scanf("%s", k);
creaPlaylist(k);
}
}
return 0;
}
```
---
### Codice C
```c
#include
#include
struct timestamp {
int giorno, mese, anno, ora, minuti;
};
struct paziente {
char nome[16];
char cognome[16];
char cf[16];
int exe; // Esenzione
};
struct appuntamento {
char cf_paziente[16];
struct timestamp ts;
char ambulatorio[15];
float costo;
};
int main() {
// Dimostrazione basica di inserimento
printf("Sistema di gestione clinica avviato.\n");
return 0;
}
```