Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-03-2011, 13: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, 15: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, 11: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, 12: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 12:27.
  Rispondi citando il messaggio o parte di esso
Old 31-03-2011, 13: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, 13: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, 14: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, 17: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


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Apple apre Music Hall, una sala concerto...
Adobe arriva su Gemini e Claude: nuove f...
Non solo Fideuram: quasi 2 milioni di it...
I lettori CD di fascia alta potrebbero s...
Tutto il meglio di Amazon weekend: 5 nov...
Proscenic P15+ a 113€ su Amazon: scopa e...
TP-Link Wi-Fi 6 a 59,99€ e Tenda 4G03 Pr...
Un quasi top di gamma a 461€: lo smartph...
Roborock Saros 20 Neo e Flow Complete: 3...
Mac mini si trasforma: chip a 2 nanometr...
Su Amazon c'è un super TV Samsung...
La Cina ha rilasciato un satellite dallo...
Il satellite LINK è rientrato nel...
L'ESA risponde alle critiche di Jared Is...
La NASA annuncia il nuovo telescopio spa...
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: 14:15.


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