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