Skillbook Logo
foto profilo

Skill Factory

Lista post > Laboratori di Logica di Programmazione in C- Lezione 2

Laboratori di Logica di Programmazione in C- Lezione 2

Gino Visciano | Skill Factory - 13/03/2018 00:04:18 | in Tutorials

Benvenuti alla Lezione 2, nella lezione precedente abbiamo visto l'utilizzo del Contatore e del Totalizzatore, in questa lezione vediamo i gli Array e le Strutture.

ARRAY
Un Array se è monodimensionale si chiama Vettore, se è bidimensionale si chiama Matrice. Per puntare ad un elemento di un Array si usano gli indici, valori numerici progressivi  che permettono di assegnare oppure leggere i valori degli elementi. Gli indici iniziano sempre da zero.
 

Fig. 1 Vettore e Matrice di interi

 

COME SI POPOLA UN VETTORE
Popolare un vettore significa assegnare un valore a tutti i suoi elmenti. Ogni elemento di un vettore corrisponde ad un progressivo numerico chiamato indice.
Se gli elementi del vettore sono n, i valori dell'indice andranno da 0 ad n-1, come mostra l'esempio seguente:

Fig.2 Assegnazione del valore 10 al primo elemento del vettore v (v[0] -> leggi: v di 0)

 

int v[5]; //Dimensionamento Vettore
v[0]=10;
v[1]=20;
v[2]=5;
v[3]=60;
v[4]=30;

 

COME SI POPOLA UNA MATRICE
Per popolare gli elementi di una matrice servono due indici, uno di riga ed uno di colonna, come mostra l'esempio seguente:

Fig.3 Assegnazione del valore 20 al primo elemento della matrice m (m[0][0] -> leggi: m di 0 di 0)

int m[5][3]; //Dimensionamento Matrice
m[0][0]=20;
m[0][1]=80;
m[0][2]=10;
m[1][0]=40;
m[1][1]=10;
m[1][2]=85;
m[2][0]=5;
m[2][1]=20;
m[2][2]=60;
m[3][0]=70;
m[3][1]=50;
m[3][2]=35;
m[4][0]=10;
m[4][1]=90;
m[4][2]=25;
 

La struttura di programmazione più adatta per gestire gli Array è il ciclo for, come mostrano gli esempi seguenti:

Esempio 1

int main() {
    int v[5];
    int i=0;
    v[0]=10;
    v[1]=20;
    v[2]=30;
    v[3]=40;
    v[4]=50;
    for(i=0;i<5;i++){
        printf("%i\n",v[i]);
    }
    return(0);
}

Esempio 2

int main() {
    int r=0; // Indice di riga
    int c=0; // Indice di colonna
    int m[5][3];
    m[0][0]=20;
    m[0][1]=80;
    m[0][2]=10;
    m[1][0]=40;
    m[1][1]=10;
    m[1][2]=85;
    m[2][0]=5;
    m[2][1]=20;
    m[2][2]=60;
    m[3][0]=70;
    m[3][1]=50;
    m[3][2]=35;
    m[4][0]=10;
    m[4][1]=90;
    m[4][2]=25;
     for(r=0;r<5;r++) {
        for(c=0;c<3;c++){
            printf("%i ",m[r][c]);
        }
        printf("\n");
     }
    return 0;
}

COME SI RIEMPIE UN VETTORE D'INTERI USANDO LA TASTIERA
Per inserire i numeri da tastiera dovete usare la funzione scanf, %d indica che inserirete cifre.
Il simbolo &, che precede v[i], permette di passare alla funzione scanf l'indirizzo dell'elemento i del vettore v dove  verrà inserito il numero digitato.
L'attributo v.length corrisponde al numero di elementi presenti nel vettore v.

#define len(v) (sizeof(v)/sizeof(v[0]))

Esempio 3

/*
#define definisce la funzione len che indica il numero di elementi del vettore v.
sizeof(v)->numero di byte occupato dal vettore v;
sizeof(v[0])->numero di byte occupato da un elemento del vettore v;

*/
#define len(v) (sizeof(v)/sizeof(v[0]))
int main(){
int v[3];
int i;
for(i=0;i<len(v);i++) {
      printf("inserire valore %d:",i+1);
      scanf("%d",&v[i]);
}
printf("---------------------\n");
for(i=0;i<len(v);i++) {
     printf("valore %d:%d\n",i+1,v[i]);
}
return(0);
}

 

COME SI USANO I VETTORI PER INSERIRE STRINGHE DI CARATTERI

Una stringa è un insieme di caratteri, come ad esempio un nominativo oppure un indirizzo.
In C il tipo stringa non esiste, quindi per momorizzare un'informazione composta da caratteri dovete usare un vettore di char, aggiungendo come ultimo carattere il simbolo '\0', detto tappo.

Ad esempio per memorizzare il nome "Mario" dovete procedere nel modo seguente:

Esempio 4

int main() {
char nome[6];
nome[0]='M';
nome[1]='a';
nome[2]='r';
nome[3]='i';
nome[4]='o';
nome[5]='\0';
printf("Nome:%s",nome);
return(0);
}

Il simbolo %s visualizza nella posizione in cui viene inserito il valore del vettore nome che corrisponde ad una stringa.
Attenzione il valore '\0' è importante altrimenti il compilatore non riesce a capire dove finisce la sequenza di caratteri della stringa.
Senza tappo, per visualizzare il contenuto del vettore dovete usare un ciclo for, come mostra l'esempio seguente:

Esempio 5

int main() {
int i;
char nome[5];
nome[0]='M';
nome[1]='a';
nome[2]='r';
nome[3]='i';
nome[4]='o';
printf("Nome:");
for(i=0;i<5;i++){
    printf("%c",nome[i]); /* %c -> visualizza un valore di tipo char nella posizione in cui viene inserito) */
}
return(0);
}

Come creare un elenco di stringhe

Esempio 6

int main(){
int i;
char nominativi[3][50]={"Mario","Fabio","Paolo"};
for(i=0;i<3;i++){
    printf("%d)Nome:%s\n",i+1,nominativi[i]);
}
return(0);
}

Esempio 7

int main(){
int i;
char nominativi[3][50];
nominativi[0]="Mario";
nominativi[1]="Fabio";
nominativi[2]="Paolo";
for(i=0;i<3;i++){
    printf("%d) Nome:%s\n",i+1,nominativi[i]);
}
return(0);
}

Esempio 8

int main(){
int i;
char nominativi[3][50];
for(i=0;i<3;i++){
    printf("Nome %d:",i+1);
    gets(nominativi[i]);
}
printf("-----------------------------\n");
for(i=0;i<3;i++){
    printf("%d) Nome:%s\n",i+1,nominativi[i]);
}
return(0);
}

 

COME CREARE UNA MATRICE CHE CONTIENE LA TABELLINA DEL 15

Esempio 9

int main(){
int riga,colonna,x=0,y=0;
int tabellina[15][15];
for(riga=0;riga<15;riga++){
   x=riga+1;
   for(colonna=0;colonna<15;colonna++){
        y=colonna+1;
        tabellina[riga][colonna]=x*y;
   }
}
for(riga=0;riga<15;riga++){
   for(colonna=0;colonna<14;colonna++){
        printf("%d, ",tabellina[riga][colonna]);
   }
  printf("%d\n",tabellina[riga][colonna]);
}
return(0);
}
 


COME CREARE UNA MATRICE CHE CONTIENE I CODICI ASCII DEI CARATTERI
Il Codice ASCII (American Standard Code for Information Interchange - Codifica Americana Standard per lo Scambio d'Informazioni) è la tabella che contiene i codici numerici dei 256 caratteri usati per la comunicazione digitale.
Per creare la matrice che contiene il formato decimale dei  codici ASCII ed i caratteri corrispondenti, utilizziamo le seguenti dimensioni 32 righe x 8 colonne = 256 caratteri.
La variabile offset serve per ottenere il conteggio progressivo per riga, mentre la stringa spazi viene usate per allineare in colonna i numeri decimali ed i caratteri corrispondenti.
Per ottenere le sequenze progressive codice/carattere basta usare all'interno della funzione printf i simboli %d e %c.
Per evitare problemi di visualizzazione e necessario non stamapre i caratteri speciali corrispondenti ai codici:

7=BELL (Suono);
8=BACKSPACE(Cancella carattere a sinistra del cursore);
9=HORIZONTAL TAB(Sposta il cursore di n caratteri, corrisponde al carattere:'\t');
10=LINE FEED(Nuova riga, corrisponde al carattere:'\n');
11=VERTICAL TAB(Inizio schermo, Home);
12=FORM FEED (Pagina seguente);
13=CARRIAGE RETURN(Sposta il cursore ad inizio riga, corrisponde al carattere:'\r').

Esempio 10

int main(){
int riga,colonna,codice,offset,x=0,y=0;
char spazi[5];
int codici[32][8];
for(riga=0;riga<32;riga++){
   offset=riga*8;
   for(colonna=0;colonna<8;colonna++){
        codici[riga][colonna]=colonna+offset;
   }
}
printf("-------------------- TABELLA DEI CODICI ASCII --------------------\n");
for(riga=0;riga<32;riga++){
   for(colonna=0;colonna<8;colonna++){
        codice=codici[riga][colonna];
        if(codice<10){
            strcpy(spazi,"   ");
        } else if (codice>9 && codice<100){
            strcpy(spazi,"  ");
        } else {
            strcpy(spazi," ");
        }
        if(!(codice==7 || codice==8  || codice==9 || codice==10 || codice==11 || codice==12 || codice==13)){
           printf("<%d>%s%c ",codice,spazi,codice);
        }else {
           printf("<%d>%s%s ",codice,spazi," ");
        }
   }
    printf("\n");
}
return(0);
}

 

STRUTTURE
Le Strutture in C sono modelli che permettono di creare strutture di dati composte da più variabili. Sono molto utili perché riducono i tempi di sviluppo e migliorano l'organizzazione delle applicazioni.
Nell'esempio seguente possiamo vedere come si crea una struttura per memorizzare i dati delle persone:

struct Persona {
      char nome[30];
      char cognome[30];
      int eta;
     char sesso[2];
}

Per utilizzare la struttura appena creata dovete dichiarare un variabile di riferimento, come mostra l'esempio seguente:

Persona persona;

Utilizzando la variabile di riferimeno appena creata, potete usare le variabili della struttura, come mostra l'esempio seguente:

persona.nome="Mario";
persona.cognome="Rossi";
persona.eta=30;
persona.sesso="M";

Nelle variabili di riferimento c'è l'indirizzo di memoria dove vengono allocate le variabili della struttura.

Nell'esempio seguente, con typedef, definiamo un tipo di dato che corrisponde ad una struttura e lo chiamiamo Persona.
Successivamente dichiariamo una variabile strutturata di tipo Persona e la usiamo per memorizzare i dati della persona.

Esempio 11

typedef struct {
      char nome[30];
      char cognome[30];
      int eta;
     char sesso[2];
} Persona;
int main(){
   char input[50];
   Persona persona;
   printf("Nome:");
   gets(persona.nome);
   printf("Cognome:");
   gets(persona.cognome);
   printf("Eta':");
   gets(input);
   persona.eta=atoi(input);
   printf("Sesso:");
   gets(persona.sesso);
   puts("----- PERSONA -----");
   puts(persona.nome);
   puts(persona.cognome);
   puts(itoa(persona.eta,input,10));
   puts(persona.sesso);
   return(0);
}

 

Nell'esempio seguente utilizziamo l'Array persone di tipo Persona per inserire 3 persone. 

Esempio 12

typedef struct {
      char nome[30];
      char cognome[30];
      int eta;
     char sesso[2];
} Persona;
   int main(){
   int x;
   char input[50];
  Persona persone[3];
  for(x=0;x<3;x++){
      printf("Persona %d\n",x+1);
      printf("Nome:");
      gets(persone[x].nome);
      printf("Cognome:");
      gets(persone[x].cognome);
      printf("Eta':");
      gets(input);
      persone[x].eta=atoi(input);
      printf("Sesso:");
     gets(persone[x].sesso);
}
   puts("----- PERSONE -----");
   for(x=0;x<3;x++){
      printf("Persona %d\n",x+1);
      puts(persone[x].nome);
      puts(persone[x].cognome);
      puts(itoa(persone[x].eta,input,10));
      puts(persone[x].sesso);
   }
   return(0);
}

 

array strutture vettori matrici codice ascii logica di programmazione linguaggio c programmare

Share Button
TOP