Corso C su Raspberry PI partendo da zero: scrivere le proprie funzioni

Le possibilità offerte dal linguaggio C sono infinite, soprattutto quando c'è da gestire, in modo ordinato e preciso, i propri algoritmi. Scrivere una propria funzione, e riutilizzarla, è una prerogativa di quasi tutti i linguaggi di programmazione, ma il C lo fa in modo esemplare. L'articolo che segue affronta il tema con estrema chiarezza, approfondendo anche l'argomento del passaggio e del ritorno dei parametri e dei valori.

Introduzione

Il mio primo linguaggio di programmazione fu il Basic per lo ZX81 Sinclair, uno dei primi Home Computer. La sua memoria era estremamente limitata, solo 1Kb di Ram (avete letto bene, solamente 1 kilobyte) con i quali si riusciva a fare ben poco, ma i rimedi estremi, a volte, esortavano a fare miracoli. Ebbene, il limitato potere del sistema mi costringeva, spesso, a ripetere tanto codice. E molte volte tale ripetizione riguardava uno stesso algoritmo, magari eseguito in precedenza. Per fortuna esistevano i Gosub e i Return che risolvevano alcuni problemi.

Le funzioni UDF

Il C è un linguaggio interamente basato su funzioni. Tutto è una funzione, anche la main(), che contiene il programma principale. Una UDF (user-defined function) è una funzione creata dall'utente che ha lo scopo di soddisfare ed eseguire compiti non contemplati da altre funzioni già esistenti. Con esse, in pratica, si arricchisce il linguaggio di nuove possibilità.

Il seguente esempio, anche se funziona, non utilizza una UDF, pertanto il numero delle righe è elevato e il sorgente non risulta snello e leggibile. Il programma deve determinare se quattro numeri sono primi o meno. Ricordiamo che un numero primo è un numero naturale che può essere diviso solo per 1 e per se stesso.

Il listato è volutamente lungo e tedioso, proprio per rimarcare l'importanza dell'esistenza delle UDF. In esso viene determinato se i numeri 23, 10007, 10011, 30000001 e 750000007 sono primi. Per ognuno di essi una variabile itera tra 2 e n-1 alla ricerca di un divisore (vedi n%k==0). Il programma non è per nulla ottimizzato e si potrebbe velocizzarlo ulteriormente. Per gli ultimi due numeri esso impiega qualche secondo per decretare la soluzione. Si compili, dunque, con il solito comando:

gcc -Wall prova.c

e si esegua il programma. Il risultato è visibile in figura 1.

#include <stdio.h>
int main(){
   unsigned long k,n;
   char FlagPrimo;
   /*----------------------------------*/
   n=23;
   FlagPrimo=1;
   for(k=2;k<n;k++)
      if(n%k==0)
         FlagPrimo=0;
   if(FlagPrimo==1)
      printf("%ld e' un numero Primo\n",n);
   else
      printf("%ld e' un numero Composto\n",n);
   /*----------------------------------*/
   n=10007;
   FlagPrimo=1;
   for(k=2;k<n;k++)
      if(n%k==0)
         FlagPrimo=0;
   if(FlagPrimo==1)
      printf("%ld e' un numero Primo\n",n);
   else
      printf("%ld e' un numero Composto\n",n);
   /*----------------------------------*/
   n=10011;
   FlagPrimo=1;
   for(k=2;k<n;k++)
      if(n%k==0)
         FlagPrimo=0;
   if(FlagPrimo==1)
      printf("%ld e' un numero Primo\n",n);
   else
      printf("%ld e' un numero Composto\n",n);
   /*----------------------------------*/
   n=30000001;
   FlagPrimo=1;
   for(k=2;k<n;k++)
      if(n%k==0)
         FlagPrimo=0;
   if(FlagPrimo==1)
      printf("%ld e' un numero Primo\n",n);
   else
      printf("%ld e' un numero Composto\n",n);
   /*----------------------------------*/
   n=750000007;
   FlagPrimo=1;
   for(k=2;k<n;k++)
      if(n%k==0)
         FlagPrimo=0;
   if(FlagPrimo==1)
      printf("%ld e' un numero Primo\n",n);
   else
      printf("%ld e' un numero Composto\n",n);
   /*----------------------------------*/
   return 0;
}

Figura 1: Il programma dei numeri primi.

Nel listato si nota una caratteristica particolare: viene ripetuto tante volte lo stesso algoritmo. Immaginate se avessimo dovuto controllare 1000 numeri, quanto lungo [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2497 parole ed è riservato agli abbonati PLATINUM. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici PREMIUM e PLATINUM e potrai fare il download (PDF) di tutti gli EOS-Book, Firmware e degli speciali MONOTEMATICI. ABBONATI ORA con PAYPAL è semplice e sicuro.

Abbonati alle riviste di elettronica

5 Commenti

  1. Massimiliano.Elico 4 ottobre 2016
  2. Massimiliano.Elico 4 ottobre 2016

Scrivi un commento