Lab 03 Scanf e tempo di vita delle variabili

Documenti analoghi
Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 04 Input/Output

scanf: STRINGA DI FORMATO

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

L'immissione dei dati di un programma e l uscita dei suoi risultati avvengono attraverso operazioni di lettura e scrittura

INPUT/OUTPUT. L'immissione dei dati di un programma e l uscita dei suoi risultati avvengono attraverso operazioni di lettura e scrittura

Esercizio 1" input tre numeri interi e stampi a video la loro somma e la media. n Realizzare un programma che legga da. Lab03 2

Lab 03 Istruzioni Prima Parte"

Fondamenti di Informatica T1. Lab 03 Istruzioni. Lab03 1

Fondamenti di Informatica T1. Lab 03 Istruzioni. Lab03 1

Fondamenti di Informatica T1. Lab 03 Istruzioni. Lab03 1

Fondamenti di Informatica e Laboratorio T-AB e Fondamenti di Informatica T1 Ingegneria Elettronica e Telecomunicazioni e Ingegneria dell Automazione

Ingresso ed Uscita in C. Informatica 1 / 15

Ingresso ed Uscita in C. Luca Abeni

Struttura dei programmi C

INPUT/OUTPUT INPUT/OUTPUT

Introduzione alla programmazione in C

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

INPUT E OUTPUT DI VALORI NUMERICI

Input/Output di numeri

L'immissione dei dati di un programma e l uscita dei suoi risultati avvengono attraverso operazioni di lettura e scrittura

Fondamenti di Informatica L-A

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

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

Precedenza & associatività degli operatori C

Cosa serve per cominciare?

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

INPUT/OUTPUT L'immissione dei dati di un programma e l uscita dei suoi risultati avvengono attraverso operazioni di lettura e scrittura.

Corso sul linguaggio C

Lab 04 (parte A) Programmazione Strutturata

Corso di Informatica A.A

Tutorato Elementi di Informatica 2018

i Vettori Alessandra Giordani Lunedì 15 aprile

Espressione di chiamata di funzione

LIBRERIE STANDARD in C

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

Le funzioni, e le istruzioni di input/output

Dichiarazioni e tipi predefiniti nel linguaggio C

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Parsing. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Esercizio 1 Soluzione

Fondamenti di Informatica Laurea in Ingegneria Civile e Ingegneria per l ambiente e il territorio

Tipi di dato semplici

LIBRERIE STANDARD in C Le librerie standard

IL PRIMO PROGRAMMA IN C

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

Tipi di dato semplici

I/O da tastiera e direttive processore. Alessandra Giordani Lunedì 3 maggio

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

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

Caratteri e stringhe

Programmazione (imperativa)

#include <stdio.h> /* l esecuzione comincia dalla funzione main */ int main()

FONDAMENTI DI INFORMATICA 2

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

LABORATORIO di INFORMATICA

Parte Input e output in linguaggio i C. 3. Programmazione strutturata 1 (if, switch, comunque segnalare dei warning

Formattazione avanzata. Modificatori di formato in output Modificatori di formato in input Stream predefiniti

Fondamenti di Informatica 1 - Compito A

Lab 04 Istruzioni, cicli e array"

I CARATTERI E LE STRINGHE

Il corpo di tutte le funzioni deve essere contenuto tra parentesi graffe


Fondamenti di Informatica L-A. Esercitazione 2

Lezione 22: Input/Output e Files

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Lab 02 Tipi semplici in C

Fondamenti di Programmazione

Esercitazione 6. Array

array: vettori, matrici e stringhe

PRIMA PROVA INTERMEDIA DEL MODULO DI

Fondamenti di Informatica. Ingegneria elettronica

Tipi di dato. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

STRUTTURA DI UN PROGRAMMA C

Fondamenti di Informatica T1. Lab 04 Array. Lab06 1

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Informatica A (per gestionali) A.A. 2004/2005. Esercizi C. Strutture di controllo

STRUTTURA DI UN PROGRAMMA C!

IEIM Esercitazione II Elementi di programmazione C. Alessandro A. Nacci -

I/O Avanzato in C: scheda riassuntiva

ciclo di vita della soluzione (informatica) di un problema

Approfondimento : printf

Laboratorio di informatica Ingegneria meccanica

Esercitazione 2. Variabili e Tipi Input e Output Assegnamenti Il comando if-else

Passaggio dei parametri. Passaggio dei parametri

IEIM Esercitazione 1 Primi passi con la programmazione" Alessandro A. Nacci -

Fondamenti di Informatica L-A

1

LEZIONE 1 LE BASI DEL LINGUAGGIO C

Transcript:

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni Lab 03 Scanf e tempo di vita delle variabili Lab02 1

Obiettivo dell esercitazione Chiarire il concetto di tempo di vita delle variabili Acquistare familiarità con l istruzione di input scanf Lab02 2

Campo di visibilità Una variabile è visibile (accessibile): All interno del blocco in cui è definita All interno di ogni sottoblocco Cos è un blocco? Una istruzione complessa che raggruppa altre istruzioni e causa la loro esecuzione in sequenza Lab02 3

Esercizio 1 int main() { int x = 0; } { int y = 1; int z = x + y; } int w = x + y; Compila? Perché? Lab02 4

Esercizio 1 - Soluzione Non compila! Perché y è definita dentro un blocco ed è visibile solo al suo interno. int main() { int x = 0; } { int y = 1; int z = x + y; } int w = x + y; Lab02 5

Esercizio 2 int main() { int x = 0; } { } int x = 1; { } int y = x + 1; Quanto vale y alla fine? Perché Lab02 6

Esercizio 2 - Soluzione Vale 2, perchè la seconda definizione di x copre quella precedente all interno del blocco. int main() { int x = 0; } { } int x = 1; { } int y = x + 1; Lab02 7

Esercizio 3 int main() { int x = 0; } { } int x = 1; int y = x + 1; Quanto vale y alla fine? Perché Lab02 8

Esercizio 3 - Soluzione Vale 1! Perché la seconda x vive solo all interno del blocco in cui è definita int main() { } int x = 0; { int x = 1; } int y = x + 1; Lab02 9

L istruzione scanf scanf( stringa di formato, &var1, &var2 ) Permette di leggere una stringa di testo da console ed interpretarla per estrarre dei dati. La struttura del testo di input viene specificata mediante una stringa di formato (primo argomento) Gli argomenti rimanenti sono le variabili in cui i dati devono essere inseriti Lab02 10

L istruzione scanf Esempio: scanf( %d%d, &x, &y) Legge due interi da standard input (la console) e li inserisce rispettivamente in x e y Il primo formato finisce nella prima variabile, e così via I nomi di variabili devono essere preceduti da & (più avanti nel corso si svelerà l arcano ) Lab02 11

L istruzione scanf Un altro esempio: scanf( %d%f, &x, &y) Cosa fa? Lab02 12

L istruzione scanf Un altro esempio: scanf( %d%f, &x, &y) Cosa fa? Legge un intero ed un float, separati da spazi o tab Spazi e tab contano come separatori (non serve specificari) Lab02 13

L istruzione scanf Ancora: scanf( %d;%f, &x, &y) Legge un intero ed un float, che devono essere separati da un ; Se la stringa di formato contiene altri caratteri oltre a quelli per le conversioni %..., questi devono comparire nella stringa di input Se mettete uno spazio, questo deve comparire nella stringa di input Lab02 14

L istruzione scanf Quali conversioni? %d : intero %f : float %c : un carattere %ld : long int, mentre %lf : double Speciale: %*d, %*c, : legge un dato e poi lo scarta Es. scanf( %*d%d, &x) Legge due interi e mette il secondo in x Lab02 15

Esercizio 0 #include <stdio.h> int main() { int x; } printf("inserire la stringa di input: "); scanf("%d", &x); printf("avete inserito: %d\n", x); return 0; Lab02 16

Esercizio 1 Modificate il programma precedente in modo che legga: 1. due interi, separati da spazi o tab 2. due interi, separati da, 3. una data, nel formato: giorno/mese/anno In tutti i casi, stampate poi a video quello che avete letto! Lab02 17

Esercizio 1 - Soluzione Modificate il programma precedente in modo che legga: 1. due interi, separati da spazi o tab : scanf( %d%d, &x, &y); 2. due interi, separati da, : scanf( %d,%d, &x, &y); 3. una data, nel formato giorno/mese/anno : scanf( %d/%d/&d, &gg, &mm, &aa); Lab02 18

Esercizio 2 Provate a togliere il & da una variabile. Cosa succede? Lab02 19

Esercizio 2 - Soluzione Provate a togliere il & da una variabile. Cosa succede? Un errore a run time! In particolare un segmentation fault. Questo succede perché il programma cerca di memorizzare il dato letto in una locazione di memoria su cui ha l accesso in scrittura. Lab02 20

Esercizio 3 Modificate il programma precedente in modo che legga: 1. Un carattere 2. Due caratteri 3. Un intero ed un float, separati da qualunque carattere Lab02 21

Esercizio 3 - Soluzione Modificate il programma precedente in modo che legga: 1. Un carattere scanf( %c, &x, &y); 2. Due caratteri scanf( %c%c, &x, &y); 3. Un intero ed un float, separati da qualunque carattere scanf( %d%*c%f, &x, &y); Lab02 22

Una Trappola Lo spazio bianco e a tutti gli effetti un carattere quindi nella lettura di caratteri scanf("%d%c%c",&intero1,&car1,&car2); printf("%d,%c,%c",intero1, car1,car2); 12 A B 12,,A La scanf ha preso lo spazio come se fosse il carattere inserito! Lab02 23

Una Soluzione Usare un separatore (anche lo spazio stesso) spazio scanf("%d %c %c",&intero1,&car1,&car2); printf("%d,%c,%c",intero1, car1,car2); 12 A B 12,A,B Lab02 24

Un altra trappola# printf("inserire un numero reale: "); scanf("%f",&reale1); printf("\ninserire un carattere: "); scanf("%c",&car1); printf("\nletti: %f,%c",reale1, car1); Questo frammento di programma sembra corretto... Lab02 25

...ma il risultato e questo: Un altra trappola# Inserire un numero reale: 12.4 Inserire un carattere: Letti: 12.400000, Lab02 26

Motivo# L' I/O e bufferizzato: i caratteri letti da tastiera sono memorizzati in un buffer, incluso il fine linea. Quando leggete il float, il fine linea rimane non consumato nel buffer di input. Quindi quando poi andate a leggere un carattere, viene letto il fine linea che era rimasto nel buffer! Lab02 27

Una soluzione# Leggere il carattere "spurio" printf("inserire un numero reale: "); scanf("%f",&reale1); scanf("%*c"); /* letto e buttato via */ printf("\ninserire un carattere: "); scanf("%c",&car1); printf("\nletti: %f,%c",reale1, car1); Lab02 28

Una Seconda Soluzione# Vuotare il buffer: char buffer[dim]; printf("inserire un numero reale: "); scanf("%f",&reale1); gets(buffer); /* Si vuota il buffer */ printf("\ninserire un carattere: "); scanf("%c",&car1); printf("\nletti: %f,%c",reale1, car1); Lab02 29

Precisazione# Questo problema si verifica solo con la lettura di caratteri. Negli altri casi il doppio carattere nel buffer e considerato come sequenza di separatori e scartato. Lab02 30