PDA

View Full Version : Richiesta aiuto per programmino in C


logadato
09-09-2002, 23:08
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)?

recoil
10-09-2002, 21:57
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

logadato
10-09-2002, 23:28
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

-=Krynn=-
11-09-2002, 11:24
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.


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.

Gibbus
11-09-2002, 19:41
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 :).

mjordan
11-09-2002, 21:15
Originariamente inviato da Gibbus
[B]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 :).

Magari proprio non usare le liste.

Gibbus
12-09-2002, 20:51
Già :D! Meglio un array di strutture.
Però la lista collegata è richiesto esplicitamente dal problema.

logadato
12-09-2002, 23:50
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

-=Krynn=-
13-09-2002, 14:30
Originariamente inviato da mjordan
[B]

Magari proprio non usare le liste.

si ma il testo chiedeva esplicitamente una lista..

Vabbè, la mia struttura va benissimo, basta cancellare l'ultima riga

struct lista * prev_ptr;

ed ottieni una lista semplice....

mjordan
14-09-2002, 00:57
Originariamente inviato da -=Krynn=-
[B]

si ma il testo chiedeva esplicitamente una lista..

Vabbè, la mia struttura va benissimo, basta cancellare l'ultima riga

struct lista * prev_ptr;

ed ottieni una lista semplice....

Si ho visto adesso. Sorry :confused:

logadato
19-09-2002, 00:57
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;
}

Python
20-09-2002, 16:52
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'

cionci
20-09-2002, 19:09
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 *...

Python
20-09-2002, 20:36
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

cionci
21-09-2002, 11:22
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...

Python
21-09-2002, 19:48
il borland compiler

cionci
22-09-2002, 11:36
Originariamente inviato da Python
[B]il borland compiler
Beh...in teoria dovrebbe compilare anche sorgenti C puri...
Probabilmente è proprio una questione di progetto...lui veva incluso il CPP e avendolo rinominato in C non lo riusciva più a trovare...