OBIETTIVO DELLA LEZIONE
- Essere in grado allocare dinamicamente la memoria
- Conoscere le direttive al preprocessore e le macro
- Conoscere gli header delle libreria standard
- Essere in grado di manipolare correttamente le stringhe
Rileggi velocemente i lucidi della lezione di stamattina. I costrutti presentati saranno molto utili per risolvere gli esercizi di oggi.
Esercizio 1: Allocazione dinamica della memoria
Utilizzando la traccia di codice sotto riportata, crea il programma Allocazione.c che:
- dichiari una variabile come puntatore a char;
- dichiari una variabile come puntatore a int;
- allochi correttamente la memoria per le due variabili e assegni loro un valore;
- stampi il valore dei due puntatori (indirizzo) e il contenuto delle celle di memoria da loro puntate;
#include <stdio.h> #include <stdlib.h> int main() { ... } // main
soluzione.
Esercizio 2: Allocazione dinamica della memoria contigua
Utilizzando la traccia di codice sotto riportata, crea il programma Allocazione2.c che:
- dichiari un puntatore a un vettore v di interi;
- richieda all'utente di immettere la dimensione del vettore v ;
- allochi correttamente la memoria per contenere il vettore v;
- inserisca nel vettore le potenze di 2 (ovvero v[i] contiene 2 elevato alla i)
- stampi il vettore cosi' costruito
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { ... } // main
soluzione.
Esercizio 3: Vettore invertito
Modifica la traccia di codice sotto riportata denominata InvertiVettore.c, in modo tale che:
- venga allocata memoria per un secondo vettore che contiene gli elementi del primo in ordine inverso;
- vengano stampati i due vettori.
#include <stdio.h> #include <stdlib.h> int main() { int n,i; int* v; //dichiaro il vettore ma non so la lunghezza // dichiarare il secondo vettore printf("Quanti numeri mi passi? "); scanf("%d", &n); //l'utente mi dice la lunghezza v = (int*) calloc (n, sizeof(int)); // alloco il vettore if (v == NULL) { printf("E' finita la memoria"); exit(-1); } for(i=0; i<n; i++){ printf("inserisci v[%d]= ", i); scanf("%d", &v[i]); } // allocare il secondo vettore // copiare il primo vettore nel secondo in ordine inverso // visualizzare i due vettori free(v); //disalloco la memoria // disallocare il secondo vettore fflush(stdin); getchar(); return 0; }
soluzione.
Esercizio 4: Macro
Modifica la traccia di codice sotto riportata in modo tale che:
- venga definita una macro PRN(x,y) che chiamata sugli interi n e m stampi la riga: x vale n, y vale m;
- venga definita una macro MAX(x,y,z) che restituisca il valore massimo tra i tre parametri
#include <stdio.h> #include <stdlib.h> #define #define int main() { // provare ad usare le due macro fflush(stdin); getchar(); return 0; }
soluzione.
Esercizio 5: Macro e funzioni
Modifica la traccia di codice sotto riportata in modo tale che:
- venga definita una funzione prn(x,y) che chiamata sugli interi n e m stampi la riga: x vale n, y vale m;
- venga definita una funzione max(x,y,z) che restituisca il valore massimo tra i tre parametri
#include <stdio.h> #include <stdlib.h> // Inserire i prototipi int main() { prn(3,5+6); printf("\n\nil max tra %d% d %d e' %d", 2*8 ,1+9,3, max(2*8 ,1+9,3)); prn(3,max(29 ,1+9,3)); fflush(stdin); getchar(); return 0; } // Inserire le due funzioni
soluzione.
Esercizio 6: Stringhe
Per lo svolgimento di questo esercizio e' necessario il file stringhe.txt. Effettua il download del file stringhe.txt.
Modifica la traccia di codice sotto riportata in modo tale che:
- il vettore di char (stringa) che contiene il nome del file di output (nomefile) sia allocato dinamicamente ovvero una volta calcolata la stringa piu' lunga allocare esattamente il numero di caratteri necessari per contenerla;
- sia definita una stringa (stringheConcatenate) che contiene la concatenazione delle prime 5 stringhe nel file di input.
- stampi a terminale il valore della stringa stringheConcatenate.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char s[128]; //stringa char p[128]; // prima stringa char sl[128]; //stringa piu' lunga char nomefile[128]; //nome del file di output FILE *pfin, *pfout; int lung =1; /* apertura del file di input */ pfin = fopen("stringhe.txt", "r"); if (pfin == NULL) // controlla se il file viene aperto { printf("Non posso aprire il file %s\n", "stringhe.txt"); exit(-1); } fscanf(pfin,"%s", p); //leggo la prima stringa strcpy(sl, p); //la prima stringa per ora e' la piu' lunga while(!feof(pfin)) //leggo tutte le stringhe { fscanf(pfin,"%s", s); if (!strcmp(p,s)) // se sono uguali lung++; // incremento il contatore // calcolo la piu' lunga if (strlen(s)>strlen(sl)) strcpy(sl, s); } fflush(pfin); fclose(pfin); //nome file e' "stringa piu' lunga".txt sprintf(nomefile, "%s.txt", sl); /* apertura del file di output */ pfout = fopen(nomefile, "w"); if (pfout == NULL) // controllo se il file viene aperto { printf("Non posso aprire il file %s\n", nomefile); exit(-1); } fprintf(pfout, "%d", lung); fflush(pfout); fclose(pfout); return 0; }
soluzione.
Esercizio 7: Miss Italia
Completa il programma gestioneMissItalia.c sotto riportato e scrivi le funzioni mancanti: copia_miss e stampa_concorso;//gestioneMissItalia.c #include <stdio.h> #include <stdlib.h> #include typedef struct { char nome[256] ; char cognome[256] ; int voto[3]; // voto[0] e' il voto della giuria (da 0 a 100), // voto[1] quello della giuria speciale e voto[2] il voto // telefonico. int altezza; int peso; int cucina; // 0= aiuto!!! 10= apre un ristorante } MissItalia; // Iniziale maiuscola void inserisci_miss(MissItalia *Concorso, int i); // chiede una miss all'utente e la inserisce in posizione i di Concorso void copia_miss(MissItalia ragazza1, MissItalia *ragazza2) // copia la ragazza1 nella ragazza2 void stampa_concorso(MissItalia *Concorso, int dim); // stampa il nome di tutte le miss in Concorso int main() { MissItalia * Concorso; int dim; printf("Quante miss sono in concorso? --> "); scanf("%d", &dim); // DA FARE: allocare il vettore Concorso che contiene tutte le miss (usare una calloc) for (i=0; i<dim; i++) inserisci_miss (Concorso, i); copia_miss(Concorso[0], &Concorso[dim-1]) // copia nell'ultima posizione la prima miss stampa_concorso(Concorso, dim); // DA FARE: disallocare la memoria fflush(stdin); getchar(); exit(0); } void inserisci_miss(MissItalia *Concorso, int i) { printf("Dammi il nome della miss %d --> ", i); scanf("%s", Concorso[i].nome ); printf("Dammi il cognome della miss %d --> ", i); scanf("%s", Concorso[i].cognome ); Concorso[i].altezza = 180; Concorso[i].voto[0] = 80; Concorso[i].voto[1] = 90; Concorso[i].voto[2] = 99; Concorso[i].peso = 78; Concorso[i].cucina = 0; // aiuto!!! } // DA FARE: scrivere le funzioni copia_miss e stampa_concorso
soluzione.
Esercizio 8: Stringhe palindrome
Scrivere un programma che verifica se una stringa e' palindroma (una stringa e' palindroma se si legge nello stesso modo da destra verso sinistra e da sinistra verso destra. Es: anna, radar).Traccia
soluzione.
E' utile conoscere la lunghezza della stringa (usare strlen). Scandire la stringa carattere per carattere confrontando il primo carattere con l'ultimo, il secondo con il penultimo e cosi' via. Controllare che il programma funzioni sia per le stringhe con un numero pari di caratteri (Es: anna), che per quelle con un numero dispari (Es: radar).
Esercizio 9: Stringhe
Scrivere un programma che, richiesta all'utente una stringa, controlli se vi compaiono almeno due caratteri uguali consecutivi.
soluzione.