Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-09-2005, 21:02   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Nuovo problema

Ciao a tutti! Scusate se sto tempestando il forum, ma siccome domani ho l'esame sto cercando di fare il maggior numero di esercizi possibili

Allora adesso ho da fare questo....

Progettare un programma C che legge in preordine
da stdin un albero generico (cioe' non necessariamente binario)
etichettato con interi sui nodi e ritorna la somma dei valori
delle etichette x dell'albero che soddisfano
le seguenti condizioni:
1. x e' dispari;
2. il padre di x e' pari.

Il programma restituisce 0 se non ci sono nodi che soddisfano
le condizioni di cui sopra.

L'input da dare è di questo tipo:

(La prima colonna indica il numero di figli che ha il corrispondente nodo e la seconda colonna indica il nodo stesso)

3 122
1 457
0 698
0 23
2 724
1 456
0 678
2 346
0 777
0 998

Non capisco bene cosa vuol dire "il padre di x è pari". Ma x è un elemento non è un nodo .


Io cmq ho provato a fare un codice del genere:

Codice:
#include <stdio.h>
#include <malloc.h>

struct nodo{
       int val;
       struct nodo *left;
       struct nodo *right;
};

typedef struct nodo NODO;
typedef NODO *TREE;

TREE ReadTree(){
     
     TREE t=(TREE)malloc(sizeof(TREE));
     int nFigli, nVal, i;
     scanf("%d %d", &nFigli, &nVal);
     t->val=nVal;
     t->left=NULL;
     t->right=NULL;
     for(i=0; i<nFigli; ++i){
        t->left=ReadTree();
        t->right=ReadTree();
     }
     return t;
}

int evaluateSum(TREE t){
     
     int sum=0;
     
     if(t==NULL)
        return sum;
     else
        if((t->val)%2!=0)
           sum+=t->val;
        return sum+evaluateSum(t->left)+evaluateSum(t->right);
     
}

int main(void){
    TREE albero=(TREE)malloc(sizeof(NODO));
    albero=ReadTree();
    printf("Sum:  %d", evaluateSum(albero));
    return 0;
}
Quando lo faccio partire però si blocca. Forse ho gestito male la parte relativa a quanti figli ha un nodo... boh. Voi che ne dite? Grazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 11:19   #2
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ho modificato un po' il codice però la somma non mi viene esattamente come dovrebbe (dovrebbe venire 2157 invece viene 122). COsa posso fare?

Codice:
#include <stdio.h>
#include <malloc.h>

struct nodo{
       int val;
       struct nodo *figlio;
};

typedef struct nodo NODO;
typedef NODO *TREE;

TREE ReadTree(){
     
     TREE t=(TREE)malloc(sizeof(TREE));
     int nFigli, nVal, i;
     scanf("%d %d", &nFigli, &nVal);
     t->val=nVal;
     t->figlio=NULL;
     if(nFigli-- >0)
     t->figlio=ReadTree();
        
     return t;
}

int evaluateSum(TREE t){
     
     int sum=0;
     
     if(t==NULL)
        return sum;
     else if((t->val)%2==0){
           sum+=t->val;
        return sum+evaluateSum(t->figlio);
     }
     else
        return 0;
}

int main(void){
    TREE albero=(TREE)malloc(sizeof(NODO));
    albero=ReadTree();
    printf("Sum:  %d", evaluateSum(albero));
    return 0;
}
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 12:09   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
l'albero non deve essere binario, quindi la struct io la reimplementerei così:
Codice:
typedef struct _NODE {
	int nValue;
	struct _NODE *pChild, *pNext;
} NODE, *TREE;
pChild è il puntatore al primo figlio, e pNext al "fratello", perciò ogni nodo è come se avesse in pChild la testa di una lista a puntatori semplici dei suoi figli.

poi la ReadTree se non erro dovrebbe diventare così:
Codice:
TREE ReadTree() {
	TREE t = (TREE)malloc(sizeof(NODE)),
		**ppCur = &t->pChild;
	int nChildren = 0;
	scanf("%d %d", &nChildren, &t->nValue);
	t->pChild = NULL;
	t->pNext = NULL;
	while (nChildren) {
		*ppCur = ReadTree();
		ppCur = &(*ppCur)->pNext;
		nChildren--;
	}
	return t;
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 19:38   #4
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ciao e grazie della risposta. Non capisco bene quando dici:

Quote:

perciò ogni nodo è come se avesse in pChild la testa di una lista a puntatori semplici dei suoi figli.
Che intendi dire?

Ho provato comunque il tuo codice ma non va lo stesso, cioè quando lo faccio partire si blocca.

Ultima modifica di Manugal : 30-09-2005 alle 20:06.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 20:08   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
be', un albero n-ario ha n figli; come fai a rappresentarli? in ciascun nodo potresti o metterci un array, ma sarebbe difficile perché dovresti gestirlo dinamicamente, oppure, soluzione migliore, una lista (le avete fatte le liste?); io ci ho messo una lista: il puntatore pChild punta alla testa della lista e pNext punta all'elemento successivo. per esempio:
Codice:
1
|
2-----3-----4
|     |
5--6  7--8
   |
   9
il nodo 1 ha tre figli (2, 3 e 4), 2 ha due figli (5 e 6), 3 ne ha altri due (7 e 8) e il 6 ne ha uno (9).
ogni sbarretta verticale corrisponde concettualmente a un puntatore pChild, mentre le sbarrette orizzontali corrispondono a pNext.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 20:58   #6
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Si si le liste le abbiamo fatte, solamente non riesco a spiegarmi perché usare un puntatore a puntatore. Cioè pChild è già un puntatore di suo (un puntatore a struttura), quindi se io devo rappresentare ad esempio 3 filgi su un nodo, non potrei usare p->pChild normalmente dicendogli che finché il numero di figli è maggiore di zero deve richiamare ricorsivamente ReadTree() su p->pChild? E poi i fratelli come li gestisco? Al solito con la ricorsione?
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 21:24   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Manugal
Si si le liste le abbiamo fatte, solamente non riesco a spiegarmi perché usare un puntatore a puntatore. Cioè pChild è già un puntatore di suo (un puntatore a struttura), quindi se io devo rappresentare ad esempio 3 filgi su un nodo, non potrei usare p->pChild normalmente dicendogli che finché il numero di figli è maggiore di zero deve richiamare ricorsivamente ReadTree() su p->pChild?
così memorizzi solo l'ultimo figlio in pChild: dopo che avrai fatto ReadTree avrai sovrascritto pChild e ti sarà rimasto memorizzato solo l'ultimo figlio che hai letto...

Quote:
E poi i fratelli come li gestisco? Al solito con la ricorsione?
be' si, alla fine quel coso se lo giri di 45 gradi in senso orario diventa un albero binario
per effettuare la ricorsione su un albero N-ario devi fare più o meno così:
Codice:
void Ricorsione(TREE t) {
	if (!t) {
		return;
	}
	DoSomething(t->nValue);
	Ricorsione(t->pChild);
	Ricorsione(t->pNext);
}
è praticamente uguale a un albero binario
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2005, 21:45   #8
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ok ho capito. Allora questa istruzione all'interno del while a cosa serve?

Codice:
ppCur = &(*ppCur)->pNext;
Per gestire la parte next non posso fare semplicemente p->pNext=ReadTree()? Oppure anche qui andrei a sovrascrivere il vecchio valore? Perché se così fosse, allora anche con gli esercizi precedenti sugli alberi binari che avevo postato qui andavo a sovrascrivere il valore precedente (perché mettevo t->pLeft=ReadTree() e t->pRight=ReadTree() ). Perché in quel caso non la sovrascrive? Suppongo che sia per il fatto della ricorsione .... allora perché qua visto che uso la ricorsione lo dovrebbe sovrascrivere? Spero di essermi spiegato. Cmq grazie sei molto gentile a spiegarmi queste cose..... Sei del secondo anno tu?
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 00:10   #9
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
typedef struct nodo {
        int dato;
        struct nodo** next;
} Nodo;

Nodo *readTree(FILE *f)
{
        int valore, figli;
        Nodo *n = malloc(sizeof(Nodo));

        fscanf(f, "%d %d", &figli, &valore);
        n->dato = valore;
        if (figli > 0) {
                int i;
                n->next = malloc((figli+1) * sizeof(Nodo *));
                for (i = 0; i < figli; ++i){
                        n->next[i] = readTree(f);
                }
                n->next[i] = NULL;
        } else
                n->next = NULL;

        return n;
}

int valutaSomma(Nodo *n)
{
        int risultato = 0;

        if (n == NULL)
                return 0;
        if (n->dato % 2 != 0)
                risultato = n->dato;
        else if (n->next != NULL) {
                Nodo **p;
                for (p = n->next; *p; ++p)
                        risultato += valutaSomma(*p);
        }
        return risultato;
}
Ho messo i dati in un file. A me il risultato viene 1257, comunque.

Ultima modifica di Qu@ker : 01-10-2005 alle 09:56.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 11:55   #10
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Come mai hai usato un array di puntatori? E i figli come fai a gestirli se hai solamente next nella struct (anzi più che i figli i fratelli)? Potresti commentarmi il codice? Grazie.

Ultima modifica di Manugal : 01-10-2005 alle 11:58.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 12:50   #11
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
I 'fratelli' (o meglio, i loro puntatori) stanno tutti nello stesso array.

Il codice? Mah ...e' autoesplicativo!

Ultima modifica di Qu@ker : 01-10-2005 alle 12:54.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 13:10   #12
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
In effetti si riguardandolo bene. Quindi i figli sarebbero proprio l'array, giusto?

Ma come mai quando hai fatto if(Figli>0), hai allocato un nuovo nodo con figli+1?

Poi il testo dice anche di controllare che x sia dispari e che il padre di x sia pari. Ma non riesco a capire cosa intende dire... cioè x è un elemento da come si può dedurre dal testo, non un nodo.

Ultima modifica di Manugal : 01-10-2005 alle 13:19.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 14:01   #13
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Perche' utilizzo un elemento dell'array per segnalare che non ci sono piu' figli, inserendoci NULL (alle volte questo elemento viene definito 'sentinella').
L'alternativa era di inserire nella struct un campo contenente il numero dei figli.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 15:40   #14
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ok grazie credo di aver capito
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 16:05   #15
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Scusa ancora.... sto provando il tuo programma però quando lo faccio partire non stampa niente (uso Dev-C++ e quando c'è qualche problema non mi da nessun messaggio quindi non so dirti da cosa dipenda). Ti posto il main:

Codice:
int main(void){
    Nodo *t=malloc(sizeof(Nodo));
    FILE *ifp;
    ifp=fopen("input3.txt", "r");
    t=readTree(ifp);
    valutaSomma(t);
    fclose(ifp);
    return 0;
}
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 16:46   #16
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
int main(void)
{
        Nodo *radice;
        FILE *in = fopen("dati.txt", "r");
        if (in == NULL) {
                perror("fopen()");
                exit(1);
        }
        radice = readTree(in);
        fclose(in);
        printf("Il risultato e\': %d\n", valutaSomma(radice));
        return 0;
}
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2005, 18:33   #17
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Hai ragione ho scordato la printf Graazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
I satelliti spia russi Kosmos 2613 e Kos...
GTA VI: online la nuova mega galleria co...
Edits, l'app di Instagram, sbarca gratis...
Claude Code: il bug che ha spedito l'ema...
Perplexity lancia Teammates, gli agenti ...
Niente più datacenter? Gli eletto...
La Cina avrebbe approvato lo sviluppo de...
Epson EF-72 alla prova: Google TV, audio...
AST SpaceMobile annuncia il razzo spazia...
Apple taglia il budget AI dei dipendenti...
Fisco e intelligenza artificiale, come c...
Synology BC510 e CC410W, la videosorvegl...
600.000 chip NVIDIA fermi a Hong Kong: l...
La Cina punta tutto sull'allunaggio con ...
LG Italia compie 30 anni: gli italiani v...
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: 02:33.


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