Allocazione dinamica della memoria, Direttive al preprocessore, Libreria standard, Stringhe

OBIETTIVO DELLA LEZIONE
  1. Essere in grado allocare dinamicamente la memoria
  2. Conoscere le direttive al preprocessore e le macro
  3. Conoscere gli header delle libreria standard
  4. Essere in grado di manipolare correttamente le stringhe
.:. LUCIDI DELLA LEZIONE .:.

Lab

Prima di iniziare

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:
  1. venga allocata memoria per un secondo vettore che contiene gli elementi del primo in ordine inverso;
  2. 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:
  1. venga definita una macro PRN(x,y) che chiamata sugli interi n e m stampi la riga: x vale n, y vale m;
  2. 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:
  1. venga definita una funzione prn(x,y) che chiamata sugli interi n e m stampi la riga: x vale n, y vale m;
  2. 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:
  1. 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;
  2. sia definita una stringa (stringheConcatenate) che contiene la concatenazione delle prime 5 stringhe nel file di input.
  3. 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).

soluzione.
Traccia

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.




Informazioni sul sito