Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
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


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
CAS Space ha lanciato per la prima volta...
Qualcomm boccia Samsung: i futuri chip S...
Il razzo spaziale cinese Tianlong-3 di S...
Samsung cambia i piani: aumenta la produ...
TSMC non si ferma più: fatturato ...
Xiaomi porta in Italia il nuovo Redmi A7...
Mercato smartphone: Q1 2026 positivo (+1...
YouTube punta sull'AI: gli utenti potran...
Il prossimo chip a 2 nm di Samsung punte...
Due smartphone REDMAGIC sono stati rimos...
La beta della One UI 8.5 è ora di...
Addio al Pannello di Controllo di Window...
Il chip N1 di NVIDIA per i laptop del fu...
YouTube Premium costerà di pi&ugr...
I nuovi Samsung Galaxy A57 5G e A37 5G a...
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: 01:17.


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