Problema. Vettori e matrici. Vettori. Vettori

Documenti analoghi
Cicli annidati e matrici di variabili

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

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

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

IL PRIMO PROGRAMMA IN C

Esercizi Programmazione I

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

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

Introduzione a Matlab

Esercizi C su array e matrici

Array multidimensionali e stringhe

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

Cicli annidati ed Array multidimensionali

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

I CARATTERI E LE STRINGHE

Lezione 6 programmazione in Java

Elementi di Informatica A. A. 2016/2017

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

Esercitazione 4. Comandi iterativi for, while, do-while

Variabili. Tipi di dati di base. Variabili. Variabili

Strutture dati e loro organizzazione. Gabriella Trucco

PON Liceo Scientifico Leonardo da Vinci. Vallo della Lucania

Esercitazione 6. Array

Costanti e Variabili

Array e puntatori in C

Esempio: quanto mi piace questo corso! qufuafantofo mifi pifiafacefe qufuefestofo coforsofo!

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

4 GLI ARRAY E LE STRINGHE

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Linguaggio C - sezione dichiarativa: costanti e variabili

Fondamenti di Informatica T-1 Modulo 2

C: panoramica. Violetta Lonati

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

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

Allocazione dinamica della memoria

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

Variabili e Istruzioni

Verso i puntatori: Cosa è una variabile?

Fondamenti di Informatica

Gli Array. Dichiarazione di un array

Il linguaggio C Puntatori

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Istruzioni decisionali

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

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

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

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

INFORMATICA. Strutture iterative

Struttura dei programmi C

il precedente programma dichiara un vettore di interi di dimensione 10 e successivamente inserisce il valore 4 nel secondo elemento del vettore.

Array ( vettore/matrice Un dato strutturato. indice Accesso diretto

Esercitazione 3. Espressioni booleane I comandi if-else e while

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

Primi passi col linguaggio C

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

Caratteri e stringhe

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 06 Array" Lab06 1

Cos è un vettore (1) Vettori. Cos è un vettore (2) Cos è un vettore (3) DD Cap. 6 pp

Puntatore. I puntatori. Definizione. Assegnazione

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

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Aritmetica dei puntatori

Strutture dati complesse. Vettori. Tipi di dato strutturati. Strutture dati complesse nome fulvio. Esigenze. Esigenze. dato

Istruzioni iterative. Istruzioni iterative

Esercizi di programmazione in linguaggio C - Costrutto iterazione

Caratteri e stringhe

Gli array, le stringhe e le strutture

Associazione Variabile-Indirizzo

Strutture iterative. Strutture iterative. I cicli in C. Strutture iterative. con i che assume i valori da 0 a 1000

Programmazione I - Laboratorio

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

Laboratorio di Algoritmi e Strutture Dati

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Stringhe di caratteri

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Gocce di Java. Gocce di Java. Selezione e ripetizione. Pierluigi Crescenzi. Università degli Studi di Firenze

Laboratorio di informatica Ingegneria meccanica

Le basi del linguaggio Java

Dati aggregati. Violetta Lonati

Programmazione con il linguaggio LibreOffice Basic

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

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

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

Inversa di una matrice quadrata. L operatore inv() inverte una matrice quadrata non singolare (cioè in cui il determinate è diverso da zero).

Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Introduzione al linguaggio C Puntatori

int ninv; /* numero di inventario */

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

Introduzione al linguaggio C

Transcript:

e matrici Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Problema Si vuole un programma che chieda 10 numeri dalla tastiera e li visualizzi dall ultimo al primo Soluzione attuale (con le conoscenze attuali) Si possono definire 10 variabili, scrivere 10 scanf e quindi 10 printf Considerazione E se fossero 100 numeri? 1000? 10000? Soluzione ideale Serve un metodo per definire tutte insieme N variabili dello stesso tipo, inoltre queste devono poter essere identificate singolarmente tramite un numero 2 Variabili scalari: contengono un solo valore Variabili vettoriali: contengono più valori dello stesso tipo, detti elementi Se il tipo è di base (come char, int, long, double, etc.) gli elementi del vettore sono variabili scalari di quel tipo Tutti gli elementi condividono lo stesso nome e sono contraddistinti da un indice indicato tra parentesi quadre: a[1] a[2] a[3] a[4] in termini matematici questo si scrive: a 1 a 2 a 3 a 4 3 Definizione (alloca mem. per tutti gli elementi) tipo nome[num_di_elementi ]; Esempio int vett[10]; definisce un vettore di 10 elementi di tipo int vett: num_di_elementi deve essere una costante intera positiva (no const, no enum) nota al momento della compilazione (quindi non si può chiedere all utente mentre il programma gira), in genere la si indica in una #define 4

5 6 L indice deve essere un valore di tipo intero (non soltanto di valore intero) Il primo elemento ha indice 0: vett[0] L ultimo elemento di un vettore di N elementi ha indice N 1, in questo esempio è vett[9] Si accede ai singoli elementi indicando il nome del vettore seguito dall indice dell elemento tra parentesi quadre (costante o variabile): vett[7] vett[i] vett[k+1] Poiché ciascun elemento del vettore è del tipo indicato nella definizione (nell esempio è un int), può essere utilizzato in tutti i contesti in cui si può usare una variabile di quel tipo Esempi int vett[10]; scanf("%d", &vett[4]); x = vett[4] * 5; infatti vett[4] è un valore (scalare) di tipo int 7 8 Gli elementi del vettore sono allocati in locazioni di memoria contigue e successive int vett[10]; indice elemento vett[0] vett: 61 33 85 12 9 51 12 43 71 32 0 1 2 3 4 5 6 7 8 9 vett[1] vett[2] vett[3]...... vett[9] Il nome di un vettore è usato dal compilatore come sinonimo dell indirizzo di memoria del primo elemento del vettore (non è una variabile non si può assegnarle un valore) Supponendo che il vettore vett sia di interi da 32 bit e inizi in memoria dall indirizzo A00, vett[0] avrà indirizzo A00, vett[1] A04,, vett[9] A24, l ultimo byte A27 vett: 61 33 85 12 9 51 12 43 71 32 A00 0 1 2 3 4 5 6 7 8 9 A04 A08 A0C Indirizzi crescenti A10 A14 A18 A1C A20 A24

La presenza di un indice suggerisce che sia possibile efficacemente scandire tutti i valori di un vettore mediante un ciclo for Ecco la soluzione del problema iniziale: #define N 10 int vett[n]; for (i=0; i<n; i++) scanf("%d", &vett[i]); for (i=n-1; i>=0; i--) printf("%d\n", vett[i]); memorizzati in quest ordine 6 3 8 1 9 1 2 4 1 3 i 0 1 2 3 4 5 6 7 8 9 9 Sforare il vettore Si sfora il vettore quando si accede a elementi oltre i limiti del vettore Esempio int vett[4]={1,2,3,4}, x=9, y=8; vett[5]=12; Si accede ad una porzione di memoria che è possibile sia adibita ad altro, ad esempio ad altre variabili, modificandole involontariamente vett: x: y: 1 2 3 4 9 12 A00 0 1 2 3 A04 A08 A0C A10 A14 A18 A1C A20 A24 10 Sforare il vettore Esempio tipico int vett[n]; for (i=1; i<=n; i++) scanf("%d", vett[i]); Si salta l elemento 0 e si accede all elemento N che non esiste. Lo standard non richiede che il compilatore faccia controlli su un eventuale sforamento, molti compilatori lo forniscono opzionalmente, ma ciò riduce le prestazioni in quanto ad ogni accesso al vettore viene fatto un controllo preliminare per verificare che non si sfori 11 Matrici Sono variabili vettoriali con due dimensioni Definizione tipo nome[numero_righe][numero_colonne]; l indice delle righe va da 0 a numero_righe-1, quello delle colonne da 0 a numero_colonne-1 int Mx[7][5]; definisce una matrice di 7 righe 5 colonne, l indice delle righe va da 0 a 6, quello delle colonne da 0 a 4 Utilizzo Mx[3][2] è una variabile scalare di tipo int Mx[3][2] = 12; 12

Matrici La presenza di 2 indici suggerisce che sia possibile scandire sequenzialmente i valori di una matrice mediante due cicli for annidati Il codice seguente visualizza una matrice int mat[righe][colonne];... for (r=0; r<righe; r++) { for (c=0; c<colonne; c++) printf("%d ", mat[r][c]); printf("\n"); } 13 Matrici Una matrice è in realtà un vettore di vettori: int Mx[7][5]; definisce un vettore di 7 elementi ciascuno dei quali è un vettore di 5 int (l associatività delle parentesi quadre è da sinistra a destra) Mx: Mx[0] Mx[1] Mx[2] Mx[3] Mx[4] Mx[5] Mx[6] 01234 Mx[5][2] 14 Matrici Gli elementi Mx[i] sono i 7 vettori di 5 int Ciascuno dei termini Mx[i] viene usato dal compilatore come sinonimo dell indirizzo di memoria del primo elemento di ciascun vettore di 5 int; quindi non si possono assegnare valori a Mx[i] Si accede agli elementi indicando i valori di tutti gli indici, es. Mx[5][2] 15 Matrici In C gli elementi di una matrice sono memorizzati per righe, questo significa che i 7 vettori di 5 int sono collocati uno di seguito all altro in locazioni di memoria crescenti, ossia gli elementi del primo vettore di 5 int sono seguiti dagli elementi del secondo, etc. (dopo Mx[0][4]si trova Mx[1][0]) Mx: 16 01234012340123401234012340123401234 Mx[0] Mx[1] Mx[2] Mx[3] Mx[4] Mx[5] Mx[6]

Matrici multidimensionali 17 Inizializzazione di vettore 18 Sono vettori di vettori di vettori di vettori... Non c è limite al numero delle dimensioni Esempio int xyz[7][5][4]; xyz[5][2][3] è una variabile scalare di tipo int xyz[5][2][3] = 12; I 7 elementi xyz[i] (ciascuno dei quali è una matrice 5x4 di int) e gli elementi xyz[i][j] (ciascuno dei quali è un vettore di 4 int) non possono essere assegnati in quanto sono indirizzi di memoria e non variabili Se il vettore non è inizializzato, i valori in esso contenuti sono indeterminati La lista degli inizializzatori può essere indicata tra parentesi graffe dopo un segno = : int vett[4]={12, 5, 3, 6}; Gli inizializzatori devono essere noti al compile time, quindi devono essere espressioni costanti: numeri, #define, valori enum, indirizzi di memoria di variabili statiche ; non possono essere: variabili, valori const, risultati di funzioni, indirizzi di memoria di variabili automatiche (trattate in altra sezione) Inizializzazione di vettore 19 Inizializzazione di matrice 20 La dimensione può essere omessa, in questo caso viene calcolata dal compilatore contando i valori: int vett[]={12, 5, 3, 6}; ci sono 4 elementi, hanno i valori indicati Se la lista contiene meno valori di quelli indicati dalla dimensione ma almeno uno, quelli non specificati sono inizializzati a 0: int vett[4]={6, 2}; i 4 valori sono 6, 2, 0, 0 Per inizializzare a 0 tutto un vettore: int vettore[10]={0}; Il primo valore 0 è indicato esplicitamente, i successivi sono posti a 0 automaticamente Se non c è inizializzazione, i valori contenuti in una matrice (multi-dim.) sono indeterminati Gli inizializzatori degli elementi di una matrice si elencano separando con parentesi graffe i valori delle diverse righe (se bidimensionali) int Mx[2][2]={{1,2},{3,4}}; Gli inizializzatori possono non avere le graffe interne: vengono assegnati ordinatamente agli elem. della matrice come se fosse un vettore int Mx[2][2]={1,2,3,4}; Quando ci sono abbastanza inizializzatori, la prima dimensione può essere omessa (viene calcolata dal compilatore) int Mx[][2]={1,2,3,4};

Inizializzazione di matrice 21 22 Le graffe sono necessarie per non specificare tutti valori intermedi (posti a 0) int Mx[100][4]={{1,2,3},{4,5}}; 1 a riga: 1, 2, 3, 0 2 a riga: 4, 5, 0, 0 le altre 98 righe: 0, 0, 0, 0 Senza graffe vengono assegnati in sequenza int Mx[100][4]={1,2,3,4,5}; 1 a riga: 1, 2, 3, 4 2 a riga: 5, 0, 0, 0 le altre 98 righe: 0, 0, 0, 0 Per inizializzare tutta una matrice a 0 int Mx[100][100]={0}; 1. Scrivere un programma che chieda quanti valori verranno introdotti dalla tastiera (max 100), li chieda tutti e successivamente li visualizzi dall ultimo al primo. 2. Scrivere un programma che chieda quanti valori verranno introdotti dalla tastiera (max 100), li chieda tutti e successivamente visualizzi prima tutti i valori pari nell ordine in cui sono stati inseriti e poi tutti i valori dispari nell ordine inverso. Esempio: dati i valori: 8 1 3 2 8 6 5, il programma visualizza: 8 2 8 6 5 3 1 23 24 3. Scrivere un programma che definisca 2 vettori A e B di uguali dimensioni (la dimensione sia chiesta in input, max 100), chieda in input tutti i valori del primo e successivamente tutti i valori del secondo (devono comparire sul video richieste come le seguenti: Introdurre il 1 valore di A, Introdurre il 2 valore di A ecc. e successivamente Introdurre il 1 valore di B, Introdurre il 2 valore di B ecc. (Continuazione) Il programma crea un terzo vettore C della stessa dimensione di A e B contenente nel 1 o elemento la somma del 1 o elemento di A e del 1 o elemento di B, nel 2 o elemento la somma del 2 o elemento di A e del 2 o elemento di B etc. Alla fine deve visualizzare tutti gli elementi di posizione (non indice) pari di C (il 2 o, il 4 o, ) e poi tutti quelli di posizione dispari (1 o, 3 o, ). Esempio: vettori di lunghezza 4, in A sono stati messi i valori: 3 5 2 6 e in B: 3 2 6 3, verranno quindi calcolati e messi in C i valori: 6 7 8 9 e quindi stampati i valori: 7 9 6 8.

4. Scrivere un programma che chieda quanti valori verranno introdotti dalla tastiera (max 100), li chieda tutti e li collochi in un vettore. Successivamente, il programma deve determinare il massimo, il minimo, la somma e la media di questi valori. 5. Scrivere un programma che chieda quanti valori (reali) verranno introdotti dalla tastiera (max 100), li chieda tutti, calcoli e stampi la media mobile a 3 valori di questi numeri. Si controlli che il numero di valori da introdurre sia almeno pari a 3. 25 Continuazione La media mobile è una media aritmetica su solo una parte dei valori (in questo caso 3), ad esempio se viene data la sequenza di valori: 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9 il programma deve calcolare la media di 2.1, 4.2 e 1.3 e stamparla, poi la media di 4.2, 1.3 e 6.7 e stamparla, poi 1.3, 6.7 e 3.1 e stamparla, ecc. fino a 3.0, 5.4 e 3.1: 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9 26 6. Scrivere un programma che acquisisca da tastiera un vettore di (max 100) valori di tipo intero e identifichi la più lunga sequenza di numeri consecutivi uguali. Se vengono identificate più sequenze della stessa lunghezza, si consideri solo la prima identificata. Il programma deve indicare il valore ripetuto e il numero di ripetizioni di quel valore. Esempio: Input: 19 3 15 15 7 9 9 9 9 12 3 3 3 Output: numero: 9, ripetizioni: 4 27 7. Scrivere un programma che definisca una matrice di valori interi e di dimensioni richieste di volta in volta dall utente (massimo 10x10) mediante input quali quante righe? e quante colonne?. Successivamente di tutti questi valori determini il massimo, il minimo, la somma e la media. 28

8. Scrivere un programma che definisca una matrice MX di valori interi e di dimensioni richieste di volta in volta dall utente (massimo 20x26) mediante input quali quante righe? e quante colonne? e immetta in ciascuna cella un valore casuale (usare rand) compreso tra 0 e 99. Il programma deve poi visualizzare la matrice con i valori allineati correttamente (%3d nella printf) e contare quanti valori sono pari e quanti sono dispari. Si tenga separata la parte relativa allo riempimento della matrice dalle operazioni successive. 29 9. Definire la matrice MX come nel precedente esercizio, questo programma deve indicare se se almeno un quarto dei valori della matrice è pari. Non interessa sapere quanti siano i valori pari, ma solo sapere se ce n è almeno un certo numero noto a priori (num_righe * num_colonne / 4, attenzione: tronca la parte frazionaria); quindi quando si arriva a contarne esattamente quel numero si può uscire dai due cicli annidati per non perdere tempo inutilmente (è inutile contare anche gli altri). Per uscire da più cicli annidati si può utilizzare il goto. 30 10. Si acquisisca da tastiera una matrice di int di dimensioni uguale a R righe e C colonne (con R e C costanti predefinite), chieda all utente le dimensioni r e c di una matrice tali che r R e c C, visualizzi tutte le sottomatrici di dimensioni r c della matrice data la cui somma degli elementi è uguale a zero. Esempio con R=4, C=5, r=2, c=2: -2-2 4 9 7 Output prodotto: -2 2-9 13-5 22 8-9 13 16-9 1-9 2 3 2 33 2 9 13 5-9 1 31 11. Scrivere un programma che definisca una matrice 20x26 di valori int casuali (0-99), chieda all utente di introdurre una matrice (dimensioni e valori) e determini se questa seconda è contenuta nella prima, indicando le coordinate di ogni ricorrenza della stessa. 2 12 4 9 7 21 25 9 22 8 16 11 11 9 22 3 2 33 11 9 9 22 11 9 Trovata alle coordinate (1,2) Trovata alle coordinate (2,3) 32

Homework 1 Si scriva un programma per calcolare il prodotto di due matrici. Le dimensioni delle matrici vengano chieste all utente (max 100x100 ciascuna). Si controlli che le dimensioni delle matrici siano tali da permettere che esse vengano moltiplicate. La matrice risultante deve essere visualizzata. 33