PDA

View Full Version : [C] Esercizi su strutture e liste


xbubbax
18-08-2007, 10:42
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

71104
18-08-2007, 11:15
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?

xbubbax
18-08-2007, 11:32
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

71104
18-08-2007, 12:00
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.

xbubbax
18-08-2007, 12:35
ok, l'inizializzazione l'ho capita ora vedo di capire cosa fa l'esercizio

xbubbax
18-08-2007, 12:36
ma la funzione cosa deve fare?

deve confrontare i numeri memorizzati in n1 e n2 o cosa?
non l'ho capito

71104
18-08-2007, 12:49
sostanzialmente deve confrontare tutte le struct Number contenute nelle liste specificate da n ed m, ma per i dettagli sull'algoritmo vedi post #2.

71104
18-08-2007, 12:52
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.

xbubbax
18-08-2007, 12:54
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?

xbubbax
18-08-2007, 12:55
ho visto anche la tua seconda inizializzazione, ora mi è tutto chiaro. ma non capisco cosa chiede l'esercizio.

71104
18-08-2007, 12:57
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.

xbubbax
18-08-2007, 13:00
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?

xbubbax
18-08-2007, 13:05
#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?

71104
18-08-2007, 13:18
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?

xbubbax
18-08-2007, 13:32
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?

xbubbax
18-08-2007, 14:07
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

71104
18-08-2007, 15:20
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.

xbubbax
18-08-2007, 17:12
penso di aver capito.

domani ci provo

xbubbax
19-08-2007, 10:00
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

xbubbax
20-08-2007, 11:14
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

AngeL)
20-08-2007, 11:40
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
}

71104
20-08-2007, 11:55
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.

xbubbax
20-08-2007, 11:57
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

71104
20-08-2007, 12:02
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;
}

71104
20-08-2007, 12:07
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.

xbubbax
20-08-2007, 12:35
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?

xbubbax
20-08-2007, 12:47
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;

71104
20-08-2007, 12:49
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

71104
20-08-2007, 12:51
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

xbubbax
20-08-2007, 12:56
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

71104
20-08-2007, 12:56
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;
}

xbubbax
20-08-2007, 13:00
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?

71104
20-08-2007, 13:01
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

71104
20-08-2007, 13:02
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...

xbubbax
20-08-2007, 13:03
come non mi serve inizializzare la lista?
come lo provo il programma?

mi fai vedere come devo allocare memoria?

xbubbax
20-08-2007, 13:07
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

xbubbax
20-08-2007, 13:19
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

71104
20-08-2007, 15:00
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));

71104
20-08-2007, 15:02
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.

xbubbax
20-08-2007, 15:14
ci provo

xbubbax
20-08-2007, 15:21
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

71104
20-08-2007, 15:56
ho capito le due cose che mi hai detto però non so come farle.mi fai vedere tu? completando il mio esercizio? no :Prrr:

xbubbax
20-08-2007, 15:58
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

xbubbax
20-08-2007, 16:00
vedrò di riuscirci da solo.

l'allocazione della struttura dove memorizzare la sommatotale va fatta all'interno della funzione?

71104
20-08-2007, 16:02
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.

xbubbax
20-08-2007, 16:02
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?

71104
20-08-2007, 16:03
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

xbubbax
20-08-2007, 16:04
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?

71104
20-08-2007, 16:05
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.

xbubbax
20-08-2007, 16:08
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?

71104
20-08-2007, 16:08
ma guarda un po'... mi pare di capire che sei anche tu della Sapienza di Roma :D

xbubbax
20-08-2007, 16:10
Si sono della sapienza, anche tu?

magari stiamo nello stesso corso, io faccio tecnologie informatiche, devo fare il II anno

71104
20-08-2007, 16:11
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.

71104
20-08-2007, 16:12
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

xbubbax
20-08-2007, 16:14
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?

xbubbax
20-08-2007, 16:22
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?

71104
20-08-2007, 16:39
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.

71104
20-08-2007, 16:41
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

xbubbax
20-08-2007, 17:56
grazie stasera me lo vedo un po e cerco di fare l'altro?

tutta matematica?

noooooo