Home

IN EVIDENZA

C

2.2 - Ricorsione

In questo esempio vediamo, invece, come sia possibile effettuare una chiamata ricorsiva ad una funzione.
La funzione "factorial" richiama se stessa finchè il numero a parametro non diventa 1.

Code:

/* Funzione Fattoriale Ricorsiva */
#include 

long factorial(long);

main()
{
      int i;      
      for (i = 1; i <= 10; i++)
      {
          printf("%2d! = %d\n", i, factorial(i));
      }      
      return 0;
}

long factorial(long number)
{
     if (number <= 1)
        return 1;
     else
        return (number * factorial(number - 1));
}


Ultimo aggiornamento 14/04/2023 16:44:35
C

2.1 - Visibilità

Un aspetto molto importante, non solo per il C, ma per tutti i linguaggi di programmazione, è capire bene la visibilità delle variabili all'interno delle singole porzioni di codice (tra cui appunto, le funzioni).
Nell'esempio qui sotto vediamo definite 3 funzioni (a, b e c) e dichiarata una variabile "globale" (x). Queste dichiarazioni vengono inserite prima (e fuori) del metodo "main".
Nella main è poi definita un'altra variabile x che questa volta è "locale" (locale del metodo main), viene inserita una porzioni di codice all'interno di parentesi graffe, stabilendo una nuova "visibilità".
Infine viene di nuovo definita una variabile x all'interno dell'implementazione delle funzioni.
Enjoy!

Code:

/* Un esempio di visibilità */
#include <stdio.h>

void a(void);
void b(void);
void c(void);

int x = 1;  // Variabile Globale

main()
{
      int x = 5;  // Variabil Locale
      printf("Variabile Locale x in tutta main(): %d\n", x);
      
      {    // Porzione con nuova visibilità
          int x = 7;
          printf("Variabile Locale x in una porzione di main(): %d\n", x);
      }
      
      printf("Variabile Locale x in tutta main(): %d\n", x);
      
      a();  // var x locale automatica
      b();  // var x locale statica
      c();  // usa la var x globale
      a();  
      b();
      c();
      
      printf("Variabile Locale x nella main(): %d\n", x);
      return 0;
}

void a(void)
{
     int x = 25;
     printf("\nVariabile Locale x e' %d alla chiamata di a\n", x);
     ++x;
     printf("Variabile Locale x e' %d all'uscita da a\n", x);
}

void b(void)
{
     static int x = 50;
     printf("\nVariabile Locale Statica x e' %d alla chiamata di b\n", x);
     ++x;
     printf("Variabile Locale Statica x e' %d all'uscita da b\n", x);
}

void c(void)
{
     printf("\nVariabile Globale x e' %d alla chiamata di c\n", x);
     x *= 10;
     printf("Variabile Globale x e' %d all'uscita da c\n", x);
}


Ultimo aggiornamento 09/09/2022 12:26:15
C

2.0 - Le Funzioni

Una caratteristica importante del C è la possibilità di definire delle funzioni "custom" riutilizzabili più volte nel programma.
Le funzioni hanno sempre un valore di ritorno, nell'esempio qui sotto viene tornato un intero. Se la funzione non deve tornare nulla, occorre definirla come "void", cioè tornerà un valore nullo.
Vedremo altri esempi più avanti, questo è solo un primo accenno.

Code:

/* Esempio di funziona definita dal programmatore */
#include <stdio.h>

int quadrato(int);	/* Definizione della funzione */

main()
{
      int x;
      
      for (x = 1; x <= 10; x++)
      {
          printf("%d  ", quadrato(x));
      }
      
      printf("\n");
      return 0;
}

/* Implementazione della funzione */
int quadrato(int y)
{
    return y * y;
}


Ultimo aggiornamento 09/09/2022 12:25:37
PHP

Step5: Prime tabelle per il menu

Iniziamo costruendo un paio di tabelle che ci serviranno per la nostra navigazione: una tabella relativa alle categorie per raggruppare voci di menu omogenee e una seconda per le voci di menu effettive.

 

t_cat_menu

id          INTEGER     PK    NN          AI
codice      VARCHAR(5)        NN    UQ
descrizione VARCHAR(50)       NN
ordine      INTEGER           NN

 

t_menu

id          INTEGER     PK    NN          AI
codice      VARCHAR(5)        NN    UQ
descrizione VARCHAR(50)       NN
md5         VARCHAR(50)       NN
url         VARCHAR(50)       NN
pubblicato  BOOLEAN           NN
idCategoria INTEGER           NN
idPadre     INTEGER
ordine      INTEGER           NN

 

Per quanto riguarda il campo “boolean” un tempo, sui vecchi MySql non era previsto e si usava il tipo dati “TINYINT” di lunghezza 1, ma oramai si sono evoluti anche loro, potenza della Oracle!

Le due tabelle hanno quindi una relazione uno a molti tra la categoria e le relative voci di menu.

Costruiamo 2 classi che siano aderenti a queste 2 tabelle create.

catMenu.class.php:

//CATEGORIA DEL MENU

class catMenu

{

       var $id;

       var $codice;

       var $descrizione;

       var $ordine;

function __construct()

       {     

       }

}

 

4 attributi che corrispondono ai 4 campi della tabella. Il costruttore va previsto, ma in questo caso non ci serve molto e possiamo lasciarlo vuoto, potremmo utilizzarlo ad esempio per preimpostare qualche campo…

Creiamo poi i metodi per le classiche operazioni di lettura della lista dei record, di dettaglio di un singolo record, di update, di delete.

Se vogliamo lavorare con un vero modello 3-tier parcheggiamo i dati estratti dal database su delle collection in memoria.

Un metodo “getList” potrebbe quindi essere:

function getList()

{

  global $db;

  global $errorMsg;

            

  try

  {

    $sql = "SELECT * FROM t_cat_menu ORDER BY ordine";

    if(!$db->query($sql))

      throw new Exception($errorMsg, 0);

      

    while ($rowCatMenu = $db->row())

    {

       $id = $rowCatMenu["id"];

       $hashtable[$id] =

array( "id"           => $id

                    ,"codice"       => $rowCatMenu["codice"]

                    ,"descrizione"  => $rowCatMenu["descrizione"]

                    ,"ordine"       => $rowCatMenu["ordine"]

             );

    }

       return $hashtable;

  }

  catch (Exception $ex)

  {

    $errorMsg = $ex->getMessage();

  }

}

Usiamo 2 variabili globali ($db e $errorMsg) in modo da centralizzare nella index.php la connessione al database (che ovviamente comunque non è persistente e viene istanziata ad ogni action) e una unica variabile contente la messaggistica (non necessariamente solo di errore) che viene poi visualizzata in una precisa posizione della pagina.

Per i dati estratti costruiamo delle hashtable, con le n-uple costituite da accoppiate chiave – valore.

Le classi costruite quindi costituiscono il livello dell’applicativo che lavora sui dati. L’SQL che opera sul DB deve essere presente SOLO QUI!

In modo del tutto identico possiamo costruire le classe per la tabella t_menu:

menu.class.php

class menu

{

       var $id;

       var $codice;

       var $descrizione;

       var $md5;

       var $url;

       var $categoria;

       var $ruolo;

       var $pubblicato;

       var $ordine;

       var $id_padre;

}


Questi sono gli attributi e qui sotto il metodo getList:

function getList($categoria = null)

{

  global $db;

  global $errorMsg;

            

  try

  {

     $sql = "SELECT * FROM t_menu m

LEFT JOIN t_cat_menu c ON m.id_categoria = c.id ";

     if ($categoria != null) { $sql .= "WHERE m.id_categoria = ".$categoria; }

     $sql .= " ORDER BY c.ordine, m.ordine";

            

     if (!$db->query($sql))

       throw new Exception($errorMsg, 0);

            

     while ($rowMenu = $db->row())

     {

       $id = $rowMenu["m.id"];

       $hashtable[$id] =

array ( "id"               => $id

                    ,"codice"           => $rowMenu["m.codice"]

                    ,"descrizione"      => $rowMenu["m.descrizione"]

                    ,"md5"              => $rowMenu["m.md5"]

                    ,"url"              => $rowMenu["m.url"]

                    ,"codiceCategoria"  => $rowMenu["c.codice"]

                    ,"pubblicato"        => $rowMenu["m.pubblicato"]

                    ,"ordine"           => $rowMenu["m.ordine"]

             );

     }

     return $hashtable;

  }

  catch (Exception $ex)

  {

    $errorMsg = $ex->getMessage();

  }

}

L’unica differenza rispetto al getList delle categorie di menu è che qui viene gestito un parametro (facoltativo) che se valorizzato viene utilizzato per filtrare le voci di menu relativa alla categoria passata a parametro.

Direi che vi ho martellato abbastanza, alla prossima!


Ultimo aggiornamento 16/01/2020 10:00:41
DataBase

Nuova versione Corso Database Relazionali

Ciao a tutti,
è pronta la nuova versione (1.2.5) del Corso Database Relazionali.

Un saluto

Stefano
Ultimo aggiornamento 13/05/2012 16:20:09