Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-03-2011, 14:36   #1
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
[C++]Classi e struct da file

Ciao a tutti, sono ancora io XD, ho cominciato un altro esercizio, ma non riesco a procedere nello svolgimento. L'esercizio è il seguente:
Un veterinario deve organizzare, per il suo ambulatorio, l’agenda giornaliera delle visite. Per semplicità si supponga che i clienti di tale ambulatorio siano solo cani e gatti. Si progetti la classe animale e da essa si derivino le classi cane e gatto. La segretaria del veterinario riceve le prenotazioni telefonicamente ed immette da tastiera, su file sequenziale, in apposito record: il nome dell’animale, il tipo, la razza, l’età, la data della visita, il sesso ed il motivo della visita. Alla fine della giornata la segretaria stampa la lista delle prenotazioni ricevute in ordine crescente secondo la data.
Il problema è che io ho sempre avuto a che fare con classi semplici, i cui dati membro erano tipi semplici. Ad esempio creavo la classe Animale e da essa derivavo le classi Cane e Gatto, poi con i costruttori di default e le funzioni set e get creavo istanze delle classi e le stampavo. Ora non riesco a capire come leggere da un file una struct e implementarla con una classe. La funzione leggiDaFile è esterna alla classe? Sono nel panico, qualcuno potrebbe aiutarmi a capire come procedere? Grazie mille.
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2011, 16:26   #2
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
Allora ho fatto la lettura da file dichiarando prima nell'header la struct
Codice:
typedef char stringa[N];
typedef struct{
	stringa data;
	stringa nome;
	stringa tipo;
	stringa razza;
	char sesso;
	int eta;
	stringa motivo;
	}Animale;
typedef Animale Ambulatorio[N];
dopodichè ho implementato le funzioni leggiDaFile e stampa così
Codice:
void leggiDaFile(Ambulatorio a, int &r)
{
	r=0;
	ifstream f;
	f.open("ambulatorio.txt", ios::in);
	if(!f)
	{
		cerr<<"ERRORE\n";
	}
	else
	{
		while(!f.eof())
		{
			f>>a[r].data;
			f>>a[r].nome;
			f>>a[r].tipo;
			f>>a[r].razza;
			f>>a[r].sesso;
			f>>a[r].eta;
			f>>a[r].motivo;
			r++;
		}
	}
	f.close();
}

void stampa(Ambulatorio a, int r)
{
	cout<<"GIORNO\tNOME\tTIPO\tRAZZA\tSESSO\tETA’\tMOTIVO\n";
	for(int i=0;i<r;i++)
    	 cout<<a[i].data<<" "<<a[i].nome<<"  "<<a[i].tipo<<"  "<<a[i].razza<<"  "<<a[i].sesso<<"  "<<a[i].eta<<"  "<<a[i].motivo<<endl;
}
e fin qui funziona ma non ho capito come entrano in gioco le classi... le ho create ma come le collego al discorso dello struct e della lettura da file? Scusate è da poco che studio le classi e vorrei capire bene come usarle. Grazie ancora per l'aiuto.
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 12:57   #3
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
Scusate per il ritardo ma ho avuto problemi di connessione
Cmq in questo periodo ho capito qualcosa in più e ho scritto il programma in modo che con le classi, tramite le funzioni membro, scrivo da tastiera i dati e il programma me li scrive su un file, dopodichè tramite la struct leggo da file i dati e li stampo a video.
Evito di postare tutto il codice poichè è enorme, ma mi rimane ancora una cosa da fare, che sembra la più semplice ma non mi funziona: si tratta di ordinare la stampa secondo il giorno. Allora ad esempio la funzione stampa() della classe Cane l'ho implementata così:
(Ambulatorio è il nome dell'array di record)
Codice:
void Cane::stampa(Ambulatorio v, int &r)
{
	r=0;
	ifstream f;
	f.open("ambulatorio.txt", ios::in);
	if(!f)
	{
		cerr<<"ERRORE\n";
	}
	else
	{
		while(!f.eof())
		{
			f>>v[r].nome;
			f>>v[r].sesso;
			f>>v[r].eta;
			f>>v[r].motivo;
			f>>v[r].data;
			f>>v[r].tipo;
			f>>v[r].razza;
			r++;
		}
	}
	for(int i=0;i<r;i++)
	{
		for(int j=r-1;j>=i+1;j--)
			if(strcmp(v[j-1].data,v[j].data) == 1)
			{
				stringa temp;
				strcpy(temp,v[j].data);
				strcpy(v[j].data,v[j-1].data);
				strcpy(v[j-1].data,temp);
			}
	}
	cout<<"\nGIORNO      NOME    TIPO  RAZZA   SESSO ETA’ MOTIVO\n";
	for(int i=0;i<r;i++)
	{
		cout<<v[i].data<<"  "<<v[i].nome<<"  "<<v[i].tipo<<"  "<<v[i].razza<<"  "<<v[i].sesso<<"     "<<v[i].eta<<"   "<<v[i].motivo<<endl;
	}
	f.close();
}
togliendo quel pezzo di codice che dovrebbe fare l'ordinamento, l'output è
Codice:
GIORNO      NOME    TIPO  RAZZA   SESSO ETA’ MOTIVO
18/06/2002  Romina  Cane  Cocker  F     3   Gravidanza
17/06/2002  Nefert  Gatto  Europeo  F     3   Vaccinazione
invece se metto quel pezzo di codice
Codice:
GIORNO      NOME    TIPO  RAZZA   SESSO ETA’ MOTIVO
  Romina  Cane  Cocker  F     3   Gravidanza
17/06/2002  Nefert  Cane  Europeo  F     5   Vaccinazione
18/06/2002
cioè in un certo senso me li ordina ma mi stravolge la stampa.
Come posso fare? Grazie mille a colo che mi aiuteranno.
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 13:24   #4
pisto
 
Messaggi: n/a
Codice:
if(strcmp(v[j-1].data,v[j].data) == 1)
mettici il >. strcmp ti da un valore maggiore o minore di zero se le due stringhe non sono uguali, non esattamente 1 o -1. Magari alcune implementazioni ti danno solo quei due valori, ma non credo proprio, e poi comunque lo standard è l'altro.
Codice:
{
	stringa temp;
	strcpy(temp,v[j].data);
	strcpy(v[j].data,v[j-1].data);
	strcpy(v[j-1].data,temp);
}
qui stai spostando solo la data, non l'intero oggetto cane/gatto

EDIT:
mi sembra di capire che è un esercizio per la scuola. Se ti è permesso, perché non usi già la classe string e le funzioni di ordinamento che della libreria standard C++?

Ultima modifica di pisto : 31-03-2011 alle 13:27.
  Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 14:35   #5
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
Grazie per aver risposto
Allora ho capito il fatto della sostituzione di > al posto di == infatti sono andato a rivedere lo standard.
Credo di aver capito anche l'errore nell'algoritmo; allora se ho dichiarato nell'header:
Codice:
typedef char stringa[N];
typedef struct{
	stringa nome;
	char sesso;
	int eta;
	stringa motivo;
	stringa data;
	stringa tipo;
	stringa razza;
	}record;
typedef record Ambulatorio[N];
allora l'algoritmo dovrebbe essere:
Codice:
for(int i=0;i<r;i++)
{
	for(int j=r-1;j>=i+1;j--)
		if(strcmp(v[j-1].data,v[j].data) > 1)
		{
			record temp;
			strcpy(temp.data,v[j].data);
			strcpy(v[j].data,v[j-1].data);
			strcpy(v[j-1].data,temp.data);
		}
}
va bene così? Purtroppo però non funziona ancora. Help
PS. per quanto riguarda la libreria standard credo di aver fatto qualche accenno ma non so come usarla. Ho visto che c'è la funzione compare() ma non so degli algoritmi di ordinamento. Mi illuminersti? Grazie
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 14:57   #6
pisto
 
Messaggi: n/a
io tutti i miei oggetti del tipo record li metterei in una list (http://www.cplusplus.com/reference/stl/list/) su cui poi chiamerei sort() passandogli un comparatore (http://www.cplusplus.com/reference/stl/list/sort/).

Riguardo alla tua seconda modifica, devi scambiare l'intero oggetto, quello che stai facendo è scambiare la data a due record lasciando tutto il resto della struttura al suo posto!

Secondo me, da te vogliono che tu faccia due classi, una cane e una gatto, ambedue derivate da animale. per come te l'hanno posta sembra inutile, perché non ti dicono alcun attributo specifico di "cane" o "gatto", ma attento ai prof rompiballe...
  Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 15:36   #7
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
Ok, diciamo che per il momento lascio da parte la libreria standard delle stringhe per mancanza di tempo, ma sicuramente la riprenderò in futuro.
Riguardo all'algoritmo che ho scritto non riesco a capire il problema... in realtà anche a me sono sembrati inutili tutti questi passaggi ma suppongo siano a scopo didattico; allora io ho usato le classi (base e derivate) per scrivere in input i dati, successivamente scrivo questi dati su un file. A questo punto tramite un array di record leggo da file tutti i dati ponendoli nei rispettivi campi. Quindi ora ogni animale è un record formato da diversi campi (tipo, nome, sesso, eta, ecc.); non riesco a capire come usare le classi ora... una volta fatto il controllo sulla data, dichiaro una variabile temp di tipo record (il nome della struct) e poi faccio gli scambi... di sicuro l'errore sarà in questi scambi ma non riesco a capire qual è. Grazie per l'aiuto che mi stai offrendo
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 18:45   #8
pisto
 
Messaggi: n/a
Codice:
for(int i=0;i<r;i++)
{
	for(int j=r-1;j>=i+1;j--)
		if(strcmp(v[j-1].data,v[j].data) > 1)
		{
			record temp=v[j];
			v[j]=v[j-1];
			v[j-1]=temp;
		}
}
secondo me questo è giusto, perché sposta l'intero oggetto record. tu prima stavi spostando solo la data. se poi non funziona ancora passami il codice intero.

quello che penso che ti rimprovereranno è riguardo a questa direttiva che ti hanno dato:
Quote:
Si progetti la classe animale e da essa si derivino le classi cane e gatto.
qui tu non l'hai fatto, hai fatto un struct record, il che anche a mio parere è sufficiente, ma stando a quello che ti hanno detto non è quello che vogliono.
Probabilmente loro vogliono una classe Animale, che ha come fields nome, sesso, eta, motivo, data; il costruttore dovrebbe prendere questi argomenti. Poi vorranno che crei due classi derivate, una Gatto e una Cane: quindi il tipo di animale è implicito. Non ti hanno deto di mettere altri fields che caratterizzino meglio Gatto e Cane, quindi sono due classi un po' inutili, ma vabeh.
Quindi, la tua lista invece che di oggetti tipo record sarà di oggetti tipo Animale. È opportuno che definisci un metodo tipo getType() (virtuale, implementato nelle classi Gatto e Cane) nella tua classe Animale che ti restituisca il tipo del tuo animale (sotto forma di stringa, tipo "gatto" o "cane"), e magari anche un metodo simile che ti dia la razza.

Tutto questo è fondamentalmente inutile, ma forse è questo che vogliono, se la mia interpretazione della tua frase è giusta, sono anche poco abituato a problemi del genere perché la programmazione io l'ho imparata da autodidatta, e non ho mai dovuto risolvere questo tipo di esercizi
  Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Al centro della Via Lattea ci potrebbe e...
Elon Musk ora guarda alla Luna: SpaceX p...
La Cina ha lanciato nuovamente lo spazio...
Blue Origin potrebbe realizzare il lande...
Artemis II: il prossimo Wet Dress Rehear...
Il nuovo HONOR 600 sta arrivando e avr&a...
La crisi delle memorie non coinvolger&ag...
Windows domina su Steam, ma molti utenti...
Per non incorrere in nuovi aumenti delle...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
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: 03:18.


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