Laboratorio 7 – 14-12-2020

Premi qui per scaricare il PDF

[adinserter block="7"]

Esercizio 1

Scrivere un programma in C per il calcolo della media dei prezzi della benzina. Il programma deve chiedere all’utente quanti prezzi vuole inserire (minimo 1), allocare la memoria necessaria per contenere l’elenco dei prezzi (si consideri che ogni prezzo è rappresentato da un numero reale), calcolare la media e salvare la media calcolata su un file denominato media.txt. Per il calcolo della media si definisca una funzione denominata calcoloMedia che riceve in ingresso l’elenco dei prezzi e altri parametri necessari e restituisce la media.

#include 
#include 

#define NOME_FILE "media.txt"

float calcoloMedia(int, float*);

int main() {
  int quanti, i;
  float *prezzi;
  float risultato;
  FILE* save;

  do
  {
    printf("Quanti prezzi si vuole inserire?\n");
    scanf("%d", &quanti);

    if(quanti < 1)
      printf("Attenzione, inserire almeno un prezzo\n");
  }while (quanti < 1);
 
  prezzi = (float*) malloc(quanti * sizeof(float));

  for (i = 0; i < quanti; i++)
  {
    printf("Inserisci il %d prezzo\n", i+1);
    scanf("%f", &(*(prezzi+i)));
  }

  risultato = calcoloMedia(quanti, prezzi);
  printf("La media dei prezzi inseriti e': %f", risultato);

  save = fopen(NOME_FILE, "w");
  if (save == NULL) 
    printf("ATTENZIONE, Impossibile aprire il file\n");
  else
  {
    for(i = 0; i < quanti; i++)
    {
      fprintf(save, "%f", (*(prezzi+i)));
      fprintf(save, "%c", '\n');
    }
      
    if (fclose(save) == EOF)
      printf("ERRORE nella chiusura del file\n");
  }
  return 0;
}

float calcoloMedia(int n, float* prices)
{
  int i;
  float media = 0;

  for(i = 0; i < n; i++)
    media += (*(prices+i));

  return (media/n);
}
[adinserter block="7"]

Esercizio 2

Scrivere un programma che legge da un file una serie di stringhe e le stampi a video. L’acquisizione si ritiene conclusa quando il file è stato completamente acquisito. Ogni stringa è memorizzata nel file preceduta da un numero intero che ne rappresenta la lunghezza, poichè a priori non è nota la lunghezza massima possibile. Il programma dovrà quindi leggere la lunghezza della stringa, allocare la memoria necessaria per contenerla, acquisirla e quindi stamparla. Il programma procederà poi con la stringa successiva. Gestire correttamente le problematiche di utilizzo della memoria (allocazione/deallocazione) e dei file: Si ipotizzi che il file non contenga errori.
#include < stdlib.h>
#include < stdio.h>

#define NOME_FILE_IN "in.txt"

int main()
{
  int i, lungh;
  FILE* in;
  char* s;

  in = fopen(NOME_FILE_IN, "r");
  if (in == NULL)
    printf("ATTENZIONE, errore nell'apertura del file\n");
  else
  {
    while(!feof(in))
    {
      if(fscanf(in, "%d", &lungh) > 0)
      {
        fgetc(in);
        s = (char*) malloc((lungh+1) * sizeof(char));
        
        if (s != NULL)
        {
          fgets(s, lungh+1, in);
          printf("%s\n", s);
          free(s);
        }
      }
    }
    if(close(in) == EOF)
      printf("Si è verificato un errore durante la chiusura del file\n");
  }
  return 0;
}
[adinserter block="7"]

Esercizio 3

Scrivere un programma in C per la verifica dei codici a barre. Un codice a barre è rappresentato da una stringa di 12 cifre dove l’ultima cifra (definita cifra di controllo) viene calcolata in base alle prime 11 cifre come di seguito indicato:
  1. calcolare la somma delle cifre nelle posizioni dispari e moltiplicarla per 3;
  2. calcolare la somma delle cifre nelle posizioni pari e sommarla al risultato precedente;
  3. se l’ultima cifra del risultato al passo precedente è 0, allora la cifra di controllo è 0; altrimenti sottrarre l’ultima cifra a 10 per ottenere la cifra di controllo;
  4. se il valore calcolato corrisponde all cifra in posizione 12 del codice a barre, allora questo è corretto.
Il programma deve:
  1. Leggere un file di testo denominato codes.txt che contiene un elenco di codici a barre (uno per riga);
  2. Per ogni codice a barre letto deve validare il codice e stampare a video un messaggio che dice se il codice è corretto o meno. Per la validazione scrivere una funzione denominata validaCodice che riceve in ingresso un codice e restituisce 1 (Vero) se il codice è valido, 0 (Falso) altrimenti.
#include < stdlib.h>
#include < stdio.h>

#define FILE_NAME "codes.txt"
#define DIM 12

int validaCodice(char*);

int main()
{
  FILE* fp;
  int i, result;
  char* code;

  fp = fopen(FILE_NAME, "r");

  if( fp == NULL)
    printf("ATTENZIONE, impossibile aprire il file\n");
  else
  {
    while (!feof(fp))
    {
      code = (char*) malloc((DIM+1)*sizeof(char));
      
      if(code != NULL)
      {
        fgets(&(*(code)), DIM+1, fp);
        fgetc(fp);
        result = validaCodice(code);
        if (result)
          printf("\nIl BarCode è valido\n\n");
        else
          printf("\nIl BarCode non è valido\n\n");
        free(code);
      }
    }
  }
  return 0;
}

int validaCodice(char* barre)
{
  int temp[DIM];
  int i, somma_dispari = 0, somma_pari = 0, somma_tot, controllo;

  for(i = 0; i < DIM; i++)
  {
    temp[i] = barre[i] - 48;
    printf("%d", temp[i]);
  }

  for(i = 1; i < DIM-1; i+=2)
    somma_dispari += temp[i];

  somma_dispari *= 3;

  for (i = 0; i < DIM-1; i+=2)
    somma_pari += temp[i];

  somma_tot = somma_pari + somma_dispari;

  if ((somma_tot%10) == 0)
    controllo = 0;
  else
  {
    controllo = 10 - (somma_tot%10);
  }

  if(controllo == temp[DIM-1])
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
[adinserter block="7"]

Premi qui per scaricare il PDF