ivan p
08-07-2009, 15:13
Salve.
Prima di tutto non sono un esperto quindi esprimetevi nel modo più chiaro possibile. Spero possiate essermi d'aiuto. Il codice che segue dovrebbe creare un file di testo in cui scrivere i dati che attraverso il richiamo di determinate procedure saranno poi copiati in una struttura dati lista. Più precisamente in una lista di lista. Ho definito le strutture dati e le relative funzioni e in compilazione non ottengo nessun errore o warning. Quando eseguo il codice richiamando la funzione numero 2, il programma commette un errore e appare il messaggio di segnalazione di errore a microsoft. Non capisco da cosa possa dipendere l'errore. Grazie anticipatamente. Ecco il codice:
#include <stdio.h>
#include <malloc.h>
/*Definizioni strutture dati*/
typedef unsigned short boolean;
typedef struct{
unsigned int giorno,mese,anno;
}*D;
typedef struct{
int codMulta;
D data;
char targa[16];
float importo;
char violazione [100];
boolean stato; /*1=pagato 0=non pagato*/
}*multa;
typedef struct sottonodo{
multa info;
struct sottonodo *next;
}*sottolista;
typedef sottolista positionS;
typedef struct nodo{
D data;
sottolista elenco;
struct nodo *next;
}*lista;
typedef lista position;
/*Definizione funzioni primitive Lista*/
position First(lista l) {
return(NULL); /*se la lista è vuota torna END(l) */
}
position End(lista l){
if(l==NULL) return(l);
while(l->next!=NULL)
l=l->next;
return(l);
}
lista Retrieve(lista l,position p){
if(p==NULL) return(l);
else return(p->next);
}
position Next(lista l,position p){
if(p==NULL)return(l);
else return(p->next);
}
/*Funzioni compito*/
/*Crea nodo*/
void insert_nodo(lista *l,position p,lista x){
struct nodo * tmp;
tmp=(struct nodo *)malloc(sizeof(struct nodo));
tmp=x;
if(p==NULL){
tmp->next=*l;
*l=tmp;
}else {
tmp->next=p->next;
p->next=tmp;
}
}
/*Crea sottonodo*/
void insert_sottonodo (sottolista *Sl,positionS pS, sottolista x){
struct sottonodo * tmp;
tmp=(struct sottonodo *)malloc(sizeof(struct sottonodo));
tmp=x;
if(pS==NULL){
tmp->next=*Sl;
*Sl=tmp;
}else {
tmp->next=pS->next;
pS->next=tmp;
}
}
/*Inserimento ordinato*/
void insert_ordinato (lista *l, sottolista x){
position p,u;
lista tmp;
sottolista *Sl;
positionS pS;
tmp->data= (*Sl)->info->data;
p = First(*l);
u = End(*l);
while (p != u){
tmp = Retrieve (*l,p);
pS= tmp->elenco;
if ( (x->info->data->anno == tmp->data->anno && x->info->data->mese == tmp->data->mese && x->info->data->giorno == tmp->data->giorno )){
insert_sottonodo(Sl,pS,x);
}else{ insert_nodo(l,p,tmp);
insert_sottonodo(Sl,pS,x);
p = Next(*l,p);
}
}
}
/*Data un dat calcola l'importo delle multe pagate e non pagate*/
float multe (lista *l, D data){
position p,u,tmp;
positionS pS;
float pagata=0,nonpagata=0;
p = First(*l);
u = End(*l);
while (p != u){
tmp = Retrieve (*l,p);
if (data == tmp->elenco->info->data){
pS = (*l)->elenco->next;
while (pS != NULL ){
if (pS->info->stato == 0)
nonpagata+=pS->info->importo;
else pagata+=pS->info->importo;
}
}else p = Next(*l,p);
}if (nonpagata == 0 && pagata ==0)
printf("\nNon esistono multe per questa data");
else printf("L'ammontare delle multe pagate e di %feuro, quello delle multe non pagate è di %feuro",pagata,nonpagata);
getchar();
}
main(){
lista lt=NULL;
sottolista Slt=NULL;
unsigned scelta;
FILE *fp;
int c = 0,i;
sottolista elem;
elem = (sottolista)malloc (sizeof(multa));
do { system("CLS");
printf("\nMenu' delle operazioni:\n");
printf("1-Inserisci dati su file\n");
printf("2-Copia file in struttura dati lista\n");
printf("3-Calcola l'importo delle multe pagate e non di una determinata targa\n");
printf("\nInserisci la scelta ----> ");
scanf("%u",&scelta);
fflush(stdin);
switch (scelta){
case 1: fp = fopen("Multe.txt","w");
if (fp==NULL) exit(1); /* Non si è aperto */
else { printf ("Inserire i dati della multa separandoli con uno spazio e premereinvio dopo ogni multa.");
printf("\nOrdine d'inserimento:\n1 Codice identificativo\n2 Data\n3 Targa\n4 Importo\n");
printf("\n5 Inserire il valore 1 se la multa e' pagata altimenti 0 se non e' pagata");
printf("\nViolazione: ");
printf("\nPreme <ctrl> e <z> contemporaneamente per terminare l'inserimento\n");
while ((c=getchar())!=EOF)
fputc(c,fp);
fclose(fp);
}
break;
case 2: fp = fopen("Multe.txt", "r");
if(fp==NULL) {
printf("Errore nell'apertura del file...");
return 1;
}
while(fscanf(fp,"%d %d %d %d %s %f %hd %[^\n]s\n", &(elem->info->codMulta)
, &(elem->info->data->giorno), &(elem->info->data->mese)
, &(elem->info->data->anno),& (elem->info->targa), &(elem->info->importo)
, &(elem->info->stato), &(elem->info->violazione)) == 8){
insert_ordinato(<,elem);
}
fclose(fp);
free(elem->info->data);
free(elem);
return 0;
break;
}
}while(scelta<=4);
}
Prima di tutto non sono un esperto quindi esprimetevi nel modo più chiaro possibile. Spero possiate essermi d'aiuto. Il codice che segue dovrebbe creare un file di testo in cui scrivere i dati che attraverso il richiamo di determinate procedure saranno poi copiati in una struttura dati lista. Più precisamente in una lista di lista. Ho definito le strutture dati e le relative funzioni e in compilazione non ottengo nessun errore o warning. Quando eseguo il codice richiamando la funzione numero 2, il programma commette un errore e appare il messaggio di segnalazione di errore a microsoft. Non capisco da cosa possa dipendere l'errore. Grazie anticipatamente. Ecco il codice:
#include <stdio.h>
#include <malloc.h>
/*Definizioni strutture dati*/
typedef unsigned short boolean;
typedef struct{
unsigned int giorno,mese,anno;
}*D;
typedef struct{
int codMulta;
D data;
char targa[16];
float importo;
char violazione [100];
boolean stato; /*1=pagato 0=non pagato*/
}*multa;
typedef struct sottonodo{
multa info;
struct sottonodo *next;
}*sottolista;
typedef sottolista positionS;
typedef struct nodo{
D data;
sottolista elenco;
struct nodo *next;
}*lista;
typedef lista position;
/*Definizione funzioni primitive Lista*/
position First(lista l) {
return(NULL); /*se la lista è vuota torna END(l) */
}
position End(lista l){
if(l==NULL) return(l);
while(l->next!=NULL)
l=l->next;
return(l);
}
lista Retrieve(lista l,position p){
if(p==NULL) return(l);
else return(p->next);
}
position Next(lista l,position p){
if(p==NULL)return(l);
else return(p->next);
}
/*Funzioni compito*/
/*Crea nodo*/
void insert_nodo(lista *l,position p,lista x){
struct nodo * tmp;
tmp=(struct nodo *)malloc(sizeof(struct nodo));
tmp=x;
if(p==NULL){
tmp->next=*l;
*l=tmp;
}else {
tmp->next=p->next;
p->next=tmp;
}
}
/*Crea sottonodo*/
void insert_sottonodo (sottolista *Sl,positionS pS, sottolista x){
struct sottonodo * tmp;
tmp=(struct sottonodo *)malloc(sizeof(struct sottonodo));
tmp=x;
if(pS==NULL){
tmp->next=*Sl;
*Sl=tmp;
}else {
tmp->next=pS->next;
pS->next=tmp;
}
}
/*Inserimento ordinato*/
void insert_ordinato (lista *l, sottolista x){
position p,u;
lista tmp;
sottolista *Sl;
positionS pS;
tmp->data= (*Sl)->info->data;
p = First(*l);
u = End(*l);
while (p != u){
tmp = Retrieve (*l,p);
pS= tmp->elenco;
if ( (x->info->data->anno == tmp->data->anno && x->info->data->mese == tmp->data->mese && x->info->data->giorno == tmp->data->giorno )){
insert_sottonodo(Sl,pS,x);
}else{ insert_nodo(l,p,tmp);
insert_sottonodo(Sl,pS,x);
p = Next(*l,p);
}
}
}
/*Data un dat calcola l'importo delle multe pagate e non pagate*/
float multe (lista *l, D data){
position p,u,tmp;
positionS pS;
float pagata=0,nonpagata=0;
p = First(*l);
u = End(*l);
while (p != u){
tmp = Retrieve (*l,p);
if (data == tmp->elenco->info->data){
pS = (*l)->elenco->next;
while (pS != NULL ){
if (pS->info->stato == 0)
nonpagata+=pS->info->importo;
else pagata+=pS->info->importo;
}
}else p = Next(*l,p);
}if (nonpagata == 0 && pagata ==0)
printf("\nNon esistono multe per questa data");
else printf("L'ammontare delle multe pagate e di %feuro, quello delle multe non pagate è di %feuro",pagata,nonpagata);
getchar();
}
main(){
lista lt=NULL;
sottolista Slt=NULL;
unsigned scelta;
FILE *fp;
int c = 0,i;
sottolista elem;
elem = (sottolista)malloc (sizeof(multa));
do { system("CLS");
printf("\nMenu' delle operazioni:\n");
printf("1-Inserisci dati su file\n");
printf("2-Copia file in struttura dati lista\n");
printf("3-Calcola l'importo delle multe pagate e non di una determinata targa\n");
printf("\nInserisci la scelta ----> ");
scanf("%u",&scelta);
fflush(stdin);
switch (scelta){
case 1: fp = fopen("Multe.txt","w");
if (fp==NULL) exit(1); /* Non si è aperto */
else { printf ("Inserire i dati della multa separandoli con uno spazio e premereinvio dopo ogni multa.");
printf("\nOrdine d'inserimento:\n1 Codice identificativo\n2 Data\n3 Targa\n4 Importo\n");
printf("\n5 Inserire il valore 1 se la multa e' pagata altimenti 0 se non e' pagata");
printf("\nViolazione: ");
printf("\nPreme <ctrl> e <z> contemporaneamente per terminare l'inserimento\n");
while ((c=getchar())!=EOF)
fputc(c,fp);
fclose(fp);
}
break;
case 2: fp = fopen("Multe.txt", "r");
if(fp==NULL) {
printf("Errore nell'apertura del file...");
return 1;
}
while(fscanf(fp,"%d %d %d %d %s %f %hd %[^\n]s\n", &(elem->info->codMulta)
, &(elem->info->data->giorno), &(elem->info->data->mese)
, &(elem->info->data->anno),& (elem->info->targa), &(elem->info->importo)
, &(elem->info->stato), &(elem->info->violazione)) == 8){
insert_ordinato(<,elem);
}
fclose(fp);
free(elem->info->data);
free(elem);
return 0;
break;
}
}while(scelta<=4);
}