Albero genealogico. Si abbia un albero genealogico come nella figura sotto. Si supponga che i nomi propri delle persone siano tutti diversi, e quindi.

Slides:



Advertisements
Presentazioni simili
File Linguaggio C.
Advertisements

I tipi Strutturati.
INFORMATICA Altre Istruzioni di I/O
INFORMATICA Algoritmi fondamentali
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (IV)
Informatica 22/03/2012.
Introduzione al linguaggio C
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Iterazione while – do while - for.
Stringhe di caratteri In linguaggio C.
Dati strutturati C++.
Universita di Camerino
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Un nuovo tipo di dati Gli array.
1 Directory Il formato delle directory varia nei vari FS utilizzati in ambito Unix Quando una directory viene aperta viene restituito un puntatore a un.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Corso di Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Introduzione agli stream e alle classi
Introduzione alla programmazione lll
Funzioni di Libreria per le stringhe DICHIARAZIONI CONTENUTE NEL FILE: char *strcpy( char *dest, const char *sorg ); Copia sorg in dest, incluso il carattere.
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Istruzioni di ripetizione in Java
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
File di testo, file binari
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
I File.
Le funzioni.
Lezione 17 maggio 2007 Parametri da linea di comando FILE Strutture (introduzione)
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.
Programmazione in Java Claudia Raibulet
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Di Luca Santucci 5° Programmatori
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
Costruzione di una semplice Agenda telefonica Elettronica Esercizio sull'uso delle principali system call Unix.
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
CORSO DI PROGRAMMAZIONE II Lezione 22
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algebra di Boole ed elementi di logica Marco D. Santambrogio – Ver. aggiornata.
Introduzione a Javascript
R 255 G 211 B 8 R 255 G 175 B 0 R 127 G 16 B 162 R 163 G 166 B 173 R 104 G 113 B 122 R 234 G 234 B 234 R 175 G 0 B 51 R 0 G 0 B 0 R 255 G 255 B 255 Supporting.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
CORSO DI PROGRAMMAZIONE II
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 27 Marzo 2015.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
Stringhe In linguaggio C. Stringhe  Un insieme di caratteri in sequenza forma una stringa.  Alcuni linguaggi definiscono per le stringhe uno specifico.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
Esercizio 1 Scrivete un programma C "creaproc" che crea (mediante fork) il numero di processi specificati in input. ad esempio: $> creaproc 7 crea 7 nuovi.
Transcript della presentazione:

Albero genealogico

Si abbia un albero genealogico come nella figura sotto. Si supponga che i nomi propri delle persone siano tutti diversi, e quindi sufficienti a caratterizzare le persone stesse. I nomi siano lunghi al più 15 caratteri. Descrivere una organizzazione dei dati atta a descrivere i rapporti di parentela. In particolare si richiede un programma in C che permetta di creare, aggiornare e interrogare la base dati secondo le seguenti specifiche:

- Se da terminale si introduce la stringa I nome1 nome2 si richiede di aggiornare la base dati inserendo la persona nome1 come figlio di nome2. Eccetto che per la prima richiesta, in cui bisogna inserire sia nome2 (progenitore) che nome1 (figli), in tutti gli altri casi occorre segnalare errore se nome1 esiste già, ed analogamente se non esiste nome2.

- Se da terminale si introduce la stringa D nome1 nome2 si richiede di verificare se c'è discendenza diretta tra la persona nome1 e la persona nome2. Se c'è discendenza diretta, è richiesta la stampa dei nomi delle persone che costituiscono quel ramo. Si supponga di non sapere a priori se nome1 è antecedente a nome2 o viceversa: pertanto è richiesto di verificare esiste_discendenza diretta(nome1, nome2) e esiste_discendenza_diretta(nome2, nome1) prima di dichiarare che non c'e' discendenza diretta.

ADAMO | | | CAINO ABELE | | | | | | ABRAMO ISACCO GIOSUE GABRIELE | | | | | | | | | GIUSEPPE SALVATORE ERNESTO | | | | | | | | | ESAU' GIORGIO

SUGGERIMENTO: realizzare la base dati con un vettore di struct. Ciascuna struct contenga il nome della persona (stringa) e la posizione del padre (intero) all’interno del vettore. Per il progenitore si preveda come posizione del padre un valore impossibile, ad esempio -1 (tappo). Se ad esempio sono stati dati i seguenti tre comandi: I Caino Adamo I Abramo Caino I Abele Adamo la base dati dovrà apparire così (la prima colonna ovviamente non esiste, è stata disegnata per comodità e indica la numerazione degli elementi del vettore di struct): 0Adamo-1 1Caino0 2Abramo1 3Abele0

BASE DATI (globale): char nome1[LUNG_NOME], nome2[LUNG_NOME]; char comando; struct { char nome[LUNG_NOME]; int posizione_padre; } genealogico[MAX_NOMI]; int quanti_nomi; char sequenza[MAX_NOMI][LUNG_NOME];

Main Poni quanti_nomi a 0 Invia il prompt Inizializza comando con blank Finché il carattere letto in comando  ‘F’ –leggi nome1 e nome2 –scelta su comando : è ‘I’ : inserisci (nome1, nome2) è ‘D’ : verifica_discendenza_diretta (nome1, nome2) default: segnala errore –leggi fino a new-line Fine.

Funzione inserisci (figlio, padre) Se quanti_nomi è 0 –in genealogico[0], nel campo nome, metti padre –in genealogico[0], nel campo posizione_padre, metti TAPPO –in genealogico[1], nel campo nome, metti figlio in genealogico[1], nel campo posizione_padre, metti 0 –poni quanti_nomi a 2 altrimenti

–Se presente (figlio, posizione) scrivi “Errore, figlio esiste già” –altrimenti se non presente (padre, posizione) –scrivi “Errore, padre non è stato ancora inserito” altrimenti –in genealogico[quanti_nomi], nel campo nome, metti figlio –in genealogico[quanti_nomi], nel campo posizione_padre, metti posizione –incrementa quanti_nomi Fine.

Funzione verifica_discendenza_diretta (progenitore, discendente) Se presente (progenitore, posizione) –se presente (discendente, posizione) Se esiste_discendenza_diretta (progenitore, discendente, quanti_passi) –stampa_discendenza(quanti_passi) altrimenti –Se esiste_discendenza_diretta (discendente, progenitore, quanti_passi) »stampa_discendenza(quanti_passi) –altrimenti »stampa “Non esiste discendenza diretta”

–altrimenti stampa “Errore : non esiste discendente” altrimenti –stampa “Errore : non esiste progenitore” Fine.

Funzione esiste_discendenza_diretta (progenitore, discendente, grado), tipo boolean Poni grado pari a 0 Poni provata_discendenza_diretta a Falso Poni flag_esiste pari a presente(discendente, posiz_discendente) \* cerca la posizione *\ Poni posiz-discendente in indice

Finché provata_discendenza_diretta è Falso AND predecessore  TAPPO –poni il campo nome di genealogico[indice] in sequenza[grado] –incrementa grado –se il campo nome di genealogico[indice] = progenitore poni provata_discendenza_diretta a Vero –altrimenti poni il campo posizione_padre di genealogico[indice] ancora in indice Restituisci provata_discendenza_diretta Fine.

Funzione presente (nome_cercato, posizione), tipo boolean Poni indice a 0 Poni trovato a Falso Finché non trovato AND indice < quanti_nomi –se il campo nome di genealogico[indice] = nome_cercato poni trovato a Vero –altrimenti incrementa indice Poni posizione pari a indice Restituisci trovato Fine.