Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-02-2016, 09:01   #1
wickedwonderland
Junior Member
 
Iscritto dal: Feb 2016
Messaggi: 5
[C] funzione che legge da .txt e trascive in una struttura concatenata

Salve, sto svolgendo un esercizio dove devo fare varie operazioni sulla programmazione di un cinema,a partire dai biglietti.

la lista dei biglietti è scritta in un file .txt secondo il seguente ordine (esempio) :
codice data ora sala tipologia
456123 03-02-2015 21:00 B 3D

devo utilizzare quindi una struct concatenata di questo tipo :

Codice:
struct biglietto {
  int codice;
  int dd;
  int mm;
  int yy;
  int h;
  int m;
  char sala;  
  int tipologiaa;  
  struct biblietto *next;
};
come posso implementare una funzione che, letti i dati dei biglietti da un file .txt, li scriva nella struttura concatenata ?
grazie
wickedwonderland è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2016, 10:34   #2
gianmpu
Senior Member
 
Iscritto dal: Oct 2010
Messaggi: 1609
Benvenuto nel forum di hwupgrade.
Come in molti ti diranno, è vietato da regolamento chiedere la soluzione di esercizi.
E' permesso invece correggere eventuali errori nel codice che tu hai scritto finora dopo che lo avrai postato.
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax
Utenti assolutamente DA EVITARE: devilred
"Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2016, 17:06   #3
wickedwonderland
Junior Member
 
Iscritto dal: Feb 2016
Messaggi: 5
Quote:
Originariamente inviato da gianmpu Guarda i messaggi
Benvenuto nel forum di hwupgrade.
Come in molti ti diranno, è vietato da regolamento chiedere la soluzione di esercizi.
E' permesso invece correggere eventuali errori nel codice che tu hai scritto finora dopo che lo avrai postahttp://www.hwupgrade.it/forum/newreply.php?do=newreply&p=43373659to.
chiedevo la risoluzione da zero proprio perchè non so lavorare con le struct concatenate, quindi il mio codice sarebbe stato inesistente. non è un esercizio assegnato e non ne traggo vantaggio dalla corretta risoluzione, era solo a scopo di apprendimento. ma se questo è il regolamento, mi ci attengo .

ho provato a trascrivere i dati dal file ad un array di strutture, un po più macchinoso, ma che dovrebbe fare il suo lavoro, in questo modo :

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

//definisco la struttura per salvare i biglietti

struct biglietto{
	int codice;
	int gg;
	int mm;
	int aa;
	int h;
	int m;
	char sala;
	int dimensione;
};


//funzione che calcola il numero di biglietti totali

int ContaLinee(FILE *f) {

	char ch;
	int linee = 0;
	while(!feof(f)){
		if ((ch = getc(f)) == '\n')
			linee++;
	}
	return linee;	
}


//funzione che legge i biglietti dal file e li copia nella struct 

void LeggiBiglietto(FILE *f, struct biglietto *b, int NumB)	{
	int i;
	for (i=0; i < NumB; i++){
		fscanf(f,"%d %d-%d-%d %d:%d %c %d", &b[i].codice, &b[i].gg, &b[i].mm, &b[i].aa, &b[i].h, &b[i].m, &b[i].sala, &b[i].dimensione);
	}
}


//main 

int main(int argc, char **argv)	{

	FILE *f;
	f = fopen(argv[1],"r");

	int NumB;
	NumB = ContaLinee(f);
	printf("il numero di biglietti emessi è : %d \n", NumB);

	struct biglietto *b[NumB];

	LeggiBiglietto(f, b[NumB], NumB);	

	int i;
	for (i = 0; i < NumB; i++ )	{
		printf("il codice è : %d \n", b[i].codice);
		printf("la data è : %d-%d-%d \n", b[i].gg, b[i].mm, b[i].aa);
		printf("l'orario di inizio è : %d:%d \n", b[i].h, b[i].m);
		printf("la sala è : %c \n", b[i].sala);
		printf("il film è in %dD \n", b[i].dimensione);
}
}
sfortunatamente non compila dandomi questo errore di cui non riesco a venirne a capo:

Codice:
esercizio.c:60:38: error: request for member ‘codice’ in something not a structure or union
   printf("il codice è : %d \n", b[i].codice);
                                      ^
esercizio.c:61:42: error: request for member ‘gg’ in something not a structure or union
   printf("la data è : %d-%d-%d \n", b[i].gg, b[i].mm, b[i].aa);
                                          ^
esercizio.c:61:51: error: request for member ‘mm’ in something not a structure or union
   printf("la data è : %d-%d-%d \n", b[i].gg, b[i].mm, b[i].aa);
                                                   ^
esercizio.c:61:60: error: request for member ‘aa’ in something not a structure or union
   printf("la data è : %d-%d-%d \n", b[i].gg, b[i].mm, b[i].aa);
                                                            ^
esercizio.c:62:50: error: request for member ‘h’ in something not a structure or union
   printf("l'orario di inizio è : %d:%d \n", b[i].h, b[i].m);
                                                  ^
esercizio.c:62:58: error: request for member ‘m’ in something not a structure or union
   printf("l'orario di inizio è : %d:%d \n", b[i].h, b[i].m);
                                                          ^
esercizio.c:63:36: error: request for member ‘sala’ in something not a structure or union
   printf("la sala è : %c \n", b[i].sala);
                                    ^
esercizio.c:64:38: error: request for member ‘dimensione’ in something not a structure or union
   printf("il film è in %dD \n", b[i].dimensione);

Ultima modifica di wickedwonderland : 13-02-2016 alle 17:10.
wickedwonderland è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2016, 20:27   #4
gianmpu
Senior Member
 
Iscritto dal: Oct 2010
Messaggi: 1609
Questa linea
struct biglietto *b[NumB]
dichiara un array di puntatori. Dal momento che ogni elemento dell'array è un puntatore ad una struct nel codice non puoi avere accesso direttamente al contenuto della struct con espressioni del tipo b[indice numerico].
Comunque, data la richiesta, c'è proprio un errore di base su cosa sia una lista concatenata.
Una lista concatenata è qualcosa composto da singoli elementi che di solito si indicano nodi, fatti in questo modo
struct nodo {
dati da salvare
puntatore al nodo successivo
};
Dove "dati da salvare" indica i dati di cui si deve tenere traccia nel singolo elemento della lista(nel tuo caso quelli di un singolo biglietto, per capirci) e puntatore al nodo successivo è un puntatore all'elemento successivo della lista.
Con le liste concatenate, di solito basta tenere traccia del puntatore al primo elemento della lista perchè è possibile raggiungere un elemento seguente "navigando" da un elemento all'altro grazie al puntatore al nodo successivo.
Gli algoritmi di inserimento di un elemento sono standard e si trovano facilmente in qualunque dispensa disponibile in rete che tratti i puntatori in C.
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax
Utenti assolutamente DA EVITARE: devilred
"Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian

Ultima modifica di gianmpu : 13-02-2016 alle 20:30.
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2016, 15:20   #5
wickedwonderland
Junior Member
 
Iscritto dal: Feb 2016
Messaggi: 5
Quote:
Originariamente inviato da gianmpu Guarda i messaggi
Questa linea
struct biglietto *b[NumB]
dichiara un array di puntatori. Dal momento che ogni elemento dell'array è un puntatore ad una struct nel codice non puoi avere accesso direttamente al contenuto della struct con espressioni del tipo b[indice numerico].
Comunque, data la richiesta, c'è proprio un errore di base su cosa sia una lista concatenata.
Una lista concatenata è qualcosa composto da singoli elementi che di solito si indicano nodi, fatti in questo modo
struct nodo {
dati da salvare
puntatore al nodo successivo
};
Dove "dati da salvare" indica i dati di cui si deve tenere traccia nel singolo elemento della lista(nel tuo caso quelli di un singolo biglietto, per capirci) e puntatore al nodo successivo è un puntatore all'elemento successivo della lista.
Con le liste concatenate, di solito basta tenere traccia del puntatore al primo elemento della lista perchè è possibile raggiungere un elemento seguente "navigando" da un elemento all'altro grazie al puntatore al nodo successivo.
Gli algoritmi di inserimento di un elemento sono standard e si trovano facilmente in qualunque dispensa disponibile in rete che tratti i puntatori in C.
capisco, quindi in questo caso non ho alternative se non usare una lista concatenata.
scusami se ti disturbo nuovamente, ho googlato un po' alla ricerca di una guida valida che spiegasse l'inserimento e la lettura dei dati nelle liste dinamiche ma non ne ho trovata neanche una , quelle qui sul forum sono ad un livello molto più avanzato, e la maggior parte di quelle nelle dispense universitarie si limitano alla sola definizione di questo tipo di strutture, sapresti dirmi dove posso trovarne una valida ?
wickedwonderland è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2016, 12:42   #6
gianmpu
Senior Member
 
Iscritto dal: Oct 2010
Messaggi: 1609
In realtà non è una questione di alternative, quanto piuttosto di traccia dell'esercizio.
Esiste infatti sempre la possibilità di utilizzare al posto della lista concatenata un array opportunamente dimensionato, ma nel tuo caso, se non ho capito male, visto che si tratta di un esercizio viene espressamente chiesto l'uso della lista. E' corretto?
Proporre una dispensa adatta al tuo livello è difficile perchè non so qual è il tuo livello attuale di conoscenza.
Comunque, cercando su google, ho trovato questa dispensa
http://www.science.unitn.it/~brunato/labpro1/lista.html
Rispetto ad altre guide, ha il vantaggio della notazione grafica.
Quando si affrontano le liste concatenate per la prima volta, infatti, aiutarsi con una notazione grafica che spieghi visivamente le operazioni che vengono effettuate può aiutare a rendere l'argomento meno ostico.
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax
Utenti assolutamente DA EVITARE: devilred
"Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2016, 19:52   #7
wickedwonderland
Junior Member
 
Iscritto dal: Feb 2016
Messaggi: 5
Quote:
Originariamente inviato da gianmpu Guarda i messaggi
In realtà non è una questione di alternative, quanto piuttosto di traccia dell'esercizio.
Esiste infatti sempre la possibilità di utilizzare al posto della lista concatenata un array opportunamente dimensionato, ma nel tuo caso, se non ho capito male, visto che si tratta di un esercizio viene espressamente chiesto l'uso della lista. E' corretto?
Proporre una dispensa adatta al tuo livello è difficile perchè non so qual è il tuo livello attuale di conoscenza.
Comunque, cercando su google, ho trovato questa dispensa
http://www.science.unitn.it/~brunato/labpro1/lista.html
Rispetto ad altre guide, ha il vantaggio della notazione grafica.
Quando si affrontano le liste concatenate per la prima volta, infatti, aiutarsi con una notazione grafica che spieghi visivamente le operazioni che vengono effettuate può aiutare a rendere l'argomento meno ostico.
Nella traccia dell'esercizio l'utilizzo di una lista concatenata é consigliato come metodo più efficiente , io sono andato sulla fiducia , ho sbagliato ?
Il mio livello nella programmazione C temo sia il più basso possibile .
Ti ringrazio per la guida linkata , la rappresentazione grafica aiuta molto
wickedwonderland è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2016, 20:28   #8
gianmpu
Senior Member
 
Iscritto dal: Oct 2010
Messaggi: 1609
Si, una lista concatenata è più efficiente.
Come detto, infatti, si potrebbe usare anche un array al posto della lista.
L'array però di solito deve avere una dimensione fissata a priori tale che possa contenere al suo interno i dati del numero massimo di biglietti quindi spesso comporta uno spreco di memoria perchè non sempre tale numero di biglietti viene venduto. La lista, invece, alloca la memoria in cui salvare i dati solo quando ce n'è veramente bisogno quindi non comporta sprechi.
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax
Utenti assolutamente DA EVITARE: devilred
"Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2016, 10:19   #9
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Le liste presentano, inoltre, ulteriori vantaggi rispetto agli array (se sono doppiamente concatenate, poi... ).
Ad esempio, l'inserimento ordinato è molto meno dispendioso (in termini di operazioni da eseguire). Immagina di voler inserire un elemento a metà lista. Se usassi un array (fermo restando il problema delle dimensioni fissate a compile-time) dovresti prima spostare tutti gli elementi che dovranno seguire quello da inserire, e poi potresti inserirlo.
Usando le liste, invece, si tratta solo di modificare i riferimenti di, al massimo, 4 puntatori, senza che siano necessarie ulteriori operazioni in memoria (infatti, i singoli elementi di una lista non sono memorizzati necessariamente in locazioni contigue).

Ovviamente, hanno anche degli svantaggi. Ad esempio, se vuoi accedere all'elemento "n" di un array, è sufficiente scrivere nome_array[n]. Nel caso di una lista, invece, devi necessariamente partire dal puntatore alla testa e scorrerla. Inoltre, se per errore perdi il puntatore alla testa della lista, non c'è modo di recuperarla (infatti, è buona norma creare un puntatore "temporaneo" per scorrere la lista, senza toccare "head").

In definitiva, la scelta tra array e liste, al di là di preferenze personali, va fatto, in linea di massima, ragionando così:

Se il programma dovrà accedere molte volte agli elementi, ma in sola lettura (quindi, quando il numero di letture è molto superiore al numero di inserimenti e rimozioni), gli array sono preferibili (fermo restando, ripeto, il limite dato dalla dimensione prefissata).

Viceversa, meglio le liste.
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2016, 10:08   #10
wickedwonderland
Junior Member
 
Iscritto dal: Feb 2016
Messaggi: 5
Quote:
Originariamente inviato da gianmpu Guarda i messaggi
Si, una lista concatenata è più efficiente.
Come detto, infatti, si potrebbe usare anche un array al posto della lista.
L'array però di solito deve avere una dimensione fissata a priori tale che possa contenere al suo interno i dati del numero massimo di biglietti quindi spesso comporta uno spreco di memoria perchè non sempre tale numero di biglietti viene venduto. La lista, invece, alloca la memoria in cui salvare i dati solo quando ce n'è veramente bisogno quindi non comporta sprechi.
Quote:
Originariamente inviato da GTKM Guarda i messaggi
Le liste presentano, inoltre, ulteriori vantaggi rispetto agli array (se sono doppiamente concatenate, poi... ).
Ad esempio, l'inserimento ordinato è molto meno dispendioso (in termini di operazioni da eseguire). Immagina di voler inserire un elemento a metà lista. Se usassi un array (fermo restando il problema delle dimensioni fissate a compile-time) dovresti prima spostare tutti gli elementi che dovranno seguire quello da inserire, e poi potresti inserirlo.
Usando le liste, invece, si tratta solo di modificare i riferimenti di, al massimo, 4 puntatori, senza che siano necessarie ulteriori operazioni in memoria (infatti, i singoli elementi di una lista non sono memorizzati necessariamente in locazioni contigue).

Ovviamente, hanno anche degli svantaggi. Ad esempio, se vuoi accedere all'elemento "n" di un array, è sufficiente scrivere nome_array[n]. Nel caso di una lista, invece, devi necessariamente partire dal puntatore alla testa e scorrerla. Inoltre, se per errore perdi il puntatore alla testa della lista, non c'è modo di recuperarla (infatti, è buona norma creare un puntatore "temporaneo" per scorrere la lista, senza toccare "head").

In definitiva, la scelta tra array e liste, al di là di preferenze personali, va fatto, in linea di massima, ragionando così:

Se il programma dovrà accedere molte volte agli elementi, ma in sola lettura (quindi, quando il numero di letture è molto superiore al numero di inserimenti e rimozioni), gli array sono preferibili (fermo restando, ripeto, il limite dato dalla dimensione prefissata).

Viceversa, meglio le liste.
Grazie ed entrambi, ieri ho scribacchiato basandomi sulla pagina linkata da Gianmpu e su un'altra trovata online, questo è il risultato :


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

#define LINEA_MAX 30


struct cinema	{
	int codice;
	int dd;
	int mm;
	int yy;
	int h;
	int m;
	char sala;
	int tipo;
	struct cinema *next;
};


//funzione per eliminare la memoria allocata

void libera_memoria(struct cinema *b)	{

	struct cinema *temp;
	while(b != NULL)	{
		temp = b;
		b = b->next;
		free(temp);
	}
}
 
//funzione che legge i dati e li mette nella struttura

struct cinema *leggi_biglietto(const char *nomefile)	{

	FILE *f;
	f = fopen(nomefile,"r");
	if (f == NULL)	{
		printf("errore nell'apertura del file");
		return NULL;
	}

	struct cinema *biglietto = NULL;
	struct cinema *b;
	char linea[LINEA_MAX + 1];
	int n;

	while(fgets(linea,LINEA_MAX + 2,f) != NULL)	{
		b = (struct cinema*) malloc(sizeof(struct cinema));
		b->next = biglietto;
		biglietto = b;
		n = sscanf(linea,"%d %d-%d-%d %d:%d %c %d", &b->codice, &b->dd, &b->mm, &b->yy, &b->h, &b->m, &b->sala, &b->tipo);
		if (n == 0)	{
			biglietto = biglietto->next;
			free(b);	
		} else if (0 < n && n < 8)	{
			printf("numero di campi non validi");
			return NULL;
		}
	}
	fclose(f);
	if (biglietto == NULL)	{
		printf("errore nella lettura dei dati");
		return NULL;
	}
	return biglietto;	
}




int main(int argc,char **argv)	{

//lettura dati

	struct cinema *biglietto;
	biglietto = leggi_biglietto(argv[1]);


//fine

	libera_memoria(biglietto);
}
funziona
potrei migliorarlo in qualche modo ?
wickedwonderland è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
Driver più sicuri: Microsoft alza...
Ego Power+ ha la giusta accoppiata per l...
Scompiglio nei listini Amazon: prezzi im...
Sotto i 105€ il robot Lefant che lava, a...
Mini proiettori smart in offerta: uno co...
Smartwatch Amazfit in offerta: Balance o...
Windows XP ritorna: ecco come usarlo sub...
Arrow Lake in saldo: Intel taglia i prez...
LG C4 da 55'' a 899€ è il top per...
DJI Neo a 159€ è il mini drone pe...
Robot aspirapolvere DREAME D10 Plus Gen ...
A 109€ ha costretto Amazon a nuove scort...
Sbaraglia la concorrenza Intel, questo m...
Giappone all'attacco: ecco il primo wafe...
Cinema in Italia, svolta storica: arriva...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v