stringhe array monodimensionali char. libreria < string.h>
|
|
|
- Benedetta Parodi
- 9 anni fa
- Просмотров:
Транскрипт
1 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
2 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
3 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
4 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
5 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
6 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
7 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
8 Per comprendere come si alloca dinamicamente una matrice, conviene riferirsi al seguente schema: mat 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
9 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
10 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
11 #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
12 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
13 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
14 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
15 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
Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di
ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere
4 GLI ARRAY E LE STRINGHE
13 4 GLI ARRAY E LE STRINGHE 4.1 Gli array monodimensionali Un array è un insieme di variabili dello stesso tipo, cui si fa riferimento mediante uno stesso nome. L accesso ad un determinato elemento si
Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
Lezione 8: Stringhe ed array multidimensionali
Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si
Strutture Dati Dinamiche
Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti
I tipi strutturati e i record in C++
I tipi strutturati e i record in C++ Docente: Ing. Edoardo Fusella Dipartimento di Ingegneria Elettrica e Tecnologie dell Informazione Via Claudio 21, 4 piano laboratorio SECLAB Università degli Studi
Caratteri e stringhe
Caratteri e stringhe Vettori di caratteri Il tipo stringa Terminatore nullo Input/output di stringhe 2 Vettori di caratteri Stringhe in C Nel linguaggio C non è supportato esplicitamente alcun tipo di
Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0
STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1
Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1
Caratteri e stringhe Il tipo stringa Terminatore nullo Input/output di stringhe 2 2006 Politecnico di Torino 1 Stringhe in C Nel linguaggio C non è supportato esplicitamente alcun tipo di dato stringa
Caratteri e stringhe
Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un
Stringhe in C. Emilio Di Giacomo
Stringhe in C Emilio Di Giacomo Stringhe Una stringa è una sequenza finita di caratteri Le stringhe sono un tipo di dati talmente importante e utile che fanno parte di quasi tutti i linguaggi di programmazione
Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione
Array Tipi di dato semplici e strutturati i tipi di dato visti finora erano tutti semplici: int, char, float,... i dati manipolati sono spesso complessi (o strutturati) con componenti elementari o strutturate
Esercitazione 8. Array multidimensionali
Esercitazione 8 Array multidimensionali Prodotto di due matrici Una matrice può essere rappresentata in C con un array bidimensionale. Consideriamo il seguente problema: date due matrici mat1[n] [P] mat2[p]
Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata
Puntatori int i = 10; int * pi = &i; pi i = 10 116 int * pi = pi contiene un informazione che mi permette di accedere ( puntare ) ad una variabile intera Un puntatore contiene un numero che indica la locazione
I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore
I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p
Stringhe e allocazione dinamica della memoria
Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per
Esercitazione di Reti degli elaboratori
Esercitazione di Prof.ssa Chiara Petrioli Christian Cardia, Gabriele Saturni Cosa vedremo in questa lezione? Gli Array Gli array multidimensionali Le stringhe I puntatori Esercizi Pagina 1 Gli Array Definizione
Esercizi C su array e matrici
Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4]
Esercitazione 12. Esercizi di Ricapitolazione
Esercitazione 12 Esercizi di Ricapitolazione Esercizio Scrivere un programma che, dato un numero intero positivo, stampa la sua rappresentazione binaria. ALGORITMO Scriviamo una procedura stampa_bin che,
Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))
Allocazione dinamica della memoria: malloc() In C è possibile allocare dinamicamente un area di memoria (ossia, durante l esecuzione di un programma) tramite le funzioni malloc() e calloc() (occorre includere
Esercitazione 6. Array
Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione
Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi
Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi [email protected] Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)
Cicli annidati ed Array multidimensionali
Linguaggio C Cicli annidati ed Array multidimensionali Cicli Annidati In C abbiamo 3 tipi di cicli: while(exp) { do { while(exp); for(exp;exp;exp3) { Cicli annidati: un ciclo all interno del corpo di un
I CARATTERI E LE STRINGHE
I CARATTERI E LE STRINGHE IL CODICE ASCII Per memorizzare i simboli grafici corrispondenti ai caratteri bisogna associare un numero intero a ciascuno di essi Il codice ASCII / æski/ (American Standard
I/O da tastiera + Alessandra Giordani Lunedì 2 maggio
I/O da tastiera + costrutti while e if Alessandra Giordani [email protected] Lunedì 2 maggio 2011 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una
Le funzioni, e le istruzioni di input/output
Linguaggio C Le funzioni, e le istruzioni di input/output 1 Funzioni! Sono sottoprogrammi per svolgere un particolare compito! Sequenze di istruzioni (raggruppate tramite le parentesi graffe) alle quali
Stringhe di caratteri
Linguaggio C Stringhe di caratteri 1 Variabili e costanti stringa! Una stringa letterale è una sequenza di caratteri racchiusa tra doppi apici! Può essere scritta su più righe utilizzando il backslash
Linguaggio C: Array Valeria Cardellini
Linguaggio C: Array Valeria Cardellini Corso di Calcolatori Elettronici A.A. 2018/19 Università degli Studi di Roma Tor Vergata Dipartimento di Ingegneria Civile e Ingegneria Informatica Array in C q Dichiarazione
C: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
STRINGHE: ARRAY DI CARATTERI! a p e \0
STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più
Variabili e Istruzioni
Exit Menù Variabili e Istruzioni 1 Le Variabili Una VARIABILE è un oggetto identificato da un NOME e da uno STATO, detto CONTENUTO o VALORE. Possiamo immaginarla come una scatola contenuto Pippo 11 nome
L'Allocazione Dinamica della Memoria nel linguaggio C
L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego [email protected] http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria
Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);
Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di
L Allocazione Dinamica della Memoria
L Allocazione Dinamica della Memoria Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania [email protected] http://www.diit.unict.it/users/mpalesi Sommario Questo documento
Ripasso R1. Dati strutturati. Esempi. Array. Dichiarazione di un array. Dichiarazione di un array in C
Ripasso R1 Dati strutturati Aggregazione di dati omogenei: gli array Spesso gli algoritmi lavorano su insiemi di dati omogenei. o l insieme dei valori reali che rappresentano le temperature medie delle
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Lettura da tastiera e scrittura su monitor
Lettura da tastiera e scrittura su monitor Per poter leggere UN SINGOLO CARATTERE dalla tastiera e visualizzare UN SINGOLO CARATTERE sul monitor si possono utilizzare le funzioni: int getchar (void) (per
Primo programma in C
Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file
Array multidimensionali e stringhe
Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Array uni-dimensionali (richiami) Dichiarazione: int vet[100]; float x[50]; Gli elementi
Esercizi sulle stringhe
Esercizi sulle stringhe Esercizio 1 La cifratura è un processo di sostituzione, permutazione manuale ed automatica di simboli. Lo scopo di un criptosistema è di cifrare un testo intellegibile (in chiaro)
Esercizi. Filtraggio
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia Filtraggio L utente inserisce un array di numeri reali non negativi (un numero negativo indica la fine della fase di inserimento)
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
File binari e file di testo
I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file
