TECNICHE DI PROGRAMMAZIONE 1 Descrivere in maniera non ambigua cosa deve fare il programma POCO PRECISO Es. Scrivere un programma per calcolare l’area di tre figure geometriche (quadrato, triangolo, cerchio) e fare quindi la somma delle aree. PIU’ PRECISO Es. Scrivere un programma per caricare e mostrare il lato del quadrato, la base e l’altezza del triangolo, il raggio del cerchio, calcolare l’area del quadrato,del triangolo e del cerchio, mostrare i valori delle aree, fare la loro somma e mostrarle. TECNICHE DI PROGRAMMAZIONE 2 Accertarsi che il problema sia risolvibile. Test della frase Indicare se la seguente frase è VERA o FALSA "in queta frase ci sono tre erori" FALSA VERA ALTRO INDECIDIBILE TECNICHE DI PROGRAMMAZIONE 3 Se il problema è risolvibile allora è sempre possibile scrivere un algoritmo per trovare la soluzione. TECNICHE DI PROGRAMMAZIONE 4 Metodo successive approssimazioni. 1- Descrivere mediante frasi o diagrammi di flusso il problema. LEGGI I DATI CALCOLO AREA QUADRATO, TRINGOLO E CERCHIO E MOSTRALI SOMMA AREA QUADRATO, TRINGOLO E CERCHIO E MOSTRA Metodo successive approssimazioni. 2- Raffinare la descrizione usando un linguaggio più simile al linguaggio di programmazione. Leggi i valori per: LatoQuadrato, BaseTriangolo, AltezzaTriangolo, RaggioCerchio AreaQuadrato LatoQuadrato x LatoQuadrato AreaTriangolo (BaseTriangolo x AltezzaTriangolo)/2 AreaCerchio PiGreco x (Raggio)2 mostra AreaQuadrato, AreaTriangolo, AreaCerchio SommaAree AreaQuadrato + AreaTriangolo + AreaCerchio mostra SommaAree Metodo successive approssimazioni. 2- Scrivere il programma. PROGRAM Area(input,output); {calcolo aree quadrato, trinagolo, cerchio e sommale} CONST PiGreco=3,14; VAR LatoQuadrato, BaseTriangolo, AltezzaTriangolo, RaggioCerchio : integer; AreaQuadrato, AreaTriangolo, AreaCerchio, SommaAree : real; BEGIN AreaQuadrato:= LaqoQuadrato* LaqoQuadrato; AreaTriangolo:= BaseTriangolo* AltezzaTriangolo/2; AreaCerchio:= PiGreco*sqr(RaggioCerchio); writeln(‘Area Quadrato’, AreaQuadrato :5:2); writeln(‘Area Triangolo’, AreaTriangolo :5:2); writeln(‘Area Cerchio’, AreaCerchio :5:2); writeln(‘Somma Aree ‘, SommaAree :6:2); END. TECNICHE DI TEST TRACE - Si usano dati noti che producono risultati noti. Limite: vale solo per i dati di test. ASSERTION - Seguire passo passo l’algoritmo e verificare che ogni passo sia logicamente coerente con i precedenti. Limite: per algoritmi molto complessi è difficile da fare. ON-LINE - Inserisci scritte di controllo per verificare la correttezza dell’elaborazione. Limite: vale solo per i dati usati nei test. MANUTENZIONE - Si usano le scritte di controllo e commento. 1 - DEFINISCI IL PROBLEMA no E’ RISOLVIBILE? si LASCIA PERDERE O RIDEFINISCI IL PROBLEMA 2 - PIANIFICA E RAFFINA UNA SEQUENZA DI AZIONI no SEMBRA CHE IL PROBLEMA SIA RISOLVIBILE ? si RIVEDI IL PUNTO 2 3 - SCRIVI E COMPILA IL CODICE SORGENTE CI SONO ERRORI DI SINTASSI ? si RIVEDI IL PUNTO 3 no 4 - LANCIA IL PROGRAMMA I RISULTATI SONO CORRETTI ? no RIVEDI IL PUNTO 4 si 5 - USA IL PROGRAMMA SONO RICHIESTE ALTRE MODIFICHE ? si RIPARTI DAL PUNTO 1 USO DI PSEUDO-CODICE Uno pseudo-codice è una scrittura informale di un programma o di una sua parte a cui corrispondono eventuali istruzioni in un linguaggio tipo Pascal (codice sorgente o source code). Esempio 1 - Introduci tre caratteri e stampali in ordine inverso a quello di inserimento. Pseudo codice. INPUT: leggi i valori del carattere1, carattere2 e carattere3 e mostrali sul monitor. OUTPUT: mostra sul monitor il carattere3, il carattere2, il carattere1 Source code. PROGRAM InvertiCaratteri(input,output); Introduci tre caratteri e stampali in ordine inverso a quello di inserimento. VAR Carattere1, Carattere2, Carattere3: Primo carattere. Secondo carattere. Terzo carattere. char; BEGIN write(‘Introduci tre caratteri e poi premi Invio : ’; readln(Carattere1, Carattere2, Carattere3); writeln(‘I caratteri in ordine inverso sono: ‘, Carattere3, Carattere2, Carattere3) END. Generalizzando potremmo definire un algoritmo per la lettura dei dati, la loro elaborazione e la presentazione dei risultati. Algoritmo per leggere, elaborare e mostrare. leggi i valori dei dati elabora i dati mostra a video i risultati Fine dell’algoritmo. ESEMPI LETTURA DATI VAR Real1, Real2: real; Int1, Int2 : integer; Carattere: char; readln(Int1, Int2, Real1, Real2, Carattere) readln(Carattere, Int1, Int2, Real1, Real2) LE STRINGHE Una variabile di tipo stringa rappresenta un gruppo di caratteri messi insieme con un qualche criterio. Per definire le stringhe si usa la parola riservata STRING. STRING [ VAR Stringa1, Stringa2: STRING[10]; costante intera ] E’ possibile definire un tipo per introdurre un indicatore di riferimento invece di usare tipi anonimi, legati cioè a singole variabili. TYPE identificatore TYPE Stringa10 = STRING[10]; VAR Stringa1, Stringa2: Stringa10; = tipo ; Esempio Programma per dare il benvenuto agli studenti del corso. Pseudo-codice Mostra la frase di benvenuto generale Chiedi il nome dello studente Mostra la frase di benvenuto usando il nome dello studente PROGRAM BenvenutoAlCorso(input,output); Questo programma dà il benvenuto ad ogni studente del corso di Programmazione CONST NomeDocente = ‘Ernesto Burattini’; MaxLungStringa = 50; massimo numero di caratteri permessi TYPE NomeTipo = STRING[MaxLungStringa]; VAR NomeStud = NomeTipo; BEGIN writeln(‘Buongiorno’, il mio nome e’’, NomeDocente, ‘, ’); writeln(‘Potrei sapere il nome dello studente seduto in prima fila a destra?’); readln(NomeStud); writeln(‘Benvenuto al Corso di Programmazione ‘, NomeStud) END. Benven ALCUNE FUNZIONI STANDARD Ogni funzione è richiamata facendo riferimento al suo identificatore. Ogni funzione deve avere un argomento. funzione identificatore ( espressione Ipotenusa:=sqrt(sqr(Lato1)+sqr(Lato2)) ) Nome Funzione Tipo Argomento Tipo Risultato abs Valore assoluto dell’argo mento Quadrato dell’argo mento Radice quadrata dell’argo mento Numerico Come ValAss=abs(-3) 3 l’argomento Numerico Come Quadr=sqr(5) 25 l’argomento Numerico Reale sqr sqrt Esempio RadQuad=sqrt(16) ) 4 Nome Funzione pred Predecessore Carattere dell’argomento Carattere PredCar=pred(‘c’) b succ Successore Carattere dell’argomento Carattere SuccCar=pred(‘c’) d chr Carattere il Intero cui valore numerico è l’argomento Valore Carattere numerico il cui carattere è l’argomento Carattere Carattere=chr(65) ) A ord Tipo Tipo Argomento Risultato Intero Esempio ValNum=ord(‘A’) ) 65 CODIFICA CARATTERI ASCII American Standard Coded Information Interchange EBCDIC Extended Binary Coded Decimal Interchange Code Se vogliamo sapere in binario come è codificato un certo carattere è sufficiente applicare la funzione ord al carattere e quindi fare il binario del numero decimale così ottenuto. ord(‘A’)=65 -------- Binario(65)=01000001 Si noti che se chr(65)=‘A’ allora chr(ord(‘A’))=‘A’ Dec 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 Esad 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A Simb Dec A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 Esad 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A Simb a b c d e f g h i j k l m n o p q r s t u v w x y z Poiché nel codice ASCII la differenza tra i codici delle maiuscole e minuscole è costante, cioè: [ord(‘a’)-ord(‘A’)]= [ord(‘b’)-ord(‘B’)]=….= [ord(‘z’)-ord(‘Z’)] Allora è possibile scambiare la minuscole con le maiuscole con la seguente istruzione: Letter := chr(ord(Letter)+ord(‘A’)-ord(‘a)); Esercizio spazio a capo Dato un testo, controllare che dopo (. Þ) o dopo (. ¶) il testo successivo inizi con la maiuscola. Se non accade sostituire la minuscola con la corrispondente maiuscola. PROGRAMMAZIONE TOP-DOWN - Dividere il problema in sotto problemi (quando possibile) - Rappresentare graficamente la struttura del problema - Assegnare ad ogni identificatore un nome legato al suo significato. Il nome relativo (di una costante o variabile) non deve cambiare nel corso del programma, non si deve cioè chiamare con due nomi diversi lo stesso oggetto. Il valore delle variabili però, pur se il significato resta lo stesso può cambiare nel corso del programma. Esempio Definizione del problema Dato il rapporto di cambio tra l’Euro e le monete europee, supponiamo di dover fare un viaggio attraverso Italia, Francia e Germania. Abbiamo disponibili 1000 Euro e spendiamo : Lit 650.000 in Italia FF 870 in Francia DM 280 in Germania Ci chiediamo quanti Euro restano a fine viaggio. PSEUDO CODICE INIZIALE •Calcolare la spesa in Euro in Italia •Calcolare la spesa in Euro in Francia •Calcolare la spesa in Euro in Germania •Sommare tutte le spese in Euro •Calcolare la differenza tra la spesa in Euro e la cifra iniziale RAPPRESENTAZIONE GRAFICA SpeseLit SpeseFF SpeseDD LitEuro FFEuro DDEuro SpeseLitEuro SpeseFFEuro SpeseDDEuro CifraEuro SpeseTotEuro LitEuro FFEuro DDEuro SpeseLit SpeseFF SpeseDD CifraEuro Resto Viaggio SpeseLitEuro SpeseFFEuro SpeseDDEuro Calcola la differenza SpeseTotEuro Introduci valori del cambio Introduci le spesein Lit, FF, DD e la cifra iniziale in Euro Trasforma le spese in Euro Calcola la spesa totale in Euro Mostra il risultato I rapporti di cambio tra euro e Lit, FF e DD sono Lit 1936,27 FF 1,955830258 DD 6,559580191 Scrivere il programma in PASCAL Euro