Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-05-2005, 16:31   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
[C] è decente come soluzione?!?!

Ciao....altro esercizio per l'esame di programmazione 1...questa volta non ho guardato la soluzione del proff e l'ho risolto a modo mio (diverso da come l'ha fatto lui...) dite che può andare?è decente come soluzione o fà schifo?

L'esercizio dice:

Scrivere una funzione con prototipo int *extract(List *pL, int *nE) che elimini dalla lista *pL gli elementi x per i quali esiste un elemento successivo y tale y.cod > x.cod, alloca dinamicamente un vettore che contiene i valori dei campi cod degli elementi eliminati, restituisce in *pL il puntatore al primo elemento della lista modificata, in *nE il numero degli elementi eliminati e ritorna il vettore.

Se non ci sono elementi eliminati la funzione ritorna NULL. Si assume che i valori dei campi cod siano tutti distinti

Esempio: se la lista è 5->12->7->10->9 viene modificata in: 5->7->9, il vettore creato è [12, 10] e in *nE è restituito 2.

Mia Soluzione:

Codice:
/* La funzione extract() riceve il puntatore al primo nodo della lista e il
   puntatore alla variabile nE dove andare ad inserire il numero degli elementi
   eliminati e ritorna l'indirizzo del vettore di interi */

#include <stdio.h>
#include <stdlib.h>
   
typedef struct Elem{
    int cod;
    struct Elem *next;
} Elem, *List;    

int *extract(List *pL, int *nE){
    
    List L;         // Dichiaro il puntatore al nodo corrente
    List succ;      // Dichiaro il puntatore al nodo successivo
    int dimvet;    // Numero di elementi che compongono il vettore
    int *vett=NULL;     // Puntatore alla prima locazione del vettore di interi
    int val1;     // Contiene il valore del campo cod del nodo puntato da L
    int val2;     // Contiene il valore del campo cod del nodo puntato da suc
    int contatore = 0;    // Indice di scorrimento del vettore
    
    L = pL;           // Setta L al primo nodo della lista
    succ = L->next;    // Setta suc al nodo successivo ad L
    
    /* Ciclo che calcola quanti elementi vanno eliminati dalla lista e quante
       locazioni dovranno essere allocate per il vettore di interi vet */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){       // Se la funzione Less restituisce 1
                dimvet++;                // incrementa dimvet
        }
        
        L = L->next;    // Aggiorna L e fallo puntare al prossimo nodo
        succ = succ->next; // Aggiorna succ e fallo puntare al prossimo nodo
        *nE = dimvet;
    }
    
    vett = calloc(dimvet, sizeof(int)); // Alloca un vettore di dimevet interi
    
    L = pL;    // Reimposta nuovamente il puntatore L al primo nodo della lista
    succ = L->next;    // Reimposta suc al nodo successivo a L
    
    /* Ciclo che salva i valori da eliminare nel vettore ed elimina i nodi */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){    // Se la funzione Less restituisce 1
                
                /* Imposta il valore del campo next puntato da L con il valore
                   del campo next del nodo puntato da succ */
                L->next = succ->next;
                
                /* Copia il valore del campo cod del nodo puntato da suc nel
                   vettore di interi alla posizione indicizzata da contatore */
                vett[contatore] = succ->cod;
                
                contatore++;    // Incrementa il contatore
                
                free(succ);    // Elimina il nodo puntato da succ 
        }
        
       L = pL;    // Reimposta nuovamente il puntatore L al primo nodo
       succ = L->next;    // Reimposta suc al nodo successivo a L
   }
   
   return(vett);       // Ritorna il puntatore alla prima locazione del vettore
}

/* La funzione Less() riceve il valore del campo cod del nodo corrente e il
   valore del campo cod del nodo successivo, se il valore corrente < del valore
   successivo restituisce 1, 0 altrimenti */
   
short Less(int val, int valsucc){
    
    if(valsucc > val)
          return 1;
    else
      return 0;
}
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:04   #2
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
la soluzione non l'ho ancora guardata però mi chiedevo...sono questi gli esercizi che fanno fare all'uni sono esattamente come quelli che si fanno alle superiori, immaginavo qualche programma più impegnativo
ps ora do una occhiata al programma
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:06   #3
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da D4rkAng3l
Ciao....altro esercizio per l'esame di programmazione 1...questa volta non ho guardato la soluzione del proff e l'ho risolto a modo mio (diverso da come l'ha fatto lui...) dite che può andare?è decente come soluzione o fà schifo?

L'esercizio dice:

Scrivere una funzione con prototipo int *extract(List *pL, int *nE) che elimini dalla lista *pL gli elementi x per i quali esiste un elemento successivo y tale y.cod > x.cod, alloca dinamicamente un vettore che contiene i valori dei campi cod degli elementi eliminati, restituisce in *pL il puntatore al primo elemento della lista modificata, in *nE il numero degli elementi eliminati e ritorna il vettore.

Se non ci sono elementi eliminati la funzione ritorna NULL. Si assume che i valori dei campi cod siano tutti distinti

Esempio: se la lista è 5->12->7->10->9 viene modificata in: 5->7->9, il vettore creato è [12, 10] e in *nE è restituito 2.

Mia Soluzione:

Codice:
/* La funzione extract() riceve il puntatore al primo nodo della lista e il
   puntatore alla variabile nE dove andare ad inserire il numero degli elementi
   eliminati e ritorna l'indirizzo del vettore di interi */

#include <stdio.h>
#include <stdlib.h>
   
typedef struct Elem{
    int cod;
    struct Elem *next;
} Elem, *List;    

int *extract(List *pL, int *nE){
    
    List L;         // Dichiaro il puntatore al nodo corrente
    List succ;      // Dichiaro il puntatore al nodo successivo
    int dimvet;    // Numero di elementi che compongono il vettore
    int *vett=NULL;     // Puntatore alla prima locazione del vettore di interi
    int val1;     // Contiene il valore del campo cod del nodo puntato da L
    int val2;     // Contiene il valore del campo cod del nodo puntato da suc
    int contatore = 0;    // Indice di scorrimento del vettore
    
    L = pL;           // Setta L al primo nodo della lista
    succ = L->next;    // Setta suc al nodo successivo ad L
    
    /* Ciclo che calcola quanti elementi vanno eliminati dalla lista e quante
       locazioni dovranno essere allocate per il vettore di interi vet */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){       // Se la funzione Less restituisce 1
                dimvet++;                // incrementa dimvet
        }
        
        L = L->next;    // Aggiorna L e fallo puntare al prossimo nodo
        succ = succ->next; // Aggiorna succ e fallo puntare al prossimo nodo
        *nE = dimvet;
    }
    
    vett = calloc(dimvet, sizeof(int)); // Alloca un vettore di dimevet interi
    
    L = pL;    // Reimposta nuovamente il puntatore L al primo nodo della lista
    succ = L->next;    // Reimposta suc al nodo successivo a L
    
    /* Ciclo che salva i valori da eliminare nel vettore ed elimina i nodi */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){    // Se la funzione Less restituisce 1
                
                /* Imposta il valore del campo next puntato da L con il valore
                   del campo next del nodo puntato da succ */
                L->next = succ->next;
                
                /* Copia il valore del campo cod del nodo puntato da suc nel
                   vettore di interi alla posizione indicizzata da contatore */
                vett[contatore] = succ->cod;
                
                contatore++;    // Incrementa il contatore
                
                free(succ);    // Elimina il nodo puntato da succ 
        }
        
       L = pL;    // Reimposta nuovamente il puntatore L al primo nodo
       succ = L->next;    // Reimposta suc al nodo successivo a L
   }
   
   return(vett);       // Ritorna il puntatore alla prima locazione del vettore
}

/* La funzione Less() riceve il valore del campo cod del nodo corrente e il
   valore del campo cod del nodo successivo, se il valore corrente < del valore
   successivo restituisce 1, 0 altrimenti */
   
short Less(int val, int valsucc){
    
    if(valsucc > val)
          return 1;
    else
      return 0;
}
scusa ma usi il tipo List che non hai mai definito, e poi la soluzione mi sembra un po' un accrocchio è piuttosto contorta
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:14   #4
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
non ho ancora letto il codice, ma ti faccio notare che l'esempio è sbagliato: in teoria dovresti eliminare gli x che hanno un successore y strettamente maggiore, quindi se hai

5->12->7->10->9

la lista originale deve diventare

12->10->9

perché vanno eliminati il 5 e il 7. l'esempio della traccia l'ha scritta sempre il solito prof., vero? si riconosce lo stile...

PS x sirus: be', lui è solo al primo anno e quindi è ancora tutto molto semplice, ma concordo con te che cmq all'università si dovrebbe fare molto di più... e penso anche che bisognerebbe piantarla con questa stupida moda di Linux immotivata (o motivata solo da ragioni economiche peraltro nemmeno tanto valide): casomai se proprio proprio, bisognerebbe essere "equi" e dare un'istruzione sia in ambito Linux che in ambito Windows.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:15   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da sirus
scusa ma usi il tipo List che non hai mai definito [...]
si che l'ha definito
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:18   #6
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da 71104
si che l'ha definito
e dove???
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:20   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da sirus
e dove???
all'undicesima riga
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:23   #8
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da 71104
all'undicesima riga
a già... c'è il typedef davanti, non avevo visto chiedo venia
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:26   #9
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
imho sarebbe meglio evitare i due cicli e fare tutto in uno ogni volta (se necessario) estendi l'array e via...
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:49   #10
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
mmm me ne sono accorto...che dire...quello è un altro errore del proff !!! aveva scitto male le specifiche cmq la lista deve essere come quella dell'esempio...e mi pare che il mio lo faccia...

io avevo pensato di usare la realloc per riallocare lo spazio dell'array di volta in volta che si aggiungeva un elemento...si può fare?

Grazie cmq :-)
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 18:58   #11
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da D4rkAng3l
mmm me ne sono accorto...che dire...quello è un altro errore del proff !!! aveva scitto male le specifiche cmq la lista deve essere come quella dell'esempio...e mi pare che il mio lo faccia...

io avevo pensato di usare la realloc per riallocare lo spazio dell'array di volta in volta che si aggiungeva un elemento...si può fare?

Grazie cmq :-)
si...
e poi non dichiarare così tante variabili...usa una sintassi più stringata è più bello tipo
Codice:
...
val1 = L->cod;
val2 = succ->cod;

if(Less(val1, val2) == 1){       // Se la funzione Less restituisce 1
                dimvet++;                // incrementa dimvet
}
...
lo cambi in
Codice:
if(!Less(L->cod,succ->cod))
    dimvet++;
è più C
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 19:07   #12
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
evitiamo tanti giri di parole: non è che è più C, semplicemente è più facile, più leggibile e quindi più manutenibile
non è colpa nostra se quel sedicente professore non spiega agli alunni che tra parentesi nelle chiamate di funzioni ci stanno espressioni, non variabili.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 19:08   #13
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da 71104
evitiamo tanti giri di parole: non è che è più C, semplicemente è più facile, più leggibile e quindi più manutenibile
non è colpa nostra se quel sedicente professore non spiega agli alunni che tra parentesi nelle chiamate di funzioni ci stanno espressioni, non variabili.
è anche più bello, lo stile è importante come una buona indentazione
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2005, 19:21   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da sirus
è anche più bello, lo stile è importante come una buona indentazione
così stai parlando di leggibilità
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2005, 09:12   #15
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da 71104
così stai parlando di leggibilità
già...ogni tanto vedo i programmi dei miei compagni (quando mi chiedono di aiutarli) e la prima cosa che faccio è indentarli e magari cambiare qualche cosetta tipo quella che ho detto prima... altrimenti è una cosa impossibile...
riescono ad indentare male anche con visual c++ che fa tutto lui
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2005, 12:20   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da sirus
già...ogni tanto vedo i programmi dei miei compagni (quando mi chiedono di aiutarli) e la prima cosa che faccio è indentarli e magari cambiare qualche cosetta tipo quella che ho detto prima... altrimenti è una cosa impossibile...
riescono ad indentare male anche con visual c++ che fa tutto lui
LOL in effetti che ne vuole
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
Un attacco informatico può far ma...
AMD Helion, fino a 32.768 core Zen 6 per...
Chiamate con numeri falsi: AGCOM sanzion...
Il radiotelescopio cinese FAST ha scoper...
Certificati TLS più brevi, Let's ...
Milano si candida a sede Onu per la gove...
Dopo Groq e Hugging Face, NVIDIA guarda ...
Thomas Zurbuchen entra in Blue Origin ne...
Qualcomm porta servizi e sicurezza nel g...
Microsoft porta l'inferenza IA sul propr...
Blue Origin aiuterà la NASA nella...
Scoperto pianeta 'ribelle': orbita al co...
smart #2 debutta a Parigi: batteria da 3...
Un certificato in scadenza può la...
BYD ATTO 8, ricarica FLASH dal 10 al 97%...
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: 17:07.


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