{"id":6083,"date":"2011-03-11T15:22:44","date_gmt":"2011-03-11T14:22:44","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6083"},"modified":"2011-10-05T12:19:17","modified_gmt":"2011-10-05T10:19:17","slug":"2-introduzione-alla-programmazione-algoritmi-e-diagrammi-di-flusso","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/2-introduzione-alla-programmazione-algoritmi-e-diagrammi-di-flusso\/","title":{"rendered":"2. Introduzione alla programmazione: algoritmi e diagrammi di flusso"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-00.jpg\" alt=\"corso-completo-c-introduzione-alla-programmazione-00\" title=\"corso-completo-c-introduzione-alla-programmazione-00\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6184\" \/><\/a> Alla base della programmazione vi \u00e8 il concetto di <strong>algoritmo<\/strong>.<br \/>\nPossiamo provare a spiegare in modo non rigoroso cosa sia un algoritmo: \u00e8 un insieme di istruzioni per fare qualcosa. Se per strada vi chiedono delle informazioni per raggiungere la spiaggia, probabilmente voi fornirete un algoritmo per raggiungerla, qualcosa come: &#8220;Vai dritto, gira a sinistra, poi <em>se<\/em> la strada \u00e8 bloccata vai dritto, <em>altrimenti<\/em> gira a sinistra e cammina <em>fino a quando<\/em> vedrai il Duomo&#8221;. In questo testo ho messo in corsivo alcuni termini il cui significato \u00e8 molto importante nel mondo della programmazione, li rivedremo spesso nelle prossime lezioni.<!--more--><\/p>\n<p>Come abbiamo detto l&#8217;informatica \u00e8 una scienza e non una materia approssimativa, non possiamo quindi accettare definizioni approssimative di algoritmo, ce ne serve una formale. Esistono diverse definizioni formali della parola algoritmo, quella che piaceva tanto al mio professore universitario \u00e8 questa:<\/p>\n<blockquote><p>\nDicesi &#8220;algoritmo&#8221;, un insieme finito di istruzioni, effettivamente eseguibili, atte alla risoluzione di un problema.\n<\/p><\/blockquote>\n<p>A me piace inoltre ricordare che algoritmo ha la stessa radice ed etimologica di algebra, una parola che a sua volta deriva dal nome del grande matematico arabo Musa al-Khwarizmi (<a href=\"http:\/\/biografieonline.it\/biografia.htm?BioID=2298&#038;biografia=Muhammad+ibn+Musa+al-Khwarizmi\" target=\"_blank\">link<\/a>) e che vuol dire, in qualche modo, spezzare, dividere in parti pi\u00f9 piccole. Un algoritmo \u00e8 quindi un sistema per spezzare un problema in parti pi\u00f9 piccole.<\/p>\n<p>Notiamo che nella definizione non c&#8217;\u00e8 nulla di esplicitamente legato al mondo della programmazione, infatti il concetto di algoritmo \u00e8 molto pi\u00f9 generico.<\/p>\n<h4>Descrivere un algoritmo: i diagrammi di flusso<\/h4>\n<p>I diagrammi di flusso o a diagrammi a blocchi sono un metodo grafico per rappresentare un algoritmo. Esistono anche altri metodi per descrivere un algoritmo, come lo <em>pseudocodice<\/em> o il linguaggio naturale, ma i diagrammi di flusso si prestano molto bene per via della loro chiarezza. In alcuni casi, infatti, \u00e8 facile riscontrare alcuni problemi logici di un algoritmo semplicemente guardandone il diagramma di flusso.<\/p>\n<p>I blocchi che costituiscono un diagramma di flusso sono:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-01.jpg\" alt=\"corso-completo-c-introduzione-alla-programmazione-01\" title=\"corso-completo-c-introduzione-alla-programmazione-01\" width=\"500\" height=\"95\" class=\"aligncenter size-full wp-image-6185\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-01.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-01-300x57.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-01-150x28.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Le frecce indicano il flusso delle operazioni da eseguire.<\/p>\n<p>Utilizzando questo sistema potremmo descrivere l&#8217;algoritmo per preparare un t\u00e8 in questo modo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-02.jpg\" alt=\"corso-completo-c-introduzione-alla-programmazione-02\" title=\"corso-completo-c-introduzione-alla-programmazione-02\" width=\"294\" height=\"337\" class=\"aligncenter size-full wp-image-6186\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-02.jpg 294w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-02-261x300.jpg 261w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-02-130x150.jpg 130w\" sizes=\"auto, (max-width: 294px) 100vw, 294px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>ottenendo sicuramente un risultato pi\u00f9 chiaro rispetto ad una descrizione in linguaggio naturale.<\/p>\n<p>A volte mi chiedo perch\u00e9 nei libri di cucina non utilizzino i diagrammi di flusso! si eviterebbero frasi come &#8220;porre nella casseruola nella quale avevamo tagliato le verdure che erano state sbucciate&#8230;&#8221;<\/p>\n<h4>Correttezza di un algoritmo<\/h4>\n<p>Se \u00e8 facile descrivere un algoritmo, ben pi\u00f9 grosso \u00e8 invece il problema di definirne la correttezza e verificare che rispetti tutte le propriet\u00e0 che lo definiscono.<\/p>\n<p>Sorvolando momentaneamente la correttezza, possiamo verificare fin da subito almeno che soddisfi le tre propriet\u00e0 dettate dalla definizione?<\/p>\n<p><strong>Insieme finito di istruzioni<\/strong><\/p>\n<p>Un algoritmo deve avere un numero finito di istruzioni, non deve cio\u00e8 continuare indefinitamente. Ci si pu\u00f2 chiedere che senso abbia cercare di risolvere un problema con un algoritmo che non finisce mai, e in effetti in generale ha davvero poco senso tranne che in casi davvero particolari. Supponiamo infatti di voler ricercare un numero perfetto dispari (<a href=\"http:\/\/it.wikipedia.org\/wiki\/Numero_perfetto\" target=\"_blank\">link<\/a>), purtroppo non \u00e8 noto se un tale numero esista realmente, quindi possiamo solo scorrere tutti i numeri fin quando non ne troviamo uno oppure&#8230;oppure proseguiremo ad infinito. Quindi quello che stiamo facendo, tecnicamente non \u00e8 un algoritmo.<\/p>\n<p>C&#8217;\u00e8 un altro modo di uscire fuori dalla definizione di algoritmo ed \u00e8 quello di generare un <em>loop<\/em>, una sequenza di istruzioni che si ripete (spesso per errore) indefinitamente come in questa versione modificata dell&#8217;algoritmo per fare il t\u00e8:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-03.jpg\" alt=\"corso-completo-c-introduzione-alla-programmazione-03\" title=\"corso-completo-c-introduzione-alla-programmazione-03\" width=\"266\" height=\"306\" class=\"aligncenter size-full wp-image-6187\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-03.jpg 266w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-03-260x300.jpg 260w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-alla-programmazione-03-130x150.jpg 130w\" sizes=\"auto, (max-width: 266px) 100vw, 266px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il problema in questo esempio \u00e8 che per errore ho scritto &#8220;metti l&#8217;acqua sul fornello&#8221; senza specificare che sia acceso, quindi se il fornello \u00e8 spento continuer\u00f2 ad aspettare indefinitamente. Questo quindi tecnicamente non \u00e8 un algoritmo.<\/p>\n<h4>Istruzioni effettivamente eseguibili<\/h4>\n<p>Questa parte della definizione significa che le istruzioni devono essere eseguibili, se non lo sono non si tratta di un algoritmo. Per esempio in un algoritmo non pu\u00f2 essere presente l&#8217;istruzione &#8220;prendi il pi\u00f9 grande numero primo&#8221; in quanto non \u00e8 eseguibile considerando che i numeri primi sono infiniti.<\/p>\n<p>Alcune volte viene richiesto anche che le istruzioni siano &#8220;atomiche&#8221;, nel senso di indivisibili, elementari. (quando hanno scoperto le particelle subatomiche avrebbero dovuto cambiare nome all&#8217;atomo!). Questa caratteristica ha influenza solo sulla quantit\u00e0 di dettaglio che bisogna fornire all&#8217;esecutore dell&#8217;algoritmo affinch\u00e8 lo possa eseguire. Ad esempio possiamo dare l&#8217;istruzione &#8220;versa l&#8217;acqua in una tazza&#8221; ad un uomo perch\u00e8 per lui \u00e8 un&#8217;istruzione atomica, non ci sarebbe bisogno di specificare ulteriori dettagli per\u00f2 se il destinatario delle nostre istruzioni fosse un robot meccanico allora bisognerebbe certamente fornire istruzioni come &#8220;afferra la tazza, sollevala, ruotala intorno al suo asse etc etc&#8221;.<\/p>\n<h4>Istruzioni atte alla risoluzione di un problema<\/h4>\n<p>L&#8217;algoritmo per fare il t\u00e8 alla fine deve fare il t\u00e8, se non lo fa non \u00e8 un algoritmo, o meglio, \u00e8 un algoritmo probabilmente per non fare il t\u00e8. Questa propriet\u00e0 non \u00e8 facilmente verificabile, perch\u00e8 l&#8217;algoritmo potrebbe sembrare che faccia il t\u00e8, mentre in realt\u00e0 non lo fa. Questo problema a questo punto ricade sulla correttezza dell&#8217;algoritmo.<\/p>\n<h4>Correttezza di un algoritmo<\/h4>\n<p>Un algoritmo si dice corretto se fa quello per cui \u00e8 stato progettato. In algoritmi piuttosto complessi non \u00e8 facile seguire il filo del procedimento, quindi viene richiesta una verifica formale del loro funzionamento. Una vera e propria dimostrazione con tanto di teoremi, ipotesi e regole di derivazione. Certo nessuno vi chieder\u00e0 di dimostrare l&#8217;algoritmo per preparare il t\u00e8, ma se scriverete un programma per cifrare le password in un database bancario, probabilmente qualcuno vi chieder\u00e0 di dimostrare, formalmente, qual \u00e8 la probabilit\u00e0 che qualcuno riesca a decifrarlo inserendo una chiave a caso.<\/p>\n<p>Resta per\u00f2 il fatto che &#8220;Dimostrare la correttezza di un algoritmo \u00e8 un problema indecidibile&#8221; (<a href=\"http:\/\/it.wikipedia.org\/wiki\/Teoremi_di_incompletezza_di_G%C3%B6del#Esempi_di_enunciati_indecidibili\" target=\"_blank\">link<\/a>) per\u00f2 questa frase oltre a giustificarvi con il vostro cliente che vi chiede come mai il vostro programma non funziona, ci informa anche che non esiste una procedura automatica per cui, dato un algoritmo si riesca a decidere se sia corretto o meno. Ci sono tantissimi casi particolari in cui \u00e8 possibile dare una risposta, ma resta valido il principio generale di indecidibilit\u00e0.<\/p>\n<h4>Prossimamente:<\/h4>\n<p>Nella prossima lezione faremo una panoramica sulle caratteristiche dei linguaggi di programmazione, vedremo perch\u00e9 ne esistono cos\u00ec tanti e quali sono le loro principali differenze. Inoltre daremo un breve introduzione al linguaggio C<\/p>\n<h4>Letture consigliate:<\/h4>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" title=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7803\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><strong>Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica) <\/strong><\/a><br \/>\n<em>Brian W. Kernighan &#8211; Dennis M. Ritchie<\/em><br \/>\n<strong>Editore:<\/strong> Pearson | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 313 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 27,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 22,95 con Spedizione gratuita<\/p>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" title=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7550\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><strong>C. Corso completo di programmazione<\/strong><\/a><br \/>\n<em>Paul J. Deitel &#8211; Harvey M. Deitel<\/em><br \/>\n<strong>Editore:<\/strong> Apogeo | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 640 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 39,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 33,15 con Spedizione gratuita<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alla base della programmazione vi \u00e8 il concetto di algoritmo. Possiamo provare a spiegare in modo non&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[569],"tags":[612,593,613,241,594,611,592],"class_list":["post-6083","post","type-post","status-publish","format-standard","hentry","category-corso-completo-di-c","tag-algoritmo","tag-corso-completo-di-c-2","tag-diagrammi-di-flusso","tag-ignazio-calo","tag-iniziare-a-programmare-iphone","tag-introduzione-alla-programmazione","tag-programmare-in-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6083"}],"version-history":[{"count":23,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6083\/revisions"}],"predecessor-version":[{"id":7806,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6083\/revisions\/7806"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}