NGI.Home > Forum
  EOLO HOME  OFFERTE INTERNET WIRELESS EOLO  FORMULA ADSL
   
   
WEBMAIL
   
 
  > Register  
  > FAQ  
  > Members List  
 
  > Calendar  
  > Today's Posts  
   
 

Go Back   NGI Forum > Tech & Tech > Developer's Zone

Reply
 
Thread Tools Rate Thread
Old 16th December 2010, 11:18   #1
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
[Impariamo il C] Lezione 10

Buongiorno.

Nelle puntate precedenti del corso collaborativo di programmazione:
  1. installazione dell'IDE, cenni di architettura degli elaboratori
  2. sintassi del C, programmazione strutturata
  3. ancora sulla sintassi, i tipi di dato, le variabili
  4. variabili parte seconda: gli array
  5. introduzione delle funzioni
  6. operatori aritmetici e logici
  7. costrutti di selezione
  8. costrutti di iterazione
  9. ancora sull'iterazione
In questo capitolo:
  • array multipli
  • strutture dati avanzate

Array multipli

Negli ultimi esercizi abbiamo visto come iterazioni e array vadano a braccetto. Ci fa comodo strutturare i dati in sequenze di blocchi, da poter ravanare per poter fare le nostre considerazioni su di essi (l'esempio dell'isolamento del codone di start). Piuttosto che avere mille variabili da utilizzare, ne usiamo una con un indice.

Tuttavia, non sempre una sequenza si presta bene a rappresentare un problema. Pensiamo, ad esempio, alle parole crociate. Se volessimo programmare il seguente schema



con un array come potremmo fare? potremmo utilizzare

un array lungo 5*5 = 25 caratteri, e dire che

da schema[0] a schema[4] č la prima riga
da schema[5] a schema[9] č la seconda
...
da schema[20] a schema[24] č l'ultima

In sostanza, per accedere alla cella (i,j) - ovvero riga i, colonna j - dovremmo accedere a schema[(i-1)*5+(j-1)].

Anche con un esempio cosģ semplice, la formula di lookup si fa gią antipatica. Salendo con le dimensioni (pensiamo ad una texture tridimensionale), magari di grandezza diversa, la faccenda sfugge di mano.


Il C ci viene incontro con gli array multidimensionali, una notazione estesa che "maschera" all'utente la formula di lookup, calcolandola per noi.

Ecco la sintassi per creare lo schema delle parole crociate:

Code:
char schema_2D[5][5];
Se decidessimo di implementare gli spazi neri usando il carattere "_", permetterne il primo in alto dovremmo fare

Code:
schema_2D[1][3] = "_";
Ricordate: in informatica si conta da zero, quindi la seconda riga č la 1, e la quarta colonna č la 3.


Naturalmente, potete creare array di qualunque dimensione aggiungendo altre quadre e costanti numeriche all'atto della dichiarazione.


Esercizio 1: create un array bidimensionale contenente lo schema completato delle parole crociate. Usate "_" come segnaposto dei blocchi neri. Scrivete una funzione stampa a video lo schema completo.

Esercizio 2 (difficile): implementare le parole crociate.


Strutture dati avanzate

Abbiamo visto la potenza degli array multidimensionali. Alle volte, perņ, i nostri dati non sono strutturabili nemmeno con blocchi di memoria di questo tipo.

Una prima limitazione, ad esempio, č che l'array č tutto dello stesso tipo di dato (nelle parole crociate sono tutti caratteri), mentre talvolta i dati sono strutturati in maniera pił complessa.

Ad esempio, se volessimo fare un array di CD musicali, ogni CD possiede diverse caratteristiche:
  • titolo (stringa)
  • anno_di_pubblicazione (numero naturale)
  • nome_band (stringa)
  • genere (stringa)
una soluzione potrebbe essere realizzare quattro array diversi, uno per ogni aspetto (un array per i titoli, uno per l'anno, eccetera.

Funziona, non c'č dubbio. Perņ č disagevole. Pensiamo ad una funzione che deve modificare un album, che parametri dovremmo passargli? Pseudocodice:

Code:
funzioneaggiornamento( arraytitoli, arrayanni, arrayband, arraygenere )
...
mentre sarebbe molto pił strategico fare qualcosa tipo

Code:
funzioneaggiornamento( arraydischi )
...
e maneggiare direttamente l'elemento i-esimo dell'array di dischi, agendo sui singoli campi di interesse (titolo, anno, ecc). Questa cosa č possibile con le struct.

Vediamo la sintassi; occhio perché sono fondamentali, ma sono anche un po' tricky.

Code:
struct nome_struttura {
  tipo_dato nome_campo;
  ...
};
La sintassi "tipo_dato nome_campo" dovrebbe esserci nota: č la stessa sintassi della dichiarazione di variabile.

La struct non dichiara davvero una variabile, non potremo utilizzarla nel nostro codice. Semplicemente dice "la mia struttura ha questo campo, che immagazzina dati di questo tipo". Si osservi anche anche gli array sono tipi validi.

Tornando al nostro esempio dei CD, potremmo creare una struttura dati cosģ fatta:

Code:
struct CD {
   char titolo[20];
   unsigned int anno_pubblicazione;
   char nome_band[20];
   char genere[20];
};
A questo punto, posso utilizzare la struttura CD per dichiarare finalmente una variabile:

Code:
struct CD  singoloCD;
avrņ quindi una variabile singoloCD, ai cui campi posso accedere usando il punto ".". Esempio:

Code:
singoloCD.anno_pubblicazione = 1999;
...
printf("Anno: %d\n", singoloCD.anno_pubblicazione);   // stampa "Anno: 1999"
Concludendo (per ora) l'argomento struct, č possibile dichiarare degli array di struct con la solita sintassi a base di quadre:

Code:
struct CD  elencoCD[100];
...
elencoCD[123].anno_pubblicazione = 2010;
Esercizio 3: creare una struttura che modelli un "libro"; creare un archivio di libri con un array di strutture di questo tipo. I libri devono essere letti dall'utente.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arėsius; 16th December 2010 at 17:27.
Arėsius is offline   Reply With Quote
Old 16th December 2010, 12:58   #2
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
figata le struct!
ora devo andare in uni, quando torno vedo cosa riesco a fare con gli esercizi (anche se dubito di essere in grado...)
posso osare di chiedere una cosa?
al posto che sparare e lezioni una dietro l'altra ogni giorno...
puoi aspettare un giorno tra una e l'altra?
magari dando 4 o 5 esercizi in ognuna cosģ uno si allena bene e le informazioni "sedimentano" meglio...
č solo un consiglio da parte mia, magari sono io cerebroleso che non riesco a star bene dietro...
__________________
•• |||||||||| SoundCloud
La mia č una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 16th December 2010, 13:00   #3
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
certamente!
mi sa che ho una percezione sbagliata dei vostri ritmi di apprendimento, mi pare che siate perfettamente a pari con gli esercizi e con la comprensione degli argomenti

ora sto aspettando esattamente 24 ore tra una lezione e l'altra, raddoppio il tempo.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 16th December 2010, 13:19   #4
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Arėsius View Post
certamente!
mi sa che ho una percezione sbagliata dei vostri ritmi di apprendimento, mi pare che siate perfettamente a pari con gli esercizi e con la comprensione degli argomenti

ora sto aspettando esattamente 24 ore tra una lezione e l'altra, raddoppio il tempo.
probabilmente il fatto non č tanto il tempo di apprendimento, ma magari uno ha tutta la giornata a lavorare o in universitą o dove devono essere e vede giusto il thread alla sera e puņ non aver voglia di mettersi lģ o le forze o che ne so.... credo che dare un respiro pił "rilassato" sia pił produttivo...

č probabile anche che io stia sparando cazzate.

invece č sicuro che arrivo tardi a lezione.... perņ quando c'č una cosa che non funge nel mio pc mi impunto e perdo la concezione del tempo
__________________
•• |||||||||| SoundCloud
La mia č una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 16th December 2010, 13:20   #5
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
vado a lezione anch'io

a pił tardi
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 16th December 2010, 14:45   #6
Pier4R
Ex falso quodlibet
 
Pier4R's Avatar
 
Join Date: Jul 2004
Location: equgpbc.r2.Frisia
Posts: 18,664
__________________
Ngi the e.FlameeXperience • • • .Fe • • • ! • • • ngi.agorą@twitter (sottoscrivi per essere incluso)
You must play online: warSow • • • EnemyTerritory + etpro • • • quake 4 + q4max & quake 3 + cpma & quakelive • • • Teeworlds! • • • hoi2series

Ringrazio i grammar nazi che mi fanno comprendere gli errori ; my.IL
; lettere porno
Pier4R is offline   Reply With Quote
Old 16th December 2010, 20:43   #7
nanomad
Dietro le sbarre
 
nanomad's Avatar
 
Join Date: Apr 2005
Location: Papia (olim Ticinum)
Posts: 5,221
Lezioni 9 e 10 disponibili sul wiki.

Sarebbe carino che un mod facesse uno sticky, ma vabbe'....
__________________
Rivuoi i video nel forum? Usa questa estensione (chrome)
Source & firefox version
"(...) the three great virtues of a programmer: laziness, impatience, and hubris." -- LarryWall
nanomad is offline   Reply With Quote
Old 16th December 2010, 22:19   #8
.Z.
fork()
 
.Z.'s Avatar
 
Join Date: Jan 2002
Location: Bologna
Posts: 13,461
Cosa intendi esattamente con "i libri devono essere letti dall'utente"?
__________________
And for any day that stings, two better days it brings.
Nothing is as bad as it seems.
.Z. is offline   Reply With Quote
Old 17th December 2010, 11:14   #9
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
il programma chiede in input all'uente i dati dei libri, e li riversa nei campi della struct
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 17th December 2010, 11:28   #10
[En][gma]
Registered User
 
[En][gma]'s Avatar
 
Join Date: Dec 2001
Posts: 2,867
sono ancora alla 8 ((((((((((

edit:
volevo dire alla 7
__________________
.: NoS - Nitrous Oxide System :.

Last edited by [En][gma]; 17th December 2010 at 11:29.
[En][gma] is offline   Reply With Quote
Old 17th December 2010, 11:40   #11
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
non c'č fretta ragazzi ^^
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 17th December 2010, 15:26   #12
[En][gma]
Registered User
 
[En][gma]'s Avatar
 
Join Date: Dec 2001
Posts: 2,867
ok sono arrivato a questa lezione ma, a parte il primo esercizio che prevede solo di scrivere delle cose gią conosciute...

non ho capito la seconda consegna
Esercizio 2 (difficile): implementare le parole crociate.
cioč?

e per l'esercizio 3 intendi fare quanto hai spiegato poco sopra ma relativo ad un libro?
e poi si vuole che richiesto un libro ne escano i dati?
o bisogna memorizzarli prima e poi richiamarli? ^^
__________________
.: NoS - Nitrous Oxide System :.
[En][gma] is offline   Reply With Quote
Old 17th December 2010, 16:08   #13
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
la prima consegna in realtą richiede tre cose

0) risolvere le parole crociate dell'esempio
1) creare un array bidimensionale
2) riempirlo (con una strategia furba!) con le risposte corrette e i quadrati neri.

cosa intendo per furba? eviterei una roba tipo

a[0][0]='p';
a[0][1]='a';
...

e cosģ via



L'esercizio 2 č molto libero: avete tutti gli strumenti per implementare un gioco di parole crociate in C.

Chiaramente č un compito oneroso, anche solo disegnare l'interfaccia con l'utente vi potrebbe portare via tempo, dovete pensare a tutto quello che dovete gestire, eccetera. Non siete obbligati (ovvio ), ma č un esercizio istruttivo su come utilizzare gli array multidimensionali.


L'esercizio 3 č molto libero; l'importante č che realizzate la struct di un libro, ne fate un array e poi inserite/leggete dei dati. Fatelo come preferite. ^^
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arėsius; 17th December 2010 at 17:04.
Arėsius is offline   Reply With Quote
Old 17th December 2010, 17:11   #14
[En][gma]
Registered User
 
[En][gma]'s Avatar
 
Join Date: Dec 2001
Posts: 2,867
ma disegnare l'interfaccia che intendi?
perché a parte usare printf(); nudo e crudo non mi sembra di ricordare che sia stato spiegato qualcosa...
ad esempio..almeno un "refresh"/"clear" della console...

o devo cercare su gugol per conto mio?
__________________
.: NoS - Nitrous Oxide System :.
[En][gma] is offline   Reply With Quote
Old 17th December 2010, 18:00   #15
meL
Nab with the man around
 
meL's Avatar
 
Join Date: Jun 2008
Location: VI / PD
Posts: 224
system("cls");

disegnarla tipo cosi credo
Code:
+ - + - + - +
| A |   |   |
+ - + - + - +
l'avevo usata a suo tempo per fare forza 4...
non ce l'ho pił cavoli
__________________
"Beware of bugs in the above code;
I have only proved it correct, not tried it."

Donald Ervin Knuth

meL is offline   Reply With Quote
Reply

Bookmarks

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 21:29.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright 1998-2014 by NGI SpA