stringhe array monodimensionali char. libreria < string.h>

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

4 GLI ARRAY E LE STRINGHE

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

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Tipi strutturati in C. Stringhe

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Esercizi di programmazione in linguaggio C English Dictionary

Elementi di Informatica A. A. 2016/2017

Lezione 8: Stringhe ed array multidimensionali

Strutture Dati Dinamiche

I tipi strutturati e i record in C++

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Caratteri e stringhe

ESERCIZIO allochi staticamente un vettore V1 di 10 float e allochi dinamicamente un vettore V2 di 10 double;

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

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.

Caratteri e stringhe

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

Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Caratteri e stringhe

Stringhe in C. Emilio Di Giacomo

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

Esercitazione 8. Array multidimensionali

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

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

ESERCIZI LEZIONE 7 STRINGHE ED ALLOCAZIONE DINAMICA DELLA MEMORIA

Matrici (array bidimensionali)

Stringhe e allocazione dinamica della memoria

Esercitazione di Reti degli elaboratori

Esercizi C su array e matrici

Array e Matrici. Perchè usare gli array?

Esercitazione 12. Esercizi di Ricapitolazione

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

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

Esercitazione 6. Array

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

Cicli annidati ed Array multidimensionali

Corso di Informatica A.A

Allocazione dinamica della memoria

I CARATTERI E LE STRINGHE

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

Le funzioni, e le istruzioni di input/output

Elementi di Informatica

Stringhe di caratteri

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Linguaggio C: Array Valeria Cardellini

Introduzione al C. Unità 8 Stringhe. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

C: panoramica. Violetta Lonati

Puntatori. Grazie ai puntatori:

Allocazione dinamica della memoria

ESERCIZIO allochi staticamente un vettore V1 di 10 float e allochi dinamicamente un vettore V2 di 10 double;

STRINGHE: ARRAY DI CARATTERI! a p e \0

Informatica 2 modulo C Massimo Callisto De Donato

Variabili e Istruzioni

Fondamenti di Informatica 2

da_costruire = da_costruire ^ 1; /* inserisco un bit nella prima posizione a destra */

Dati due punti sul piano calcolare la loro distanza

Gli array. slides credit M. Poneti

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

L'Allocazione Dinamica della Memoria nel linguaggio C

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

L Allocazione Dinamica della Memoria

Programmazione C Massimo Callisto De Donato

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

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

Fondamenti di Informatica 2

Lezione 12: Allocazione Dinamica della Memoria

RIPRENDIAMO I PUNTATORI

A. Ferrari. stringhe di caratteri In linguaggio C

Il linguaggio C. Puntatori e dintorni

Tipi di dato strutturati: Array

Lettura da tastiera e scrittura su monitor

Esercizio 1: calcolo insieme intersezione

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

Ingresso ed Uscita in C. Informatica 1 / 15

Primo programma in C

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Array multidimensionali e stringhe

Esercizi sulle stringhe

Corso di Informatica 1 (IN110) Tutorato n. 4

Tipi di dato strutturati: Array

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili

Esercizi. Filtraggio

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

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Il linguaggio C Puntatori

Lab 2 Info B. Diego Carrera Ing. Gian Enrico Conti 7 Novembre 2016

Linguaggio C: Stringhe Valeria Cardellini

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati

Puntatori. Fondamenti di Programmazione

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Associazione Variabile-Indirizzo

File binari e file di testo

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

Transcript:

Le stringhe Le stringhe sono array monodimensionali il cui tipo base è char. Il nucleo del linguaggio non prevede particolari istruzioni per il trattamento delle stringhe che potrebbero essere gestite elemento per elemento come gli altri array. Su tutti i compilatori si trova la libreria < string.h> che dispone di potentissime funzioni per la loro manipolazione. Le funzioni scanf e printf supportano la lettura e la scrittura diretta delle stringhe utilizzando il formato %s. Le stringhe acquisite con scanf non debbono contenere spazi vuoti perché la lettura si arresterebbe al primo spazio. 1

Dichiarando ad esempio con le istruzioni Le stringhe char parola[15]; scanf( %s,parola); printf( %s,parola); verrebbe prima acquisita da tastiera una stringa e poi stampata. Oss.1: in scanf parola non è preceduto dal simbolo & essendo parola una costante puntatore (parola è l indirizzo del primo elemento). Oss.2: le funzioni di libreria prevedono per le stringhe un carattere terminatore ( quello di codice 0 o \0 ) posto dopo l ultimo carattere utile e, infatti, scanf lo pone automaticamente. Leggendo le stringhe carattere per carattere occorre memorizzare esplicitamente il terminatore. 2

Alcune funzioni della libreria <string.h> Siano s1 e s2 array di caratteri: strcpy(s1,s2) ricopia s2 su s1; strcmp(s1,s2) confronta alfabeticamente s1 e s2 restituendo 0 se sono uguali, un numero positivo se s1 segue alfabeticamente s2, un numero negativo viceversa; strlen(s1) restituisce la lunghezza in numero di caratteri di s1 (escluso il terminatore); strncpy(s1,s2,n) copia i primi n caratteri di s2 su s1; strcat(s1,s2) aggiunge ( concatena ) s2 a s1. Oss.: anche per le stringhe, come in generale per tutti gli array, il compilatore non effettua controllo sul fatto che gli indici superino le dimensioni dichiarate. 3

Le stringhe Problema: scrivere una procedura che data una stringa trasformi in maiuscolo gli eventuali caratteri minuscoli. Utilizzando il codice ASCII i caratteri minuscoli hanno codice che va da 97 (a) a 122 (z) mentre quelli maiuscoli iniziano con 65 (A) e proseguono rispettando l ordine alfabetico. void maiuscolo(char *s) {int i = 0; while (s[i]) { if((s[i] > 96) && (s[i]<123)) s[i] -=32; i++; } } 4

Le stringhe Problema: scrivere una procedura che consenta di leggere una stringa con un massimo fissato di caratteri contenente anche spazi e ponga correttamente il carattere terminatore; void leggi_stringa(char *s,int l) { int i = 0; while (( (s[i] = getch())!= 13) &&(i<l)) {printf("%c",s[i]);i++;} s[i] = '\0';printf("\n"); } Osserviamo la compattezza delle istruzioni consentite dalla flessibilità del C! 5

Le stringhe Le stringhe contenenti spazi possono essere acquisite dalla funzione gets della libreria <stdio.h> esempio: char parola[25]; gets(parola); N.B Se si usa gets dopo scanf,con il compilatore dev c++,occorre prima di gets l istruzione fflush(stdin); che svuota il buffer della tastiera, altrimenti il funzionamento non è corretto. Le stringhe, come gli altri array, possono essere allocate anche dinamicamente. 6

Come gli array monodimensionali, anche gli array bidimensionali (o matrici) possono essere allocati sia staticamente che dinamicamente. Ad esempio, con la dichiarazione: int mat[10][8]; viene dichiarata staticamente una matrice di interi con 10 righe e 8 colonne, con indice di riga variabile tra 0 e 9 e indice di colonna fra 0 e 7. Per referenziare un singolo elemento basta scrivere il nome mat e, fra parentesi quadre, gli indici di riga e di colonna. 7

Per comprendere come si alloca dinamicamente una matrice, conviene riferirsi al seguente schema: mat 0 1 2 0 1 2 m-1 n-1 mat è un puntatore a puntatore contenente l indirizzo della prima di n posizioni di memoria, allocate dinamicamente, atte a contenere indirizzi ( array di puntatori ); ogni elemento dell array contiene l indirizzo della prima di m posizioni di memoria, allocate dinamicamente, atte a contenere il tipo di dato voluto. 8

Esempio di allocazione dinamica di una matrice: int i, n, m; int **mat; /* puntatore a puntatore a intero */..... scanf ( %d,&n); scanf ( %d,&m); mat = (int **)malloc(n * sizeof(int *)); /* si alloca l array di puntatori */ for (i=0;i<n;i++) mat[i] = (int *) malloc(m*sizeof(int)); /* per ogni elemento si alloca un array di m interi */... Oss.: le dimensioni n ed m sono state acquisite da tastiera; naturalmente n ed m possono essere variabili contenenti opportuni valori o costanti opportune. 9

Nel passaggio di parametri di tipo matrice alle funzioni, bisogna distinguere fra matrici allocate staticamente e dinamicamente. Per quelle allocate dinamicamente basta utilizzare un puntatore a puntatore. Per quelle allocate staticamente il parametro deve essere dichiarato allo stesso modo della matrice cui deve legarsi, salvo che l indicazione del numero di righe è inutile. 10

#include <stdio.h> #include <conio.c> #define n 4; #define m 5; void leggi_mat(int[ ][m],int,int); void calcola(int [ ][m],int,int); void main(void) {int mat[n][m]; leggi_mat(mat,n-1,m); calcola(mat,n,m); } void leggi_mat(int pmat[ ][m], int righe,int colonne) { int i,j; clrscr();gotoxy(25,1); Array pluridimensionali printf("inserire i dati ( Num. interi ) nella matrice"); for(i=0;i<righe;i++) for(j=0;j<colonne;j++) {gotoxy(10+3*j,5+i); scanf("%d",&pmat[i][j] ); } } void calcola(int pmat[ ][m],int righe,int colonne) { int i,j; clrscr(); printf ("L'ultima riga contiene i totali"); for(j=0;j<colonne;j++) {pmat[righe-1][j]=0; for(i=0;i<righe-1;i++) pmat[righe-1][j]+= pmat[i][j]; } for(i=0;i<righe;i++) for(j=0;j<colonne;j++) gotoxy(10+3*j,5+i);printf("%d",pmat[i][j]); } } 11

Analizzando il parametro formale int pmat[ ][m] si osserva che per passare una matrice occorre un parametro formale dichiarato allo stesso modo salvo che l indicazione del numero di righe è inutile. Infatti, si deve tener presente che la memoria allocata per la matrice con la dichiarazione è costituita da una sequenza lineare di dimensione n*m*sizeof(tipoelementi) formata da celle in posizioni consecutive. 12

Per poter determinare tramite due indici i (indice di riga ) e j (indice di colonna) la posizione effettiva di un elemento basta conoscere ( oltre ad i e j ) la posizione del primo elemento ( &mat[0][0] ), il numero di elementi per riga ( numero m di colonne ) e il tipo degli elementi. Si ha infatti : &mat[i][j] = &mat[0][0] + (m*i + j )*sizeof(tipoelementi) Si comprende dunque che il numero di righe in cui è comodo immaginare suddivisa la memoria allocata non serve per determinare la posizione di un elemento ma solo per allocare la giusta quantità di memoria, in fase di dichiarazione, e per non sconfinare oltre l ultima posizione riservata, nel trattamento degli elementi della matrice. 13

Problema: scrivere un programma che acquisisca da tastiera due matrici di interi di dimensioni rispettivamente n t e t m e calcoli il prodotto riga colonna memorizzandolo in una matrice n m. Si risolve il problema utilizzando matrici allocate dinamicamente con la tecnica del puntatore a puntatore e le seguenti funzioni: int leggi_numero(char *s) viene utilizzata per acquisire da tastiera il numero di righe o di colonne e restituirlo. Al parametro, puntatore a carattere, viene passata la stringa da visualizzare prima dell immissione. void inserisci(char *s, int **x,int rig,int col ) serve ad acquisire da tastiera gli elementi delle due matrici. Al primo parametro viene passato il messaggio da visualizzare e al secondo il contenuto del puntatore doppio con cui si referenziano le matrici; rig e col servono per il numero di righe e di colonne. 14

int **prodotto(int **x,int **y,int rig1, int col1,int col2) restituisce un puntatore a puntatore contenente l indirizzo della matrice prodotto allocata dinamicamente all interno della funzione.i due parametri puntatore a puntatore servono per le due matrici di cui si deve calcolare il prodotto e i tre parametri di tipo intero per le righe e colonne delle tre matrici. void visualizza(char *s,int **x,int rig,int col,int riga_inizio ) visualizza, in tre distinte attivazioni, le tre matrici. I primi quattro parametri hanno significato analogo a quello già visto nelle altre funzioni. int riga_inizio serve per far partire la visualizzazione dalla riga opportuna. L algoritmo discende direttamente dalla definizione di prodotto riga - colonna. Si utilizza un ciclo più esterno, che tiene conto della colonna j, ed uno intermedio della riga i della matrice risultato, in cui si memorizza il prodotto della riga i- esima della prima matrice con la colonna j-esima della seconda matrice calcolato da un ciclo più interno. N.B: Per il programma completo, consultare la dispensa a pag 33. 15