01-funzione.c 1/3

[
top][prev][next]
/* Si scriva una funzione F che riceva come parametro il numero reale
   X e restituisca il valore della funzione matematica F(x)=x^3 - 4x^2
   + x + 1 */

#include <stdio.h>

/* La funzione riceve in ingresso un float e restituisce un float */
float F(float x) {
  float result;

  /* Alternativamente si poteva usare la funzione pow (powf se uso i
     float invece dei double) che riceve come parametri la base e
     l'spinente. In tal caso dovevo aggiungere #include <math.h>
     all'inizio del file */
  result = x*x*x - 4*x*x + x + 1;

  return result;

}

/* Semplice programmino d'esempio per mostrare il funzionamento di
   F */
void main() {
  float x, y;

  printf("Inserisci un valore reale ");
  scanf("%f", &x);

  y = F(x);

  printf("Il valore ella funzione  %f\n", y);

}

02-trasforma.c 2/3

[
top][prev][next]
/* Scrivere una funzione chiamata TRASFORMA che trasforma un valore da
   chilometri a metri. Il valore in km deve essere fornito come
   parametro della funzione e modificato dalla funzione stessa.

   Scrivere poi un programma che: 

   - crea un vettore (con l'opportuna struttura) costituito da 10
     elementi che rappresentano distanze in chilometri e assegna i
     valori agli elementi dell'array chiedendoli all'utente

   - modifica il vettore trasormando ogni suo elemento nel
     corrispondete valore in metri, utilizzando la funzione TRASFORMA

 */

#include <stdio.h>

#define MAX 10

typedef struct {
  float dati[MAX];
  int dim;
} VETTORE;


/* La funzione riceve come parametro la distanza espressa in
   chilometri. Siccome deve modificarne il valore, richiede come
   parametro non la variabile vera e propria ma un puntatore a questa
   variabile, ovvero il suo indirizzo. La funzione non restituisce
   nulla e di conseguenza utilizzo la parola void */
void trasforma(float *distanza) {

  /* Siccome ho un puntatore alla variabile, posso accedervi
     direttamente dalla funzione */
  *distanza = *distanza * 1000;
}

void main() {

  VETTORE v;
  int i;

  v.dim = 0;

  for(i = 0; i < MAX; i = i + 1) {
    printf("Inserisci la distanza (km) ");
    scanf("%f", &(v.dati[i]));
  }

  /* Adesso scorro tutto l'array, trasformo i valori in metri e poi
     stampo i nuovi valori */
  for(i = 0; i < MAX; i = i + 1) {

    /* Siccome trasforma richiede un puntatore a float, devo passargli
       l'indirizzo (cio devo usare &) di v.dati[i] */
    trasforma(&(v.dati[i]));
    printf("%f\n", v.dati[i]);
  }
}

03-biblioteca.c 3/3

[
top][prev][next]
/* Scrivere una funzione per l'inserimento e il prestito di un libro
   in una biblioteca. Si definiscano opportunamente le strutture LIBRO
   e BIBLIOTECA per tener traccia dei libri in catalogo e distinguere
   tra quelli in prestito e quelli disponibili */

#include <stdio.h>

#define MAX_LIBRI 100
#define MAX_STR 50

typedef struct {
  char autore[MAX_STR];
  char titolo[MAX_STR];
  float prezzo;
} libro;

typedef struct{
  libro catalogo[MAX_LIBRI];
  /* per ogni libro catalogo[i], se valido[i]  1 vuol dire che il
     libro  disponibile per il prestito, se  zero vuol dire che il
     libro  gi stato preso */
  int valido[MAX_LIBRI];
  int dim;
} biblioteca;

/* Il libro non deve essere inserito quindi lo passo per copia mentre
   biblioteca devo passarlo per indirizzo perch lo devo modificare
   (devo aggiungere il libro) */
void inserimento(biblioteca *b, libro lib) {
  
  /* NB:b->dim equivale a dire (*b).dim  */

  /* b->dim mi indica la dimensione effettiva dell'array catologo e al
     tempo stesso mi indica la prima cella libera (se dim = 0, vuol
     dire che l'array  vuoto e quindi la prima cella libera sar la
     cella 0, se dim=1 allora l'array contiene un elemento e quindi la
     prima cella libera  la cella numero uno e cos via) */
  b->catalogo[b->dim] = lib;
  b->valido[b->dim] = 1;

  /* Incremento la posizione */
  b->dim = b->dim + 1;

}

/* La funzione ricerca il libro lib nel catalogo nella biblioteca, se
   lo trova ed  disponibile lo segna come non disponibile e ritorna 1
   altrimenti ritorna 0 (prestito non effettuato) */
int prestito(biblioteca *b, libro lib) {
  /* NB: Per confrontare le stringhe si usa la funzione strcmp(s1, s2)
     disponibile in string.h. strcmp confronta le stringhe e
     restituisce 0 se sono uguali */
  int i;

  for(i = 0; i < b->dim; i = i + 1) {
    /* Verifico se il libro  disponibile */
    if(b->valido[i] == 1) {
      /* Confronto titolo e autore */
      if(strcmp((b->catalogo[i]).autore, lib.autore) == 0 &&
	 strcmp((b->catalogo[i]).titolo, lib.titolo) == 0) {
	b->valido[i] = 0;
	/* L'istruzione return fa terminare immediatamente la funzione
	   e ritorna il controllo al main. Di conseguenza, non appena
	   trovo il libro la funzione termina. */
	return 1;
      }
    }
  }

  /* Se sono arrivato fin qui vuol dire che il libro non  stato
     trovato (perch altrimenti sarebbe stato eseguito l'istruzione
     "return 1" e la funzione sarebbe terminata), quindi restituisco 0
     (prestito non eseguito) */
  return 0;
}

void main() {

  biblioteca sormani;
  libro temp;
  int i, effettuato;
  char continua;

  /* La biblioteca  vuota */
  sormani.dim = 0;

  printf("Vuoi inserire un libro (s per continuare) ");
  scanf("%c%*c", &continua);

  i = 0;

  while(i < MAX_LIBRI && continua == 's') {
    printf("Autore: ");
    gets(temp.autore);
    printf("Titolo: ");
    gets(temp.titolo);
    printf("Prezzo: ");
    scanf("%f%*c", &temp.prezzo);

    inserimento(&sormani, temp);

    printf("Vuoi inserire un altro libro (s per continuare) ");
    scanf("%c%*c", &continua);

    i = i + 1;

  }
    
  printf("Vuoi prendere in prestito un libro ? (s per continuare) ");
  scanf("%c%*c", &continua);

  while(continua == 's') {
   printf("Autore: ");
   gets(temp.autore);
   printf("Titolo: ");
   gets(temp.titolo);
   
   effettuato = prestito(&sormani, temp);

   if(effettuato == 1) {
     printf("Prestito effettuato con successo\n");
   } else {
     printf("Prestito non effettuato\n");
   }

  printf("Vuoi prendere in prestito un altro libro ? (s per continuare) ");
  scanf("%c%*c", &continua);
 
  }

}

Generated by GNU enscript 1.6.4.