{"id":374,"date":"2014-12-30T19:00:14","date_gmt":"2014-12-30T18:00:14","guid":{"rendered":"http:\/\/www.valcon.it\/pascal\/?p=374"},"modified":"2014-12-30T19:33:34","modified_gmt":"2014-12-30T18:33:34","slug":"sottoprogrammi","status":"publish","type":"post","link":"https:\/\/www.valcon.it\/pascal\/sottoprogrammi\/","title":{"rendered":"Sottoprogrammi"},"content":{"rendered":"<p>Un programma pu\u00f2 diventare molto lungo&#8230;<\/p>\n<div class=\"clear\">Per migliorare la leggibilit\u00e0 si pu\u00f2<\/div>\n<ul>\n<li>ricorrere a delle linee vuote o di commento<\/li>\n<li>dare dei nomi a a parti di codice riconoscibili<\/li>\n<li>separare questi blocchi dal flusso principale<\/li>\n<li>scrivere una sola volta parti di codice che si ripetono<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-61 size-full\" src=\"http:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub0.png\" alt=\"sub0\" width=\"124\" height=\"124\" \/>Se a questi blocchi di codice si da un nome e si separano dal programma principale, scrivendoli prima, diventano dei sottoprogrammi<\/p>\n<pre class=\"\">Procedure P1;\r\nBegin\r\n\u00a0 \u00a0Istr11;\r\n   Istr12;\r\n   ...\r\nEnd;\r\nProcedure P2;\r\nBegin\r\n\u00a0 \u00a0Istr21;\r\n   Istr22;\r\n   ...\r\nEnd;\r\n...\r\nBegin { MAIN }\r\n   ...\r\n   P1;\r\n   P2;\r\n   ...\r\nEnd.<\/pre>\n<p>Per passare il controllo al sottoprogramma \u00e8 necessario <em>chiamarlo<\/em>.<\/p>\n<p>Il controllo ritorna al chiamante quando si giunge all&#8217;etichetta di fine del sottoprogramma <tt>End<\/tt>.<\/p>\n<p>Il blocco principale non ha l&#8217;esclusiva di fare le chiamate, anzi ogni sottoprogramma pu\u00f2 chiamare tutti gli altri sottoprogrammi.<\/p>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-62 size-full\" src=\"http:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub1.png\" alt=\"sub1\" width=\"184\" height=\"124\" srcset=\"https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub1.png 184w, https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub1-150x101.png 150w\" sizes=\"(max-width: 184px) 100vw, 184px\" \/>Parametri per valore<\/h3>\n<p>All&#8217;atto della chiamata di un sottoprogramma \u00e8 possibile specificare dei parametri<\/p>\n<pre class=\"\">P1(a, b);<\/pre>\n<p class=\"clear\">Prima dell&#8217;esecuzione del codice del sottoprogramma <strong>P1<\/strong>\u00a0avviene un passaggio, assegnazione, del valore di <strong>a<\/strong> in <em>x<\/em> e del valore di <strong>b<\/strong> in <em>y<\/em>.<\/p>\n<pre class=\"clear\">Procedure\u00a0P1(x: Integer; y: Double);<\/pre>\n<p>Il sottoprogramma <strong>P1<\/strong>\u00a0svolger\u00e0 l&#8217;operazione per la quale \u00e8 stato progettato in modo parametrico, cio\u00e8 in funzione dei valori assunti dai <em>parametri formali<\/em> (<em>x, y, &#8230;<\/em>) specificati dal chiamante tramite i <strong>parametri attuali<\/strong> (<strong>a<\/strong>, <strong>b<\/strong>, &#8230;)<\/p>\n<h4 id=\"hn_59ca4f8bbb_1\">Note<\/h4>\n<ol type=\"1\">\n<li>l&#8217;elenco dei <strong>parametri attuali<\/strong> deve corrispondere in numero e tipo all&#8217;elenco dei parametri formali<\/li>\n<li>ogni <em>parametro formale<\/em> viene dichiarato e si comporta come una variabile locale inizializzata al valore specificato con il parametro attuale all&#8217;atto della chiamata<\/li>\n<li>i <strong>parametri attuali<\/strong> devono essere <em>valori<\/em>, quindi possono essere costanti (<strong>-1<\/strong>, <strong>+5.0<\/strong>), variabili (<strong>a<\/strong>, <strong>b<\/strong>), espressioni (<strong>-a<\/strong>, <strong>b+5.0<\/strong>), &#8230;<\/li>\n<li>al termine dell&#8217;esecuzione del sottoprogramma le eventuali modifiche dei valori dei <em>parametri formali<\/em> scompariranno per sempre&#8230;<\/li>\n<\/ol>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-63 size-full\" src=\"http:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub2.png\" alt=\"sub2\" width=\"184\" height=\"124\" srcset=\"https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub2.png 184w, https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub2-150x101.png 150w\" sizes=\"(max-width: 184px) 100vw, 184px\" \/>Parametri per variabile<\/h3>\n<p>Piuttosto che passare dei valori si pu\u00f2 scegliere di passare delle variabili (<em>indirizzi, reference, &#8230;<\/em>).<\/p>\n<pre class=\"\">Procedure P2(Var x: Integer; Var y: Double);\r\nBegin\r\n   ...\r\nEnd;\r\n...\r\nP2(a, b);<\/pre>\n<div class=\"clear\">Il sottoprogramma <strong>P2<\/strong> svolger\u00e0 l&#8217;operazione per la quale \u00e8 stato progettato utilizzando <strong>a<\/strong>, il <strong>parametro attuale<\/strong>, ogni volta che nel suo codice compare <em>x<\/em>, il <em>parametro formale<\/em>.<\/div>\n<div class=\"clear\">Analogamente per l&#8217;uso di <strong>b<\/strong> piuttosto che di <em>y<\/em>.<\/div>\n<p>Si dice che <em>x<\/em>\u00a0e <em>y<\/em>\u00a0sono solo <em>reference<\/em>, riferimenti, per <strong>a<\/strong>\u00a0e <strong>b<\/strong><\/p>\n<h4>Note<\/h4>\n<ol type=\"1\">\n<li>gli effetti dell&#8217;esecuzione del sottoprogramma <strong>P2<\/strong>\u00a0si manifestano nei valori contenuti nelle variabili utilizzate come <strong>parametri attuali<\/strong> all&#8217;atto della chiamata<\/li>\n<li>i <strong>parametri attuali<\/strong> devono essere variabili<\/li>\n<\/ol>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-64 size-full\" src=\"http:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub3.png\" alt=\"sub3\" width=\"184\" height=\"124\" srcset=\"https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub3.png 184w, https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub3-150x101.png 150w\" sizes=\"(max-width: 184px) 100vw, 184px\" \/>Parametri misti<\/h3>\n<p>Le due modalit\u00e0 di passaggio dei parametri (per valore, per riferimento) possono essere utilizzate contemporaneamente<\/p>\n<pre class=\"\">Procedure P3(Var x: Integer; y: Double);\r\nBegin\r\n   ...\r\nEnd;\r\n...\r\nP(a, b);<\/pre>\n<p>Alla fine dell&#8217;esecuzione del sottoprogramma <strong>P3<\/strong> il valore di <strong>a<\/strong>, nel chiamante dipender\u00e0 dalle operazioni che sono state eseguite su <strong>x<\/strong> in <strong>P3<\/strong>.<\/p>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-66 size-full\" src=\"http:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub5.png\" alt=\"sub5\" width=\"210\" height=\"150\" srcset=\"https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub5.png 210w, https:\/\/www.valcon.it\/pascal\/wp-content\/uploads\/sub5-150x107.png 150w\" sizes=\"(max-width: 210px) 100vw, 210px\" \/>Funzioni<\/h3>\n<p>Quando il sottoprogramma <strong>F<\/strong> termina restituisce un risultato che occuper\u00e0 <em>logicamente<\/em> lo spazio di codice della chiamata<\/p>\n<pre class=\"\">Function\u00a0F(x: Integer; y: Double): Char;\r\nBegin\r\n \u00a0 ...\r\n \u00a0 F:=...;\r\nEnd;\r\n...\r\nWriteln(F(a,b));\r\n...\r\nz:=F(a,b);\r\n...\r\n<\/pre>\n<p class=\"\">Il chiamante ricever\u00e0 da\u00a0<strong>F<\/strong> (la funzione) un dato, risultato dell&#8217;elaborazione, e potr\u00e0 utilizzarlo come argomento di altre elaborazioni<\/p>\n<ul>\n<li>visualizzazione<\/li>\n<li>assegnazione a una variabile<\/li>\n<li>elaborazione all&#8217;interno di un&#8217;espressione<\/li>\n<li>come parametro all&#8217;interno di un&#8217;altra chiamata<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<h4 id=\"hn_59ca4f8bbb_1\">Note<\/h4>\n<ol type=\"1\">\n<li>Si assegna <em>letteralmente<\/em> il risultato alla funzione.<\/li>\n<li>L&#8217;assegnazione potrebbe avvenire pi\u00f9 volte, quindi l&#8217;ultima assegnazione determiner\u00e0 il risultato effettivo.<\/li>\n<\/ol>\n<h3>Ricorsione<\/h3>\n<p>Se il linguaggio di programmazione prevede la ricorsione&#8230; un sottoprogramma <strong><span style=\"font-family: monospace;\">PR<\/span><\/strong>\u00a0pu\u00f2 chiamare il sottoprogramma <strong>PR<\/strong>, se stesso, per svolgere lo stesso compito ma con un&#8217;stanza diversa<\/p>\n<pre class=\"\">Procedure PR(parametri_formali);\r\nBegin\r\n\u00a0 \u00a0 ...\r\n\u00a0 \u00a0 PR(parametri_attuali);\r\n\u00a0 \u00a0 ...\r\nEnd;<\/pre>\n<p>Il sottoprogramma <strong>PR<\/strong> chiama il sottoprogramma <strong>PR<\/strong> &#8230; finch\u00e9 non succede qualcosa (l&#8217;istanza diventa un <em>caso particolare<\/em> che non necessita di un&#8217;ulteriore chiamata <em>ricorsiva<\/em>) e si ritorna all&#8217;indietro fino alla prima chiamata&#8230;<\/p>\n<p>Pu\u00f2 essere una funzione <strong>FR<\/strong> &#8230;<\/p>\n<pre class=\"\">Function FR(parametri_formali): Double;\r\nBegin\r\n\u00a0 \u00a0 ...\r\n\u00a0 \u00a0 x=FR(parametri_attuali);\r\n\u00a0 \u00a0 ...\r\n\u00a0 \u00a0 FR:=espr;\r\nEnd;<\/pre>\n<p>La ricorsione pu\u00f2 essere anche <em>indiretta:\u00a0<\/em>il sottoprogramma <strong>PR1<\/strong> chiama il sottoprogramma <strong>PR2<\/strong> che a sua volta &#8230; che a sua volta chiama <strong>PR1<\/strong>.<\/p>\n<h3>Conclusioni<\/h3>\n<p>Si pu\u00f2 immaginare un sottoprogramma come uno <em>strumento<\/em> del quale non si conosce l&#8217;implementazione (<em>scatola nera<\/em>) ma si conoscono<\/p>\n<ul>\n<li>il nome<\/li>\n<li>la funzionalit\u00e0 che offre<\/li>\n<li>l&#8217;elenco dei parametri formali (con la loro modalit\u00e0 di passaggio e il loro ruolo)<\/li>\n<li>l&#8217;eventuale tipo del valore di ritorno<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Un programma pu\u00f2 diventare molto lungo&#8230; Per migliorare la leggibilit\u00e0 si pu\u00f2 ricorrere a delle linee vuote o di commento dare dei nomi a a parti di codice riconoscibili separare questi blocchi dal flusso principale scrivere una sola volta parti di codice che si ripetono &#8230; Se a questi blocchi di codice si da un &#8230; <a title=\"Sottoprogrammi\" class=\"read-more\" href=\"https:\/\/www.valcon.it\/pascal\/sottoprogrammi\/\" aria-label=\"Leggi di pi\u00f9 su Sottoprogrammi\">Leggi tutto<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/374"}],"collection":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/comments?post=374"}],"version-history":[{"count":13,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/374\/revisions"}],"predecessor-version":[{"id":388,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/374\/revisions\/388"}],"wp:attachment":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/media?parent=374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/categories?post=374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/tags?post=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}