Linguaggio C - Array. Array: tipo nome_array[num_elementi]

Documenti analoghi
Informatica 2 modulo C Massimo Callisto De Donato

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Caratteri e stringhe

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Stringhe. Concetti chiave

Tutorato Programmazione 1 Modulo 2

STRINGHE: ARRAY DI CARATTERI! a p e \0

Introduzione al C. Unità 8 Stringhe

Stringhe e allocazione dinamica della memoria

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Stringhe e tipi di dati strutturati

C: panoramica. Violetta Lonati

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Informatica B

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Lezione 5 Sottoarray di somma massima

Gestione delle stringhe in C

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Corso di Informatica 1 Esercitazione n. 4

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

a.a Codice corso: 21012, 22010

Ripasso R1. Dati strutturati. Esempi. Array. Dichiarazione di un array. Dichiarazione di un array in C

Esercitazione 6. Array

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

Alcuni Richiami sul C

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Esercizi. Stringhe. Stringhe Ricerca binaria

5 Stringhe. Esiste una libreria di C che gestisce le stringhe string.h essa ci permette di:

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Cicli annidati ed Array multidimensionali

Esercitazione 11. Liste semplici

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

3 Costrutti while, for e switch

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ESERCIZI LEZIONE 7 STRINGHE ED ALLOCAZIONE DINAMICA DELLA MEMORIA

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Lezione 6: Funzioni di I/O avanzate

Università degli Studi di Brescia. Vettori di variabili. ! Sono variabili aggregate in grado di memorizzare una collezione (organizzata) di oggetti

Esercitazione 12. Esercizi di Ricapitolazione

Programmazione I - Laboratorio

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

Esercizi C su array e matrici

Cicli annidati e matrici di variabili

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Dati aggregati. Violetta Lonati

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Array multidimensionali e stringhe

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Stringhe di caratteri

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Vettori di stringhe. Matrici Vettori di stringhe. Matrici di caratteri. Vettori di stringhe. char tris[3][3] ; Esercizio Verifica Sudoku.

Corso di Informatica B - Sezione D. Esercitazioni Linguaggio C

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };

Linguaggi di programmazione + laboratorio a.a. 2012/2013

Esercizio 1: calcolo insieme intersezione

stringhe array monodimensionali char. libreria < string.h>

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Il linguaggio C Puntatori

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Laboratorio di Algoritmi e Strutture Dati

Informatica 1. Prova di recupero 21 Settembre 2001

Multidimensionali. Array Multidimensionali. Tipi di array. Matrice: array bidimensionale. Array multidimensionale. Dichiarazione di una matrice

Uso avanzato dei puntatori Allocazione dinamica della memoria

Stringhe. Una stringa è una sequenza di caratteri. Esempi: printf( Sum = %d, s); #define ERR_PREFIX ***** Error -

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Strutture di Controllo

Vettori di caratteri. Caratteri e stringhe. Stringhe in C. Vettori di caratteri. char saluto[10] ; B u o n g i o r n o 4. Esempio.

Introduzione al C. Esercitazione 8. Domenico Daniele Bloisi Raffaele Nicolussi. Corso di Laboratorio di Informatica Ingegneria Clinica

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Esercizio 1 - Soluzione

Fondamenti di Programmazione

Le basi del linguaggio Java

Esercizi proposti. Caratteri e stringhe. Esercizio Parola palindroma. Esercizi proposti. Palindromia. Analisi. o t t o. m a d a m

Esercitazione 8. Array multidimensionali

Istruzioni decisionali

Programmazione I - Laboratorio

Fondamenti di Informatica L-A

Tipi di dato semplici

dott. Sabrina Senatore

Esercizio 1. Esercizio - 1

Il linguaggio C. Puntatori e dintorni

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

ALGORITMI E STRUTTURE DATI

ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

Le stringhe. Le stringhe

Le direttive del Preprocessore

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Caratteri e stringhe

Transcript:

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.

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: for(i=0;i<dim_a; i++) b[i]=a[i]; errore: b[] = a[]; oppure b=a;

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.

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?

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 È permesso: int a[2][3] = { { 0, 2, 3, { -2 int a[2][3] = { {0 // tutti i valori a zero. 0 2 3-2 5 9 0 2 3-2 0 0 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;

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".

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).

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.

#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.

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++) {;

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!

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);

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.

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.