Esercizi. La funzione swapint() primo tentativo

Documenti analoghi
Esercizi C su array e matrici

Esercizi. Stringhe. Stringhe Ricerca binaria

Esercizi C sui tipi definiti dall utente

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Introduzione al linguaggio C Puntatori

Il linguaggio C. Puntatori e dintorni

Esercitazione 11. Liste semplici

C: panoramica. Violetta Lonati

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Tipi di dato semplici

dott. Sabrina Senatore

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

Il linguaggio C. Notate che...

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

ESERCIZIO: Lettura/Scrittura Array

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Esercizi. I File ed il C

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

3 Costrutti while, for e switch

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

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

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Esercizio 1 (15 punti)

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

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

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

Esercitazione 6. Array

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

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

- int nbrani = 0; //numero di brani presenti in archivio. int creaplaylist(tipobrano[] playlist, int n, TipoGenere g, TipoFile t);

Strutture Dati Dinamiche

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

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

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

Esercizio 1: calcolo insieme intersezione

$QDOLVLGHOSURJUDPPDTXDGUDWR

Operazioni su file di caratteri

Dati aggregati. Violetta Lonati

Stringhe e tipi di dati strutturati

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Linguaggio C: PUNTATORI

Struct, enum, Puntatori e Array dinamici

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

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

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

Fondamenti di Informatica Il linguaggio C (parte 1) IL LINGUAGGIO C

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

18/01/16. Soluzione degli esercizi svolti in aula alla lavagna. Seconda lezione. Cast

Lezione 8 Struct e qsort

Informatica 1. Prova di recupero 21 Settembre 2001

Scrittura formattata - printf

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Esercizi di programmazione in C

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

Compito di Fondamenti di Informatica

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

ELEMENTI DI INFORMATICA LB ESERCITAZIONE (del 09/03/2007) Files, Strutture e Liste

Breve Ripasso del linguaggio C

Strategie di programmazione

Programmazione di base

L'Allocazione Dinamica della Memoria nel linguaggio C

Fondamenti di Informatica

Corso di Fondamenti di Informatica Il sistema dei tipi in C++


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

Perché il linguaggio C?

Introduzione alla programmazione in linguaggio C


Puntatori e Heap in C. Prof.Ing.S.Cavalieri

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Programmazione I - Laboratorio

Il linguaggio C funzioni e puntatori

I puntatori e l allocazione dinamica di memoria

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

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

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

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

int ninv; /* numero di inventario */

Associazione Variabile-Indirizzo

Indirizzi e tipi puntatore a

C espressioni condizionali

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

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

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

Linguaggio C - sezione dichiarativa: costanti e variabili

INFORMATICA. Strutture iterative

void concatenastringhe (char st1[], char st2[], char stout[]) { int n=0,s=0; // dichiarazione variabili con inizializzazioni

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Fondamenti di Programmazione

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

INTRODUZIONE. ALLA PROGRAMMAZIONEColonna 1. in linguaggio C

Transcript:

Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include <stdio.h> La funzione swapint() primo tentativo void swapint (int a1, int a2) int tmp; tmp = a1; a1 = a2; a2 = tmp; void main () int n1 = 3, n2 = 4; swapint (n1, n2); printf ("n1=%d,n2=%d",n1,n2); Passando i parametri per valore, il risultato non è quello atteso! wrongswapint() scambia il contenuto delle variabili locali a1 e a2 Nessun effetto sulle variabili n1 e n2-2 - 1

Definizione: Parametri per indirizzo void funzione (float *p1, char *p2) *p1 = 1.125; *p2 = 'z'; Chiamata: float x; char y; funzione (&x, &y); I parametri formali puntano ai parametri attuali Le modifiche effettuate sui parametri formali sono in realtà eseguite sui parametri attuali. - 3 - #include <stdio.h> La funzione swapint() versione corretta void swapint (int *p1, int *p2) int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; void main () int n1 = 3, n2 = 4; swapint (&n1, &n2); printf ("n1=%d,n2=%d",n1,n2); - 4-2

Indovina numero Scrivere un programma che, utilizzando le funzioni, implementi un gioco nel quale l utente deve indovinare un numero segreto entro un massimo di tentativi La funzione indovinanumero(): Permette di inserire un numero Confronta il numero inserito con quello da individuare e visualizza il messaggo troppo grande o troppo piccolo Se il numero inserito è corretto, la funzione ritorna vero, altrimenti ricomincia il ciclo (un parametro fissa il numero max di tentativi) Se, esauriti i tentativi permessi, il numero segreto non è stato individuato, la funzione ritorna falso. - 5 - #include <stdio.h> Indovina numero typedef enum falso, vero Booleano; Booleano indovinanumero (unsigned int *ripetiz, unsigned int maxripetiz, unsigned long int numero) unsigned long int tentativo; unsigned int n = 0; Booleano trovato = falso; do printf ("Tentativo %u: ", n + 1); scanf ("%lu", &tentativo); n++; - 6-3

Indovina numero if (tentativo == numero) trovato = vero; else if (tentativo > numero) printf ("Troppo grande!\n"); else printf ("Troppo piccolo!\n"); while (!trovato && n < maxripetiz); *ripetiz = n; return trovato; - 7 - Indovina numero void main() const unsigned long int NUMERO = 999, MAXRIP = 3; Booleano indovinato; unsigned int nrip; indovinato = indovinanumero (&nrip,maxrip,numero); if (!indovinato) printf ("Tentativi esauriti"); else printf ("Ok al tentativo %u", nrip); - 8-4

Puntatore a struct Due modi equivalenti di accedere ad un campo di una struct, usando un puntatore: Esempio, evendo questo tipo strutturato: typedef struct int a; int b; int c; MioTipo; MioTipo *f; Accedo al campo a attraverso *f usando: (*f).a oppure f->a f a b c - 9 - Area Scrivere un programma che, sfruttando le funzioni, permetta di calcolare l area di un cerchio o di un quadrato. L utente inserisce un numero, dichiarando se si tratta del raggio di un cerchio o del lato di un quadrato Se l utente inserisce un numero negativo viene visualizzato un errore, altrimenti il sistema calcola l area in modo appropriato. - 10-5

Area #include <stdio.h> #define PI 3.1415 #define NUMERO_NEGATIVO -1; #define NO_ERRORE 0; typedef enum quadrato, cerchio Forma; typedef struct Forma qualeforma; float a; float area; InfoFigura;. - 11 - Area int calcolaarea (InfoFigura *f) if ((*f).a < 0) return NUMERO_NEGATIVO; if ((*f).qualeforma == quadrato) (*f).area = (*f).a * (*f).a; else (*f).area = (*f).a * (*f).a * PI; return NO_ERRORE;. - 12-6

Area void main() InfoFigura figura; int errore; printf ("Figura (0=quadrato, 1=cerchio)? "); scanf ("%u", &figura.qualeforma); printf ("lato o raggio: "); scanf ("%f", &figura.a); errore = calcolaarea (&figura); if (errore == NO_ERRORE) printf ("Area: %f", figura.area); - 13 -. Richiamo: array e puntatori Il nome dell array, usato senza le parentesi, rappresenta l indirizzo in memoria della prima cella (ovvero, un puntatore ad essa) L indirizzo non può essere modificato (ovvero, il nome rappresenta un puntatore costante) E possibile definire un puntatore ed usarlo come array! int vetta[4], vettb[4]; int *pintero; pintero = vetta; /* Corretto: pintero punta a vetta */ pintero[1] = 3; /* Corretto: pintero come array */ vettb = vetta; /* Errore di compilazione! */ vetta = pintero; /* Errore di compilazione! */ - 14-7

Parametri array Sfrutta le caratteristiche di puntatori e array Definizione: void funzione (float *v1, char *v2) v1[3] = 1.125; /* v1 come array */ v2[15] = 'z'; /* v2 come array */ Chiamata: float a[10]; char b[20]; funzione (a, b); /*senza & perché nome è puntatore*/ Definizione equivalente: void funzione (float v1[], char v2[]) Passaggio per indirizzo! - 15 - Media e varianza Scrivere un programma che, utilizzando le funzioni, calcoli la media e la varianza di un array di numeri reali Utilizzare le funzioni: leggi(): permette di inserire il vettore di numeri media(): calcola e ritorna la media varianza(): calcola e ritorna la varianza scrivi(): visualizza il vettore, la media e la varianza. - 16-8

#include <stdio.h> #include <math.h> Media e varianza void leggi (float vet[], unsigned int lungh) unsigned int i; for (i = 0; i < lungh; i++) printf ("Numero: "); scanf ("%f", &vet[i]); Non si usa return perché vet è passato per indirizzo. - 17 - Media e varianza float media (float vet[], unsigned int lungh) unsigned int i; float m = 0; for (i = 0; i < lungh; i++) m = m + vet[i]; return m / lungh;. - 18-9

Media e varianza float varianza (float vet[], unsigned int lungh, float media) unsigned int i; float v = 0; for (i = 0; i < lungh; i++) vet[i] = pow (vet[i] - media, 2.0); for (i = 0; i < lungh; i++) v = v + vet[i]; return v / (lungh 1);. - 19 - Media e varianza void scrivi (float vet[], unsigned int lungh, float med, float var) unsigned int i; for (i = 0; i < lungh; i++) printf ("%f\n", vet[i]); printf ("Media: %f, varianza: %f", med, var); - 20-10

Media e varianza void main() const unsigned int MAX = 3; float array[max]; float m, v; leggi (array, MAX); /* non uso & */ m = media (array, MAX); v = varianza (array, MAX, m); scrivi (array, MAX, m, v); Side effect su array Cosa visualizza la funzione scrivi()? Non funziona! Serve un altro vettore in cui salvare array prima che venga modificato. - 21 - Media e varianza void main() const unsigned int MAX = 3; float array[max], copia[max]; float m, v; unsigned int i; leggi (array, MAX); /* non uso & */ m = media (array, MAX); for (i = 0; i < MAX; i++) copia[i] = array[i]; Side effect su array v = varianza (array, MAX, m); scrivi (copia, MAX, m, v); Adesso scrivi() stampa il vettore corretto - 22-11

Copia di struct con campi puntatore Se la struct contiene dei puntatori: typedef struct int *a; int b[2]; Tipo; int w[2]=5,6; Tipo x, y; x.a = w; x.b[0] = 7; x.b[1] = 8; y = x; x y a b 7 8 a b 7 8 w 5 6 Avrò un alias (x.a e y.a puntano alla stessa variabile). - 23 - Riassumendo: quando usare Passaggio parametri per copia (o per valore): La funzione deve ritornare un solo valore (e quindi basta usare il return); i parametri sono parametri di input Passaggio parametri per indirizzo: La funzione deve ritornare più valori (e quindi non basta usare il return) e non voglio usare variabili globali; i parametri sono parametri di input/output Caso particolare: gli array Il nome dell array rappresenta l indirizzo in memoria della prima cella Passando l array come parametro, ne passo in realtà l indirizzo Quindi, gli array sono sempre passati per indirizzo e non per copia (possibili side effect). - 24-12