Linguaggio C

Transcript

Linguaggio C
Linguaggio C - Array
Array:
Gli array o vettori sono delle strutture dati in grado di contenere un insieme di valori tutti dello stesso tipo. Un array lo
possiamo immaginare come un contenitore suddiviso in tante caselle quanti sono i dati da memorizzare. Ogni
elemento dell’array è identificato da un indice, ovvero un numero intero che specifica la posizione dell’elemento
all’interno del vettore. Gli indici vanno da 0 al numero totale degli elementi meno uno.
La lunghezza dell’array indica il numero di elementi contenuti.
Sintassi: tipo nome_array[num_elementi]
es.: int a[5];
a
indici:
0 1
2
3 4
Gli elementi vengono indirizzati nella seguente maniera: nome_array[indice]
a[2] = 5; a[0]= 8; a[1]=-3
8
-3
5
int x = a[0] + a[2]; // x vale 13
Nota: Fare attenzione che l’indice non vada fuori range [0, lenght-1] :
es. a[5] o a[8] : Il compilatore non da errore => comportamento imprevedibile in esecuzione.
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Array
Inizializzazione dei vettori:
In fase di definizione:
int b[] = {2, -2, 34, 0, 3, 23, 1};
// dim = numero dei valori specificati
Con un ciclo: for(i=0; i<5; i++) a[i]=0;
Oppure possiamo caricare i valori da tastiera:
int i, a[5];
for (i = 0; i < 5; i++){
printf("Inserisci un intero: ");
scanf("%d", &a[i]);
// si noti &
}
Nota: Ogni elemento del vettore a[i] va considerato al pari di una variabile.
Copia di vettori:
la copia tra due array avviene elemento per elemento;
forma corretta:
errore:
for(i=0;i<dim_a; i++) b[i]=a[i];
b[] = a[]; oppure
b=a;
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Array
#include <stdio.h>
#define MAX_CONC 100 // Num. MAX CONCORRENTI
main()
{
/* definiamo 3 vettori */
float prova1[MAX_CONC], prova2[MAX_CONC];
float media [MAX_CONC];
/* si noti l’allocazione statica dei vettori
indipendente dal numero reale di partecipanti */
int i, n;
do { // n deve essere tra 1 e MAX_CONC
printf("Inserire numero dei partecipanti: ");
scanf("%d", &n);
} while ((n < 1) || (n > MAX_CONC));
/* Inserimento punteggi */
for (i=0; i < n; i++){
printf("\nConcorrente %d\n",i+1);
printf("Risultato prima prova: ");
scanf("%f", &prova1[i]);
printf("Risultato seconda prova: ");
scanf("%f", &prova2[i]);
}
/* calcolo media dei punteggi */
for (i=0; i < n; i++) media[i]=(prova1[i] + prova2[i])/2;
/* stampa classifica */
for (i=0; i < n; i++) {
printf("%f\t", prova1[i]);
printf("%f\t", prova2[i]);
printf("%f\n", media [i]);
}
}
Esercizi:
- Ricerca del massimo/minimo in un array e restituzione del valore e della posizione (indice).
- Somma incrociata tra due vettori.
- Verifica della presenza di duplicati in un array.
- Ordinamento degli elementi di un array (bubble sort , selection sort).
- Ricerca binaria con array ordinati.
- Fusione di due vettori ordinati/non ordinati in un terzo vettore.
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Array
Array bidimensionali (matrici)
In un array bidimensionale i valori sono organizzati per righe e colonne ( come una tabella )
sintassi: tipo nome_array[n][m]
es.: int matrice[5][5];
float mat[10][20];
Ogni elemento è individuato da un doppio indice ; il primo indica la riga (compreso tra 0 e n-1),
il secondo la colonna (compreso tra 0 e m-1):
• matrice[0][3] : elemento della prima riga 4 colonna.
• matrice[4][1] : elemento della quinta riga seconda colonna.
Array multidimensionali:
sintassi: tipo nome_array[dim1][dim2] …. [dimn]
esempio:
Per memorizzare i ricavi ottenuti dalla vendita di 10 prodotti in 5 punti vendita nei dodici mesi dell’anno potremmo
definire una matrice tridimensionale:
int ricavi[10][5][12]
es.: ricavi[2][4][10] cosa indica?
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Array
Inizializzazione o caricamento dei valori nelle matrici:
nella definizione: int matrice[2][3] = { { 0, 2, 3 }, { -2, 5, 9 } }
oppure:
int matrice[2][3] = { 0, 2, 3, -2, 5, 9 }
0
2
3
-2
5
9
È permesso:
0
2
3
-2
0
0
int a[2][3] = { { 0, 2, 3}, { -2} }
int a[2][3] = { {0} } // tutti i valori a zero.
Caricamento della matrice da tastiera:
#include <stdio.h>
int main(){
int i, j, mat[4][3];
printf("\n\nCaricamento della matrice\n\n");
for(i = 0; i < 4; i++)
for(j = 0; j < 3; j++){
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &mat[i][j]);
}
printf("\n\nVisualizzazione: \n\n");
for(i = 0; i < 4; i++){
printf("\n");
for(j = 0; j < 3; j++) printf("%d\t", mat[i][j]);
}
return 0;
}
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Array
Esercizi:
- Date due matrici a[n][p] e b[p][m] scrivere un programma in C che faccia il prodotto delle matrici.
p
c[i][j] = ∑ a[i][k] * b[k][j]
con i=1..n e j=1..m
k=1
- Data una matrice, calcolare la trasposta.
- Data una matrice quadrata (n x n), verificare se è diagonale.
- Data una matrice quadrata verificare se è un "quadrato magico".
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
Stringhe in C
 Una stringa di caratteri è una sequenza di caratteri ASCII, indicante una parola, una frase, ecc.
 Nel linguaggio C non esiste un vero e proprio tipo di dato specifico per le stringhe.
 Una stringa è un array di caratteri (char) che termina con un carattere speciale \0; è il primo carattere
del codice ASCII ( 00000000 ) da non confondere con lo 0 decimale ( 00110000) .
Sintassi:
char nome_stringa[dimensione]
es.:
char str[6];
char str[6]= {'h', 'e','l','l','o','\0'}; // al pari di un normale array
char str[6] ={'h','e','l','l','o'}; // ammesso ma non consigliabile
char str[6] = “hello”;
str[0] = 'h'; str[1]= 'e';
// come elementi dell’array.
Si noti la differenza: 'A' : indica il singolo carattere
"A" : indica la stringa : {'A','\0'}
Nota: L’ultimo elemento è sempre il terminatore. Ad es. codice fiscale 16 caratteri: char codfis[17] ;
Lettura e scrittura di stringhe:
….
char str[20];
printf("inserisci la stringa: ");
scanf("%s", str);
printf("stringa inserita: %s", str );
Si noti nella funzione scanf che abbiamo scritto str e non &str;
poiché l’identificatore str funge da puntatore, quindi l’indirizzo
della locazione dove memorizzare la stringa (vedremo più avanti).
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
Funzioni di libreria:
Come già detto, le stringhe non sono un tipo di dato primitivo; ma nella libreria standard dello C esistono
delle funzioni che semplificano la gestione delle stringhe. Per utilizzarle dobbiamo includere nel nostro
sorgente il seguente file:
#include <string.h>
Funzioni principali:
 strlen(str) restituisce la lunghezza di str
 strcpy(str1, str2) copia str2 in str1
 strncpy(str1, str2, n) copia i primi n caratteri di str2 in str1
 strcat(str1, str2) concatena str2 a str1
 strcmp(str1, str2) confronta str1 con str2, restituisce zero se le due stringhe sono uguali un valore negativo
se str1 è minore di str2, un valore positivo altrimenti.
strlen(str)
restituisce la lunghezza della stringa passata come parametro, ovvero il numero di caratteri contenuti escluso il
terminatore \0.
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
#include <stdio.h>
#include<string.h>
int main(){
char str [20];
int len;
printf("Inserire una stringa: ");
scanf("%s", str);
len = strlen(str);
printf("La stringa inserita: %s è lunga: %d", str , len);
return 0;
}
Per esercizio: determinare la lunghezza di una stringa senza l’uso della funzione strlen():
…..
char str [20];
int i;
printf("Inserire una stringa: ");
scanf("%s", str);
for (i=0; str[i] != '\0'; i++) { };
// a fine ciclo il contatore i indica la lunghezza di str.
……
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
strcpy(str1, str2)
Le stringhe, essendo dei vettori di caratteri, non è possibile copiarle direttamente tramite un semplice
assegnamento (=); bisogna procedere carattere per carattere.
#include <stdio.h>
#include<string.h>
int main(){
char str1 [20], str2[20];
printf("inserire la stringa: ");
scanf("%s", str2);
strcpy(str1,str2);
printf("La stringa copiata: %s è lunga: %d", str1 , strlen(str1));
return 0;
}
Per esercizio: copiare le stringhe senza usare la funzione strcpy(), varie possibilità:
•
… // letta la stringa str2
for (i=0; i < strlen(str2); i++) str1[i]=str2[i];
str1[i]=str2[i];
•
for (i=0; str2[i] != '\0'; i++) str1[i]=str2[i];
str1[i]=str2[i];
•
for (i=0; (str1[i] = str2[i]) != '\0'; i++) {};
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
strncpy(str1, str2, n) : opera come la funzione strcpy(), ma copia solo i primi n caratteri di str2 in str1.
strcat(str1, str2):
consente di concatenare le due stringhe passate come parametri; il risultato viene memorizzato nella prima stringa.
/* concatenazione nome e cognome */
#include <stdio.h>
#include<string.h>
main(){
char nome[20], cognome[20];
printf("inserire il nome: ");
scanf("%s", nome);
printf("inserire il cognome: ");
scanf("%s", cognome);
strcat(nome,cognome);
printf("nome_cognome: %s", nome);
} // fare attenzione alla lunghezza di nome !!!
Per esercizio: concatenare due stringhe (nome+cognome) senza usare strcat():
....
for (i=0; nome[i] != '\0'; i++); // al termine indice i punta all’ultimo carattere di nome
for (j=0; (nome[i]=cognome[j]) != '\0'; i++, j++);
….
Nota: la dimensione della stringa nome, potrebbe non essere sufficiente, => Attenzione !
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
strcmp(str1, str2):
effettua il confronto delle due stringhe passate come parametro. Queste possono essere:
 str1 == str2 : la funzione restituisce 0
 str1 < str2 : la funzione restituisce valore negativo
 str1 > str2 : la funzione restituisce valore positivo
Nota: come ordine per i caratteri si segue il codice ASCII.
/* comparazione due stringhe */
#include <stdio.h>
#include<string.h>
main(){
char str1[20], str2[20];
printf("inserire stringa1: ");
scanf("%s", str1);
printf("inserire stringa2: ");
scanf("%s", str2);
if (strcmp(str1,str2) < 0) printf("%s < %s", str1, str2);
else if (strcmp(str1,str2) == 0) printf("%s = %s", str1, str2);
else printf("%s > %s", str1, str2);
}
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
Per esercizio: confrontare due stringhe senza usare strcomp:
….
int i=0, diff= 0; //flag
while ( (str1[i] != '\0') && (str2[i] !='\0') ) {
if (str1[i] < str2[i]) { diff=-1; break; }
if (str1[i] > str2[i]) { diff=1; break; }
i++;
}
switch (diff) {
case -1: printf ("%s < %s", str1, str2); break;
case 1 : printf ("%s > %s", str1, str2); break;
case 0 :
if ( (str1[i] == '\0') && (str2[i] == '\0') ) printf("%s = %s", str1, str2);
else if (str1[i] == '\0') printf("%s < %s", str1, str2);
else printf("%s > %s", str1, str2);
break;
}
…..
Nota: esistono altre funzioni per la manipolazione delle stringhe: (contenute in stdlib.h)
atoi(str) : converte la stringa in un intero
atof(str): converte la stringa in un decimale.
Corso di Informatica 2
A.A 2015/16
Linguaggio C – Stringhe
Esercizi:
• Verificare che una stringa sia palindroma.
• Letta una stringa, convertire tutti in caratteri in maiuscolo o in minuscolo.
• Letti un carattere e una stringa, contare le occorrenze del carattere nella stringa.
Corso di Informatica 2
A.A 2015/16