Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-05-2005, 17: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 20: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, 20: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, 20: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, 10: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, 13: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


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 ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
NVIDIA porta l'AI nello spazio: presenta...
NVIDIA Vera: la CPU per l'AI agentica pr...
Dell rinnova la sua gamma di workstation...
NVIDIA DLSS 5 arriverà in autunno...
Intel Xeon 6 con P-core è la CPU ...
Telepass e TIM: la mobilità integ...
Deep Tech Revolution: le cinque startup ...
Leapmotor, sostenuta da Stellantis, ragg...
Isar Aerospace e Astroscale stringono un...
Donut Lab, test di ricarica con Verge TS...
Polestar, arriva un nuovo finanziamento ...
Friggitrice ad aria, tutto quello che de...
BYD lancia la nuova campagna per il bran...
Samsung Galaxy Book4 in offerta: portati...
HONOR MagicPad 4: più sottile, pi...
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: 00:51.


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