Oppure

Loading
18/09/10 16:32
gtsolid
ciao a tutti
qui ho il testo del problema: img541.imageshack.us/img541/7929/…

e qui la soluzione che ho scritto:

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

#define N_AZIENDE 5

int main (int argc, char* argv[])
{
FILE *fin, *fout;
int cliente, azienda, operazione, q[N_AZIENDE], salva, totale = 0,cc;
float qta;
if(argc != 7)
    {
    fprintf (stderr,"Errore nel numero di argomenti passati al programma\n");
    return (-1);
    }
if((fin = fopen(argv[1],"r")) == NULL)
    {
    fprintf (stderr,"Errore in apertura file di ingresso\n");
    return (-2);
    }
/* il file di output lo apriamo solo se necessario */
cliente = atoi(argv[2]);
azienda = atoi(argv[3]) - 1;
operazione = argv[4][0];
qta = atof(argv[5]);
if (argv[6][1] == 'S')
    {
    salva = 0;
    }
else /* non sono previsti errori ....*/
    {
    salva = 1;
/* apriamo il file di output */
if((fout=fopen(argv[7],"w")) == NULL)
    fprintf (stderr,"Errore in apertura file di uscita\n");
    }
/* tutte e tre le operazioni richiedono di scandire il file */
while(fscanf(fin,"%d %d %d %d %d %d", &cc, &q[0], &q[1], &q[2], &q[3], &q[4]) == 6)
{
if(cc == cliente)
{
switch(operazione) {
case 'A':
q[azienda] += qta;
break;
case 'V':
q[azienda] -= qta;
break;
case 'G':
q[azienda] = q[azienda] * (1 + qta/100.0);
break;
}
}
if (salva)
{
fprintf(fout,"%d %d %d %d %d %d\n", cc, q[0], q[1], q[2], q[3], q[4]);
}
else
{
/* accumulo il totale dell’azienda, da stampare alla fine */
totale += q[azienda];
}
}
if (!salva)
{
printf("Numero totale di azione dell’azienda %d: %4d\n", azienda, totale);
}
fclose(fin);
if (salva)
{
fclose(fout);
}
}


vorrei innanzitutto un parere e soprattutto un'alternativa... nel senso di una struttura in cui siano presenti struct.

grazie
aaa
19/09/10 9:08
matrix90
in quel problema devi utilizzare per forza una struttura dati dinamica, poichè il problema di dice che i nomi che stanno sul file non sono prefissati... quindi io farei una bella lista e procederei di conseguenza
aaa
19/09/10 10:06
matrix90
#include <stdio.h>
#include <stdlib.h>

struct user{
	int name;
	int company_a;
	int company_b;
	int company_c;
	int company_d;
	int company_e;
};

typedef struct user user;

struct list{
	user data_user;
	void *next;
};

typedef struct list list;

list *
list_alloc();

list *
list_load(list *p, FILE *fp, char *name_file);

list *
list_create(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e);

list *
list_tail(list *p);

void
list_insert(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e);

void
list_print(list *p);

int 
main (int argc, char **argv){
	list *p=(list *)NULL;
	FILE *fp;

	p=list_load(p, fp, argv[1]);

	list_print(p);	

	exit(0);
}

list *
list_alloc(){
	list *new=(list *)NULL;

	new=(list *)malloc(sizeof(list));

	if(new){
		new->next=(list *)NULL;
	}
		
	return new;
}

list *
list_load(list *p, FILE *fp, char *name_file){
	int ret_val, user, company_a, company_b, company_c, company_d, company_e;
	
	fp=fopen(name_file, "r");

	if(fp){
		do{
			ret_val=fscanf(fp, "%d %d %d %d %d %d", &user, &company_a, &company_b, &company_c, &company_d, &company_e);

			if(ret_val==6){
				p=list_create(p, user, company_a, company_b, company_c, company_d, company_e);
			}

		}while(ret_val==6);

		fclose(fp);
	}

	return p;
}

list *
list_create(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e){
	list *new, *temp;

	new=list_alloc();

	if(new){
		list_insert(new, user, company_a, company_b, company_c, company_d, company_e);
	}else{
		printf("error to alloc\n");
	}

	if(!p){
		p=new;
	}else{
		temp=p;

		temp=list_tail(temp);

		temp->next=new;
	}

	return p;
}

list *
list_tail(list *p){
	while(p->next){
		p=p->next;
	}
	return p;
}

void
list_insert(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e){
	p->data_user.name=user;
	p->data_user.company_a=company_a;
	p->data_user.company_b=company_b;
	p->data_user.company_c=company_c;
	p->data_user.company_d=company_d;
	p->data_user.company_e=company_e;
}

void
list_print(list *p){
	while(p){
		printf("%d %d %d %d %d %d\n", p->data_user.name, p->data_user.company_a, p->data_user.company_b, p->data_user.company_c, p->data_user.company_d, p->data_user.company_e);

		p=p->next;
	}
}


diciamo dovresti fare un qualcosa del genere...
questo codice pero carica solo i dati da file e nient altro! :asd:
aaa
19/09/10 13:08
lorenzo
attenzione che il programma genera un enorme memory leak!
Bisogna sempre deallocare la memoria riservata dalla malloc usando la free


void release_list(list *start)
{
   list *tmp;

   while(start != NULL)
   {
         tmp = start;
         start = start->next;
         free(tmp);
   }
}



da richiamare prima di terminare il programma.
Ultima modifica effettuata da lorenzo 19/09/10 13:09
aaa
20/09/10 8:04
matrix90
sisi lorenzo lo so... ma ho fatto tutto in maniera veloce per fare vedere un po come avrei fatto io... comunque sapresti spiegarmi perche se io dealloco nella maniera che mi hai fatto vedere tu mi rimangono sempre i puntatori? cioe se io dpo avere deallocato tutto provo a ristampare, mi stampa? ovviamente con qualke dato mancante.
invece se opero in questa maniera il tutto va abuon fine:

list *
list_free(list *p){
	list *temp;

	if(!p){
		return NULL;
	}

	if(p->next){
		p->next=list_free(p->next);
	}

	temp=p->next;
	free(p);
	return temp;
}
aaa