PROGRAMMA: PRINTING UN GIOCO DI PAROLE CAPITOLO2 FONDAMENTI DI C printf( C, o non C: Questo è il problema.\n"); Scrivere questo programma e chiamarlo pun.c Usare l estensione.c per i programmi C. 1 2 COMPILAZIONE E LINKING Prima che un programma sia eseguito, sono necessari tre steps: Preprocessing. Il preprocessore obbedisce a comandi che iniziano con # Compiling. Il compilatore traduce il programma in istruzioni macchina. Linking. Il linker combina il codice oggetto prodotto dal compilatore con qualche codice aggiuntivo necessario per completare l esecuzione del programma. Il preprocessore è di solito integrato con il compilatore. FORMA DI UN SEMPLICE PROGRAMMA directive istruzioni C usa e per individuare l inizio e la fine di un gruppo si comandi. 3 6
DIRECTIVE Le direttive sono comandi per il e <stdio.h> è un header contenenete informazioni circa la libreria standard di I/O FUNCTIONS Una funzione ha un nome proprio e raggruppa una serie di istruzioni. Funzioni di libreria sono fornite dal C. Una funzione che calcola un valore, usa un return per specificare il valore da restituire: return x + 1; Le direttive cominciano sempre con # Alla fine della linea non c è ; 7 8 LA FUNZIONE main La funzione main è obligatoria. main è chiamata automaticamente quando il programma è eseguito. main restituisce un valore numerico indice dello stato di terminazione del programma; il valore 0 indica una terminazione normale. Se l istruzione return è omessa alla fine della funzione main, molti compilatori segnalano l errore. ISTRUZIONI Una istruzione è un comando che viene eseguito quando gira il programma. pun.c usa solo due tipi di istruzioni: return e printf Si tratta in entrambi I casi di funzioni. Si dice che sono state chiamate le funzioni. Ciascuna istruzione deve terminare con un punto e virgola ; 9 10
PRINTING STRINGHE I caratteri da scrivere sullo standard output (terminale) con la printf devono essere inclusi tra e PRINTING STRINGHE: ESEMPI printf("c, o non C: Questo è il problema. \n"); printf non va automaticamente daccapo. Per avere una nuova linea con printf bisogna includere \n (new-line character) printf("c, o non C: "); printf("questo è il problema. \n"); Lo \n può essere ripetuto più volte printf("c, o non C: \n"); printf("questo è il problema. \n"); 11 12 COMMENTI Un commento comincia con /* e finisce con */ /* This is a comment */ VARIABILI La maggior parte dei programmi richiedono di conservare valori in locazioni chiamate variabili Type /* Name: pun.c Purpose: Prints a bad pun. Author: K. N. King */ Ogni variabile ha un tipo. C ha una grande varietà di tipi: int e float Una variabile di type int(integer) può conservare numeri come 0, 1, 392, or 2553. 13 14
TYPES Una variabile di type float (floating-point) può conservare numeri più grandi di variabili di type int Una variabile di type float può contenere numeri decimali, come 379.125 DICHIARAZIONI Le variabili devono essere dichiarate prima di essere usate Le variabili devono essere dichiarate una alla volta int height; float profit; Oppure, molte variabili dello stesso tipo possono essere dichiarate insieme int height, length, width, volume; float profit, loss; 15 16 DICHIARAZIONI dichiarazioni istruzioni ASSEGNAMENTI Ad una variabilepuò essere dato un valore con un assegnamento height = 8; Il numero 8 è detto una costante Prima di assegnare un valore ad una variabile, o prima di farne un qualunque altro uso, la variabile deve essere dichiarata. 17 18
ASSIGNMENT Una volta che è stato assegnbato un valore ad una variabile, la variabile può essere usata per computare il valore di un altra variabile height = 8; length = 12; width = 10; volume = height * length * width; /* volume is now 960 */ Il lato destro di un assignamento può essere una qualunque formula ( expression, in C) che coinvolge costanti, variabili ed operatori PRINTING IL VALORE DI UNA VARIABLE printf può essere usata per mostrare il valore di una variabile Per scrivere su standard output Height: h dove h è il valore corrente della variabile height printf("height: %d\n", height); %d indica il punto in cui deve apparire il valore di height 19 20 PRINTING IL VALORE DI UNA VARIABLE %d può essere usato solo per variabili int %f può essere usato per variabili float Non c è limite al numero di variabili che possono essere inserite in una chiamata di printf: PROGRAM: COMPUTARE IL PERIMETRO E L AREA DI UN RETTANGOLO Il programma rettangolo.c il perimetro e l area di un rettangolo con dimesioni: Base (cm): 12 Altezza (cm): 30 printf("height: %d Length: %d\n", height,length); 21 22
rettangolo.c /* Computa il perimetro e l area di un rettangolo con base di 12 cm ed altezza 30 cm */ int base, altezza, perimetro, area; INIZIALIZAZIONE Il valore iniziale di una variabile può essere inclusa nella sua dichiarazione: int base = 12; base = 12; altezza = 30; perimetro = (base + altezza) * 2; area = (base * altezza); printf("dimensioni: %dx%d\n", base, altezza); printf( Perimetro (cm): %d\n", perimetro); printf("dimensional area (cm x cm): %d\n", area); int base = 12, altezza = 30; int base, altezza = 30; /* initializes only altezza */ 23 24 PRINTING ESPRESSIONI printf può mostrare a video il valore di un espressione volume = height * length * width; printf("%d\n", volume); LEGGERE L INPUT scanf è la controparte di counterpart di printf nella libreria C Example di uso di scanf per leggere un int scanf("%d", &i); /* reads an integer; stores into i */ printf("%d\n", height * length * width); scanf("%f", &x); /* reads a float; stores into x */ Il simbolo & è di solito usato da scanf. 25 26
PROGRAM: COMPUTARE IL PERIMETRO E L AREA DI UN RETTANGOLO (RIVISITATO) Il programma rettangolo-1.c il perimetro e l area di un rettangolo con dimesioni fornite dall utente Ciascuna chiamata di scanf è preceduta da una di printf che chiede il dato rettangolo-1.c /* Computa il perimetro e l area di un rettangolo con base di 12 cm ed altezza 30 cm */ int base, altezza, perimetro, area; printf( Inserisci la base del rettangolo: "); scanf("%d", &base); printf("inserisci l altezza del rettangolo: "); scanf("%d", &altezza); perimetro = (base + altezza) * 2; area = (base * altezza); printf( Perimetro (cm): %d\n", perimetro); printf("dimensional area (cm x cm): %d\n", area); 27 28 PROGRAM: COMPUTARE IL PERIMETRO E L AREA DI UN RETTANGOLO (RIVISITATO) Esempio dell output del programma 30 Inserisci la base del rettangolo: 12 Inserisci l altezza del rettangolo: Perimetro (cm): 84 Area (cm x cm): 180 DEFINIRE I NOMI DELLE COSTANTI rettangolo.c and rettangolo-1.c usano la costante 2 Possiamo definire la costante con una macro: #define CONST_RETT 2 Il nomi delle costanti vengono di solito scritti con lettere maiuscole 29 30
DEFINIRENOMI PER LE COSTANTI Quando viene compilato un programma, il ppreprocessore sostituisce ciascuna macro con il valore che lo rappresenta. Durante il preprocessing, l istruzione perimetro = (base + altezza) * CONST_RETT; diventa perimetro = (base + altezza) * 2; Rettangolo-2.c /* Computa il perimetro e l area di un rettangolo con base di 12 cm ed altezza 30 cm */ #define CONST_RETT 2 int base, altezza, perimetro, area; printf( Inserisci la base del rettangolo: "); scanf("%d", &base); printf("inserisci l altezza del rettangolo: "); scanf("%d", &altezza); perimetro = (base + altezza) * CONST_RETT; area = (base * altezza); printf( Perimetro (cm): %d\n", perimetro); printf("dimensional area (cm x cm): %d\n", area); 31 32 PROGRAMMA: CONVERTIRE DA FAHRENHEIT A CELSIUS Il programma celsius.c chiede all utente di inserire una temperatira e poi scrive su stdout l equivalente temperatura Celsius Esempio dell output del programma Enter Fahrenheit temperature: 212 Celsius equivalent: 100.0 celsius.c /* Converts a Fahrenheit temperature to Celsius */ #define FREEZING_PT 32.0f #define SCALE_FACTOR (5.0f / 9.0f) float fahrenheit, celsius; printf("enter Fahrenheit temperature: "); scanf("%f", &fahrenheit); celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR; printf("celsius equivalent: %.1f\n", celsius); 33 34
PROGRAMMA: CONVERTIRE DA FAHRENHEIT A CELSIUS Definire SCALE_FACTOR con (5.0f / 9.0f) invece di (5 / 9) è importante. Nota che l uso di %.1f per la visualizzazione di celsius permette di avere 1 sola cifra decimale IDENTIFICATORI I nomi di variabili, funzioni macro sono chiamati identificatori. Un identificatore può contenere lettere, cifre e underscores, ma deve cominciare con una lettera o un underscore times10 get_next_char _done 35 36 IDENTIFICATORI C è case-sensitive: distingue tra lettere maiuscole e minuscole. Per esempio, gli identificatori seguenti sono tutti differenti job job job job Job JoB JOb JOB CHAPTER 3 INPUT/OUTPUT FORMATTATO 37 38
LA FUNZIONE printf La funzione printf ha come parametro il formato della stringa, seguiti da alcuni valori che vi devono essere inseriti durante la visualizzazione: printf(string, expr1, expr2, ); Il formato della stringa può contener normali caratteri e specificatori di conversione che cominciano con il carattere % %d è usato per indicare un int %f è usato per indicare un float LA FUNZIONE printf int i, j; float x, y; i = 10; j = 20; x = 43.2892f; y = 5527.0f; printf("i = %d, j = %d, x = %f, y = %f\n", i, j, x, y); Output: i = 10, j = 20, x = 43.289200, y = 5527.000000 39 40 LA FUNZIONE printf Attenzione! printf("%d %d\n", i); /*** WRONG ***/ LA FUNZIONE scanf scanf legge l input in accordo ad un particolare formato scanf può contenere sia caratteri normali che specifiche di conversione printf("%d\n", i, j); /*** WRONG ***/ Le conversioni di scanf sono preticamente le stesse di printf. 41 42
LA FUNZIONE scanf int i, j; float x, y; scanf("%d%d%f%f", &i, &j, &x, &y); Esempio di input: 1-20.3-4.0e3 PROGRAMMA: SOMMARE FRAZIONI Il programma addfrac.c chiede all uetnte di inserire due frazioni e poi mosta in output la frazione somma. Esempio: Enter first fraction: 5/6 Enter second fraction: 3/4 The sum is 38/24 scanf assegnerà 1, 20, 0.3, e 4000.0 a i, j, x, e y 43 44 addfrac.c /* Adds two fractions */ int num1, denom1, num2, denom2, result_num, result_denom; printf("enter first fraction: "); scanf("%d/%d", &num1, &denom1); printf("enter second fraction: "); scanf("%d/%d", &num2, &denom2); result_num = num1 * denom2 + num2 *denom1; result_denom = denom1 * denom2; printf("the sum is %d/%d\n",result_num, result_denom) 45