01-puntatori1.c 1/8

[
top][prev][next]
/* Dato il seguente codice, indicare a fianco di ogni printf il
   risultato stampato */

#include <stdio.h>

void main() {
  int a, b;
  int *p1, *p2;
  int **pp1, **pp2;

  a = 37;
  b= 27;

  p1 = &a;
  p2 = p1;

  printf("%d %d %d %d\n", a, b, *p1, *p2); /* Stampa 37 27 37 37 */

  p1 = &b;
  *p1 = *p1 + * p2;

  printf("%d %d %d %d\n", a, b, *p1, *p2); /* Stampa 37 64 64 37 */
  pp1 = &p1;
  pp2 = &p2;
  *pp2 = *pp1;

  printf("%d %d %d %d\n", a, b, *p1, *p2); /* Stampa 37 64 64 64 */

}

02-puntatori2.c 2/8

[
top][prev][next]
/* Dato il seguente codice, indicare a fianco di ogni printf il
   risultato stampato, usando eventualmente un punto di domanda per i
   valori indefiniti */

#include <stdio.h>

void main() {
  int a, b;
  int *aPtr;

  a=7;
  aPtr = &a;
  printf("%d %d %d\n", a, aPtr, *aPtr);  /* Stampa 7 ? 7 */

  *aPtr = 2;
  aPtr = &b;
  printf("%d %d %d\n", a, aPtr, *aPtr);  /* Stampa 2 ? ? */

}

03-puntatori3.c 3/8

[
top][prev][next]
/* Dato il seguente codice, indicare a fianco di ogni printf il
   risultato stampato */

#include <stdio.h>

void main() {
  char s[10] = "abcdef"; /* Inizializzo s coi caratteri abcdef */
  int a, b;
  char *p, *q, *r;

  a = 3;
  b = 4;
  p = &s[0];
  q = &s[a];
  a = a + 1;
  r = &s[a];
  printf("%s\n", s);   /* Stampa abcdef */

  s[b] = *r;
  printf("%s\n", s);   /* Stampa abcdef */

  b = b + 1;
  *p = *q;
  printf("%s\n", s);   /* Stampa dbcdef */

  s[b] = *p;
  printf("%s\n", s);   /* Stampa dbcded */

}

04-multipli.c 4/8

[
top][prev][next]
/* Si scriva un programma che legga una sequenza di interi positivi
   (la sequenza termina quando viene inserito il valore 0) e stampa a
   video solamenti i numeri che sono multipli di 5, 7 e 11. Si
   utilizzi la struttura dati VETTORE */

#include <stdio.h>
#define MAX 100


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

void main() {

  int i, num;
  VETTORE v;
  /* Ogni volta che dichiaro un vettore devo ricordarmi di
     inizializzare a zero la sua dimensione effettiva */
  v.dim = 0;

  i = 0;
  printf("Inserisci i numeri (la sequenza termina con 0): \n");
  scanf("%d", &num);
  while(i < MAX && num!=0) {
    v.dati[i] = num;
    v.dim = v.dim + 1; /* ogni volta che inserisco un dato devo
			  incrementare la dimensione effettiva
			  dell'array */
    scanf("%d", &num);
    i = i + 1;
  }

  /* Adesso stampo tutti i valori multipli di 5, 7 o 11 (si poteva
     fare anche subito nel ciclo while) */
  for(i=0; i<v.dim; i = i+1) {
    if((v.dati[i] % 5 == 0) || (v.dati[i] % 7 == 0) || (v.dati[i] % 11 == 0)) {
      printf("%d ", v.dati[i]);
    }
  }

  printf("\n");

}

05-bug.c 5/8

[
top][prev][next]
/* Il programma dovrebbere chiedere il numero di studenti iscritti e
   poi memorizzare i relativi voti di un esame e stampare il numero di
   voti compresi tra 18 e 23, tra 24 e 26 e tra 27 e 30. Trovare gli
   errori nel seguente codice */

#include <stdio.h>

#define MAX_NUM 5

main() {

    int voti[MAX_NUM];
    int contA, contB, contC;
    int dim, i;
  
    MAX_NUM = 6; /* ERRORE: non si pu ridefinire una costante */


    /* ERRORE: devo inizializzarre dim prima di testarne il valore
       (alternativamente si poteva usare un ciclo do-while */

    while(dim < 0 && dim > MAX_NUM) {  /* ERRORE: le condizioni del
					    while vanno messe in OR
					    (nessun numero pu essere
					    contemporanenamente minore
					    di 0 e maggiore di
					    MAX_NUM */
    printf("\nQuanto  grande l'array ? ");
    scanf("%d", &dim);                
  }

  
    /* ERRORE: non ho inizializzato i tre contatori contA, contB e
       contC, che pertanto avranno un valore indefinito */


    for(i=0; i < MAX_NUM; i+1) { /* ERRORE: devo arrivare fino a dim e
				    non fino a MAX_NUM */
    scanf("%d", &voti[i]); 

    /* ERRORE: la costuzione degli if  sbagliata: se un numero 
    maggiore di 27 incremento tutti e tre i contatori. Il secondo e il
    terzo if dovevano essere degli else if. */
    if(voti[i] > 27)
      contA = contA + 1;
    if(voti[i] > 24)
      contA = contB + 1;
    if(voti[i] > 18)
      contA = contA + 1;

  }

  printf("I voti maggiori di 27 sono %d, quelli tra 24 e 26 sono %d e quelli tra 18 e 23 sono %d",contA, contB, contC);

}

06-binario.c 6/8

[
top][prev][next]
/* Scrivere un programma per eseguire la conversione
   decimale-binario. Si ricordi che per convertire un numero decimale
   in base binaria, bisogna eseguire una serie di divisioni intere per
   2. I resti delle divisioni (a partire dall'ultimo) rappresentano la
   codifica binaria del numero */

#include <stdio.h>

void main() {
  int num;

  scanf("%d",&num);

  /* Continuo finche il numero  0 */
  while(num!=0) {
    if((num % 2) == 0) {
      printf("0 ");
    }
    else {
      printf("1 ");
    }
    num = num / 2;
    
  }

  printf("\n");
  
}

07-decodifica.c 7/8

[
top][prev][next]
/* Sviluppare un programma che decodifica una parola chiave cifrata
   sulla base di una parola chiave. L'idea  che la parola cifrata
   (una sequenza di cifre comprese tra 0 e 9) rappresenta un
   "messaggio" in codice, il cui significato deve essere ricostruito a
   partire da una parola chiave che definisce la regola di traduzione
   da cifre a lettere. La regola  la seguente: la lettera
   decodificata corrispondente alla cifra N (0 < N < 9) nella parola
   cifrata  quella che si trova in posizione N nella parola chiave,
   assumendo di iniziare a contare le posizioni da zero.

   Ad esempio: se la parola chiave  BARONE, la parola cifrata 2141
   viene decodificata nella parola RANA, e la parola cifrata 5421 in
   NERA */

#include <stdio.h>
#define MAX 80


void main() {

  char chiave[MAX];
  int cifrata[MAX];
  char decodifica[MAX];

  int i, dim, num;

  printf("Inserisci la parola chiave: ");
  gets(chiave);

  printf("Inserisci i numeri del messaggio cifrato uno alla volta (termina con -1): \n");

  i=0;
  scanf("%d%*c", &num);
  while(i < MAX && num!=-1) {
    cifrata[i] = num;
    scanf("%d%*c", &num);
    i = i + 1;
  }

  /* Memorizzo il numero di caratteri letti */
  dim = i; 

  /* Decodifico la parola cifrata (il for viene eseguito solo fino a
     dim, cio al numero reale di caratteri letti */
  for(i=0; i < dim; i = i+1) {
    /* l'indice della lettera contenuta in chiave  pari al numero che
       leggo in cifrata */
    decodifica[i] = chiave[cifrata[i]];
  }

  /* Siccome  una stringa di caratteri, alla fine dei caratteri metto
     il carattere TAPPO */
  decodifica[i] = '\0';

  printf("La parola decodificata  %s\n", decodifica);
}

08-crescente.c 8/8

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

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

void main() {
  int i, num;
  VETTORE v;
  /* Ogni volta che dichiaro un vettore devo ricordarmi di
     inizializzare a zero la sua dimensione effettiva */
  v.dim = 0;

  /* Il primo numero lo inserisco sempre */
  printf("Inserisci un numero: ");
  scanf("%d", &v.dati[0]);
  v.dim = 1; /* Ho inserito un elemento */


  /* Adesso leggo un numero e poi verifico se  maggiore del
     precedente (i lo inizializzo a 1) */
  i = 1;
  printf("Inserisci un numero: ");
  scanf("%d", &num);

  while(num > v.dati[i-1] && i < MAX) {
    /* Se sono nel ciclo vuol dire che num  maggiore dell'ultimo
   numero inserito e quindi posso inserire num nel mio vettore */
    v.dati[i] = num; 
    v.dim = v.dim + 1; /* Ognivolta che inserisco un elemento, devo
			  incrementare la dimensione effettiva del
			  vettore */

    /* Incremento i e leggo un nuovo valore */
    i = i + 1;
    printf("Inserisci un numero: ");
    scanf("%d", &num);
  }

  /* Adesso stampo i numeri inseriti. NOTA: Eseguo un numero di
     iterazioni pari a v.dim cio alla dimensione effettiva */
  for(i=0; i < v.dim; i = i + 1) {
    printf("%d ", v.dati[i]);
  }

  printf("\n");

}

Generated by GNU enscript 1.6.4.