Laboratorio di Algoritmi e Strutture Dati

Documenti analoghi
Stringhe e allocazione dinamica della memoria

Laboratorio di Algoritmi e Strutture Dati

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

STRINGHE: ARRAY DI CARATTERI! a p e \0

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Esercitazione 4. Comandi iterativi for, while, do-while

Esercitazione 6. Array

Dati aggregati. Violetta Lonati

Informatica 1. Prova di recupero 21 Settembre 2001

Esercizi Programmazione I

Primi passi col linguaggio C

Laboratorio di Algoritmi e Strutture Dati

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Caratteri e stringhe

Lettura da tastiera e scrittura su monitor

Esercitazione 12. Esercizi di Ricapitolazione

Lezione 9 Esercizi d esame

Il linguaggio C. Notate che...

Definizione di metodi in Java

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Array multidimensionali e stringhe

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Le Funzioni e la Ricorsione

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Parte 2. Ricorsione. [M.C.Escher Drawing hands, 1948] - AA. 2012/13 2.1

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Puntatori. Fondamenti di Programmazione

Il generatore di numeri casuali

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Lezione 5 Sottoarray di somma massima

Corso di Informatica 1 Esercitazione n. 4

Variabili e Istruzioni

Algoritmi di Ricerca. Esempi di programmi Java

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Mini-dispensa sui puntatori in C

Espressione di chiamata di funzione

Input/Output di numeri

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili

Linguaggio C. Tipi predefiniti. Università degli Studi di Brescia. Prof. Massimiliano Giacomin. Prof. M. Giacomin

Primi passi con JFlex

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Programmazione I - Laboratorio

Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1

Esercizi per la preparazione. Alessandra Giordani Lunedì 13 maggio 2013

La principale modalità di calcolo è l applicazione di funzioni

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Scrittura formattata - printf

Esempio di Prova Scritta

Capitolo 5 - Funzioni

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Architetture dei Calcolatori

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Linguaggi. Claudio Sacerdoti Coen 29,?/10/ : La struttura dei numeri naturali. Universitá di Bologna

Struttura dei programmi C

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Lezione 6 Selection/Insertion Sort su interi e stringhe

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Indice. Prefazione. 3 Oggetti e Java 53

Problema. Vettori e matrici. Vettori. Vettori

Fondamenti di Informatica 2

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Le direttive del Preprocessore

Problema: calcolare il massimo tra K numeri

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

6) Descrivere con un diagramma a blocchi un algoritmo che legga da input due numeri ne calcoli il prodotto in termini di somme ripetute.

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

Esercizi di programmazione in C

Corso di Fondamenti di Informatica. La ricorsione

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Sviluppo dei Programmi

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

C: panoramica - I parte

Problemi, istanze, soluzioni

AA LA RICORSIONE

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define

Alberi binari e alberi binari di ricerca

Transcript:

Laboratorio di Algoritmi e Strutture Dati Docente: Camillo Fiorentini 27 novembre 2007 In C una stringa è rappresentata da una sequenza di caratteri terminante con il carattere nullo \0 il cui valore è 0. Una stringa va scritta in un array di char di dimensione adeguata (ad esempio, la stringa "cane" richiede un array di char di almeno 5 elementi). Con l istruzione scanf("%s", w); viene letta da standard input una stringa e scritta nell array w. Si ricordi che vengono saltati tutti i caratteri di spaziatura che precedono la stringa e che la lettura della stringa termina quando si incontra un carattere di spaziatura oppure end-of-file (quindi non è possibile leggere stringhe contenenti caratteri di spaziatura). È compito di chi chiama scanf() assicurarsi che w sia l indirizzo di un array di lunghezza sufficiente per contenere la stringa letta (oppure, dichiarare nella documentazione del programma qual è la massima lunghezza di una stringa per cui il programma funziona correttamente). Usare compilatore gcc. Si consiglia di compilare con opzione -Wall che segnale (come warning) le anomalie presenti nel programma rilevate dal compilatore. Esercizio 1: funzioni su stringhe Si assume che le stringhe abbiano lunghezza massima MAX, dove MAX è una macro definita nel programma. Per ogni punto, scrivere una funzione main() che permetta di verificare la correttezza della funzione scritta. Per l Esercizo 2 occorre svolgere i punti a, b, c e d. a. Scrivere il codice di una funzione int strlength(char *w) che restituisce il numero di caratteri della parola w (senza considerare il carattere di fine stringa \0 usato nella rappresentazione C). Ad esempio, se w è la stringa "cane" la funzione deve restituire 4, se w è la stringa nulla "" la funzione deve restituire 0. b. Scrivere il codice di una funzione void strcopy(char *t, char *s) che copia una stringa da s (source) a t (target) (incluso il carattere di fine stringa \0 ). Si assume che t sia l indirizzo di un array di char sufficientemente grande per poter contenere la stringa da copiare. c. Scrivere il codice di una funzione void addchar(char *word, char *source, char c) che pone in word la stringa ottenuta aggiungendo alla stringa source il carattere c. Ad esempio, se source è la stringa "cane" e c il carattere a, word deve essere la stringa "canea". Si assume che word sia l indirizzo a un array di char sufficientemente grande per poter contenere la stringa risultante. Usare le funzioni strlength() e strcopy(). 1

d. Scrivere il codice di una funzione void deletechar(char *word, char *source, int k) che pone in word la stringa ottenuta togliendo dalla stringa source il carattere source[k]. Ad esempio, se source è la stringa "cane" e k il vale 1, word deve essere la stringa "cne". Si assume che 0 k < strlength(source) e che word sia l indirizzo di un array di char sufficientemente grande per poter contenere la stringa risultante. Usare la funzione strcopy(). e. Scrivere il codice di una funzione int struguali(char *w1, char *w2) che restituisce 1 se le stringhe w1 e w2 sono uguali, 0 altrimenti (occorre confrontare le stringhe carattere per carattere, non i valori di w1 e w2). Provare la funzione con le seguenti coppie di stringhe: cane canzone cane cane cane canea gattone gatto f. Scrivere il codice di una funzione ricorsiva void strinv(char *t, char *s) che pone in t la stringa ottenuta invertendo la stringa s. Ad esempio, se s è la stringa "cane", t deve essere la stringa "enac". Si assume che t sia l indirizzo di un array di char sufficientemente grande per poter contenere la stringa risultante. Occorre distinguere tra il caso in cui s è la stringa nulla e il caso in cui s contiene almeno un carattere (richiede una chiamata ricorsiva). Usare la funzione strlength(). 2

Esercizio 2: generazione di anagrammi L obiettivo dell esercizio è quello di scrivere una funzione di intestazione void anagrammi(char *word) che stampa tutti gli anagrammi della parola word. Si assume che la parola word abbia lunghezza al massimo MAX, dove MAX è una macro definita nel programma, e che word contenga solo lettere minuscole. Se gli anagrammi sono tanti, conviene redirigere lo standard output in un file out.txt: a > out.txt La soluzione più naturale è di usare una funzione ricorsiva, infatti: - Gli anagrammi di una parola word sono ottenibili concatenando a ogni carattere c di word gli anagrammi della parola ottenuta togliendo c da word. Per evitare ripetizioni, ogni carattere c di word va considerato una sola volta. Esempio Gli anagrammi della parola cava hanno la forma: (1). c più gli anagrammi della parola ava cava caav cvaa (2). a più gli anagrammi della parola cva acva acav avca avac aacv aavc (3). v più gli anagrammi della parola caa vcaa vaca vaac Notare che le parole in (1) hanno la forma (1.1). ca più gli anagrammi della parola va cava caav (1.2). cv più gli anagrammi della parola aa cvaa Questo suggerisce che per impostare correttamente il ragionamento induttivo occorre definire una funzione Anagr che stampa tutte le parole ottenute concatenando una parola pref con gli anagrammi della parola word. Ad esempio, se pref è la parola ca e word è la parola va, la funzione deve stampare: cava caav 3

Ad alto livello la definizione di Anagr è: Anagr (pref, word) 1 if word e la stringa nulla 2 then stampa pref 3 else 4 for each carattere c in word 5 do if il carattere c non e ancora stato usato 6 then dichiara che c e gia stato usato 7 newpref stringa ottenuta aggiungendo a pref il carattere c 8 newword stringa ottenuta eliminando da word il carattere c 9 Anagr (newp ref, neww ord) La correttezza e terminazione della funzione si dimostra per induzione sulla lunghezza di word (si noti che newword ha un carattere in meno di word, quindi per ipotesi di induzione la chiamata ricorsiva svolge correttamente il suo compito). a. Scrivere il codice della funzione /* Stampa su linee distinte tutte le parole ottenute concatenando la stringa pref con gli anagrammi della stringa word */ void anagr(char *pref, char *word) che traduce l algoritmo di alto livello sopra riportato. Per tradurre il ciclo alla linea 4 occorre considerare come in C sono rappresentate le stringhe (è necessario determinare la lunghezza di word usando strlength()). Nelle linee 7 e 8 usare le funzioni addchar() e deletechar(). Per stabilire se un carattere è già stato usato si può dichiarare un array char used[n]; dove N è il numero delle lettere dell alfateto, tale che, per k 0, used[k] vale 1 se la k-esima lettera dell alfabeto è stata usata, used[k] vale 0 altrimenti (si ricordi che per ipotesi le parole contengono solo lettere minuscole). Ad esempio, se si ha used[0] == 0 used[1] == 1 used[2] == 1 used[3] == 0... significa che il carattere a non è ancora stato usato, i caratteri b e c sono stati usati, d non è stato usato. Ricordarsi di inizializzare l array nel modo corretto. b. Scrivere il codice della funzione void anagrammi(char *word) che stampa tutti gli anagrammi di word (è sufficiente una chiamata ad anagr() con i parametri giusti). 4

c. Supponiamo ora di voler stampare gli anagrammi numerandoli. Ad esempio: 1 cava 2 caav 3 cvaa... 12 vaac Occorre modificare la funzione anagr() nel seguente modo: - La funzione deve avere un parametro n che rappresenta il numero degli anagrammi che sono già stati stampati. - La funzione deve restituire il numero complessivo degli anagrammi stampati. Il tipo di n e il tipo della funzione deve essere un tipo che permette di rappresentare numeri interi positivi grandi. Conviene usare il tipo unsigned long int e porre all inizio del programma la definizione typedef unsigned long int bigint; che definisce un nuovo tipo bigint che è sinonimo di unsigned long int. Per stampare una variabile di tipo unsigned long int con printf() occorre usare il carattere di conversione %lu. Per provare il programma, occorre modificare opportunamente la funzione anagrammi(). Fare in modo che restituisca il numero di anagrammi trovati. d. Quanti sono gli anagrammi di una parola contenente n caratteri distinti? Quanti sono gli anagrammi di una parola in cui possono esserci ripetizione di caratteri? Qual è lo spazio di memoria richiesto dalla funzione anagrammi()? e. Provare a risolvere l esercizio senza usare la ricorsione. 5