| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  09-09-2002, 23:08 | #1 | 
| Junior Member Iscritto dal: Sep 2002 
					Messaggi: 4
				 | 
				
				Richiesta aiuto per programmino in C
			 
		Salve a tutti, sono alla prime armi col C, ho urgente bisogno di risolvere questo quesito,sotto riportato,cioè devo scrivere un programmino che soddisfi le specifiche date..e questo è ovvio:-))) Ho già iniziato una probabile soluz ma sono certo che ci sia qualche errore.oltretutto non so proprio dove iniziare per risolvere il terzo punto dell'esercizio. Spero vivamente di trovare qualche anima buona in questo ng disposto a perdere un pò del suo tempo.. Soprattutto,ripeto,er aiutarmi col terzo punto. Ringrazio tutti coloro che mi risponderanno anche solo per correggere pochi passaggi del mio operato. Saluti,Lollo In un’agenzia di servizio corriere le richieste giornaliere di ritiro pacchi da spedire sono memorizzate su di una lista collegata (rappresentata tramite strutture/record e puntatori) in memoria centrale.Per ogni richiesta la lista contiene un elemento che specifica: · l’orario in cui è stata effettuata la richiesta(rappresentato tramite due campi interi,uno per le ore,l’altro per i minuti) · nome del mittente (stringa max 20 caratteri) · indirizzo del mitt.( stringa max 40 char) · sigla della provincia di destinazione(2 caratteri) La lista è già ordinata per orario crescente. Si richiede di risolvere i seguenti punti 1- progetta la struttura dati per risolvere i punti 2 e 2 2- Progetta una funz C che , presi in ingresso attraverso opportuni parametri la lista L delle richieste e la sigla P di una provincia,scriva su di un file l’ora,nome e indirizzo del mittente di tutte le richieste in L destinate alla provincia P,una richiesta per riga. Il nome del file deve essere ottenuto concatenando la sigla della provincia P con l’estensione ”.txt”. 3- Progetta una funz C che, presi in ingresso attraverso opportuni parametri la lista L delle richieste di spedii ed un orario T ( specificato in ore,minuti),elimini dalla lista L tutte le richieste effettuate più tardi di T,liberando la memoria occupata dagli elementi eliminati. Nell’eliminare gli elementi ,si deve tener conto del fatto che la lista è ordinata per orario crescente Per le richieste rimaste in L,la funz deve inoltre restituire in un opportuno vettore (con una componente per ogni ora della giornata) il num delle richieste effettuate in ciascuna ora della giornata.In altre parole,la componente h del vettore deve contenere il num di richieste effettuate tra h:00 e h:59 Soluzione (un semplice abbozzo) 1) # include < stdio.h> #include<stdlib.h> #iclude<string.h> # define LUNGNOME 20 # define LUNGIND 40 # define LUNGPROV 2 typedef char [LUNGNOME +1] ; typedef char [LUNGIND +1] ; typedef char [LUNGPROV +1] ; Struct tipoOrario{ Int ore; Int minuti ; }; typedef tipoorario TipoOrario; struct TipoRichiesta{ TipoOrario orario; TipoNome nome; TipoIndirizzo indirizzo; TipoProvincia pv; typedef struct tipoRichiesta NodoRichieste ; typedef Nodorichiesta *Tipolistarichiesta 2) void individuarichieste (tipolistarichiesta lis tipoprovincia pv) {tipolistarichiesta aux; FILE * pv.txt, if((pv.txt=fopen(“pv.txt”,”w”))= =null){ printf (“errore in apertura del file “pv.txt”); exit (1);} while (lis != null){ if(stamp (aux®pv,pv)= = 0) fprint(“pv.txt”, "% d : %d %20s %40s %2s " ,lis.ore®pv, lis.minuti®pv, lis.nome®pv, lis.indirizzo®pv, lis.pv®pv); lis=lis®next;} fclose(pv.txt); } 3)? | 
|   |   | 
|  10-09-2002, 21:57 | #2 | 
| Senior Member Iscritto dal: Jul 2002 Città: Milano 
					Messaggi: 19148
				 | 
		per ora non ti do una mano a farlo perché mi ci vorrebbe un po' troppo, cmq ti posso già dire che ci sono delle stranezze nel codice che hai postato... typedef char [LUNGNOME +1] ; che vuol dire?? FILE * pv.txt sbagliato, non puoi dichiarare una variabile con il . in mezzo. al posto di -> io vedo la ®, non capisco perché la metti... va beh, se domani o dopo avrò tempo ti darò una mano un po' più concreta, cmq non hai specificato come deve essere scritto il file di output, intendi una cosa tipo "10.20 Mario Rossi Via Diaz 10" per ogni riga? ciao | 
|   |   | 
|  10-09-2002, 23:28 | #3 | 
| Junior Member Iscritto dal: Sep 2002 
					Messaggi: 4
				 | 
		Ciao. Ti ringrazio tantissim per l'aiuto che mi offri. rispondo subito a qualche tuo quesito typedef char TipoNome[LUNGNOME +1] dovrebbe essere così Per quanto riguarda la variabile pv,me ne sono accorto e oggi pome ho cercato di porvi rimedio. ..Cmq Sono lontano dalla soluz. Per le R tipo marchi registrato ..si, hai ragione ,solo che facendo copia-incolla da word ,sono apparse queste modifiche da me impreviste..e oltretutto non me ne sono accorto. Per quanto riguarda il file di output è proprio come intendi tu. Ora come ora mi chiedo come poi posso verificare la corretta funzionalità del programma. oggi ho provato così. Mi creo a parte una lista con inserite varie voci.Poi dal programma principale la richiamo in lettura e ci faccio una ricerca.. Ma è più facile a dirsi che a farsi,almeno per me!! Domani forse conoscerò la soluz,nel caso contrario..sarò fiducioso in un tuo aiuto. Grazie ancora,Lollo | 
|   |   | 
|  11-09-2002, 11:24 | #4 | 
| Senior Member Iscritto dal: Dec 2001 Città: Firenze - Nosgoth 
					Messaggi: 7333
				 | 
		io farei come struttura una lista collegata dinamicamente con i puntatori, magari che abbia due puntatori, uno che punta in avanti ed uno che punta indietro. Codice:  struct lista { short int ore;
                                 short int minuti;
                                 char mittente[21];
                                 char indirizzo[41];
                                 char provincia[2];
                                 struct lista * next_ptr;
                                 struct lista * prev_ptr;
                              };ora non ho molto tempo, quindi non ti fo le funzioni due punti 2 e 3, ma prova ad usare una lista in questa maniera, dovrebbe essere + semplice. 
				__________________ Xbox GamerTag: Falux || Psn: Falux79 || -=Krynn=- | 
|   |   | 
|  11-09-2002, 19:41 | #5 | 
| Senior Member Iscritto dal: Nov 2001 
					Messaggi: 1205
				 | 
		Mi sembra che il nostro amico sia alle prime armi con il C, quindi, se proprio si vuole puntare su una lista collegata, meglio implementare quella semplice non quella doppia   . | 
|   |   | 
|  11-09-2002, 21:15 | #6 | |
| Bannato Iscritto dal: Mar 2002 Città: Pescara - 未婚・恋人なし      Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3 
					Messaggi: 27578
				 | Quote: 
 | |
|   |   | 
|  12-09-2002, 20:51 | #7 | 
| Senior Member Iscritto dal: Nov 2001 
					Messaggi: 1205
				 | 
		Già   ! Meglio un array di strutture. Però la lista collegata è richiesto esplicitamente dal problema. | 
|   |   | 
|  12-09-2002, 23:50 | #8 | 
| Junior Member Iscritto dal: Sep 2002 
					Messaggi: 4
				 | 
		grazie ancora a tutti per l'aiuto. Il problema richiede proprio l'uso delle liste,ma con puntatore in un solo verso.. coem avevo scritto sono venuto in possesso della soluz totale dell'esercizio,che però ora no ho qui con me..domani o dopodomani mi riprometto di renderla disponibile per tutti... oltretutto il difficile è stato no solo risolvere l'esercizo,ma sviluppare la lista L (descritta nel testo) e collegarla al programma per verificarne la funzionalità..in poche parole era necessario vedere se effettivamente 'sto prog girava :-) Un saluto,alla prossima | 
|   |   | 
|  13-09-2002, 14:30 | #9 | |
| Senior Member Iscritto dal: Dec 2001 Città: Firenze - Nosgoth 
					Messaggi: 7333
				 | Quote: 
 Vabbè, la mia struttura va benissimo, basta cancellare l'ultima riga Codice: struct lista * prev_ptr; 
				__________________ Xbox GamerTag: Falux || Psn: Falux79 || -=Krynn=- | |
|   |   | 
|  14-09-2002, 00:57 | #10 | |
| Bannato Iscritto dal: Mar 2002 Città: Pescara - 未婚・恋人なし      Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3 
					Messaggi: 27578
				 | Quote: 
   | |
|   |   | 
|  19-09-2002, 00:57 | #11 | 
| Junior Member Iscritto dal: Sep 2002 
					Messaggi: 4
				 | 
		ciao A tutti!.Come promesso vi invio una probabile completa soluzione dell'esercizio.Spero possa essere di aiuto. vi ringrazio ancora per il vostro aiuto. Alla prossima. Lorenzo #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXNOME 20 #define MAXIND 40 #define MAXSIGLA 3 typedef char tiponome[MAXNOME+1]; typedef char tipoind[MAXIND+1]; typedef char tiposigla[MAXSIGLA]; struct Orario{ int ore; int minuti;}; typedef struct Orario tipoorario; struct Lista { tipoorario orario; tiponome nome; tipoind indirizzo; tiposigla sigla; struct Lista *next;}; typedef struct Lista tiponodolista; typedef tiponodolista *tipolista; typedef tipoorario v[24]; /*Punto 1:funzione che scrive su file le richieste destinate alla provincia P*/ void Fun1(tipolista L,tiposigla P){ /*definizioni*/ FILE *fp=NULL; char *nomefile; char *point="."; char *c="TXT"; /*operazioni per ottenere il nome del file*/ strcpy(nomefile,P); strcat(nomefile,point); strcat(nomefile,c); /*operazioni per scrivere le richieste sul file*/ if((fp=fopen(nomefile,"w"))==NULL){ fprintf(stderr,"Errore in apertura del file %s in scrittura\n",nomefile); exit(1);} while(L!=NULL){ if((strcmp(L->sigla,P))==0) fprintf(fp,"%d %d %s %s\n",L->orario.ore,L->orario.minuti,L->nome,L->indirizzo); L=L->next; } fclose(fp); } /*Punto 3:Funzione che restituisce l'array con il numero di richieste effettuate in un'ora della giornata*/ void Fun3(tipoorario v[24],tipolista L){ /*definizioni*/ tipoorario n; tipoorario h; tipoorario i; n.ore=0; n.minuti=0; printf("scrivi l'ora \n"); scanf("%d",&(h.ore)); while(L!=NULL){ if((h.ore)==(L->orario.ore)){ (n.ore)++;} L=L->next; } v[h.ore]=n; printf("L'indice%d ha valore %d\n",h.ore,v[h.ore]); } /*Funzione ausiliaria per la stampa delle lista*/ void Stampalista(tipolista L){ while(L!=NULL){ printf("%d.%d %s %s %s\n",L->orario.ore,L->orario.minuti,L->nome,L->indirizzo,L->sigla); } L=L->next; } /*Punto 3:Funzione che elimina dalla lista le richieste avvenute dopo l'orario T. Nella funzione si tiene conto che la lista Š ordinata in senso crescente,per tanto se un elem Š >T,lo saranno i successivi, che quindi devono essereeliminati*/ void Fun2(tipolista *L,tipoorario T){ tipolista aux; if((*L)->orario.ore>(T.ore)) { if((*L)->orario.minuti>(T.minuti)){ aux=*L; (*L)=(*L)->next; free(aux); Fun2(&(*L)->next,T); }} else Fun2(&(*L)->next,T);} int main(){ tipoorario h; tipoorario v[24]; tiposigla P; tipoorario T; char *nomefile; tipolista L=NULL; tipolista aux; clrscr(); /*Costruisco una lista di prova*/ aux=malloc(sizeof(tipolista)); aux->orario.ore=9; aux->orario.minuti=30; strcpy(aux->nome,"Rossi"); strcpy(aux->indirizzo,"ViaVerdi"); strcpy(aux->sigla,"FI"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux=malloc(sizeof(tipolista)); aux->orario.ore=10; aux->orario.minuti=45; strcpy(aux->nome,"Verdi"); strcpy(aux->indirizzo,"ViaBianchi"); strcpy(aux->sigla,"BA"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux->orario.ore=11; aux->orario.minuti=10; strcpy(aux->nome,"Bianchi"); strcpy(aux->indirizzo,"ViaViola"); strcpy(aux->sigla,"MI"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux->orario.ore=13; aux->orario.minuti=12; strcpy(aux->nome,"Viola"); strcpy(aux->indirizzo,"ViaLilla"); strcpy(aux->sigla,"FI"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux->orario.ore=16; aux->orario.minuti=30; strcpy(aux->nome,"Lilla"); strcpy(aux->indirizzo,"ViaNeri"); strcpy(aux->sigla,"FG"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux->orario.ore=16; aux->orario.minuti=50; strcpy(aux->nome,"Gialli"); strcpy(aux->indirizzo,"ViaAzzurri"); strcpy(aux->sigla,"PA"); aux->next=L; L=aux; aux=malloc(sizeof(tipolista)); aux->orario.ore=18; aux->orario.minuti=20; strcpy(aux->nome,"Neri"); strcpy(aux->indirizzo,"ViaRossi"); strcpy(aux->sigla,"MI"); aux->next=L; L=aux; printf("Immetti la provincia di interesse:\n"); scanf("%s",&P); Stampalista(L); /*Stampa la lista di prova*/ Fun1(L,P); printf("Immetti l'orario:\n"); /*per Fun2*/ scanf("%d%d",&T.ore,&T.minuti); Fun2(&L,T); Stampalista(L); /*Stampa la lista modificata*/ Fun3(v,L); return 0; } | 
|   |   | 
|  20-09-2002, 16:52 | #12 | 
| Senior Member Iscritto dal: Jul 2002 
					Messaggi: 2183
				 | 
		ciao ho provato a compilare il tuo codice cosi x prova (mi può essere d'esempio, sono + agli inizi di te (molto di +)) mi da 9 erroroi in compilazione error E2034 prob.cpp 127 cannot convert 'void *' to 'lista *' in function main() e cosi x i righi 130 139 140 149 etc prima ancora mi dice che warning W8004 prob.cpp 50 'fp' is assigned a value that is never used in function e cosi alla riga 98 x 'L' | 
|   |   | 
|  20-09-2002, 19:09 | #13 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Prova a rinominare il sorgente come .C Probabilmente l'hai chiamato CPP e ti usa le estensioni al C del C++...ad esempio la necessità del cast esplicito sul void *... | 
|   |   | 
|  20-09-2002, 20:36 | #14 | 
| Senior Member Iscritto dal: Jul 2002 
					Messaggi: 2183
				 | 
		il compilatore che ho è per c++ (e come si dice in giro con un compilatore c++ posso compilare codice c) però se lo rinomino in prob.c mi dice che non trova il file prob.cpp cioè lo vuole proprio come .cpp se nò nn lo compila | 
|   |   | 
|  21-09-2002, 11:22 | #15 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Sì, si può compilare anche codice C con un compilatore C++...ma come vedi ci sono alcune differenze...ad esempio bisogna mettere il cast esplicito (lista *) davanti alla malloc... Che compilatore hai ? Magari basta reincludere il file .c all'interno del progetto... | 
|   |   | 
|  21-09-2002, 19:48 | #16 | 
| Senior Member Iscritto dal: Jul 2002 
					Messaggi: 2183
				 | 
		il borland compiler
		 | 
|   |   | 
|  22-09-2002, 11:36 | #17 | |
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | Quote: 
 Probabilmente è proprio una questione di progetto...lui veva incluso il CPP e avendolo rinominato in C non lo riusciva più a trovare... | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 11:05.









 
		 
		 
		 
		










 
  
 



 
                        
                        










