View Full Version : [C] Esercizi su strutture e liste
Mi date una mano a capire questi esercizi? E' arabo per me, pensavo di aver capito le strutture e le liste invece questi mi sembrano difficili
http://www.imagestime.com/out.php/i35233_1.JPG (http://www.imagestime.com/show.php/35233_1.JPG)
ESERCIZIO 1
int confronta(struct interoillimitato *m, struct interoillimitato *n)
restituisce 1 se m è minore di n, 0 se sono uguali e -1 se n è minore di m
io procederei così: tanto per cominciare confronta le lunghezze dei due numeri in input, la lunghezza maggiore appartiene al numero maggiore. se le lunghezze sono uguali allora passi a testare le singole cifre dei due numeri con un ciclo partendo dalle più significative verso le meno significative; non appena incontri due cifre diverse sei in grado di determinare il numero maggiore e puoi interrompere il ciclo e ritornare subito, altrimenti se riesci a concludere il ciclo e a verificare l'uguaglianza di tutte le cifre allora i due numeri sono identici. cosa non ti è chiaro?
Non ho capito proprio la prima parte, quell'immagine che ho postato, cioè tutte quelle dichiarazioni ecc..
sei hai tempo mi fai vedere come si inizializza il tutto nel modo piu semplice possibile,cose forse riesco a capire
supponiamo che io debba utilizzare quella roba per memorizzare il numero 24:
struct Number n1, n2;
struct InteroIllimitato i;
n1.value = 4;
n1.next = &n2;
n2.value = 2;
n2.next = NULL;
i.length = 2;
i.firstNumber = &n1;
i.lastNumber = &n2;
me in realtà a te non serve scrivere codice di inizializzazione.
ok, l'inizializzazione l'ho capita ora vedo di capire cosa fa l'esercizio
ma la funzione cosa deve fare?
deve confrontare i numeri memorizzati in n1 e n2 o cosa?
non l'ho capito
sostanzialmente deve confrontare tutte le struct Number contenute nelle liste specificate da n ed m, ma per i dettagli sull'algoritmo vedi post #2.
faccio un altro esempio di inizializzazione, giusto per chiarire che una di quelle liste può contenere anche molto più di due cifre; supponiamo di voler memorizzare il numero 123:
struct Number n1, n2, n3;
struct InteroIllimitato i;
n1.value = 3;
n1.next = &n2;
n2.value = 2;
n2.next = &n3;
n3.value = 1;
n3.next = NULL;
i.length = 3;
i.firstNumber = &n1;
i.lastNumber = &n3;
la struttura InteroIllimitato può descrivere una lista di lunghezza arbitraria, e può quindi contenere dozzine di cifre.
allora, tu hai creato una struttura di tipo number chiamata n1 e una chiamata n2 e in oguna di queste strutture hai inizializzato la variabile value rispettivamente a 4 e 2.
poi hai creato una struttura di tipo interoillimitato chiamata i e hai inizializzato la lunghezza a 2(perchè?) e hai inizializzato i due puntatori, uno a n1 e uno a n2.
Mi puoi spiegare a parole cosa chiede l'esercizio?
ho visto anche la tua seconda inizializzazione, ora mi è tutto chiaro. ma non capisco cosa chiede l'esercizio.
poi hai creato una struttura di tipo interoillimitato chiamata i e hai inizializzato la lunghezza a 2(perchè?) perché mi apprestavo a creare una lista di lunghezza 2, cioè contenente 2 elementi (n1 ed n2). nell'altro esempio invece la lunghezza l'ho impostata a 3 perché ci sono 3 elementi.
Mi puoi spiegare a parole cosa chiede l'esercizio? di confrontare i due numeri n ed m che arrivano in ingresso come parametri. n ed m sono in realtà due struct che descrivono altrettante liste di cifre decimali, quindi n ed m rappresentano dei numeri.
non capisco ancora, non ci riuscirò mai..
quindi devo confrontare due numeri n e m, cioè due liste? come quella che hai creato?
solo che ne devo fare due e confrontarle?
#include <stdio.h>
struct Number{
int value;
struct Number *next;};
struct Interoillimitato{
int lenght;
struct Number *firstnumber;
struct Number *lastnumber;};
int main(){
struct Number n1, n2, n3, n4;
struct Interoillimitato i;
n1.value=4;
n1.next=&n2;
n2.value=3;
n2.next=&n3;
n3.value=2;
n3.next=&n4;
n4.value=1;
n4.next=NULL;
i.lenght=4;
i.firstnumber=&n1;
i.lastnumber=&n4;
Ho scritto questo, cioè ho creato una lista di 4 elementi, 4->3->2->1->NULL
ora che devo fare?
ora che devo fare? scrivi il codice della funzione "confronta" descritta nel testo dell'esercizio 1. comincia col controllo basilare: se un numero ha più cifre di un altro è sicuramente maggiore, no?
scusa la mia ignoranza ma non ho capito proprio cosa deve fare la funziona
cioè io ho una lista di 4 elementi e una struttura dove c'è scritto il numero di elementi che ha la lista e c'è un puntatore al primo e uno all'ultimo numero della lista
ora cosa devo farci con questa lista?
non bisogna creare 2 liste per confrontare 2 numeri?
cioè ho capito come va svolto l'esercizio ma non so su cosa devo lavorare all'interno della funzione e quali sono i due numeri da confrontare. devo confrontare due liste o cosa?
mi serve un aiutino, un input, poi cerco di farlo da solo
guarda la dichiarazione della funzione: ci sono due parametri, m ed n, che rispettivamente puntano a due diverse "struct InteroIllimitato" ciascuna delle quali descrive una diversa lista di cifre decimali. ricevi in input le descrizioni di due liste diverse che corrispondono a due numeri diversi, e tu devi confrontare questi due numeri e ritornare 1 se è minore il primo, 0 se sono uguali e -1 se è maggiore il primo.
penso di aver capito.
domani ci provo
Ho provato a farlo, ditemi tutto quello che ho sbagliato
#include <stdio.h>
int confronta(struct interoillimitato *m, struct interoillimitato *n);
struct Number{
int value;
struct Number *next;};
struct Interoillimitato{
int lenght;
struct Number *firstnumber;
struct Number *lastnumber;};
int main(){
struct Number n1, n2, n3, n4;
struct Number m1, m2, m3, m4;
struct Interoillimitato m;
struct Interoillimitato n;
n1.value=4;
n1.next=&n2;
n2.value=3;
n2.next=&n3;
n3.value=2;
n3.next=&n4;
n4.value=1;
n4.next=NULL;
n.lenght=4;
n.firstnumber=&n1;
n.lastnumber=&n4;
m1.value=3;
m1.next=&m2;
m2.value=7;
m2.next=&m3;
m3.value=2;
m3.next=&m4;
m4.value=6;
m4.next=NULL;
m.lenght=4;
m.firstnumber=&m1;
m.lastnumber=&m4;
printf("%d\n", confronta(Interoillimitato m, Interoillimitato n));
}
int confronta(struct interoillimitato *m, struct interoillimitato *n){
int risultato=0;
if(m.lenght>n.lenght){
risultato=-1;}
if(m.lenght<n.lenght){
risultato=1;} else { for(i=0;i<m.lenght;i++){
if(m.firstnumber>n.firstnumber){
risultato=-1; break;}
if(m.firstnumber<n.firstnumber){
risultato=1; break;} else
{m.firstnumber=m.firstnumber->next;
n.firstnumber=n.firstnumber->next;}}
return risultato;}
LetBloodline
20-08-2007, 09:23
Ho provato a farlo, ditemi tutto quello che ho sbagliato
#include <stdio.h>
int confronta(struct interoillimitato *m, struct interoillimitato *n);
struct Number{
int value;
struct Number *next;};
struct Interoillimitato{
int lenght;
struct Number *firstnumber;
struct Number *lastnumber;};
int main(){
struct Number n1, n2, n3, n4;
struct Number m1, m2, m3, m4;
struct Interoillimitato m;
struct Interoillimitato n;
n1.value=4;
n1.next=&n2;
n2.value=3;
n2.next=&n3;
n3.value=2;
n3.next=&n4;
n4.value=1;
n4.next=NULL;
n.lenght=4;
n.firstnumber=&n1;
n.lastnumber=&n4;
m1.value=3;
m1.next=&m2;
m2.value=7;
m2.next=&m3;
m3.value=2;
m3.next=&m4;
m4.value=6;
m4.next=NULL;
m.lenght=4;
m.firstnumber=&m1;
m.lastnumber=&m4;
printf("%d\n", confronta(Interoillimitato m, Interoillimitato n));
}
int confronta(struct interoillimitato *m, struct interoillimitato *n){
int risultato=0;
if(m.lenght>n.lenght){
risultato=-1;}
if(m.lenght<n.lenght){
risultato=1;} else { for(i=0;i<m.lenght;i++){
if(m.firstnumber>n.firstnumber){
risultato=-1; break;}
if(m.firstnumber<n.firstnumber){
risultato=1; break;} else
{m.firstnumber=m.firstnumber->next;
n.firstnumber=n.firstnumber->next;}}
return risultato;}
tanto per cominciare il return viene eseguito all'interno del ciclo for mentre devi eseguirlo per ultima cosa esterna a tutti i cicli e a tutti gli if. Devi chiudere ancora una parentesi grafa prima del return
ma la sintassi è corretta all'interno delle funzione?
cioè ho passato per bene le strutture e liste alla funzione oppure in quello che ho scritto ci sono tanti errori?
puoi effettuare le correzioni tu cosi capisco bene dove ho sbagliato?
grassie
Ho provato a farlo, ditemi tutto quello che ho sbagliato
#include <stdio.h>
int confronta(struct interoillimitato *m, struct interoillimitato *n);
struct Number{
int value;
struct Number *next;};
struct Interoillimitato{
int lenght;
struct Number *firstnumber;
struct Number *lastnumber;};
int main(){
struct Number n1, n2, n3, n4;
struct Number m1, m2, m3, m4;
struct Interoillimitato m;
struct Interoillimitato n;
n1.value=4;
n1.next=&n2;
n2.value=3;
n2.next=&n3;
n3.value=2;
n3.next=&n4;
n4.value=1;
n4.next=NULL;
n.lenght=4;
n.firstnumber=&n1;
n.lastnumber=&n4;
m1.value=3;
m1.next=&m2;
m2.value=7;
m2.next=&m3;
m3.value=2;
m3.next=&m4;
m4.value=6;
m4.next=NULL;
m.lenght=4;
m.firstnumber=&m1;
m.lastnumber=&m4;
printf("%d\n", confronta(Interoillimitato m, Interoillimitato n));
}
int confronta(struct interoillimitato *m, struct interoillimitato *n){
int risultato=0;
if(m.lenght>n.lenght){
risultato=-1;}
if(m.lenght<n.lenght){
risultato=1;} else { for(i=0;i<m.lenght;i++){
if(m.firstnumber>n.firstnumber){
risultato=-1; break;}
if(m.firstnumber<n.firstnumber){
risultato=1; break;} else
{m.firstnumber=m.firstnumber->next;
n.firstnumber=n.firstnumber->next;}}
return risultato;}
ma perchè indenti così? bastano 4 spazi/livello, non devi per forza superare la graffa dell'istruzione precedente..
//0
int main() {
//4
for(int i = 0; i < 10; i++) {
//8
}
//4
}
xubbax, formatta meglio il codice che così non si riesce a leggere nulla :|
e usa il tag CODE, altrimenti vengono delle parti blu.
per il resto qualche errore c'è: ci sono errori nel modo in cui è realizzato l'algoritmo e anche nel modo in cui confronti i numeri, per esempio:
if(m.firstnumber>n.firstnumber) ...
così non confronti i valori di quelle cifre, confronti due puntatori.
ESERCIZIO 2
struct interoillimitato *somma(struct intero illimitato *m, struct interoillimitato *n)
che restituisce un puntatore alla testa di una lista che rappresenta un interoillimitato risultato della somma.Non distruggere gli interi in ingresso alla funzione,allocando nuova memoria per il risultato
me lo spiegate?
non c'ho capito niente
vabbè va, sto calvario è durato abbastanza :asd:
ecco la mia versione, non testata come al solito perché mi pesa il :ciapet:
int confronta(struct InteroIllimitato *m, struct InteroIllimitato *n) {
struct Number *FirstDigit, *SecondDigit;
if (m->length > n->length) {
return -1;
}
if (m->length < n->length) {
return 1;
}
FirstDigit = m->firstNumber;
SecondDigit = n->firstNumber;
while (FirstDigit) {
if (FirstDigit->value > SecondDigit->value) {
return -1;
}
if (FirstDigit->value < SecondDigit->value) {
return 1;
}
FirstDigit = FirstDigit->next;
SecondDigit = SecondDigit->next;
}
return 0;
}
ESERCIZIO 2
struct interoillimitato *somma(struct intero illimitato *m, struct interoillimitato *n)
che restituisce un puntatore alla testa di una lista che rappresenta un interoillimitato risultato della somma.Non distruggere gli interi in ingresso alla funzione,allocando nuova memoria per il risultato
me lo spiegate?
non c'ho capito niente la prima frase infatti ("che restituisce " ecc. ecc.) è scritta col c**o. la seconda invece ("Non distruggere " ecc.) mi pare abbastanza chiara, anche se grammaticalmente "originale": non devi modificare il contenuto delle due liste che ti arrivano in ingresso (potevano anche sprecarsi a dichiarare i parametri con const), e la struttura che ritorni deve essere allocata con malloc.
ma devo fare la somma di due liste in poche parole?
quindi dichiaro sempre le mie due liste e poi faccio una funzione per sommarle?
L'inizializzazione va bene?
Ho creato due liste di 5 elementi
#include <stdio.h>
struct Number{
int value;
struct Number *next;};
struct InteroIllimitato{
int Lenght;
struct Number *firstNumber;
struct Number *lastNumber;};
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);
int main(){
struct Number m1,m2,m3,m4,m5;
struct Number n1,n2,n3,n4,n5;
struct InteroIllimitato im, in;
m1.value=3;
m1.next=&m2;
m2.value=4;
m2.next=&m3;
m3=value=1;
m3.next=&m4;
m4.value=2;
m4.next=&m5;
m5.value=2;
m5.next=NULL;
n1.value=4;
n1.next=&n2;
n2.value=3;
n2.next=&n3
n3.value=4;
n3.next=&n4
n4.value=1;
n4.next=&n5;
n5.value=6;
n5.next=NULL;
im.Lenght=5;
im.firstNumber=&m1;
im.lastNumber=&m5
in.Lenght=5;
in.firstNumber=&n1;
in.last.Number=&n5;
ma devo fare la somma di due liste in poche parole?
quindi dichiaro sempre le mie due liste e poi faccio una funzione per sommarle? ... per sommare i numeri rappresentati dalla concatenazione delle cifre delle rispettive liste. si. :p
cioè tu hai questa lista: 4->3->2->1->NULL
e poi hai quest'altra: 8->7->6->5->NULL
la tua funzione deve fare la somma 1234+5678, che fa 6912, e ritornare quindi la seguente lista: 2->1->9->6->NULL
capito
e la terza lista dove la devo dichiarare?
all'interno della funzione o dove?
hai controllato la mia inizializzazione delle due liste? è corretta
sto cominciando ad ingranare...:D
ora che ci faccio caso: la funzione che ho scritto al post #25 ha un errore. per come è ordinata la lista (ultimo elemento = cifra più significativa) bisognerebbe iterare partendo dall'ultimo e arrivando al primo, ma per farlo servirebbero dei puntatori all'elemento precedente mentre invece la struct Number contiene solo quello al successivo. non ci ho ragionato perché ho dato per scontato che l'esercizio semplificasse la vita allo studente dando già i puntatori nella direzione giusta, ma non è così. riposto la mia soluzione:
int confronta(struct InteroIllimitato *m, struct InteroIllimitato *n) {
struct Number *FirstDigit, *SecondDigit;
int Result;
if (m->length > n->length) {
return -1;
}
if (m->length < n->length) {
return 1;
}
Result = 0;
FirstDigit = m->firstNumber;
SecondDigit = n->firstNumber;
while (FirstDigit) {
if (FirstDigit->value > SecondDigit->value) {
Result = -1;
}
if (FirstDigit->value < SecondDigit->value) {
Result = 1;
}
FirstDigit = FirstDigit->next;
SecondDigit = SecondDigit->next;
}
return Result;
}
un'altra cosa, perchè se scrivi 4->3->2->1->NULL
lo consideri come 1234?
non si dovrebbe partire dal primo elemento cioè 4 e andare avanti fino a NULL?
capito
e la terza lista dove la devo dichiarare?
all'interno della funzione o dove? è un grave errore ritornare puntatori a variabili locali: lo standard del C non garantisce che il valore della variabile (e addirittura la sua esistenza) siano preservati quando questa uscirà dal suo scope. di fatto ciò che avviene su molte architetture è che lo spazio dove la variabile era allocata (una locazione di stack) continuerà ad esistere, ma conterrà valori arbitrari a seconda di come il programma continuerà ad usare lo stack (dichiarazione di altre variabili, chiamate a nuove funzioni, ecc.).
come ho scritto in un post precedente, lo spazio di memoria dove memorizzerai la nuova lista va allocato con delle chiamate a malloc. per semplificarti la vita puoi allocare un blocco diverso per ogni struct Number e uno per la struct InteroIllimitato.
hai controllato la mia inizializzazione delle due liste? è corretta non ti serve inizializzare le liste n ed m :O
un'altra cosa, perchè se scrivi 4->3->2->1->NULL
lo consideri come 1234?
non si dovrebbe partire dal primo elemento cioè 4 e andare avanti fino a NULL? l'esercizio dice che la prima cifra della lista è la meno significativa...
come non mi serve inizializzare la lista?
come lo provo il programma?
mi fai vedere come devo allocare memoria?
per fare la somma ho pensato a questo:
parto dalla cifra meno significativa, la somma all'altra cifra dell'altra lista, se il risultato è maggiore di 9, sottraggo 10 al risultato, quindi scrivo il risultato ottenuto in quella posizione e aggiungo l'1 alla cifra successiva della lista, e questo si ripete per le altre cifre
Va bene qualcosa del genere per la funzione?
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
int somma=0;
int temp=0;
int sommatotale=0;
while(m.firstNumber!=NULL){
somma=m.firstNumber+n.firstNumber
if(somma>9){
temp=somma-10;
sommatotale += temp;
somma=0;}
else {sommatotale += somma;
somma=0;}
m.firstNumber=m.firstNumber->next;
n.firstNumber=n.firstNumber->next;}
devo completare la parte dove ritorno sommatotale, però vorrei sapere almeno se il ragionamento e la sintassi fin qui è giusta
devo completare la parte dove ritorno sommatotale, però vorrei sapere almeno se il ragionamento e la sintassi fin qui è giusta ci sono alcuni errori di sintassi che ti ho corretto ed evidenziato di seguito:
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
int somma=0;
int temp=0;
int sommatotale=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber;
if(somma>9){
temp=somma-10;
sommatotale += temp;
somma=0;}
else {sommatotale += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
inoltre penso che per l'esercizio non sia accettabile utilizzare un int per memorizzare il risultato perché queste struct sono fatte apposta per contenere un numero virtualmente illimitato di cifre, mentre un int ne contiene a malapena 10. ciò che devi fare è generare la lista man mano che calcoli le somme parziali (cioè man mano che ne ottieni le cifre) allocando una struct Number alla volta.
questo è un esempio di allocazione con malloc:
struct Number *n;
...
n = (struct Number*)malloc(sizeof(struct Number));
altro errore: hai modificato i valori di firstNumber nelle due struct ricevute in ingresso, mentre l'esercizio dice di non toccare le due liste. usa delle variabili temporanee per iterare lungo le due liste, come ho fatto io nella mia soluzione all'esercizio 1.
ho capito le due cose che mi hai detto però non so come farle.mi fai vedere tu? completando il mio esercizio?
il prox esercizio lo faccio tutto da solo, è come questo solo con la sottrazione
ho capito le due cose che mi hai detto però non so come farle.mi fai vedere tu? completando il mio esercizio? no :Prrr:
guarda che non sto approfittando di te, se chiedo queste cose è proprio perchè non ci riesco e vorrei vedere come si fanno, non voglio mica farmi fare gli esercizi da te:D altrimenti non servirebbe a niente
vedrò di riuscirci da solo.
l'allocazione della struttura dove memorizzare la sommatotale va fatta all'interno della funzione?
guarda che non sto approfittando di te, se chiedo queste cose è proprio perchè non ci riesco e vorrei vedere come si fanno, non voglio mica farmi fare gli esercizi da te:D altrimenti non servirebbe a niente eh lo so ma il dispensatore automatico di soluzioni di esercizi è guasto: si è spezzata la leva, quella grossa leva tipo slot machine che tiri giù e ti scende la soluzione nel cassetto dei premi, con un allegro motivetto di sottofondo.
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
/*struttura dove memorizzerò la somma totale*/
struct Number{
int value;
struct Number *next;};
struct Number x;
int somma=0;
int temp=0;
int sommatotale=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
sommatotale += temp;
somma=0;}
else {sommatotale += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
ora come faccio a usare la struttura x al posto di somma e di sommatotale?
vedrò di riuscirci da solo.
l'allocazione della struttura dove memorizzare la sommatotale va fatta all'interno della funzione? quella si può fare dove vuoi, ma siccome l'esercizio diceva di consegnare solamente il corpo delle funzioni direi proprio che si, va fatta dentro. ma di un po': sono esercizi per un corso universitario? perché a sto punto so' curioso :D
veramente questi sono esercizi assegnati dal prof durante l'anno dell'università, e siccome non ho superato programmazione 1 li sto usando come esercitazione per l'esame di programmazione 1 che dovrò sostenere a settembre.
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
/*struttura dove memorizzerò la somma totale*/
struct Number{
int value;
struct Number *next;};
struct Number x;
int somma=0;
int temp=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
x.value += temp;
somma=0;}
else {x.value += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
Va bene una cosa del genere?
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
/*struttura dove memorizzerò la somma totale*/
struct Number{
int value;
struct Number *next;};
struct Number x;
int somma=0;
int temp=0;
int sommatotale=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
sommatotale += temp;
somma=0;}
else {sommatotale += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
ora come faccio a usare la struttura x al posto di somma e di sommatotale? non hai bisogno di ridefinire la struct dentro la funzione, men che mai di ridefinirla due volte. devi solo dichiararci un paio di variabili.
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
struct Number x;
int somma=0;
int temp=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
x.value += temp;
somma=0;}
else {x.value += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
quindi basta scrivere struct Number x;
e memorizzare la sommatotale in x.value?
ma guarda un po'... mi pare di capire che sei anche tu della Sapienza di Roma :D
Si sono della sapienza, anche tu?
magari stiamo nello stesso corso, io faccio tecnologie informatiche, devo fare il II anno
quindi basta scrivere struct Number x;
e memorizzare la sommatotale in x.value? NO :O
value è un int, non cambia niente se usi la variabile int sommatotale o se usi value per memorizzare il risultato: non puoi memorizzarlo in un int, perché sebbene l'esercizio non lo dica esplicitamente quelle possono essere liste che contengono numeri ben più grossi o piccoli del massimo o del minimo che può memorizzare un int. devi allocare con malloc una nuova struct Number ogni volta che ottieni una somma parziale, memorizzarci la somma parziale e concatenare alla lista. alla fine ottieni il risultato nella lista.
Si sono della sapienza, anche tu?
magari stiamo nello stesso corso, io faccio tecnologie informatiche, devo fare il II anno sono di tecnologie anche io. comunque io, ehm, come dire, devo fare il quarto anno :mc: :mc: :D :D :D lol
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
n = (struct Number*)malloc(sizeof(struct Number));
int somma=0;
int temp=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
n += temp;
somma=0;}
else {n += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
tipo questo?
Io non so neanche se continuare o no...programmare non è per me
Quindi hai gia finito la triennale o devi fare il 4 anno della triennale? cioè leggermente fuori corso?
comq perchè dici che modifico i valori delle due liste?
io non sto semplicemente sommando i valori delle due liste in un'altra lista?cioè come si fanno a modificare due valori se li sommo e metto il risultato in un'altra parte?
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n);{
struct Number{
int value;
struct Number *next;};
n = (struct Number*)malloc(sizeof(struct Number));
int somma=0;
int temp=0;
while(m->firstNumber!=NULL){
somma=m->firstNumber+n->firstNumber
if(somma>9){
temp=somma-10;
n += temp;
somma=0;}
else {n += somma;
somma=0;}
m->firstNumber=m->firstNumber->next;
n->firstNumber=n->firstNumber->next;}
tipo questo? la struct Number non c'è bisogno di definirla proprio per niente, è già definita dal testo dell'esercizio. inoltre quella malloc sovrascrive il valore del parametro n, che tra l'altro non è una struct Number ma una struct InteroIllimitato. vabbè va', faccio qualche ristrutturazione:
struct InteroIllimitato *somma(struct InteroIllimitato *m, struct InteroIllimitato *n) {
struct InteroIllimitato *Result;
struct Number *FirstNumberDigit, *SecondNumberDigit, **ResultDigit;
int Carry;
Result = (struct InteroIllimitato*)malloc(sizeof(struct InteroIllimitato));
Result->length = 0;
Result->firstNumber = NULL;
Result->lastNumber = NULL;
FirstNumberDigit = m->firstNumber;
SecondNumberDigit = n->firstNumber;
ResultDigit = &Result->firstNumber;
Carry = 0;
while (FirstNumberDigit || SecondNumberDigit) {
int Sum = 0;
if (FirstNumberDigit) {
Sum += FirstNumberDigit->value;
}
if (SecondNumberDigit) {
Sum += SecondNumberDigit->value;
}
if (Carry) {
Sum++;
}
if (Sum > 9) {
Sum -= 10;
Carry = 1;
}
else {
Carry = 0;
}
*ResultDigit = (struct Number*)malloc(sizeof(struct Number));
(*ResultDigit)->value = Sum;
(*ResultDigit)->next = NULL;
ResultDigit = &ResultDigit->next;
if (FirstNumberDigit) {
FirstNumberDigit = FirstNumberDigit->next;
}
if (SecondNumberDigit) {
SecondNumberDigit = SecondNumberDigit->next;
}
}
Result->lastDigit = *ResultDigit;
if (Carry) {
struct Number *LastDigit = (struct Number*)malloc(sizeof(struct Number));
LastDigit->value = 1;
LastDigit->next = NULL;
Result->lastNumber->next = LastDigit;
Result->lastNumber = LastDigit;
}
return Result;
}
scrivendolo mi sono accorto che era molto più complicato di quanto pensassi :Prrr:
tra parentesi non l'ho testato quindi non so manco se funziona, spero di non aver fatto errori.
Io non so neanche se continuare o no...programmare non è per me ah tranquillo che poi diventa tutta matematica :mc:
te lo dice uno che ama programmare, e che rosica su tutta questa dannata matematica :cry:
Quindi hai gia finito la triennale o devi fare il 4 anno della triennale? cioè leggermente fuori corso? devo iscrivermi al terzo anno per la seconda volta. non so se è fuori corso, fuori corso significa con un tot di esami indietro che non credo di avere. comunque sono ripetente.
ecco, già mi sono accorto di un errore... edito il post precedente e aggiungo un po' di codice (lo evidenzio in rosso).
edit - fatto. il codice che ho aggiunto serve ad aggiungere l'ultima cifra nel caso la somma delle ultime due dia un riporto.
edit2 - che rinc*******to che sono, ci avevo lasciato un if che andava tolto :D
grazie stasera me lo vedo un po e cerco di fare l'altro?
tutta matematica?
noooooo
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.