fauslogo1.jpg (2864 byte)
LABORATORIO DI PROGRAMMAZIONE 1
Prova di appello del 3 Aprile 2002
 
ESERCIZIO 1: Esiste un file di testo ("quattro.txt") che contiene i primi n multipli positivi
del numero 4.
Ogni numero e’ scritto su una riga del file.
Generare un secondo file di testo su cui copiare i numeri del primo file ed aggiungere i
successivi 10 multipli di quattro.

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


void main()
{
    FILE *f1,*f2;
    int numero,i;


    if((f1=fopen("quattro.txt","r"))==NULL)
            printf("Errore apertura file\n");
    else{
            f2=fopen("quattro1.dat","w");
            while(fscanf(f1,"%d",&numero)!=EOF){
                    fprintf(f2,"%d\n",numero);
            }

            for(i=0;i<10;i++){
                numero=numero+4;
                fprintf(f2,"%d\n",numero);
            }
    }
    fclose(f1);
    fclose(f2);
    printf("Fine elaborazione\n");
}

ESERCIZIO 2: Esiste un file binario "libri.dat" contenente dati sui libri di una biblioteca scolastica. Per ogni libro sono registrate le seguenti informazioni:
Codice libro (stringa di 6 caratteri)
Autore (stringa di 20 caratteri)
Titolo (stringa di 30 caratteri)
Casa editrice (stringa di 15 caratteri)
Anno edizione (intero)
Disponibilita’ (intero 0=non disponibile, 1=disponibile)
Il file e’ ordinato alfabeticamente rispetto al codice del libro.
Scrivere un programma C, impostato con struttura a menù , che permetta di scegliere in modo ripetuto, una fra le seguenti opzioni:
        1: dato in input il codice di un libro che viene richiesto in prestito da uno studente,verificare la disponibilita’. Se e’ disponibile
            al prestito, modificare il flag di disponibilita’ e stampare un messaggio di consenso. Se non esiste il libro o semplicemente
            non e’ disponibile al momento, mandare un messaggio di non disponibilita’
        2: Registrare su un file di testo, titolo e casa editrice dei libri di un autore dato in input, disponibili per un eventuale prestito.
            Il nome del file sia chiesto all’utente.
        3: Uscire dal programma

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

struct libro
{
    char codice[7];
    char autore[21];
    char titolo[31];
    char casaed[16];
    int anno;
    int disp;
};

FILE *f1;

void opzione1();
void opzione2();

void main()
{
    int scelta;
    if((f1=fopen("libri.dat","r+"))==NULL)
    {
            printf("Errore open file\n");
            getchar();
            exit(0);
    }
    do{
        printf("1: Prestito\n");
        printf("2: Libri di un autore\n");
        printf("3: esci\n");
        printf("Scegli: ");
        scanf("%d",&scelta);
        switch(scelta){
            case 1: opzione1();
                    break;
            case 2: opzione2();
                    break;
            case 3: break;
            default: printf("Scelta errata\n");
                        break;
        }
        getchar();
    }while (scelta!=3);
    fclose(f1);
}

void opzione1()
{
    char cod[6];
    libro l;
    int inizio,fine,centro;
    int trovato;

    printf("Dammi il codice del libro\n");
    scanf("%s",cod);

   // cerca libro con ricerca binaria
    inizio=0;
    fseek(f1,0L,SEEK_END);
    fine= (ftell(f1)/sizeof(libro))-1;
    trovato=0;

    while( !trovato && inizio<=fine){
            centro=(inizio+fine)/2;
            fseek(f1,centro*sizeof(libro),SEEK_SET);
            fread(&l,sizeof(libro),1,f1);
            if(strcmp(l.codice,cod)==0)trovato=1;
            else if(strcmp(l.codice,cod)>0)fine=centro-1;
            else inizio=centro+1;
    }
    if(trovato){
            //verifica disponibilita'
            if(l.disp==1){
                l.disp=0;
                fseek(f1,-sizeof(libro),SEEK_CUR);
                fwrite(&l,sizeof(libro),1,f1);
            }
            else printf("Libro gia\\' prestato\n");
    }
    else printf("Libro non trovato\n");
}


void opzione2()
{
    libro l;
    char aut[21], nomefile[20];
    FILE *f2;


    printf("Dammi autore: ");
    gets(aut);
    printf("Dammi nome file: ");
    gets(nomefile);

    f2=fopen(nomefile,"w");
    rewind(f1);

    while(fread(&l,sizeof(libro),1,f1)!=0){
            if(strcmp(l.autore,aut)==0 && l.disp==1){
                    fprintf(f2,"%s %s\n",l.titolo,l.casaed);
            }
    }
    fclose(f2);

}