[Risolto] [C] aiuto

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

[Risolto] [C] aiuto

Messaggio da cavaletto »

Ciao bella gente, necessito di un aiutino.
Devo realizzare e ci ho provato un programmino in C che faccia queste cose:

Prova scritta di programmazione (13 gennaio 2010)
Realizzare un programma in linguaggio C per calcolare le statistiche relative alla puntualit` di una serie di voli a aerei.

Il programma elabora un file di testo, il cui nome e passato come primo parametro sulla linea di comando, che contiene i dati dei voli da considerare. Tale file contiene un numero imprecisato (ma certamente elevatissimo) di linee, ciascuna delle quali e composta da 3 campi: il primo campo e un codice alfanumerico (di 6 caratteri) che identifica il volo, mentre il secondo e terzo campo identificano rispettivamente l’orario di atterraggio previsto e quello effettivo, entrambi nella forma HH:MM.

Si considerano come regolari tutti i voli il cui atterraggio e avvenuto con un ritardo non superiore ad un numero di minuti pari a RMAX. Questo valore e impostato per default a 5 ma pu` essere modificato specificando il suo valore come secondo parametro sulla linea di comando.

Il programma deve calcolare e scrivere nel file le seguenti informazioni:

• la percentuale di puntualità , calcolata come numero di voli regolari rispetto al totale dei voli esaminati;
• il ritardo massimo, espresso in minuti;
• la sigla del volo che ha riportato tale ritardo massimo.

Esempio. Supponiamo che il programma si chiami volstat.c e che il file 'voli.txt' contenga le seguenti
linee:
IX0034 09:37 09:39
BZ6969 20:40 21:35
WA0001 13:00 12:57
WA1009 17:03 17:08

Attivando il programma con la seguente linea di comando:

(e quindi con RMAX pari a 5 minuti) il programma dovrà creare il file 'stat.txt' col seguente contenuto:

puntualita’ = 75.0%
ritardo massimo = 55 minuti
volo ritardo massimo = BZ6969
Se invece il programma venisse attivato col comando:
allora RMAX varrebbe 3 minuti ed il file 'stat.txt' dovrà contenere:

puntualita’ = 50.0%
ritardo massimo = 55 minuti
volo ritardo massimo = BZ6969

ecco il programma che ho scritto:

Codice: Seleziona tutto

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


#define RMAX      5
#define STAT "stat.txt"
#define MAXRIGA  127+1
#define VOLO      6+1


int main(int argc, char *argv[])
{
	FILE *inDati;
	FILE *inStat;
	char riga[MAXRIGA], volo[VOLO], vrit[VOLO];
	int hprev, heff, mprev, meff; 
	int ritarmax=0; 
	double puntual=0;
	double ritardo=0;
	int nvolo=0;
	int nritardo=0;
	int tardissimo=0;
	/*controllo argomenti*/
	if ((argc<2) || (argc>3))
	{
		printf("ERRORE: numero argomenti errato.\n");
		printf("\n");
		printf("USO: <%s nomefile.txt>\n", argv[0]);
		printf("          oppure\n");
		printf(" <%s nomefile.txt minuti>\n", argv[0]);
		exit(1);
	}
	if ((inDati=fopen(argv[0],"r"))==NULL)
	{
		printf("ERRORE: il file %s è corrotto o non esiste.\n", argv[1]);
		exit(1);
	}
	if (argc==2)
		ritarmax=RMAX;
	else if (argc==3)
				{
					if ((sscanf(argv[1],"%d",&ritarmax))!=1)
						{
							printf("ERRORE: minuti di ritardo %s non valido.",argv[1]);
							exit(0);
						}
				}
	/*leggo il file ed elaboro i dati*/
	while (fgets(riga,MAXRIGA,inDati)!=NULL)
	{
		sscanf(riga,"%s %d:%d %d:%d",volo, &hprev, &mprev, &heff, &meff);
		if ((hprev==23) && (heff==00))
			heff=24;
		if ((hprev==00) && (heff==23))
			hprev=24;
		ritardo = (((heff*60)+meff)-((hprev*60)+mprev));
		if ((int)ritardo>ritarmax)
			++nritardo;
		if (tardissimo<(int)ritardo)
		{
			tardissimo=(int)ritardo;
			strcpy(vrit,volo);/*memorizzo il codice del volo con ritado massimo */
		}
		++nvolo;
	}
	/*chiudo file dati*/
	if (fclose(inDati)!=0)
	{
		printf("ERRORE: impossibile chiudere il file %s", argv[1]);
		exit(1);
	}
	puntual=(((double)nritardo)/((double)nvolo))*100;
	/*apro file statistiche*/
 if ((inStat=fopen(STAT,"w"))==NULL)
	{
		printf("ERRORE: il file %s è corrotto o non esiste.\n", STAT);
		exit(1);
	}
	/*scrivo le stat richieste*/
  /*finchè non vedo che funziona scrivo a video*/
	printf("puntualità = %f%%\n",puntual);
	printf("ritardo massimo = %d minuti\n",tardissimo);
	printf("volo ritardo massimo = %s\n",vrit);
	/*chiudo file statistiche*/
	if (fclose(inStat)!=0)
	{
		printf("ERRORE: impossibile chiudere il file %s", argv[1]);
		exit(1);
	}
	return (0);

}
se lo eseguo ecco che succede:

due-desktop:~/C_program/Tes13gen2010$ ./volstat voli.txt
puntualità = 17803.289863%
ritardo massimo = 1946186866 minuti
volo ritardo massimo = �Y
                        gT��bss_start

le ho già provate tutte..Sicuramente sarà una stupidaggine che non riesco a vedere

help me
Ultima modifica di cavaletto il venerdì 21 gennaio 2011, 0:28, modificato 1 volta in totale.
:muro:
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

Re: [C] aiuto

Messaggio da cavaletto »

ho capito che il problema e nel 'sscanf' ma non capisco dove sbaglio
:muro:
Avatar utente
jobv
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 262
Iscrizione: domenica 25 marzo 2007, 14:38
Località: Bolzano

Re: [C] aiuto

Messaggio da jobv »

Non vorrei dire cavolate ma mi pare di notare una cosa:

i tuoi orari sono nella forma XX:XX e quindi forse la sscanf dovrebbe essere %d%d:%d%d.

In più, visto che sono interi, la variabile "ritardo" forse può essere intera e non float
Avatar utente
matteovid
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 368
Iscrizione: mercoledì 9 dicembre 2009, 9:09
Desktop: Openbox, XFCE, XMonad
Distribuzione: GNU/Linux Arch - openSUSE Leap
Sesso: Maschile
Località: Parma

Re: [C] aiuto

Messaggio da matteovid »

Ciao

per leggere il file devi leggere argv[1]

argv[0] nome del programma, nel tuo caso è volstat
argv[1] primo parametro, nel tuo caso è voli.txt
argv[2] secondo parametro, nel tuo caso sono i minuti da scivere in MAXRIGA

Matteo
miglia da percorrere, prima di dormire
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [C] aiuto

Messaggio da ienaplinsky »

ciao, apparte i problemi di argv , leggere in quel modo con sscanf sinceramente non so se si può fare, i : non li ho mai visti, comunque il problema principale credo fosse quello

Codice: Seleziona tutto


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

#define RMAX      5
#define STAT "stat.txt"
#define MAXRIGA  127+1
#define VOLO      6+1

void get_time(char *A, int *h, int *m){
	
	while(isdigit(*A)){
		*h = *h * 10 + *A - '0';
		A++;
	}
	
	A++;
	
	while(isdigit(*A)){
		*m = *m * 10 + *A - '0';
		A++;
	}
	
	printf("%d %d\n", *h, *m);
}  
		

int main(int argc, char *argv[])
{
	FILE *inDati;
	FILE *inStat;
	char riga[MAXRIGA], volo[VOLO], vrit[VOLO];
	int hprev, heff, mprev, meff; 
	int ritarmax=0; 
	double puntual=0;
	double ritardo=0;
	int nvolo=0;
	int nritardo=0;
	int tardissimo=0;
	/*controllo argomenti*/
	if ((argc<2) || (argc>3))
	{
		printf("ERRORE: numero argomenti errato.\n");
		printf("\n");
		printf("USO: <%s nomefile.txt>\n", argv[0]);
		printf("          oppure\n");
		printf(" <%s nomefile.txt minuti>\n", argv[0]);
		exit(1);
	}
	if ((inDati=fopen(argv[1],"r"))==NULL)
	{
		printf("ERRORE: il file %s è corrotto o non esiste.\n", argv[1]);
		exit(1);
	}
	if (argc==2)
		ritarmax=RMAX;
	else if (argc==3)
				{
					if ((sscanf(argv[2],"%d",&ritarmax))!=1)
						{
							printf("ERRORE: minuti di ritardo %s non valido.",argv[1]);
							exit(0);
						}
				}
	/*leggo il file ed elaboro i dati*/
	while (fscanf(inDati, "%s", volo) != EOF)
	{	
		hprev = mprev = heff = meff = 0;
		fscanf(inDati, "%s", riga);
		get_time(riga, &hprev, &mprev);
		fscanf(inDati, "%s", riga);
		get_time(riga, &heff, &meff);
		printf("%s %d %d %d %d\n", volo, hprev, mprev, heff, meff);
		while(fgetc(inDati) != '\n');
		if ((hprev==23) && (heff==00))
			heff=24;
		if ((hprev==00) && (heff==23))
			hprev=24;
		ritardo = (((heff*60)+meff)-((hprev*60)+mprev));
		if ((int)ritardo>ritarmax)
			++nritardo;
		if (tardissimo<(int)ritardo)
		{
			tardissimo=(int)ritardo;
			strcpy(vrit,volo);/*memorizzo il codice del volo con ritado massimo */
		}
		++nvolo;
	}
	/*chiudo file dati*/
	if (fclose(inDati)!=0)
	{
		printf("ERRORE: impossibile chiudere il file %s", argv[1]);
		exit(1);
	}
	puntual=(((double)nritardo)/((double)nvolo))*100;
	/*apro file statistiche*/
 if ((inStat=fopen(STAT,"w"))==NULL)
	{
		printf("ERRORE: il file %s è corrotto o non esiste.\n", STAT);
		exit(1);
	}
	/*scrivo le stat richieste*/
  /*finchè non vedo che funziona scrivo a video*/
	printf("puntualità = %f%%\n",puntual);
	printf("ritardo massimo = %d minuti\n",tardissimo);
	printf("volo ritardo massimo = %s\n",vrit);
	/*chiudo file statistiche*/
	if (fclose(inStat)!=0)
	{
		printf("ERRORE: impossibile chiudere il file %s", argv[1]);
		exit(1);
	}
	return (0);

}
ora legge bene i dati solo fa male i conti, (che non ho corretto)
Avatar utente
cavaletto
Prode Principiante
Messaggi: 50
Iscrizione: mercoledì 4 giugno 2008, 23:05
Desktop: ubuntu
Distribuzione: Ubuntu 18.04 LTS x86_64
Sesso: Maschile
Località: Torino

Re: [C] aiuto

Messaggio da cavaletto »

Risoltooooo, grazie non mi ero accorto di aver sbagliato l'argomento di apertura file, e continuavo a non vederlo.
leggere con scanf in quel modo si può,  lo esigono nel corso che sto seguendo, ma non so il perchè.

GRAZIE  (good)
:muro:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti