Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Roscosmos ha lanciato il satellite meteo...
Starship Troopers: Ultimate Bug Wars, to...
Il razzo spaziale europeo Ariane 6, per ...
Oracle Fusion Cloud Applications si pote...
OHB Italia svilupperà un satellit...
Fortinet: "Ora abbiamo una chance d...
Linux Mint chiude con gli aggiornamenti ...
Compressori portatili auto in sconto su ...
Durante il lancio della missione USSF-87...
Dopo il ritiro di Intel da Magdeburgo, l...
Xiaomi 15T scende a 388€ su Amazon: 12GB...
MSI Afterburner: arriva il monitoraggio ...
Missione cinese Chang'e-6: confermata l'...
Addio esenzione sotto i 150 euro: l'UE i...
Allarme riavvii su Windows 11 dopo il ri...
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: 05:39.


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