/* 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;
}