Programmazione in C Il problem solving Programmazione in C Problem solving elementare su dati scalari Il problem solving Problemi numerici Problemi di codifica/decodifica Problemi testuali Problemi di verifica e filtro di dati Problemi di ordinamento Sommario 2 © 2006 Politecnico di Torino 1 Programmazione in C Il problem solving Riferimenti al materiale Testi Kernighan & Ritchie Cabodi, Quer, Sonza Reorda Dietel & Dietel Dispense Scheda: “Problem solving elementare su dati scalari” 3 Problem solving elementare su dati scalari © 2006 Politecnico di Torino 2 Programmazione in C Il problem solving Il problem solving Problem solving e algoritmi Strategie di soluzione Classificazione dei problemi Problemi su dati scalari 5 Il problem solving © 2006 Politecnico di Torino 3 Programmazione in C Il problem solving Problem solving e algoritmi Con il termine “problem solving” si intende la soluzione di problemi (computazionali) mediante programmi (software) Tale soluzione si concretizza mediante Una codifica dei dati La formalizzazione di un algoritmo La scrittura di un programma C Tipi e costanti Variabili (globali, locali) e/o strutture dati dinamiche Funzioni 7 Struttura dati La scelta della struttura dati deve tener conto Della natura del problema, delle informazioni ricevute in input, dei risultati richiesti Delle scelte algoritmiche Scegliere una struttura dati significa decidere quali (di che tipo) e quante variabili saranno necessarie per immagazzinare le informazioni (dati in input, intermedi e risultati) Talvolta la struttura dati può essere scelta prima di definire l’algoritmo, ma spesso è necessario considerare dati e algoritmo insieme 8 © 2006 Politecnico di Torino 4 Programmazione in C Il problem solving Algoritmo Un algoritmo (da Al-Huarizmi, matematico arabo del IX secolo d.C.) è una sequenza finita di istruzioni che: Risolvono un problema Soddisfano i seguenti criteri Ricevono valori in ingresso Producono valori in uscita Sono chiare, non ambigue ed eseguibili Terminano dopo un numero finito di passi Operano su strutture dati 9 Algoritmo = strategia Scegliere un algoritmo spesso significa individuare la miglior strategia (= sequenza di passi) per risolvere un problema La scelta si basa su Conoscenza delle operazioni elementari e delle funzioni di libreria fornite dal linguaggio C Conoscenza dei costrutti linguistici (tipi di dato, costrutti condizionali e iterativi) Esperienza su tipi diversi di problemi 10 © 2006 Politecnico di Torino 5 Programmazione in C Il problem solving Il problem solving Strategia La maggioranza dei problemi risolti mediante programmi consiste nell’elaborazione di informazioni ricevute in input, per produrre risultati in output La parte più rilevante è l’elaborazione, che richiede Individuazione di dati (risultati intermedi) I dati possono essere scalari e/o aggregati Formalizzazione di passi (operazioni) necessarie a valutare i risultati intermedi (a partire da altri dati) I passi intermedi sono spesso formalizzati in termini di costrutti condizionali e/o iterativi. Possono poi essere modularizzati mediante funzioni 12 © 2006 Politecnico di Torino 6 Programmazione in C Il problem solving In pratica ! L’esperienza è un requisito fondamentale (come in molte altre discipline) per una efficace scelta di strategie risolutive: un algoritmo (un programma) è in definitiva un progetto Lo studio di problemi classici già risolti è un buon passo di partenza Talvolta, in mancanza di altri strumenti, un valido punto di partenza è L’analisi della soluzione “a mano” o “su carta” del problema, facendo corrispondere carta (o lavagna) a variabili e calcoli ed espressioni 13 Scegliere la struttura dati Scegliere la struttura dati consiste in Individuare i tipi di informazioni da rappresentare (input, dati intermedi, risultati): numeri (interi o reali), caratteri o stringhe, struct? Decidere se è necessario collezionare i dati in vettori o matrici (aggregati numerabili) oppure se sono sufficienti dati scalari (o struct) Alcuni problemi si risolvono con poche istruzioni (con costrutti condizionali) su dati scalari Molti problemi richiedono iterazioni su dati 14 © 2006 Politecnico di Torino 7 Programmazione in C Il problem solving Problemi iterativi e vettori Un problema iterativo non richiede un vettore quando è sufficiente manipolare il generico (l’iesimo) dato, senza “ricordare” i precedenti Es. sommatoria, ricerca del massimo Un problema iterativo richiede un vettore se è necessario raccogliere/collezionare (in variabili) tutti i dati, prima di poterli manipolare Es. input di dati, output in ordine inverso 15 Scegliere l’algoritmo Individuare l’algoritmo (costrutti if – while – for, eventualmente annidati, funzioni, ecc.) può essere decisamente semplice (suggerito direttamente dal problema) Es. problemi numerici/matematici In altri casi scegliere un algoritmo consiste nel realizzare un vero progetto, confrontando strategie diverse, valutando pro- e contro(vantaggi e costi) Es. pianificazione di attività in funzione di criteri di ottimalità 16 © 2006 Politecnico di Torino 8 Programmazione in C Il problem solving Il problem solving Criteri di classificazione In questa unità (e nelle successive) si elencheranno problemi di varia natura, con le relative soluzioni I problemi sono solitamente presentati (nei testi di programmazione) in base alle strutture dati e/o ai costrutti di controllo utilizzati I problemi possono essere classificati (in modo più vicino all’utente, e più lontano dal programmatore) in base all’ambito applicativo: Es. problemi numerici, di geometria, di elaborazione testi, di ricerca di dati, ecc. 18 © 2006 Politecnico di Torino 9 Programmazione in C Il problem solving Classificazione adottata In questa unità (e nelle successive) si fornirà un elenco (non esaustivo) di problemi classificati in base a Ambito applicativo: tipo di informazioni trattate e classe di problema Struttura dati scalare o vettoriale Strategie algoritmiche: es. problemi non iterativi o iterativi Due unità tratteranno problemi elementari, una terza unità problemi complessi (o composti) con strutture dati o algoritmi che combinano caratteristiche e/o strategie elementari diverse 19 Il problem solving © 2006 Politecnico di Torino 10 Programmazione in C Il problem solving Dati scalari (1/2) I dati scalari, trattati in questa unità, includono numeri, caratteri/stringhe, aggregati eterogenei (struct) Sono esclusi vettori e matrici, come collezioni di dati numerabili (e individuati da indici) Sono incluse le stringhe, viste come dati unitari (parole/frasi) e non vettori di caratteri Sono incluse le struct, in quanto aggregati non numerabili 21 Dati scalari (2/2) Qualora la soluzione sia iterativa, è possibile elaborare l’i-esimo dato senza ricordare tutti i precedenti. Può essere necessario, ad es., il penultimo dato, ma non serve un vettore contenente tutti i dati 22 © 2006 Politecnico di Torino 11