Blue Flower

Le funzioni predefinite

Il linguaggio C possiede alcune funzioni predefinite (built-in), che il programmatore può usare nel programma senza dichiarazione. Queste funzioni sono raggruppate in librerie di funzioniche sono l’insieme dei file contenenti i prototipi delle funzioni. Le funzioni di libreria sono richiamabili dai programmi C, inserendo all’inizio del programma la direttiva #include che specifica il file di intestazione che contiene la libreria stessa (file con estensione .h).
Esempi di file di inclusione per le librerie, che sono già stati utilizzati nei programmi precedenti, sono:

  • stdio.h per le funzioni standard di input/output
  • math.h per le funzioni matematiche.

Per esempio la funzione sqrt(x) calcola il quadrato di un numero, mentre la funzione fabs(xrestituisce il valore assoluto di un numero in virgola mobile (float).
Se la funzione fabs non fosse già predefinita nel linguaggio, il programmatore la dovrebbe creare, dichiarandola e usandola nel programma come nell’esempio seguente.

ESEMPIO: Scrivere un programma che calcoli il valore assoluto di un numero reale

La funzione per il calcolo del valore assoluto ritorna l’opposto del numero ricevuto come parametro, se il numero è negativo, altrimenti ritorna il numero stesso.

Programma C

/* ValoreAssoluto.c : valore assoluto di un numero */
#include <stdio.h>

float fabs(float x);
/* funzione principale */
int main(void)
{

float y;
printf("Introduci un numero: ");
scanf("%f", &y);
printf("%10.2f \n", fabs(y));
return 0;
}
float fabs(float x)
{

float ValAss;
if (x < 0) ValAss = -x;
else ValAss = x;
return ValAss;
}

Si osservi che il programma precedente con alcuni compilatori può generare un warning in fase di compilazione, per un conflitto di nomi tra la funzione fabs definita dal programmatore e la funzione predefinita fabs del linguaggio. Tuttavia questo errore non impedisce l’elaborazione corretta del procedimento di calcolo contenuto nella funzione implementata.
Il linguaggio C possiede anche la funzione abs(x) per il calcolo del valore assoluto di un numero x di tipo int. Per utilizzare questa funzione occorre includere all’inizio del programma il file di intestazione stdlib.h.
Il programma seguente realizza le stesse funzionalità della funzione matematica predefinita pow del linguaggio C.
La funzione pow riceve due argomenti (base e esponente) di tipo double e restituisce un valore di tipo double.

ESEMPIO: Calcolo della potenza di un numero

Si tratta di organizzare un programma che richieda in input i valori della base e dell’esponente ed esegua l’elevamento a potenza. Per realizzare l’elevamento a potenza basta moltiplicare la base per se stessa un numero di volte pari all’esponente.

Programma C

/* PotInt.c : potenza di un numero */
#include <stdio.h>
double Pot(double x, double y);
/* funzione principale */
int main(void)
{
/* input */
double base, esponente;
/* output */
double risultato;
printf("Base: ");
scanf("%lf", &base);
printf("Esponente: ");
scanf("%lf", &esponente);
risultato = Pot(base, esponente);
printf("Base = %lf \n", base);
printf("Esponente = %lf \n", esponente);
printf("Potenza = %lf \n", risultato);
return 0;
}
double Pot(double x, double y)
{
double potenza = 1.0;
double i;
for(i=1.0; i<=y; i++) potenza *= x;
return potenza;
}

Per verificare il corretto funzionamento del programma precedente si provi, per esercizio, ad
eseguire il programma che calcola la potenza anche tramite la funzione pow; per poter utilizzare
questa funzione, occorre inserire all’inizio del programma la direttiva #include <math.h> per
rendere disponibili i prototipi delle funzioni matematiche.
/* PotInt2.c : potenza di un numero */
#include <stdio.h>
#include <math.h>
/* funzione principale */
int main(void) {
double base, esponente;
double risultato;
printf("Base: ");
scanf("%lf", &base);
printf("Esponente: ");
scanf("%lf", &esponente);
risultato = pow(base, esponente);
printf("Potenza = %lf \n", risultato);
return 0;
}

Chiaramente la funzione predefinita pow è più sofisticata della funzione Pot implementata nel precedente programma. Quest’ultima infatti considera solo il caso in cui l’esponente è intero positivo.
Le funzioni built-in della libreria math.h più utilizzate nel linguaggio C sono:

  • pow(base, esponente), utilizzata per l’elevamento a potenza (il primo argomento costituisce la base, il secondo l’esponente; entrambi gli argomenti devono essere di tipo double);
  • exp(esponente), che eleva il numero di Nepero (e = 2.17..) all’esponente passato come parametro;
  • sqrt(argomento), che calcola la radice quadrata del numero passato come argomento;
  • log(argomento), che calcola il logaritmo naturale (in base e) dell’argomento;
  • log10(argomento), che calcola il logaritmo in base 10.

Sono disponibili anche le funzioni di manipolazione delle stringhe di caratteri nella libreria string.h:

  • strlen(stringa) per calcolare il numero di caratteri della stringa (lunghezza della stringa);
  • strcpy(destinazione, sorgente) per copiare una stringa (sorgente) in un’altra (destinazione);
  • strncpy(destinazione, sorgente, n) per copiare nella stringa di destinazione i primi n caratteri della stringa sorgente;
  • strcmp(stringa1, stringa2) per operare il confronto tra due stringhe (restituisce il valore 0 se le stringhe sono uguali, un valore < 0 se stringa1 è minore di stringa2, un valore > 0 se stringa1 è maggiore di stringa2);
  • strcat(stringa1, stringa2) per concatenare due stringhe: la stringa1 è la destinazione della concatenazione e la stringa2 è la stringa da concatenare; quindi stringa1 deve essere in grado di contenere, oltre ai caratteri in essa presenti, anche tutti i caratteri di stringa2.

Rispettando le regole di visibilità, per poter utilizzare le funzioni predefinite, occorre includere i loro prototipi all’inizio del programma. Quando il programma è complesso, per rendere il codice più leggibile, è buona abitudine includere gli header file necessari prima di ciascuna funzione che li richiede. È infatti possibile ripetere l’inclusione delle intestazioni predefinite senza che si generi alcun conflitto o ridefinizione.

ESERCIZI

Funzioni senza parametri

  1. Definire una funzione che ripeta sul video in tre righe diverse la stringa acquisita da tastiera.
  2. Organizzare una funzione che acquisisca da tastiera il lato di un quadrato e ne calcoli la misura dell’area e del perimetro.

Funzioni con parametri

  1. Data la parabola y = ax2 + bx + c, definire tre funzioni per calcolarne i punti significativi: vertice, fuoco, intersezione con gli assi. Le tre funzioni ricevono come parametri i coefficienti a, b, c e restituiscono il valore calcolato.
  2. Definire una funzione che abbia come parametro un numero intero positivo e che visualizzi la sequenza dei primi 5 numeri successivi al numero dato.
  3. Scrivere una funzione che abbia come parametri il numero dei valori e la loro somma e che calcoli la media aritmetica.
  4. Dati in input le età di tre persone, scrivere i dati acquisiti in ordine decrescente.
  5. Scrivere la funzione che restituisca l’età di una persona, conoscendo il suo anno di nascita (si consideri l’anno attuale come costante).
  6. Scrivere una funzione che abbia come parametri il prezzo di vendita e la percentuale di sconto e che restituisca il prezzo scontato.
  7. Scrivere una funzione che restituisca un valore booleano Vero (1) o Falso (0), controllando se due rette, di cui si conoscono le equazioni y = m1 x + q1 e y = m2 x + q2, sono perpendicolari.
  8. Data la retta y=m x + q e il punto P di coordinate (x1, y1), controllare se il punto appartiene alla retta.
  9. Dato un elenco di reparti con l’indicazione del nome e dell’incasso giornaliero, calcolare l’incasso medio. Definire una funzione per l’acquisizione e la somma dei dati e una funzione per il calcolo della media.
  10. Dato un elenco di prodotti con descrizione e prezzo, tramite una funzione viene calcolato l’incremento del prezzo secondo una percentuale fornita da tastiera. Comunicare per ciascun prodotto la descrizione e il prezzo incrementato.
  11. Dopo aver acquisito da tastiera i nomi e i voti ottenuti da due candidati in un ballottaggio, calcolare la percentuale di ciascuno rispetto alla somma dei voti e scrivere i nomi dei candidati in ordine decrescente di percentuale.

Funzioni predefinite

  1. Scrivere un programma per acquisire in input le coordinate di due punti del piano cartesiano e per calcolare la distanza tra i due punti.
  2. Scrivere il programma che calcola l’esponenziale, il logaritmo naturale, in base e, e il logaritmo in base 10 di un numero fornito da tastiera.
  3. Scrivere il programma che acquisisca da tastiera il nome e la lingua straniera studiata da N studenti e che visualizzi il nome di quelli che studiano la lingua inglese.