PDA

View Full Version : [C] Potete darmi una mano?


DavidGT
06-09-2006, 16:24
Ho l'esame di fondamenti di informatica la prossim settimana, e mi sto esercitando un po', soprattutto sulla ricorsione.

Potreste dirmi se la parte di programma che ho fatto per esercizio ieri può funzionare e che errori ho commesso.

Ho allegato il file, ci sono scritte le descrizioni delle funzioni da implementare.

Se qualcuno ha la cortesia di dargli un occhio gliene sarei molto grato :mc:



Grazie, Davide.

Marco Giunio Silano
06-09-2006, 16:28
non hai provato a compilare vero? :D

edit

non ho capito perché vedo due volte la funzione2 e la dichiarazione di scacchiera

DavidGT
06-09-2006, 16:30
Non compila perchè non ha un main, non è un programma che deve girare. Devo solo implementare delle funzioni, e vorrei sapere se l'ho fatto bene....

Praticamente è una parte dell'esame, da fare senza compilatore

----------------------------------

perchè la seconda volta ho provato a rifarla ricorsiva

GoldenAxe79
06-09-2006, 17:22
sei iscritto ad informatica , dove ?

DavidGT
06-09-2006, 17:22
sei iscritto ad informatica , dove ?


No Ing. Aerospaziale a Milano....

Nessuno mi aiuta?

DavidGT
07-09-2006, 10:29
up

Nessuno che ne sa ha 5 minuti da perdere? Per voi sono delle cavolate..

GoldenAxe79
07-09-2006, 12:48
studiate la meccanica del volo ?

DavidGT
07-09-2006, 12:51
studiate la meccanica del volo ?

certo

dierre
07-09-2006, 12:57
scusa eh, ma mettici un main e provala. Neanche due minuti ci metti.

BountyKiller
07-09-2006, 13:31
veramente una bella facoltà aerospaziale.... purtropo qui da me non c'è e ho dovuto ripiegare su ingegneria informatica.
Ma le prospettive di lavoro in italia ci sono?

dierre
07-09-2006, 13:32
veramente una bella facoltà aerospaziale.... purtropo qui da me non c'è e ho dovuto ripiegare su ingegneria informatica.
Ma le prospettive di lavoro in italia ci sono?

per ripiegare suppongo fosse più indicata meccanica.

DavidGT
07-09-2006, 13:46
Certo che ci sono prospettive di lavoro, innanzitutto sei un Ingegnere Industriale, alla fine non pensare che perchè sei Aerospaziale potrai solo lavorare in aziende basate sulla progettazzione di aerei o affini.

Cmq sopratutto nella mia zona (tra Milano e Torino) il settore è molto sviluppato, vedi Aermacchi, Alenia Spazio, Agusta

BountyKiller
07-09-2006, 14:35
si si anch'io ufficialmente sono uno ingegnere dell'industria, anche se pare che possa firmare per progetti anche nell'ambito dell'edilizia.... di sicuro posso firmare la messa a norma di impianti elettrici, ma se poi succede qualcosa vengono a cercarmi quindi...

comunque ribadisco che aerospaziale è un bel corso di laurea.

DavidGT
07-09-2006, 14:37
Non divaghiamo troppo dal tema..... :p

Il programma non riesco a farlo funzionare!!!!

Please ;)

sottovento
08-09-2006, 04:45
Non divaghiamo troppo dal tema..... :p

Il programma non riesco a farlo funzionare!!!!

Please ;)
Hai ragione.
Mi permetto di dare alcuni suggerimenti (non ho analizzato a fondo il tutto).

- linea 47 (funzione funzione1()) si legge:
else if {
che non ha senso. Immagino non volessi aggiungere l'if.

- linea 49, 52, 55, 58, 61 (stessa funzione). Fail il confronto fra stringhe. Il confronto scritto non e' valido poiche' andra' a valutare solo degli indirizzi.
Il confronto fra queste scritte si esegue con la funzione strcmp().
Nel tuo caso:

if (!strcmp (head->pedina.tipopezzo, "PedoneBianco"))
...
Ti prego di notare che le stringhe devono essere racchiuse da apici doppi (") e non semplici ('). Userai gli apici semplici quando devi racchiudere un singolo carattere (il quale sara' di tipo char. Se ovviamente vuoi racchiudere una stringa composta da un solo carattere, userai ovviamente gli apici doppi).

- Linea 94: esegui una allocazione dinamica mediante l'uso della malloc(). So benissimo che si tratta di un programma didattico, ma per favore ricordati sempre che la malloc() puo' fallire, non allocando memoria e riportandoti un puntatore a NULL. Controlla sempre poiche' nel caso di programmi veri, questo tipo di dimenticanze sono veramente costose (potresti avere un programma che saltuariamente si incarta e potresti perdere settimane a capire cosa succede).
Piuttosto che niente puoi scrivere:
nuovo=(elemento *)malloc(sizeof(elemento));
if (!nuovo)
{
printf ("Errore allocazione memoria!!!");
exit (0);
}
Non e' il massimo ma almeno sai esattamente cosa succede.

- Linea 95: stesse considerazioni. L'assegnamento pero' non lo puoi fare in questo modo ma devi usare la funzione strcpy(). Nel tuo caso:
strcpy (nuovo->pedina.tipopezzo, "PedoneBianco");
Fai attenzione che la strcpy NON fa alcun controllo sul fatto che nuovo->pedina.tipopezzo sia sufficientemente grande per contenere la stringa che vuoi inserire. Se non fosse sufficientemente grande, potresti avere dei malfunzionamenti del tutto strani e, purtroppo, anche saltuari. E' tua responsabilita' controllare sempre.

- Linea 107, 119, 131, 143, 155, 167, 179, 191, 203 - Stessa cosa relativa agli assegnamenti. Suggerimento: Si tratta di codice di cui hai fatto copy&paste e poi modificato.
Secondo i modernissimi studi sull'ingegneria del software condotti dal sottoscritto, la tecnica piu' usata per il riuso del software e' appunto il copy & paste:)
Sembrera' strano, parlano tutti (o quasi) dei massimi sistemi e poi il software che mi trovo a spulciare (mi pagano per far funzionare le cose quando l'autore si arrende) e' pieno di tecniche simili. Anche se si tratta di un programma didattico, il mio consiglio e' di spendere 10 minuti in piu' a pensare ad una soluzione diversa e piu' compatta. Ti troveresti a correggere un solo errore invece di una pletora, con il rischio di dimenticarsene qualcuno.

Come hai visto, mi sono limitato a semplici considerazioni sintattiche. Nel caso serva, possiamo andare piu' in dettaglio ma il consiglio e' quello di farlo girare. Ci vuole davvero poco, hai gia' scritto quasi tutto.

High Flying
Sottovento

DavidGT
08-09-2006, 09:23
Hai ragione.
Mi permetto di dare alcuni suggerimenti (non ho analizzato a fondo il tutto).

- linea 47 (funzione funzione1()) si legge:
else if {
che non ha senso. Immagino non volessi aggiungere l'if.



A noi hanno fatto usare anche else if quando ci sono più relazioni, posso mettere tutti if il risultato non dovrebbe cambiare.


- linea 49, 52, 55, 58, 61 (stessa funzione). Fail il confronto fra stringhe. Il confronto scritto non e' valido poiche' andra' a valutare solo degli indirizzi.
Il confronto fra queste scritte si esegue con la funzione strcmp().
Nel tuo caso:

if (!strcmp (head->pedina.tipopezzo, "PedoneBianco"))
...


Non ho capito bene questo passaggio...
Qui non va bene il confronto perchè ho passato la lista per puntatore giusto?
Altrimenti in un passaggio per copia la sintassi sarebbe giusta?


Ti prego di notare che le stringhe devono essere racchiuse da apici doppi (") e non semplici ('). Userai gli apici semplici quando devi racchiudere un singolo carattere (il quale sara' di tipo char. Se ovviamente vuoi racchiudere una stringa composta da un solo carattere, userai ovviamente gli apici doppi).

- Linea 94: esegui una allocazione dinamica mediante l'uso della malloc(). So benissimo che si tratta di un programma didattico, ma per favore ricordati sempre che la malloc() puo' fallire, non allocando memoria e riportandoti un puntatore a NULL. Controlla sempre poiche' nel caso di programmi veri, questo tipo di dimenticanze sono veramente costose (potresti avere un programma che saltuariamente si incarta e potresti perdere settimane a capire cosa succede).
Piuttosto che niente puoi scrivere:
nuovo=(elemento *)malloc(sizeof(elemento));
if (!nuovo)
{
printf ("Errore allocazione memoria!!!");
exit (0);
}
Non e' il massimo ma almeno sai esattamente cosa succede.



Questo della Malloc() proprio non lo sapevo...


- Linea 95: stesse considerazioni. L'assegnamento pero' non lo puoi fare in questo modo ma devi usare la funzione strcpy(). Nel tuo caso:
strcpy (nuovo->pedina.tipopezzo, "PedoneBianco");
Fai attenzione che la strcpy NON fa alcun controllo sul fatto che nuovo->pedina.tipopezzo sia sufficientemente grande per contenere la stringa che vuoi inserire. Se non fosse sufficientemente grande, potresti avere dei malfunzionamenti del tutto strani e, purtroppo, anche saltuari. E' tua responsabilita' controllare sempre.



Grazie mille, non le ho usate perchè non ho molta dimestichezza con queste funzioni che gestiscono stringhe, in effetti però mi sono reso conto che passare i caratteri in quel modo sarebbe sbagliato!!


- Linea 107, 119, 131, 143, 155, 167, 179, 191, 203 - Stessa cosa relativa agli assegnamenti. Suggerimento: Si tratta di codice di cui hai fatto copy&paste e poi modificato.
Secondo i modernissimi studi sull'ingegneria del software condotti dal sottoscritto, la tecnica piu' usata per il riuso del software e' appunto il copy & paste:)
Sembrera' strano, parlano tutti (o quasi) dei massimi sistemi e poi il software che mi trovo a spulciare (mi pagano per far funzionare le cose quando l'autore si arrende) e' pieno di tecniche simili. Anche se si tratta di un programma didattico, il mio consiglio e' di spendere 10 minuti in piu' a pensare ad una soluzione diversa e piu' compatta. Ti troveresti a correggere un solo errore invece di una pletora, con il rischio di dimenticarsene qualcuno.

Come hai visto, mi sono limitato a semplici considerazioni sintattiche. Nel caso serva, possiamo andare piu' in dettaglio ma il consiglio e' quello di farlo girare. Ci vuole davvero poco, hai gia' scritto quasi tutto.

High Flying
Sottovento


Grazie mille per i suggerimenti, ora provo a metterlo a posto!!

DavidGT
08-09-2006, 11:39
guardate un secondo questo...

perchè non mi prende in modo corretto l'anno??

Grazie!!

#include <stdio.h>
#include <stdlib.h>

//Creare un programma che permetta di creare una lista di
//nominativi che contenga una anagrafica con i seguenti dati: nome cognome e data di
//nascita. Le funzionalità richieste sono l’inserimento di nuovi nominativi e la stampa di tutto
//l’archivio.

typedef struct el {
int anno;
char nome[10];
char cognome[10];
struct el *next;
} elemento;


elemento * inseriscitesta (elemento *head);
void stampa (elemento *head);


void main () {


int scelta=5;
elemento *lista;

lista=NULL;

while (scelta != 9) {
printf("Se vuoi inserire un nominativo premi 1 altrimenti premi 0 per stampare la lista || per uscire 9\n\n");
scanf("%d",&scelta);

if (scelta == 1) {

lista=inseriscitesta(lista);
}

if (scelta == 2) {

stampa (lista);

}
}
}




elemento * inseriscitesta (elemento *head) {

elemento *new;

new=(elemento *)malloc(sizeof(elemento));
new->next=head;

printf("Inserire il nome\n");
scanf("%s", new->nome);
printf("Inserire il cognome\n");
scanf("%s", new->cognome);
printf("Inserire anno di nascita\n");
scanf("%d", new->anno);

return new;
}

void stampa (elemento *head) {

while (head != NULL) {

printf("%s - %s - %d\n", head->nome, head->cognome, head->anno);
head=head->next;
}
}

DavidGT
08-09-2006, 13:06
UP

DavidGT
08-09-2006, 18:08
:help:

Barbalbero
08-09-2006, 18:57
Ma new non è una parola riservata?

Cmq devi mettere l'operatore & nella scanf dell'anno

DavidGT
08-09-2006, 18:58
Ma new non è una parola riservata?

Cmq devi mettere l'operatore & nella scanf dell'anno

Non funziona nemmeno con la &....

DavidGT
08-09-2006, 19:01
Non funziona nemmeno con la &....

Ritiro tutto... che pirla!!!


Eppure mi sembrava di averla messa e non andava lo stesso!!


Vabbè... GRAZIE MILLE!!

DavidGT
10-09-2006, 11:30
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!

#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");
}
}

trallallero
11-09-2006, 07:43
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 :)

DavidGT
11-09-2006, 10:34
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)

:D


#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);
}
}

Marco Giunio Silano
11-09-2006, 11:15
(peccato che sia senza compilatore)

Ma, da quanto visto, c'è Trallallero che sta facendo da compilatore umano :D
Ben tornato trallallero!

DavidGT
11-09-2006, 11:16
Ma, da quanto visto, c'è Trallallero che sta facendo da compilatore umano :D
Ben tornato trallallero!

Senza compilatore all'esame.... :D :D

trallallero
11-09-2006, 11:27
Ma, da quanto visto, c'è Trallallero che sta facendo da compilatore umano :D
Segnalato!!!
compilatore lo dici al tuo gatto :O

Ben tornato trallallero!
grazie ma stavo meglio prima :rolleyes:

Marco Giunio Silano
11-09-2006, 11:31
Segnalato!!!
compilatore lo dici al tuo gatto :O


grazie ma stavo meglio prima :rolleyes:

Bè non conosco il prima, ma t'immagino in ferie, quindi meglio.
ok ok, basta OT. Chiedo venia :ave:

DavidGT
11-09-2006, 15:04
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?! :muro:

Avete un algoritmo da propormi che risolva il problema?

Grazie

trallallero
11-09-2006, 15:10
devi scambiare di posto il valore non l'indirizzo ;)

DavidGT
11-09-2006, 15:12
devi scambiare di posto il valore non l'indirizzo ;)

non ci avevo pensato... si vede che sono un pivello!! :p

trallallero
11-09-2006, 15:16
non ci avevo pensato... si vede che sono un pivello!! :p
mai vantarsi :O
:D

DavidGT
11-09-2006, 22:38
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! :)

#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;
}

Paco De Luciaaaaa
11-09-2006, 23:01
guardate un secondo questo...

perchè non mi prende in modo corretto l'anno??

Grazie!!

#include <stdio.h>
#include <stdlib.h>

//Creare un programma che permetta di creare una lista di
//nominativi che contenga una anagrafica con i seguenti dati: nome cognome e data di
//nascita. Le funzionalità richieste sono l’inserimento di nuovi nominativi e la stampa di tutto
//l’archivio.

typedef struct el {
int anno;
char nome[10];
char cognome[10];
struct el *next;
} elemento;


elemento * inseriscitesta (elemento *head);
void stampa (elemento *head);


void main () {


int scelta=5;
elemento *lista;

lista=NULL;

while (scelta != 9) {
printf("Se vuoi inserire un nominativo premi 1 altrimenti premi 0 per stampare la lista || per uscire 9\n\n");
scanf("%d",&scelta);

if (scelta == 1) {

lista=inseriscitesta(lista);
}

if (scelta == 2) {

stampa (lista);

}
}
}




elemento * inseriscitesta (elemento *head) {

elemento *new;

new=(elemento *)malloc(sizeof(elemento));
new->next=head;

printf("Inserire il nome\n");
scanf("%s", new->nome);
printf("Inserire il cognome\n");
scanf("%s", new->cognome);
printf("Inserire anno di nascita\n");
scanf("%d", new->anno);

return new;
}

void stampa (elemento *head) {

while (head != NULL) {

printf("%s - %s - %d\n", head->nome, head->cognome, head->anno);
head=head->next;
}
}




Probabilmente perchè nello stream dopo aver letto la stringa cognome rimane il carattere di spaziatura e/o LF eo '\n'

prova a modificare così:
scanf("%s%*c", new->cognome);

Paco De Luciaaaaa
11-09-2006, 23:06
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! :)


La divisione di due numeri interi in c restituisce sempre un intero, devi forzare con un cast a float quindi:
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.

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);
}

DavidGT
12-09-2006, 17:42
Perchè in questa funzione ho dovuto mettere un puntatore alla testa della lista (elemento *lista) altrimenti mi perdeva l'indirizzo scorrendo la funzione


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);
}
}



mentre invece in quest'altra funzione alla fine ritorno lo stesso head, che anch'esso è stato incrementato, e punta alla testa iniziale anche senza ricorrere al riferimento in testata come avevo fatto prima?????


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.... :)

DavidGT
12-09-2006, 19:46
UP

Paco De Luciaaaaa
12-09-2006, 20:32
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