|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Quote:
|
|
![]() |
![]() |
![]() |
#22 | |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Quote:
Eppure mi sembrava di averla messa e non andava lo stesso!! Vabbè... GRAZIE MILLE!! |
|
![]() |
![]() |
![]() |
#23 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Sto rifacendo per bene il programma della prima pagina.
Ho un dubbio, perchè nella chiamata ricorsiva della funzione controllonum non devo mettere "&" a num, mentre invece se la invoco nel main si (eccedenti=controllonum(PB3, &pezzi))?? Non dovrebbe esserci in entrambe? GRAZIE! Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char tipopezzo[15]; int x; int y; } pezzo; typedef struct el { pezzo pedina; struct el *next; } elemento; typedef struct { int PedoneBianco, PedoneNero, CavalloBianco, CavalloNero, AlfiereBianco,AlfiereNero,TorreBianca,TorreNera,ReginaBianca,ReginaNera,ReBianco,ReNero; } MaxPezzi; elemento * controllonum(elemento *head, MaxPezzi *num); void inizializza (); void main () { MaxPezzi pezzi; elemento *PB,*PB2,*PB3,*eccedenti; pezzi.PedoneBianco=2; pezzi.PedoneNero=8; pezzi.CavalloBianco=2; pezzi.CavalloNero=2; pezzi.AlfiereBianco=2; pezzi.AlfiereNero=2; pezzi.TorreBianca=2; pezzi.TorreNera=2; pezzi.ReginaBianca=1; pezzi.ReginaNera=1; pezzi.ReBianco=1; pezzi.ReNero=1; inizializza(); //PROVA// PB=(elemento *)malloc(sizeof(elemento)); strcpy(PB->pedina.tipopezzo,"PedoneBianco"); PB->next=NULL; PB2=(elemento *)malloc(sizeof(elemento)); strcpy(PB2->pedina.tipopezzo,"PedoneBianco"); PB2->next=PB; PB3=(elemento *)malloc(sizeof(elemento)); strcpy(PB3->pedina.tipopezzo,"PedoneBianco"); PB3->next=PB2; eccedenti=controllonum(PB3, &pezzi); printf("\n%d", pezzi.PedoneBianco); } elemento * controllonum(elemento *head, MaxPezzi *num) { elemento *eccedenti; eccedenti=(elemento *)malloc(sizeof(elemento)); eccedenti=NULL; if (head == NULL) return eccedenti; if (head != NULL) { if (strcmp(head->pedina.tipopezzo, "PedoneBianco")==0) num->PedoneBianco=num->PedoneBianco -1; return eccedenti=controllonum(head->next, num); } return eccedenti; } void inizializza () { int i, j; printf("Scacchiera vuota\n\n"); for (i=0;i<8;i++){ for (j=0;j<8;j++) { printf("X "); } printf("\n"); } } |
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
la "&" sta ad indicare che passi l'indirizzo della variabile e non il contenuto.
Dentro la funzione controllonum "num" é giá un indirizzo (é un puntatore, dichiarato con *) mentre nel main passi "pezzi" che é una variabile non puntatore (MaxPezzi) Ciao ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#25 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Piccola soddisfazione personale, alla fine ce l'ho fatta!!!
Ringrazio tutti per l'aiuto, sono passato da esercizi più semplici e grazie ai suggerimenti ho risolto anche questo. Ora mi invento qualche esercizio, l'esame è mercoledì!! (peccato che sia senza compilatore) ![]() Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char tipopezzo[15]; int x; int y; } pezzo; typedef struct el { pezzo pedina; struct el *next; } elemento; typedef struct { int PedoneBianco, PedoneNero, CavalloBianco, CavalloNero, AlfiereBianco,AlfiereNero,TorreBianca,TorreNera,ReginaBianca,ReginaNera,ReBianco,ReNero; } MaxPezzi; typedef struct { int matrix[8][8]; } matrice; elemento * controllonum(elemento *head, MaxPezzi *num, elemento *eccedenti); void inizializza (); void stampalista (elemento *head); elemento *instesta (elemento *head, pezzo A); elemento *controllopos (elemento *head, elemento *conf, elemento *lista); void main () { MaxPezzi pezzi; elemento *conf; elemento *PB,*PB2,*PB3,*eccedenti, *RN, *RN1, *ReB, *ReN, *ReN1; eccedenti=(elemento *)malloc(sizeof(elemento)); eccedenti=NULL; pezzi.PedoneBianco=8; pezzi.PedoneNero=8; pezzi.CavalloBianco=2; pezzi.CavalloNero=2; pezzi.AlfiereBianco=2; pezzi.AlfiereNero=2; pezzi.TorreBianca=2; pezzi.TorreNera=2; pezzi.ReginaBianca=1; pezzi.ReginaNera=1; pezzi.ReBianco=1; pezzi.ReNero=1; inizializza(); //PROVA// PB=(elemento *)malloc(sizeof(elemento)); strcpy(PB->pedina.tipopezzo,"PedoneBianco"); PB->next=NULL; PB2=(elemento *)malloc(sizeof(elemento)); strcpy(PB2->pedina.tipopezzo,"PedoneBianco"); PB2->next=PB; PB2->pedina.x=3; PB2->pedina.y=2; PB3=(elemento *)malloc(sizeof(elemento)); strcpy(PB3->pedina.tipopezzo,"PedoneBianco"); PB3->next=PB2; PB3->pedina.x=5; PB3->pedina.y=2; RN=(elemento *)malloc(sizeof(elemento)); strcpy(RN->pedina.tipopezzo,"ReginaNera"); RN->next=PB3; RN->pedina.x=5; RN->pedina.y=2; RN1=(elemento *)malloc(sizeof(elemento)); strcpy(RN1->pedina.tipopezzo,"ReginaNera"); RN1->next=RN; RN1->pedina.x=3; RN1->pedina.y=0; ReB=(elemento *)malloc(sizeof(elemento)); strcpy(ReB->pedina.tipopezzo,"ReBianco"); ReB->next=RN1; ReB->pedina.x=4; ReB->pedina.y=7; ReN=(elemento *)malloc(sizeof(elemento)); strcpy(ReN->pedina.tipopezzo,"ReNero"); ReN->next=ReB; ReN->pedina.x=4; ReN->pedina.y=7; ReN1=(elemento *)malloc(sizeof(elemento)); strcpy(ReN1->pedina.tipopezzo,"ReNero"); ReN1->next=ReN; ReN1->pedina.x=3; ReN1->pedina.y=4; conf=ReN1->next; printf("Elementi in gioco:\n"); stampalista(ReN1); eccedenti=controllonum(ReN1, &pezzi, eccedenti); ReN1=controllopos(ReN1,conf, ReN1); printf("Lista dopo aver eliminato gli elementi occupanti la stessa posizione:\n"); stampalista(ReN1); } elemento * controllonum(elemento *head, MaxPezzi *num, elemento *eccedenti) { if (head == NULL) { if (eccedenti != NULL) { printf("Elementi eccedenti:\n"); stampalista(eccedenti); } return eccedenti; } if (head != NULL) { if (strcmp(head->pedina.tipopezzo, "PedoneBianco")==0) { num->PedoneBianco=num->PedoneBianco -1; if (num->PedoneBianco < 0) { eccedenti=instesta(eccedenti, head->pedina); num->PedoneBianco=0; } } if (strcmp(head->pedina.tipopezzo, "PedoneNero")==0) { num->PedoneNero=num->PedoneNero -1; if (num->PedoneNero < 0) { eccedenti=instesta(eccedenti, head->pedina); num->PedoneNero=0; } } if (strcmp(head->pedina.tipopezzo, "CavalloBianco")==0) { num->CavalloBianco=num->CavalloBianco -1; if (num->CavalloBianco < 0) { eccedenti=instesta(eccedenti, head->pedina); num->CavalloBianco=0; } } if (strcmp(head->pedina.tipopezzo, "CavalloNero")==0) { num->CavalloNero=num->CavalloNero -1; if (num->CavalloNero < 0) { eccedenti=instesta(eccedenti, head->pedina); num->CavalloNero=0; } } if (strcmp(head->pedina.tipopezzo, "AlfiereBianco")==0) { num->AlfiereBianco=num->AlfiereBianco -1; if (num->AlfiereBianco < 0) { eccedenti=instesta(eccedenti, head->pedina); num->AlfiereBianco=0; } } if (strcmp(head->pedina.tipopezzo, "AlfiereNero")==0) { num->AlfiereNero=num->AlfiereNero -1; if (num->AlfiereNero < 0) { eccedenti=instesta(eccedenti, head->pedina); num->AlfiereNero=0; } } if (strcmp(head->pedina.tipopezzo, "ReginaBianca")==0) { num->ReginaBianca=num->ReginaBianca -1; if (num->ReginaBianca < 0) { eccedenti=instesta(eccedenti, head->pedina); num->ReginaBianca=0; } } if (strcmp(head->pedina.tipopezzo, "ReginaNera")==0) { num->ReginaNera=num->ReginaNera -1; if (num->ReginaNera < 0) { eccedenti=instesta(eccedenti, head->pedina); num->ReginaNera=0; } } if (strcmp(head->pedina.tipopezzo, "ReBianco")==0) { num->ReBianco=num->ReBianco -1; if (num->ReBianco < 0) { eccedenti=instesta(eccedenti, head->pedina); num->ReBianco=0; } } if (strcmp(head->pedina.tipopezzo, "ReNero")==0) { num->ReNero=num->ReNero -1; if (num->ReNero < 0) { eccedenti=instesta(eccedenti, head->pedina); num->ReNero=0; } } return eccedenti=controllonum(head->next, num, eccedenti); } return eccedenti; } void inizializza () { int i, j; printf("Scacchiera vuota\n\n"); for (i=0;i<8;i++){ for (j=0;j<8;j++) { printf("X "); } printf("\n"); } } void stampalista(elemento *head) { while (head != NULL) { printf("%s\n", head->pedina.tipopezzo); head=head->next; } printf("\n"); } elemento *instesta(elemento *head, pezzo A) { elemento *new; new=(elemento *)malloc(sizeof(elemento)); new->next=head; strcpy(new->pedina.tipopezzo,A.tipopezzo); return new; } elemento *controllopos(elemento *head, elemento *conf, elemento *lista) { elemento *temp, *succ; if (head->next == NULL) return lista; if (conf == NULL) { temp=head->next; return head=controllopos(head->next, temp->next, lista); } else { if (head->pedina.x == conf->pedina.x && head->pedina.y == conf->pedina.y) { temp=head; temp->next=conf->next; free(conf); conf=temp->next; return head=controllopos(head, conf, lista); } return head=controllopos(head, conf->next, lista); } } |
![]() |
![]() |
![]() |
#26 | |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
![]() Ben tornato trallallero!
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
![]() |
![]() |
![]() |
#27 | |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#28 | ||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
compilatore lo dici al tuo gatto ![]() Quote:
![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
![]() |
![]() |
![]() |
#29 | |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
ok ok, basta OT. Chiedo venia ![]()
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
![]() |
![]() |
![]() |
#30 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Nuovo esercizio...
Oggi volevo provare ad ordinare una lista dinamica, e stavo provando un algoritmo tipo bubble sort che usavo per gli array.
il problema è che poniamo io abbia 3 elementi: (a priori io non so se il primo elemento è più grande del secondo o no) |3| --> |2| --> |5| se scambio di posto il primo con il secondo perdo l'indirizzo della testa dell'array e quando vado a stamparlo non funziona. Come posso fare?! ![]() Avete un algoritmo da propormi che risolva il problema? Grazie |
![]() |
![]() |
![]() |
#31 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
devi scambiare di posto il valore non l'indirizzo
![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#32 | |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#33 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#34 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Nuovo programmino..... altro problema
Ho una lista di array, devo fare la media del singolo array e poi la media di tutto.
Perchè non mi prende i decimali?!?! Anche se metto 17/4, risultato = 4.... ho messo sia double che float... perchè??? Grazie! ![]() Codice:
#include <stdio.h> #include <stdlib.h> typedef struct el { int A[5]; struct el *next; } elemento; float mediavect (int array[]); float sommalista (elemento *head); int numel (elemento *head); float medialista (elemento *head); void main () { elemento *lista,*lista1,*lista2,*lista3; float media; lista=(elemento *)malloc(sizeof(elemento)); lista->A[0]=4; lista->A[1]=2; lista->A[2]=3; lista->A[3]=8; lista->A[4]='\0'; lista1=(elemento *)malloc(sizeof(elemento)); lista->next=lista1; lista1->A[0]=3; lista1->A[1]=1; lista1->A[2]=6; lista1->A[3]='\0'; lista2=(elemento *)malloc(sizeof(elemento)); lista1->next=lista2; lista2->A[0]=1; lista2->A[1]=1; lista2->A[2]='\0'; lista3=(elemento *)malloc(sizeof(elemento)); lista2->next=lista3; lista3->A[0]=4; lista3->A[1]='\0'; lista3->next=NULL; media=medialista(lista); media=17/4; printf("%f",media); } float mediavect (int array[]) { int i=0,somma=0; float media=0.0; while (array[i] != '\0') { somma=somma+array[i]; i=i+1; } media=somma / i; return media; } float sommalista (elemento *head) { float ris=0.0; if (head == NULL) return 0.0; else ris=mediavect(head->A)+sommalista(head->next); return ris; } int numel (elemento *head) { int num=0; if (head == NULL) return 0; else num=1 + numel(head->next); return num; } float medialista (elemento *head) { float media=0.0; media=sommalista(head)/numel(head); return media; } |
![]() |
![]() |
![]() |
#35 | |
Senior Member
Iscritto dal: Mar 2005
Città: Torino... ma Abruzzo rulez!
Messaggi: 613
|
Quote:
Probabilmente perchè nello stream dopo aver letto la stringa cognome rimane il carattere di spaziatura e/o LF eo '\n' prova a modificare così: Codice:
scanf("%s%*c", new->cognome);
__________________
Case AT big tower - Mobo XXX - amd 486DX2@66Mhz - 8 MB edo-ram - Trident SVGA 2MB - HDD 270MB Conner - CD-ROM Hitachi 4X ![]() "Muletto": DFI Lanparty LT X38@X48 T2R - e8400@3870 1.2xV - 4GB black dragon @ 1147 - 2x320 Barracuda 0Raided - from 8800GT Club3d ![]() ![]() |
|
![]() |
![]() |
![]() |
#36 | |
Senior Member
Iscritto dal: Mar 2005
Città: Torino... ma Abruzzo rulez!
Messaggi: 613
|
Quote:
Codice:
media = (float ) 17/4; P.S. Quando usi la malloc abbi sempre l'accortezza di controllare che l'esito dell'allocazione sia avvenuto correttamente, te l'hanno detto anche sopra. es. Codice:
puntatore = ( cast *) malloc (sizeof(cast)); if (puntatore == NULL){ fprintf(stdout,"\nErrore di allocazione della memoria."); free( ...); // tutti i puntatori a strutture create in precedenza exit(-1); }
__________________
Case AT big tower - Mobo XXX - amd 486DX2@66Mhz - 8 MB edo-ram - Trident SVGA 2MB - HDD 270MB Conner - CD-ROM Hitachi 4X ![]() "Muletto": DFI Lanparty LT X38@X48 T2R - e8400@3870 1.2xV - 4GB black dragon @ 1147 - 2x320 Barracuda 0Raided - from 8800GT Club3d ![]() ![]() Ultima modifica di Paco De Luciaaaaa : 11-09-2006 alle 23:11. |
|
![]() |
![]() |
![]() |
#37 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
Forse l'ultima domanda :-)
Perchè in questa funzione ho dovuto mettere un puntatore alla testa della lista (elemento *lista) altrimenti mi perdeva l'indirizzo scorrendo la funzione
Codice:
elemento *controllopos(elemento *head, elemento *conf, elemento *lista,elemento *prec) { elemento *temp, *succ; if (head->next == NULL) return lista; if (conf == NULL) { temp=head->next; return head=controllopos(head->next, temp->next,lista,head->next); } else { if (head->pedina.x == conf->pedina.x && head->pedina.y == conf->pedina.y) { temp=prec; temp->next=conf->next; free(conf); conf=temp->next; return head=controllopos(head, conf,lista,prec); } return head=controllopos(head, conf->next, lista,prec->next); } } Codice:
elemento * elimina (elemento *head, char cercacogn[10]) { elemento *succ; succ=head->next; if (strcmp(succ->cognome,cercacogn)==0) { free(succ); head->next=succ->next; } else if(head!=NULL) { succ=head->next; elimina((head->next), cercacogn); } return head; } Non so se mi sono spiegato bene.... ![]() |
![]() |
![]() |
![]() |
#38 |
Member
Iscritto dal: Jul 2005
Messaggi: 151
|
UP
|
![]() |
![]() |
![]() |
#39 |
Senior Member
Iscritto dal: Mar 2005
Città: Torino... ma Abruzzo rulez!
Messaggi: 613
|
Nel primo caso è ovvio: chiami recursivamente la funzione ma devi considerare che in quel caso il puntatore head alla lista lo devi passare by reference e quindi accedervi come doppio puntatore.
Nel secondo caso ci sarà un errore a run time perchè usi la free e poi tenti di accedere al campo succ che è stato eliminato. Cmq devi ben imparare 2 cose fondamentali: - La ricorsione è molto elegante ma devi saperla usare. Basta un ciclo while e un puntatore che funge da scorritore - Il passaggio dei parametri in una funzione e il loro ambiente o scope. Ciao
__________________
Case AT big tower - Mobo XXX - amd 486DX2@66Mhz - 8 MB edo-ram - Trident SVGA 2MB - HDD 270MB Conner - CD-ROM Hitachi 4X ![]() "Muletto": DFI Lanparty LT X38@X48 T2R - e8400@3870 1.2xV - 4GB black dragon @ 1147 - 2x320 Barracuda 0Raided - from 8800GT Club3d ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:15.