Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2009, 14:32   #1
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
[c++]Eliminazione elementi doppi da lista ordinata

salve nn riesco a capire dove sbaglio....
ho bisogno di variare questa parte di programma in modo che la funzione mi cancelli gli elementi nel caso in cui ce ne siano 2 dello stesso nome:
Codice:
void eliminazione()
{
string nome;
persona *p;
persona *prec = NULL;
cout <<"inserire nome da cancellare: ";
cin >> nomec;
if ( pt == null)
{
cout <<"lista vuota!";
return;
}
for (p=pt;p!=NULL && p -> nome !=nomec)
{
prec = pi;
}
if (p==NULL)
{
cout <<"nome non trovato!";
return;
}
if (prec == NULL)
{
pt == p -> succ;
delete p;
}
else 
{
prec -> succ= p -> succ;
delete p;
}
}
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:53   #2
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Se la lista è ordinata in base al contenuto degli elementi è sufficiente confrontare un elemento col successivo e se sono uguali chiamare una funzione che elimina un elemento e ripristina la catena dei puntatori.

Codice:
struct elem {
 int cont;
 elem* next;
}

void elimina(elem*, elem*);

int main(void) {
elem* testa;
elem* temp;

[...] inizializzazioni varie

for(temp = testa; temp->next == NULL; temp = temp->next)
 if(temp->cont == temp->next->cont) elimina(testa, temp->next);

return 1;
}

void elimina(elem* t, elem* e) {
elem* temp;

for(temp = t; temp->next == NULL; temp = temp->next)
if(temp->next == e) {
 temp->next = temp->next->next;
 delete temp->next;
}
}
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:54   #3
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
si ma io vorrei modificare la funzione che ho postato nn me ne serve un'altra
io cerco di partire da quella
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:55   #4
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Leggi bene quella che ti ho postato io e incorpora quanto ci trovi di buono allora...
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 15:56   #5
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
era proprio quello il problema
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:06   #6
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579


Non ci trovi nulla di buono?

Purtroppo il codice da te postato ha parecchi errori di forma e concettuali, non saprei proprio come modificarlo in maniera ortodossa... Per imparare non c'è niente di meglio che guardare del buon codice, capirne i concetti e farli propri.

Una domanda, ma usi C o C++? Perchè se usi C++ è sconsigliato usare NULL per motivi di consistenza dei tipi.

Inoltre in una funzione void è meglio evitare l'uso di return vuote, è un purismo ma in grossi software complessi garantisce solidità.

es.
Codice:
if(a!=0) {
 ...
 return 1;
}
... qualcos'altro alternativo all'if
return 5;
andrebbe cambiato in:

Codice:
if(a!=0) {
...
} else {
... alternativo
}

return x;
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:19   #7
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
uso il dev c++!
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:22   #8
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da Davidino.gbr91 Guarda i messaggi
uso il dev c++!
Ok, quello è l'ambiente ma sviluppi con C o C++?

Per un semplice programma procedurale come la gestione di liste è meglio usare C. Se usi C puoi usare NULL ma devi usare printf e scanf per l'I/O che fanno parte delle librerie C standard.
Se usi C++ devi usare 0 al posto di NULL o un valore specifico che indica il valore neutro per il tipo, e devi usare cout e cin per leggere e scrivere stream dalle periferiche I/O attraverso le librerie standard C++.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:27   #9
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
ah te dici il linguaggio
no no è c++!
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2009, 16:35   #10
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Allora evita l'uso di NULL, è ovvio che al livello di questo programma non cambia niente, ma è una pratica che prima si perde meglio è.
Soprattutto quando poi si sviluppano programmi con una tipizzazione più complessa.

uno può essere tentato di fare questo errore
es.
Codice:
string x;
int y;

x = NULL;
y = NULL;

if(x == y) ???
Codice:
string x;
int y;

x = "";
y = 0;

if(che ci scrivo?) non mi viene nemmeno
E evito pure eventuali problemi di cast e tipizzazione dinamica.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2009, 23:50   #11
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Allora evita l'uso di NULL, è ovvio che al livello di questo programma non cambia niente, ma è una pratica che prima si perde meglio è.
Ma anche no... NULL se usato solo per i puntatori va benissimo, poi ovvio che se uno inizia a usarlo invece dello 0 è sbagliato.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 13:33   #12
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Ma anche no... NULL se usato solo per i puntatori va benissimo, poi ovvio che se uno inizia a usarlo invece dello 0 è sbagliato.
Sbaglio o stiamo dicendo la stessa cosa?
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 15:06   #13
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Sbaglio o stiamo dicendo la stessa cosa?
Cosa c'è di sbagliato nell'uso di NULL nel primo post? E' usato con dei puntatori...
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 18:40   #14
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Cosa c'è di sbagliato nell'uso di NULL nel primo post? E' usato con dei puntatori...
In C va ancora bene ma in C++ il libro di Bjarne Stroustrup recita il fatto che NULL può essere usato su vari tipi (non sto parlando dei puntatori) e in fase di esecuzione (quindi in stato dinamico) se questo è passato ad una funzione e questa ne esegue il cast non sapendo il tipo di partenza possono succedere casini.

Per quanto riguarda i puntatori dedica un paragrafo apposta e un suggerimento alla fine del capitolo 5 del "C++, linguaggio, libreria standard, principi di programmazione":
"la costante zero è un int. Grazie alle conversioni standard, 0 può essere utilizzato come costante di qualsiasi tipo intero, di un tipo virgola mobile, di un tipo puntatore o di un tipo puntatore a membro. Il tipo della costante 0 viene determinato dal contesto (io aggiungerei: a differenza di NULL che è una macro del preprocessore e non ha intrinsecamente legato un tipo particolare in fase di esecuzione, mentre 0 si porta dietro il suo "contesto"). Lo zero viene rappresentato da una serie di bit nulli della misura appropriata.
Nessun oggetto viene allocato con l'indirizzo 0. Perciò 0 può essere usato anche come una costante puntatore, a indicare il fatto che il puntatore non si riferisce ad alcun oggetto (io aggiungo: ma a differenza di NULL ne viene determinato il tipo in fase di parsing, evitando errori subdoli). A causa del controllo stringente del C++ sui tipi, l'uso di zero puro può comportare meno problemi."

Ultima modifica di _Claudio : 21-04-2009 alle 19:43.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 19:45   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
In C va ancora bene ma in C++ il libro di Bjarne Stroustrup recita il fatto che NULL può essere usato su vari tipi (non sto parlando dei puntatori) e in fase di esecuzione (quindi in stato dinamico) se questo è passato ad una funzione e questa ne esegue il cast non sapendo il tipo di partenza possono succedere casini.

Per quanto riguarda i puntatori dedica un paragrafo apposta e un suggerimento alla fine del capitolo 5 del "C++, linguaggio, libreria standard, principi di programmazione":
"la costante zero è un int. Grazie alle conversioni standard, 0 può essere utilizzato come costante di qualsiasi tipo intero, di un tipo virgola mobile, di un tipo puntatore o di un tipo puntatore a membro. Il tipo della costante 0 viene determinato dal contesto (io aggiungerei: a differenza di NULL che è una macro del preprocessore e non ha intrinsecamente legato un tipo particolare in fase di esecuzione, mentre 0 si porta dietro il suo contesto e certi cast sono vietati). Lo zero viene rappresentato da una serie di bit nulli della misura appropriata.
Nessun oggetto viene allocato con l'indirizzo 0. Perciò 0 può essere usato anche come una costante puntatore, a indicare il fatto che il puntatore non si riferisce ad alcun oggetto (io aggiungo: ma a differenza di NULL ne viene determinato il tipo in fase di parsing, evitando errori subdoli). A causa del controllo stringente del C++ sui tipi, l'uso di zero puro può comportare meno problemi."
Non sono ancora del tutto convinto che usare uno 0 sia una tecnica migliore... NULL è un ((void*)0), quindi non capisco cosa ci sia di male nell'usarlo con la testa. È sicuramente più chiaro che inizializzare tutte le variabili a 0 e poi non sapere più se era un intero o un puntatore, a metà del codice. La leggibilità viene prima di tutto, IMHO.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 20:22   #16
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Non sono ancora del tutto convinto che usare uno 0 sia una tecnica migliore... NULL è un ((void*)0), quindi non capisco cosa ci sia di male nell'usarlo con la testa. È sicuramente più chiaro che inizializzare tutte le variabili a 0 e poi non sapere più se era un intero o un puntatore, a metà del codice. La leggibilità viene prima di tutto, IMHO.
E cosa cambia dall'inizializzare tutto con 0 o con NULL come leggibilità?
La differenza fondamentale è che 0 non è una macro del preprocessore.
Inoltre cosa è NULL varia da macchina a macchina, normalmente equivale (coattivamente per standard) a 0 (o (void*)0)) ma non è detto.
Poi se si usa con la testa NULL allora tutto è possibile, anche la giustizia nel mondo
Poi se lo dice chi ha inventato il C++... nel caso ancora non vogliate credermi... fare un atto di fede come tributo non sarebbe male...
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 20:29   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
E cosa cambia dall'inizializzare tutto con 0 o con NULL come leggibilità?
Che evidenzi subito il tipo, assegnando zero ad una variabile o confrontandola non puoi dire che tipo di "numero" sarebbe (int, float, puntatore, etc).
Quote:
Inoltre cosa è NULL varia da macchina a macchina
Hmm, questa me la devi spiegare, o è una macro del preprocessore o è legata ad un'architettura hardware.
Quote:
Poi se lo dice chi ha inventato il C++... nel caso ancora non vogliate credermi... fare un atto di fede come tributo non sarebbe male...
Che significa, anche Aristotele aveva detto che la terra è al centro dell'universo, e per 2000 anni tutti hanno fatto di sì con la testa perché "ipse dixit".
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 22:32   #18
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Che evidenzi subito il tipo, assegnando zero ad una variabile o confrontandola non puoi dire che tipo di "numero" sarebbe (int, float, puntatore, etc).
E assegnandogli NULL?

Quote:
Hmm, questa me la devi spiegare, o è una macro del preprocessore o è legata ad un'architettura hardware.
Il preprocessore fa parte del compilatore e il compilatore spesso è fatto ad hoc per l'hardware... o sbaglio? O per lo meno le librerie che definiscono l'ambiente cambiano e con esse il valore della macro #define NULL. Cioè posso sempre programmare usando gcc ma specifico che sto programmando codice per dispositivi embedded e uso librerie particolari.

Quote:
Che significa, anche Aristotele aveva detto che la terra è al centro dell'universo, e per 2000 anni tutti hanno fatto di sì con la testa perché "ipse dixit".
Sono due cose ben diverse, del moto dei pianeti all'epoca di Aristotele nulla si sapeva, il C++ è stato creato da Bjarne quindi suppongo che lui conosca ogni singolo dettaglio meglio di chiunque altro.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 02:04   #19
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
E assegnandogli NULL?
Espliciti che fai riferimento ad un puntatore.
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Il preprocessore fa parte del compilatore e il compilatore spesso è fatto ad hoc per l'hardware... o sbaglio? O per lo meno le librerie che definiscono l'ambiente cambiano e con esse il valore della macro #define NULL. Cioè posso sempre programmare usando gcc ma specifico che sto programmando codice per dispositivi embedded e uso librerie particolari.
Come vuoi, ma il discorso non cambia... Ad esempio MSVC++ 8 definisce così il NULL:
Codice:
       /* Define NULL pointer value */
       #ifndef NULL
       #ifdef __cplusplus
       #define NULL    0
       #else
       #define NULL    ((void *)0)
       #endif
       #endif
Quindi semplicemente non vedo il problema pratico.
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Sono due cose ben diverse, del moto dei pianeti all'epoca di Aristotele nulla si sapeva, il C++ è stato creato da Bjarne quindi suppongo che lui conosca ogni singolo dettaglio meglio di chiunque altro.
Era un esempio, non accetto che mi si venga detto di ricevere le cose per "atto di fede", neanche se fosse Bjarne in persona a dirmele.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 11:54   #20
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Espliciti che fai riferimento ad un puntatore.
A livello di scrittura del codice... ma se uno scrive codice sapientemente si ricorda che quella variabile è un puntatore.
E personalmente do maggior priorità alla correttezza del codice scritto rispetto la sua chiarezza... mi sembra sacrosanto.

Quote:
Come vuoi, ma il discorso non cambia... Ad esempio MSVC++ 8 definisce così il NULL:
Codice:
       /* Define NULL pointer value */
       #ifndef NULL
       #ifdef __cplusplus
       #define NULL    0
       #else
       #define NULL    ((void *)0)
       #endif
       #endif
Quindi semplicemente non vedo il problema pratico.
msvc è un compilatore potente per sistemi mediamente potenti (normalmente pc). Come ti ho già scritto altri compilatori hanno altre implementazioni, se faccio porting dando per scontato che NULL ha quel valore...

Quote:
Era un esempio, non accetto che mi si venga detto di ricevere le cose per "atto di fede", neanche se fosse Bjarne in persona a dirmele.

ciao
L'ho detto provocatoriamente... ovvio. Ma le motivazioni sono evidenti, al di là che lo dica Bjarne o meno.

Il problema è che se uso C++ personalmente cerco di essere il più aderente possibile al linguaggio e alla sua filosofia (che comprende il non usare il più possibile le direttive del preprocessore) e cerco di scrivere programmi il più corretti possibili mettendo in secondo piano la leggibilità. Poi è un mio punto di vista... spero sia condiviso... ma se non lo è amen, spero di non trovarmi mai a lavorare in futuro con del codice leggibilissimo ma che ha errori subdoli come quello riguardante il NULL su compilatori diversi.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
12 MW e oltre 20.000 pannelli: Stellanti...
Sono bastate solo 5 ore per insegnare a ...
Fastweb + Vodafone e TIM: un accordo per...
Scaleway apre una nuova cloud region a M...
Il PC non dà accesso al disco C:/...
Attenzione alle app IPTV: nascondono Per...
Controller Xbox in offerta su Amazon: co...
vivo X300 Pro 5G a 1.199€ su Amazon: il ...
"Portraits of Italians": la ca...
Roborock Qrevo Curv 2 Pro crolla di prez...
Uber ha trovato il partner per i robotax...
Sony pronta a dire addio al marchio PSN:...
ARCTIC Senza AI 370: il PC 'sotto la scr...
Corsair 3200D, il mid-tower sotto i 100€...
Esiste un SSD NVMe M.2 2280 da 16 TB, ma...
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:33.


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