ex1.c 1/4

[
top][prev][next]
/* Si scriva un programma che legga da tastiera una sequenza di 10
   caratteri (uno alla volta), li memorizzi in un array e stampi a
   schermo la stringa così ottenuta con printf(%s, stringa) */

#include <stdio.h>

void main() {

  /* Se devo leggere 10 caratteri, avrò bisogno di una stringa di 11
     caratteri perchè mi serve lo spazio per il carattere "tappo"
     ovvero per il '\0' */
  char stringa[11];
  int i;

  /* leggo 10 caratteri e li inserisco nella stringa */
  for(i=0; i < 10; i = i + 1) {
    printf("Inserisci un carattere ");
    /* il codice %*c serve per scartare il carattere di <invio> (vedi i lucidi) */
    scanf("%c%*c", &stringa[i]);
  }

  /* Inserisco il carattere tappo */
  stringa[10] = '\0';

  printf("%s", stringa);

  printf("\n");
}

ex2.c 2/4

[
top][prev][next]
/* Si scriva un programma che legga da tastiera il voto di 7 giudici e
   stampi sullo schermo la media dei voti calcolata escludendo la
   valutazione maggiore e quella minore. Si modifichi il programma in
   modo che accetti i voti solamente con valore compreso tra 0 e 10 (e
   richieda il reinserimento in caso contrario).*/

#include <stdio.h>
#define NUMGIUD 7

void main() {

  /* Si noti che non è necessario utilizzare un array. Come abbiamo
     già visto a esercitazione per calcolare la somma e il max e il
     min è sufficiente un solo valore in cui di volta in volta viene
     memorizzato il dato inserito dall'utente */
  float num, max, min, somma;

  int i;

  somma = 0;
  /* max lo inizializzo a -1 perchè sicuramente i voti saranno
     maggiori di -1 mentre min lo inizializzo a 11 perchè sicuramente
     i voti saranno minori di 11. Alternativamente potevo
     inizializzare max e min al primo valore letto (in tal caso ci
     voleva una scanf fuori dal for per leggere il primo valore e poi
     il ciclo for lo facevo partire da 1*/
  max = -1;
  min = 11;


  for(i = 0; i < NUMGIUD; i = i + 1) {
    /* Il ciclo do-while mi serve per controllare l'input: finchè
       l'utente non inserisce un voto compreso tra 0 e 10 il programma
       continua a richiedere l'inserimento senza fare nulla. */
    do{
      printf("Inserisci un numero: ");
      scanf("%f", &num);
    } while(num < 0 || num > 10);

    somma = somma + num;

    if(num < min) {
      min = num;
    }
    if(num > max) {
      max = num;
    }
    
  }

  /* Alla somma totale tolgo il valore massimo e il valore minimo e
     poi divido per NUMGIUD-2 perche avendo esclusi il voto massimo e
     minimo i voti sono diventati 5 (occhio alle parentesi) */
  printf("La media finale è %f\n", (somma - max - min)/(NUMGIUD-2));

}

ex3-1.c 3/4

[
top][prev][next]
/* Si scriva un programma che legga 5 numeri interi e stampi un
istogramma in cui la lunghezza della barra i-esima (rappresentate con
caratteri '#') e' pari all'i-esimo dato letto.  
Esempio: se l'utente inserisce 12 6 9 4 11 l'output sarà 

0 - ############ 
1 - ###### 
2 - ######### 
3 - #### 
4 - ###########
*/

#include <stdio.h>
#define MAX 5

void main() {
  int serie[MAX];
  int i, j;

  /* Acquisisco i dati */
  for(i=0; i < MAX; i = i + 1) {
    printf("Inserisci un numero ");
    scanf("%d", &serie[i]);
  }

  /* Il for esterno mi serve per scorrere tutto l'array, mentre quello
     interno che viene eseguito per ciascun elemento dell'array, mi
     serve per stampare il numero appropriato di # e chiaramente dovrà
     avere un numero di iterazioni pari al valore dell'elemento che
     sto considerando. Per es. se il primo elemento è 12 devo eseguire
     12 iterazioni cioè stampare 12 cancelletti */
  for(i=0; i < MAX; i = i + 1) {
    printf("\n%d - ", i);
    for(j = 0; j < serie[i]; j = j + 1) {
      printf("#");
    }
  }

  printf("\n");

}

ex3-2.c 4/4

[
top][prev][next]
/* Si modifichi il programma precedente per ottenere un istogramma a barre verticali del tipo:

       #          
       #        
       #     #     
       #     #      
       #     #    #
       #     #    #

       0     1    2
*/

#include <stdio.h>
#define MAX 5

void main() {
  int serie[MAX];
  int i, j, max;

  /* Per stampare le barre in verticale ho bisogno di calcolare
     l'altezza della barra più alta, ovvero il valore più grande che è
     stato inserito. Questo viene calcolato nello stesso modo visto
     nell'esercizio 2 */
  max = -1;

  /* Acquisisco i dati */
  for(i=0; i < MAX; i = i + 1) {
    printf("Inserisci un numero ");
    scanf("%d", &serie[i]);
    if(serie[i] > max) {
      max = serie[i];
    }
  }

  /* Questo è l'algoritmo che viene utilizzato:per visualizzare un
     istogramma a barre verticali

           Stampa la riga i-esima dell'istogramma (composto da max righe, quindi
              i = max...1). Si noti che nello stampare la riga i, la colonna
              j-esima dell'istogramma va stampata se e solo se data[j] > i;
*/

  for(i=max; i>=1; i--) {
    for(j=0; j<5; j++) {
      if(serie[j]>=i) {
	printf("* ");
      }
      else {
	printf("  ");
      }
    }
    printf("\n");
  }

}

Generated by GNU enscript 1.6.3.