PDA

View Full Version : ARRAY E STRUCT IN C


biggestopolino
24-08-2005, 23:35
non riesco a trovare su internet buone guide per gli array e struct (e loro applicazione, quindi esercizi vari). :mc:
dove posso trovarne??

GioVesas
25-08-2005, 07:32
Per le struct
http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTAX/struct.html

In C (non C++), le array sono il termine inglese di matrici es.
a[20]
b[10][10]

biggestopolino
25-08-2005, 07:52
sisi, ma per gli array volevo sapere se si trovano guide spiegate in modo semplice, perchè io sto usando il deitel & deitel e il capitolo occupa un 25 pagine e non è spiegato alla meraviglia :muro:

RaouL_BennetH
25-08-2005, 14:31
Uhm,il deitel & deitel secondo me invece lo spiega in maniera molto particolareggiata,almeno per me è stato abbastanza chiaro nello spiegare gli array.

Provo a fare una spiegazione sintetica di cosa sia un array(matrice):

Quando tu dichiari una variabile,prenoti uno spazio nella memoria adatto a contenere esattamente la dimensione della variabile stessa,con la particolarità che sebbene la dimensione venga "prenotata" in maniera precisa,l'indirizzo di memoria al quale questa variabile viene assegnata non è prevedibile; es:


int var ;

Saranno allocati 4 byte(su altri sistemi potrebbero essere anche 2) per questa variabile "var" all'indirizzo di memoria 1000(per esempio).Questa variabile quindi occuperà la memoria a partire dall'indirizzo 1000 fino all'indirizzo 1003.

Immagina quindi di voler calcolare le spese mensili e di fare un totale annuo:

float spese_gennaio;
float spese_febbraio;
float spese_marzo;

etc....etc...


In questo caso,sarebbe meglio "raggruppare" tutte le variabili float in un "unico contenitore" adatto a contenere esattamente la dimensione delle nostre variabili:

float spese[12] ;

In questo caso,abbiamo appunto dichiarato un array "spese" di tipo float composto da 12 elementi di tipo float che sono numerati da 0 a N-1,o più semplicemente, nel nostro caso da 0 a 12-1 quindi da 0 a 11 e questo perchè l'indice più basso di un array è sempre 0.

In questo semplice esempio,non trova posto però il totale della somma dei 12 mesi perchè sarebbe il 13 elemento,quindi,si potrebbe dichiarare un array più grande adatto a contenerlo anzichè un'altra variabile: float totale;
In modo da avere:

float spese[13];

Per usare delle parole molto semplici,io immagino un array come un casellario in cui gli elementi singoli(ma sempre dello stesso tipo)vengono contenuti in un semplice ordine numerico.

biggestopolino
25-08-2005, 16:10
---------------------
#include <stdio.h>

main () {
int n[10]={32,27,64,18,95,14,90,70,60,37};
int i;

for(i=0;i<=9;i++)
n[i]=0;

printf("%s%13s\n","Elemento","Valore");
for(i=0;i<=9;i++)
printf("%7d%13d\n",i,n[i]);

system("pause");
return 0;
}

-------------------------
questo è un programma copiato dal deitel, che dovrebbe visualizzare due colonne, una con il titolo "elemento", l'altra "valore".
stando al libro nella prima colonna dovrebbero essere presenti i valori da 0 a 9 (i valori di "i").
nella seconda dovrebbero comparire i valori 32,27,64,18,95 ecc.
torna tutto tranne che nella seconda colonna compaiono solo degli zeri.
dove sta il problema?
un'altra cosa:
nella stringa
printf("%7d%13d\n",i,n[i]);
compare n[i]
come lo devo interpretare? cosa viene interpretato dal programma questo comando? :help:

RaouL_BennetH
25-08-2005, 16:23
---------------------
#include <stdio.h>

main () {
int n[10]={32,27,64,18,95,14,90,70,60,37};
int i;

for(i=0;i<=9;i++)
n[i]=0;

printf("%s%13s\n","Elemento","Valore");
for(i=0;i<=9;i++)
printf("%7d%13d\n",i,n[i]);

system("pause");
return 0;
}

-------------------------
questo è un programma copiato dal deitel, che dovrebbe visualizzare due colonne, una con il titolo "elemento", l'altra "valore".
stando al libro nella prima colonna dovrebbero essere presenti i valori da 0 a 9 (i valori di "i").
nella seconda dovrebbero comparire i valori 32,27,64,18,95 ecc.
torna tutto tranne che nella seconda colonna compaiono solo degli zeri.
dove sta il problema?
un'altra cosa:
nella stringa
printf("%7d%13d\n",i,n[i]);
compare n[i]
come lo devo interpretare? cosa viene interpretato dal programma questo comando? :help:


Il comportamento che ti da i valori della seconda colonna a zero è normale in quanto sono stati tutti inizializzati a zero da:

for (i = 0; i < 9; i++)
n[i] = 0; /*tutti gli indici dell'array qui vengono messi a zero*/

per la printf, quel n[i] dice appunto di stampare ogni singolo indice dell'array "n".

Per ottenere questo:

./fo
Elemento Valore
0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37




devi solo ragionare un pochettino sul codice da te postato ;)

Altra cosa:
benchè in molti libri e guide troverai una notazione della main() così:

main()
etc....etc...

sappi che lo standard attuale vuole che la main ritorni sempre un int,quindi tu scrivila sempre:

int main()

biggestopolino
25-08-2005, 17:18
si ho notato che inizializzando n[i]=0 infatti porta tutto a zero, quindi provando con n[i]=10 ovviamente portava tutto a 10, poi provando ad eliminare l'inizializzazione va a scrivere 10 volte "elemento" e "valore", allora ho pensato di inizializzare n[i] dicendo che n[i]=n[i], e quindi deve essere uguale ai valori che avevo inserito in precedenza.
e in effetti così il programma ha girato, sono andato vicino alla soluzione del problema? :rolleyes:

GioVesas
25-08-2005, 17:23
fuochino

biggestopolino
25-08-2005, 17:43
:confused:

cdimauro
26-08-2005, 10:02
Altra cosa:
benchè in molti libri e guide troverai una notazione della main() così:

main()
etc....etc...

sappi che lo standard attuale vuole che la main ritorni sempre un int,quindi tu scrivila sempre:

int main()
Sicuro? Se la memoria non m'inganna, il tipo di default è l'int, e non è necessario specificarlo come valore di ritorno di una funzione.

RaouL_BennetH
26-08-2005, 12:11
Sicuro? Se la memoria non m'inganna, il tipo di default è l'int, e non è necessario specificarlo come valore di ritorno di una funzione.

Per la main dev'essere sempre un int per lo standard C.

questi sono due esempi dichiarando la main void e poi int:


#include <stdio.h>

void main() {

printf("sono pippo\n");

}


Compilando con gcc e l'opzione -Wall per i warning mi dice:


gcc -Wall pippo.c
pippo.c:3: warning: return type of 'main' is not 'int'


se provo a non specificare niente:


#include <stdio.h>
main() {
printf("sono sempre pippo\n");
}


al solito, il compilatore come warning mi restituisce:


gcc -Wall pippo.c
pippo.c:3: warning: return type defaults to 'int'
pippo.c: In function 'main':
pippo.c:6: warning: control reaches end of non-void function


Ovviamente, se ci piazzo int main, nessun messaggio di warning e gcc è contento :D

biggestopolino
26-08-2005, 14:33
fuochino

non mi avete ancora detto come era il comando esatto :)

GioVesas
26-08-2005, 14:46
Quello che hai fatto non é sbagliato, ma semplicemente inutele: hai ricopiato un pezzo di memoria su se stessa.
La cosa corretta è semplicemente non fare quel ciclo for.

main () {
int n[10]={32,27,64,18,95,14,90,70,60,37};
int i;
/*
for(i=0;i<=9;i++)
n[i]=m[i];
*/

printf("%s%13s\n","Elemento","Valore");
for(i=0;i<=9;i++)
printf("%7d%13d\n",i,n[i]);

system("pause");
return 0;
}

In alternativa:

main () {
int m[10]={32,27,64,18,95,14,90,70,60,37};
int n[10];
int i;

for(i=0;i<=9;i++)
n[i]=m[i];

printf("%s%13s\n","Elemento","Valore");
for(i=0;i<=9;i++)
printf("%7d%13d\n",i,n[i]);

system("pause");
return 0;
}

cioè copi una matrice su un'altra.

biggestopolino
27-08-2005, 13:44
ti ringrazio, anche perchè io stesso non capivo perchè dovessi riscrivere 2 volte il for..
infatti quell'esercizio, copiato dal libro, non funzionava :p

cdimauro
27-08-2005, 20:19
Per la main dev'essere sempre un int per lo standard C.
E' un int in generale, se non lo specifichi... ;)
questi sono due esempi dichiarando la main void e poi int:


#include <stdio.h>

void main() {

printf("sono pippo\n");

}


Compilando con gcc e l'opzione -Wall per i warning mi dice:


gcc -Wall pippo.c
pippo.c:3: warning: return type of 'main' is not 'int'

E' chiaro, perché per convenzione main deve tornare un int.
se provo a non specificare niente:


#include <stdio.h>
main() {
printf("sono sempre pippo\n");
}


al solito, il compilatore come warning mi restituisce:


gcc -Wall pippo.c
pippo.c:3: warning: return type defaults to 'int'
pippo.c: In function 'main':
pippo.c:6: warning: control reaches end of non-void function

OK, ma il warning dice una cosa giusta: non essendoci il tipo, di default assume che sia int. ;)
Ovviamente, se ci piazzo int main, nessun messaggio di warning e gcc è contento :D
Sì, ma tu prova a compilare senza warning, sennò non vale... :p

RaouL_BennetH
27-08-2005, 21:46
Sì, ma tu prova a compilare senza warning, sennò non vale... :p


lol :D