ricorsione.c 1/3

[
top][prev][next]
#include <stdio.h>

void indovina (int x, int c) {
  int y;
  scanf("%d",&y);
  if (y == x) {
    printf("%d",c);
    return;
  } else {
    indovina(x,c+1);
  }
}

void main() {
  indovina(18, 1);
}

squadra.c 2/3

[
top][prev][next]
#include <stdio.h>

#define MAX_STRING 80

typedef struct {
  char nome[MAX_STRING];
  char cognome[MAX_STRING];
  /* per indicare la nazionalitÓ Ŕ sufficiente un intero: se il
     calciatore Ŕ europeo nazionalita sarÓ 1, altrimenti 0 */
  int nazionalita;
  int stipendio;
} Calciatore;

typedef struct {
  char nome[MAX_STRING];
  Calciatore roster[30];
  int dimRoster; /* indica il numero EFFETTIVO di calciatori */
  int capitaleSociale;

} Squadra;

int controllaSquadra(Squadra s) {

  int contatoreExtraComunitari = 0;
  int stipendioTotale = 0;
  int i;

  for(i = 0; i < s.dimRoster; i = i + 1) {
    if(s.roster[i].nazionalita == 0) {
      /* se nazionalita Ŕ pari a zero vuol dire che il giocatore Ŕ
	 extra-comunitario */
      contatoreExtraComunitari = contatoreExtraComunitari + 1;
    }
    stipendioTotale = stipendioTotale + s.roster[i].stipendio;
  }

  if((stipendioTotale > s.capitaleSociale) && (contatoreExtraComunitari > (s.dimRoster / 3))) {
    /* entrambi i controlli sono falliti, restituisco 0 */
    return 0;
  }
  else if(stipendioTotale > s.capitaleSociale) {
    /* Ŕ fallito solo il primo controllo (sicuramente i calciatori
       extra-comunitari sono meno di un terzo, altrimenti sarebbe
       stata vera la prima condizione dell'if), ritorno -1 */
    return -1;
  }
  else if(contatoreExtraComunitari > (s.dimRoster / 3)) {
    /* fallito solo il secondo controllo, restituisco -2 */
    return -2;
  }
  else {
    /* nessun controllo fallito, restituisco 0 */
    return 0;
  }

}

dispari.c 3/3

[
top][prev][next]
/* Si scriva una funzione in C che ricevendo come parametro un
   puntatore al primo elemento della lista cancelli dalla lista tutti
   gli elementi che hanno nel campo dato un numero dispari. */

#include <stdio.h>
#include <malloc.h>

typedef struct elem_lista {
  int dato;
  struct elem_lista* next;
} elem_lista;

elem_lista* creaLista() {
  return NULL;
}

elem_lista* inserisciInCoda(elem_lista *lista, int elemento) {
  elem_lista *corrente;

  elem_lista *nuovo;

  /* Alloco lo spazio per il nuovo elemento e gli assegno il valore
     desiderato */
  nuovo = (elem_lista *)malloc(sizeof(elem_lista));
  nuovo->dato = elemento;
  /* Siccome il nuovo elemento sar\x{00E0} l'ultimo della lista, dovr\x{00E0}
     puntare a NULL */
  nuovo->next = NULL;
  
  if(lista == NULL) {
    /* se la lista \x{00E8} vuota, allora il puntatore al primo elemento
       (cio\x{00E8} lista) dovr\x{00E0} puntare a nuovo */
    lista = nuovo;
  }
  else {
    corrente = lista;
    /* scorro la lista fino ad arrivare in fondo */
    while(corrente->next != NULL) {
      corrente = corrente->next;
    }
    /* corrente \x{00E8} l'ultimo elemento della lista e quindi per inserire
       il nuovo elemento \x{00E8} sufficiente far puntare corrente a nuovo */
    corrente->next = nuovo;
  }
  return lista;
}


elem_lista *cancellaDispari(elem_lista* l) {
  elem_lista* corr, *prec;

  /* scorro tutta la lista fino a quando incontro un numero pari
     oppure fino a quando sono arrivato in fondo */
  while((l != NULL) && (l->dato % 2 != 0)) {
    corr = l;
    /* cancello l'elemento */
    free(corr);
    /* modifico la testa della lista per farla puntare all'elemento
       successivo */
    l = l->next;
  }

  corr = l;

  /* scorro la lista fino all'ultimo elemento ed elimino gli eventuali
     elementi dispari */
  while(corr->next != NULL) {
    if(corr->dato % 2 != 0) {
      /* elimino i numeri dispari */
      prec->next = corr->next;
      free(corr);
      /* ho eliminato corr percui l'elemento successivo sarÓ
	 prec->next */
      corr = prec->next;
    }
    else {
      /* incremento corr come al solito */
      prec = corr;
      corr = corr->next;
    }
  }

  /* controllo anche l'ultimo elemento */
  if(corr->dato %2 != 0) {
    prec->next = NULL;
    free(corr);
  }

  return l;

}

/* Altro modo per poter scrivere la funzione cancella dispari: in
   pratica viene creata una nuova lista che contiene solo i numeri
   pari mentre la prima viene completamente cancellata */
elem_lista* cancellaDispari2(elem_lista* lista) {
  elem_lista* corr, *temp;

  temp = creaLista();


  while(lista != NULL) {
    /* se Ŕ pari lo inserisco nella nuova lista */
    if((lista->dato % 2) == 0) {
      temp = inserisciInCoda(temp, lista->dato);
    }
    corr = lista;
    lista = lista->next;
    free(corr);
  }
  /* ritorno la NUOVA lista */
  return temp;

}


void stampa(elem_lista *lista) {

  elem_lista *i;

  i = lista;
  while(i!=NULL) {
    printf("%d ", i->dato);
    i = i->next;
  }
  printf("\n");
}


void main() {
  elem_lista* lista;
  int num;

  lista = creaLista();

  printf("Inserisci un numero (0 per terminare): ");
  scanf("%d", &num);

  while(num != 0) {
    lista = inserisciInCoda(lista, num);

    printf("Inserisci un numero (0 per terminare): ");
    scanf("%d", &num);

  }

  stampa(lista);

  lista = cancellaDispari(lista);
  /* Commentando la riga sopra e scommentando questa sotto, si pu˛
     verificare il funzionamento della seconda procedura per
     cancellare i dispari */
  /*   lista = cancellaDispari2(lista); */

  stampa(lista);

}

Generated by GNU enscript 1.6.4.