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