/* Individua le inversioni di segno in una sequenza di numeri. * La decisione sul singolo numero da trattare viene presa sulla base del valore del numero precedente * la memoria necessaria al problema e' quindi limitata a due numeri, piu' * quanto necessario per il conteggio. * * Algoritmo: * * Acquisisce nome di file e apre in scrittura, in caso di errore esce * inizializza il contatore di righe scritte e legge il primo numero fuori dal ciclo * ripeti il ciclo * acquisisci numero corrente * se la condizione e' rispettata, scrive nel file e incrementa il contatore * copia il numero corrente nel precedente * domanda all'utente se vuole continuare * finche' l'utente lo desidera * chiudi il file e visualizza quanto richiesto */ #include <stdio.h> #define LNome 64 /* lunghezza della stringa per il nome del file */ char continua(void); /* funzione per la domanda di continuazione */ typedef char stringa[LNome]; /* tipo stringa per il nome */ int main() { float x_1,x; /* Numero precedente e numero corrente */ char risp; /* risposta per la domanda di continuazione */ int i; /* contatore righe scritte */ stringa nomefile; /* nome del file */ FILE *fp; /* puntatore al file */ printf("Qual e' il nome del file da aprire in scrittura? > "); scanf("%s",nomefile); if ((fp=fopen(nomefile,"w"))==NULL) { /*operazione di controllo sul file*/ printf("Impossibile aprire file %s in scrittura\n",nomefile); return 1; } printf("Inserire primo numero reale della serie > "); scanf("%f",&x_1); /* Acquisisce il primo numero fuori dal ciclo */ i=0;/*inizializza il contatore delle righe*/ do { /* entra nel ciclo con il numero precedente disponibile */ printf("Inserire numero reale > "); scanf("%f",&x); /* acquisisce numero corrente */ if ((x==0)||(x_1==0) || ((x_1<0)&&(x>0)) || ((x_1>0)&&(x<0))) { fprintf(fp,"%4.2f %4.2f\n",x_1,x); /*mette i valori su file se si verificano le condizioni*/ i++;/*incrementa contatore di riga*/ } x_1=x;/*sposta le posizioni, l'ultimo numero passa nel precedente*/ risp=continua(); /* domanda all'utente se continuare */ } while (risp=='s'); printf("Il numero di righe inserite su file e' %d\n",i); fclose(fp); return 0; } /* main */ char continua(void) { /* domanda di continuazione */ char r; do { printf("Inserire risposta per la continuazione (s o n) > "); scanf(" %c",&r); /* il segnaposto %c prende un carattere */ } while ((r!='s')&&(r!='n')); /* controllo che il carattere sia soltanto s o n */ return r; }