01-bisestile.c 1/9

[
top][prev][next]
/* Leggere un anno da tastiera e si stabilisca se è o meno un
   anno bisestile (si ricordi che un anno per essere bisestile deve
   essere divisibile per 4 ma non per 100 a meno che sia divisibile
   per 400. Ad esempio il 2004 è un anno bisestile così
   come il 2000 mentre non lo è il 1900) */

#include <stdio.h>

void main() {

  int anno;

  printf("Inserisci l'anno: ");
  scanf("%d", &anno);

  /* L'operatore modulo (%) restituisce il resto della divisione
     intere. Per es: 9 % 2 = 1 perchè 9 / 2 = 4 con resto di 1 */
  if(anno % 400==0)
    printf("Bisestile");
  /* NB: anche se sono soddisfatte più condizioni dell'if, viene
     comunque eseguita solo la prima. Se per esempio anno = 2000 e
     quindi è divisibile sia per 400, che per 100 che per 4 viene
     comunque eseguito solo la prima printf */
  else if(anno % 100==0)
    printf("Non Bisestile");
  else if (anno % 4==0)
    printf("Bisestile");
  else
    printf("Non Bisestile");
  
  printf("\n");
  
}

02-elevpot.c 2/9

[
top][prev][next]
/* Si scriva una funzione ricorsiva ed una non ricorsiva per il calcolo della
 * funzione "pow" er il calcolo della potenza intera di un numero.  */

#include <stdio.h>


void main() {

  /* La base può essere un numero in virgola mobile mentre invece
     l'esponente deve essere intero */
  float base, risultato;
  int exp;
  int i;

  printf("Inserisci la base: ");
  scanf("%f", &base);

  printf("Inserisci l'esponente: ");
  scanf("%d", &exp);

  /* Inizializzo risultato a 1 non a zero altrimenti otterrei sempre
     zero */
  risultato = 1;

  for(i=0; i<exp; i = i+1) {
    risultato = risultato*base;
  }

  /* scrivendo .2 tra % e f vengono stampate solo due cifre decimali
     (eventualmente approssimate) */
  printf("Il risultato è %.2f\n", risultato);

}



03-maxmin.c 3/9

[
top][prev][next]
/* Leggere una sequenza di interi da tastiera e si stampi la somma
   totale e il numero maggiore e minore. La sequenza termina quando
   l'utente inserisce il numero -1 */

#include<stdio.h>

void main() {

  int num, min, max, somma;

  somma = 0;
  min = 0;
  max = 0;  

  printf("Inserisci un numero (-1 per uscire): ");
  scanf("%d", &num);
  
  /* Questa è il primo numero che leggo quindi sicuramente è anche il
     maggiore è minore. NB: questo viene fatto fuori dal ciclo !! */
  min = num;
  max = num;

  while(num != -1) {
    somma = somma + num;
    if(num < min) {
      min = num;
    }
    if(num > max) {
      max = num;
    }
    
    printf("Inserisci un numero(-1 per uscire): ");
    /* Mettendo la scanf in fondo al ciclo, il valore -1 non viene
       conteggiato nella somma */
    scanf("%d", &num);
  }

  /*All'interno della printf posso stampare il valore di più
    variabili. I vari %d vengono associati alle variabili seguendo
    l'ordine in cui queste sono inserite dopo la virgola */
  printf("La somma è %d, il minore è %d e il maggiore è %d\n", somma, min, max);

}

04-frequenze.c 4/9

[
top][prev][next]
/*  Leggere una sequenza di dieci numeri interi e calcolare il contributo
    percentuale di ciascun intero rispetto al cumulo totale

1. lettura dell'input
2. somma degli elementi
3. stampa dei contributi percentuali qualora la somma lo permetta

1 e 2 possono essere fatti insieme

*/


#include <stdio.h>

/* la parola chiave #define permette di definere delle costanti */
#define QUANTI 10

void main() {

  int serie[QUANTI];        
  int i;     /* contatore */
  /* un long int corrisponde ad una porzione di memoria pari al doppio
     di quella occupata da un int (tipicamente 64 bit invece di 32
     anche se dipende dall'archittettura hardware e da come è
     implementato il compilatore */
  long int somma = 0;          /* la sommatoria */
  float peso = 0.0;
  
  /* lettura degli elementi della sequenza e calcolo della somma */
   for(i = 0; i < QUANTI; i = i + 1){
    // serie[i]=atoi(gets(bufferone));
    scanf("%d", &serie[i]);
    somma = somma + serie[i];
  }
  
  /* calcolo del contributo percentuale di ciascun numero nella sequenza */
  printf("Stampa dei contributi percentuali \n");
  if (somma != 0){
    i = 0;
    for(i = 0; i < QUANTI; i = i + 1){
      peso = serie[i]*100.0/somma; /* ! Conversioni automatiche */
      /* %% serve per scrivere il carattere % mentre il numero 5 serve
	 per indicare il numero di cifre totali (comprese il punto e
	 le cifre decimali) così da stampare i risultati in
	 incolonnati */
      printf("Il contributo dell'elemento %d e` %5.2f%%\n", i, peso); 
      i = i + 1;
    }
  }
  else{
    printf("La sommatoria e` nulla \n");
  }
}

05-indovina.c 5/9

[
top][prev][next]
/*Si generi un numero casuale e si inviti l'utente ad indovinare il numero scelto fornendogli le seguenti indicazioni:

    fuoco se la differenza è  minore di 10
     fuochino se la differenza è compresa tra 10 e 50
     acqua se la differenza è superiore di 50
     colpito e affondato se il numero è stato indovinato
*/


#include <stdio.h>
#include <stdlib.h>

void main() {

  int estratto, differenza, numero;

  srand(5);
  /*NB: in reaqltà l'uso della funzione rand() è estremamente più
    complesso perchè richiede anche l'inizializzazione del seed. Qui
    la funzione è usata a solo scopo esemplificativo. Ne vedremo una
    versione corretta in una delle prossime esercitazioni in
    laboratorio */
  estratto = rand();

  do {
    printf("Inserisci un numero: ");
    scanf("%d", &numero);
    differenza = abs(numero - estratto);
    if(numero == estratto) {
      printf("Colpito e affondato");
    }
    else if(differenza < 10) {
      printf("Fuoco");
    }
    else if(differenza >= 10 && differenza <= 50) {
      printf("Fuochino");
    }
    else{
      printf("Acqua");
    }
    printf("\n");
  }while(numero != estratto);

  
}

06-divisione.c 6/9

[
top][prev][next]
/* Scrivere un programma che esegue la divisione tra due interi
positivi, senza usare gli operatori modulo (%) e quoziente (/). Il
programma legge in input due interi verifica che entrambi siano
diversi da zero e in caso uno dei due sia zero, continua a richiedere
l'input all'utente finchè questi non inserisca un numero
positivo. Quindi calcola il quoziente e lo stampa.*/

void main() {

  int a, b;
  int quoz = 0;
  int resto;

  /* Il ciclo do-while funziona esattamente come un ciclo while ma la
     condizione viene verificata alla fine del ciclo e non alla fine
     quindi viene eseguita almeno un'iterazione */
  do {
    printf("Inserisci il dividendo (diverso da zero) ");
    scanf("%d", &a);
    printf("Inserisci il divisore (diverso da zero): ");
    scanf("%d", &b);
  } while (a == 0 || b == 0);
  /* Si noti che la condizione del while è la condizione per rimanere
     dentro il ciclo (non la condizione d'uscita!), cioè il programma
     continua ad eseguire le istruzioni del ciclo se o a o b sono pari
     a zero */

  resto = a;
  while(resto - b >= 0) {
    quoz = quoz + 1;
    resto = resto -b;
  }

  printf("%d / %d = %d con resto %d\n", a, b, quoz, resto);

}

07-invParola.c 7/9

[
top][prev][next]
/* Invertire una parola inserita dall'utente

   1. lettura della parola 
   2. calcolo della dimensione
   3. la scrivo partendo dalla fine

*/

#include <stdio.h>
#define MAX_CARATTERI 20


void main()
{
  char car;         /* variabile per leggere da tastiera i caratteri */
  char parola[MAX_CARATTERI];  /* variabile per memorizzare la parola
                                  letta da tastiera */
  int i, lung;

  printf("Inserisci la parola da invertire\n");
  gets(parola);

  i = 0;
  /* Queso mi serve per calcolare la dimensione della stringa */
  while(parola[i] != '\0') {
    i = i + 1;
  }
  
  /* lung rappresenta la lunghezza della stringa, ovvero il numero di
     caratteri '\0' escluso */
  lung = i;
  
  
  /* stampo sullo schermo i caratteri memorizzati nella variabile
     'parola' partendo dall'ultimo */
  printf("Parola invertita: \n");
   
  for(i = lung - 1; i >= 0; i = i - 1) {
    printf("%c",parola[i]);
  }
  printf("\n");
}


08-searchAndReplace.c 8/9

[
top][prev][next]
/*Realizzare un programma per sostituire un carattere in un stringa
  inserita dall'utente.Esempio: se la stringa è "CASA" e voglio
  sostituire tutte le A con le O otterrà COSO */

#include <stdio.h>

void main(){
  char frase[10];
  char dacercare,dasostituire;
  int i,lung=10;      
  char ch;

  printf("Inserisci una stringa di caratteri: ");
  /* La gets legge tutti i caratteri (spazi compresi) fino all'enter e
     li inserisce in testo) */
  gets(frase);

  printf("Inserisci il carattere da cercare: ");
  /* Purtroppo la scanf se usata per leggere un carattere ha un
     comportamente un pò strano: in realtà non legge un singolo
     carattere ma legge una sequenza di caratteri fino alla pressione
     del tasto enter (compreso quindi anche il carattere enter) e
     memorizza i caratteri superflui in un buffer. La successiva scanf
     prima di chiedere un nuovo carattere all'utente va a guardare se
     esiste già qualche carattere memorizzato e in caso affermativo
     utilizza quello. Quindi quando l'utente inserisce un carattere in
     realtà ne sta inserendo due il carattere stesso e il carattere di
     invio. Di conseguenza nella scanf usiamo due %c ma memorizziamo
     solo il primo mentre il secondo serve per evitare che il tasto
     enter venga memeorizzato */
  scanf("%c%c",&dacercare);
   
  printf("Inserisci il carattere da sostituire: ");
  scanf("%c%c",&dasostituire);

  i = 0;
  
  while(frase[i] != '\0') {
    if(frase[i] == dacercare){
      frase[i] = dasostituire;
    }
    i = i + 1;
  }

  printf("La stringa modificata è: %s \n", frase);  
 }

09-filtro.c 9/9

[
top][prev][next]
/* Si deve implementare un programma che legge una linea di testo L ed
 una stringa S e stampa i soli caratteri di L inclusi in S.  Esempio:
 L="alzati e cammina" e S="caml" -> "alacamma"
 */

#include <stdio.h>

#define MAX_LENGTH 255
#define END '\0'

void main() {
  char testo[MAX_LENGTH], filtro[MAX_LENGTH];
  int i, j;

  printf("Inserire il testo che deve essere filtrato\n");
  /* La gets legge tutti i caratteri (spazi compresi) fino all'enter e
     li inserisce in testo) */
  gets(testo);
    
  printf("Inserire l'insieme di caratteri da filtrare ");
  gets(filtro);

  i=0;
  while(testo[i] != END) {
    j=0;
    /* Questo secondo ciclo while viene eseguito finchè non è stata
       raggiunta la fine della stringa e finchè non ho trovato il
       carattere */
    while(filtro[j] != END && filtro[j] != testo[i]) {
      j = j + 1;
    }
    /* Questo if mi serve per capire se il ciclo while si è interrotto
       perchè ho raggiunto la fine della stringa o perchè ho trovato
       il carattere */
    if(testo[i]==filtro[j]) {
      printf("%c",testo[i]);
    }
    i = i + 1;
  }
  printf("\n");
}

Generated by GNU enscript 1.6.3.