Pagina 1 di 1

problema esercizio c

Inviato: giovedì 26 marzo 2020, 13:38
da claudiolari
Salve a tutti :ciao:

Ho un file con le temperature di una sorgente termale registrate ogni giorno.
Esempio:

06/12/2018 56.42 56.11 55.99 56.3 54.9 ecc.
07/12/2018 54.12 56.43 57.1 56.3 52.3 ecc.
08/12/2018 55.45 56.63 57.2 56.3 54.96 ecc.
09/12/2018 56.4 56.1 57.1 58.39 52.9 ecc.
10/12/2018 56.47 56.32 57.1 56.3 51.94 ecc.
Devo scrivere un programma in c che mi calcoli la media delle 24 temperature,valuti se ci sono valori di temperatura che si discostano di più del 5% dalla media di quel giorno, nel qual caso scriva in un secondo file (di nome “Fuori media.txt”) la data e la media giornaliera (i giorni in cui non ci sono variazioni di piu del 5% non producono output).

All'inizio non riesco ad acquisire i dati che mi servono per procedere con la risoluzione del problema e ho provato a fare un debug ,ma i valori li mette nella variabile date e anche in temp:
while(fscanf(fp,"%s %f",date,&temp)!=EOF){


temptot=temptot+temp;
i++;

}

Re: problema esercizio c

Inviato: martedì 31 marzo 2020, 11:49
da Vincenzo1968
...ma i valori li mette nella variabile date e anche in temp:
Sì, perché se fai così:

Codice: Seleziona tutto

fscanf(fp,"%s %f",date,&temp)
ad ogni iterazione vengono letti due valori alla volta.
La prima iterazione legge il primo valore '06/12/2018' e lo piazza nella variabile date; il secondo valore '56.42' lo piazza nella variabile temp.
La seconda iterazione piazza il terzo valore '56.11' nella variabile date e il quarto valore '55.99' nella variabile temp e così via.

Se vuoi leggere, per ogni iterazione, una riga contenente la data seguita da 24 valori di tipo float, devi fare così:

Codice: Seleziona tutto

fscanf(fp, "%s %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", date, &val1, &val2, ..., &val24)

Re: problema esercizio c

Inviato: martedì 31 marzo 2020, 11:53
da Vincenzo1968
Esempio:

temper.c:

Codice: Seleziona tutto

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

#define NUM_VALUES 24

int main(int argc, char *argv[])
{	
	char date[128];
	double v[NUM_VALUES];
	
	double m = 0.0;
	double p = 0.0;
	double d = 0.0;
	
	FILE *fpIn = NULL;
	FILE *fpOut = NULL;
	
	int i;
	
	if ( argc != 3 )
	{
		printf("\n\nUsage: %s InputFile OutputFile\n\n", argv[0]);
		return EXIT_FAILURE;
	}
			
	fpIn = fopen(argv[1], "rb");
	if ( NULL == fpIn )
	{
		printf("\nERROR: failed to open input file '%s'\n", argv[1]);
		return EXIT_FAILURE;
	}
	
	fpOut = fopen(argv[2], "wb");
	if ( NULL == fpOut )
	{
		fclose(fpIn);
		printf("\nERROR: failed to create output file '%s'\n", argv[2]);
		return EXIT_FAILURE;
	}
	
	printf("\n");
	
	while(fscanf(fpIn, "%s %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
	             date,
	             v, v + 1, v + 2, v + 3, v + 4,
	             v + 5, v + 6, v + 7, v + 8, v + 9,
	             v + 10, v + 11, v + 12, v + 13, v + 14,
	             v + 15, v + 16, v + 17, v + 18, v + 19,
	             v + 20, v + 21, v + 22, v + 23) != EOF)
	{
		m = 0.0;
		for ( i = 0; i < NUM_VALUES; i++ )
			m += v[i];
		m /= NUM_VALUES;
		p = 0.05 * m;
		
		for ( i = 0; i < NUM_VALUES; i++ )
		{
			d = v[i] - m;
			if ( d < 0.0 )
				d *= -1.0;
			if ( d > p )
			{
				fprintf(fpOut, "%s %lf\n", date, m);
				//printf("%s m = %lf p = %lf d = %lf\n", date, m, p, d);
				break;
			}
		}
	}
	
	printf("\n");
		
	fclose(fpOut);
	fclose(fpIn);

	return EXIT_SUCCESS;
}

Codice: Seleziona tutto

gcc -Wall -Wextra -pedantic -O3 -std=c99 temper2.c -o prova
temperature.txt

Codice: Seleziona tutto

06/12/2018 56.42 56.11 55.99 56.3 54.9 57.9 53.1 54.6 57.3 55.5 57.1 59.3 54.03 55.2 56.8 55.12 52.3 55.9 56.4 53.47 55.2 55.8 55.24 55.31
07/12/2018 54.12 56.43 57.1 56.3 52.3 56.11 55.99 56.3 54.9 57.9 53.1 54.6 57.3 55.99 56.3 54.9 57.9 53.1 54.6 57.3 55.5 57.1 59.3 54.03
08/12/2018 55.45 56.63 57.2 56.3 54.96 56.11 55.99 55.3 54.9 56.9 55.1 54.6 55.3 55.99 55.3 54.9 54.9 55.1 56.6 54.3 54.5 55.1 55.3 56.03
09/12/2018 56.4 56.1 57.1 58.39 52.9 54.9 57.9 53.1 54.6 57.3 55.5 57.1 59.3 54.03 55.2 56.8 55.12 52.3 55.9 56.4 53.47 55.2 55.8 55.24
10/12/2018 56.47 56.32 57.1 56.3 51.94 54.9 57.9 53.1 56.6 57.3 55.5 57.1 51.3 54.03 54.2 56.8 55.12 52.3 55.9 55.4 52.47 57.2 56.8 54.24

Codice: Seleziona tutto

./prova temperature.txt Fuori_Media.txt
Fuori_Media.txt:

Codice: Seleziona tutto

06/12/2018 55.637083
07/12/2018 55.769583
09/12/2018 55.668750
10/12/2018 55.262083

Re: problema esercizio c

Inviato: martedì 31 marzo 2020, 14:10
da Vincenzo1968
Questa versione stampa, oltre alla data e alla media, la lista dei valori fuori media:

Codice: Seleziona tutto

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

#define NUM_VALUES 24

int main(int argc, char *argv[])
{	
	char date[128];
	double v[NUM_VALUES];
	char szOutput[4096];
	char szTemp[4096];
	size_t lenOut;
	
	double m = 0.0;
	double p = 0.0;
	double d = 0.0;
	
	FILE *fpIn = NULL;
	FILE *fpOut = NULL;
	
	int i;
	int j;
	
	if ( argc != 3 )
	{
		printf("\n\nUsage: %s InputFile OutputFile\n\n", argv[0]);
		return EXIT_FAILURE;
	}
			
	fpIn = fopen(argv[1], "rb");
	if ( NULL == fpIn )
	{
		printf("\nERROR: failed to open input file '%s'\n", argv[1]);
		return EXIT_FAILURE;
	}
	
	fpOut = fopen(argv[2], "wb");
	if ( NULL == fpOut )
	{
		fclose(fpIn);
		printf("\nERROR: failed to create output file '%s'\n", argv[2]);
		return EXIT_FAILURE;
	}
	
	printf("\n");
	
	while(fscanf(fpIn, "%s %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
	             date,
	             v, v + 1, v + 2, v + 3, v + 4,
	             v + 5, v + 6, v + 7, v + 8, v + 9,
	             v + 10, v + 11, v + 12, v + 13, v + 14,
	             v + 15, v + 16, v + 17, v + 18, v + 19,
	             v + 20, v + 21, v + 22, v + 23) != EOF)
	{
		m = 0.0;
		for ( i = 0; i < NUM_VALUES; i++ )
			m += v[i];
		m /= NUM_VALUES;
		p = 0.05 * m;
		
		for ( i = 0; i < NUM_VALUES; i++ )
		{
			d = v[i] - m;
			if ( d < 0.0 )
				d *= -1.0;
			if ( d > p )
			{				
				sprintf(szOutput, "%s - Media -> %lf - Valori fuori media -> [(%d):%.2lf; ", date, m, i + 1, v[i]);
								
				for ( j = i + 1; j < NUM_VALUES; j++ )
				{
					d = v[j] - m;
					if ( d < 0.0 )
						d *= -1.0;
					if ( d > p )
					{
						sprintf(szTemp, "(%d):%.2lf; ", j + 1, v[j]);
						strcat(szOutput, szTemp);
					}
				}
				
				lenOut = strlen(szOutput);
				
				szOutput[lenOut - 2] = ']';
				szOutput[lenOut - 1] = '\0';
				
				fprintf(fpOut, "%s\n", szOutput);
				
				break;
			}
		}
	}
	
	printf("\n");
		
	fclose(fpOut);
	fclose(fpIn);

	return EXIT_SUCCESS;
}
Fuori_Media.txt

Codice: Seleziona tutto

06/12/2018 - Media -> 55.637083 - Valori fuori media -> [(12):59.30; (17):52.30]
07/12/2018 - Media -> 55.769583 - Valori fuori media -> [(5):52.30; (23):59.30]
09/12/2018 - Media -> 55.668750 - Valori fuori media -> [(13):59.30; (18):52.30]
10/12/2018 - Media -> 55.262083 - Valori fuori media -> [(5):51.94; (13):51.30; (18):52.30; (21):52.47]