Record in C: il costruttore struct.

Похожие документы
Definizione di nuovi tipi in C

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

RICERCA DI UN ELEMENTO

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Le stringhe. Le stringhe

Corso di Fondamenti di Informatica

Funzioni in C. Violetta Lonati

Laboratorio di programmazione

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Esempio: Array di struct

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Appello di Informatica B

Inizializzazione, Assegnamento e Distruzione di Classi

Caratteri e stringhe Esercizi risolti

Linguaggio C - Stringhe

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Veneto Lavoro via Ca' Marcello 67/b, Venezia-Mestre tel.: 041/

Fondamenti di Informatica T. Linguaggio C: i puntatori

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Breve riepilogo della puntata precedente:

INFORMATICA - I puntatori Roberta Gerboni

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Esame del 3 febbraio 2010

Introduzione al linguaggio C Gli array

Esercizio: gestione di un conto corrente

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

costruttori e distruttori

10 - Programmare con gli Array

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Visibilità dei Membri di una Classe

Grammatica di base: Pointers

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

I file di dati. Unità didattica D1 1

Introduzione alla programmazione in C

Esercizio 1. Esercizio 2

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Algoritmi di Ricerca. Esempi di programmi Java

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Fondamenti di Informatica 2

DB - Modello relazionale dei dati. DB - Modello Relazionale 1

Le variabili. Olga Scotti

Lab 11 Gestione file di testo"

Esercizi svolti durante le ore di Informatica e Sistemi automatici nelle classi del Liceo Scientifico Tecnologico del Liceo Milli di Teramo

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Schede ADI ADP ADEM Prestazioni aggiuntive MMG. - Manuale - Data Solution Provider s.r.l.

Allocazione dinamica della memoria - riepilogo

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

Soluzione dell esercizio del 2 Febbraio 2004

ARCHIVI E DATABASE (prof. Ivaldi Giuliano)

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Definizione di classi con array di oggetti

Informatica (Basi di Dati)

I puntatori e l allocazione dinamica di memoria

Accesso all Area di Lavoro

Progettazione : Design Pattern Creazionali

Gestore Comunicazioni Obbligatorie - VARDATORI - Progetto SINTESI Dominio Provinciale Modulo Applicativo:COB Procedura VARDATORI

Manuale Operativo Beneficiario Sfinge2020

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Java: Compilatore e Interprete

Traccia di soluzione dell esercizio del 25/1/2005

C.I.C. Centro Informazione e Consulenza. Guida all uso del registro elettronico

L'utilizzo delle strutture dati nella programmazione del PLC in ambiente IEC61131, rende la gestione di attuatori e sensori più intuitiva ed efficace.

Esercizio 2. Client e server comunicano attraverso socket TCP

Variabili e tipi di dato

Gestione Risorse Umane Web

La struttura dati ad albero binario

STRUMENTI E TECNICHE LEZIONE 4: FACEBOOK PROFILI VS PAGINE

Laboratorio di Algoritmi e Strutture Dati

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Esercitazione 7. Procedure e Funzioni

Istruzioni condizionali. Istruzioni condizionali IF-THEN- ELSE IF-THEN-ELSE. Statistica computazionale Carla Rampichini a.a.

MANUALE PARCELLA FACILE PLUS INDICE

Manuale operativo - Procedura per la costruzione, la pubblicazione di questionari

Concetto di Funzione e Procedura METODI in Java

Q U E S T U R A di V A R E S E Ufficio di Gabinetto

Progettazione di Database. Un Esempio

Modulo 4: Ereditarietà, interfacce e clonazione

LINGUAGGI DI PROGRAMMAZIONE

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015

Транскрипт:

Record in C: il costruttore struct. Le variabili di tipo record e i nuovi tipi record si dichiarano in C tramite il costruttore di tipo struct:. <var-record> ::= <costr-struct> <identif> ; <costr-struct> ::= <seq-campi>} <seq-campi> ::= <seq-campi-omog> <seq-campi-omog> ; <seq-campi> <seq-campi-omog> ::= <tipo> <seq-nomi-campi> <seq-nomi-campi> ::= <identif> <identif>, <seq-nomi-campi> int Giorno; int Anno; } Data; /* variabile Data come record di tre campi: Giorno Mese e Anno, tutti di tipo intero */ Data Data.Giorno Data.Mese Data.Anno 15 10 1919 /* DICHIARAZIONE ALTERNATIVA : */ int Giorno, Mese, Anno; } Data; 1

Inizializzazione di una variabile record int Giorno, Mese, Anno; } Data = {15,10,1919}; è possibile accedere ad una variabile di tipo record nel suo insieme, come se fosse una variabile semplice oppure campo per campo, rispettando tutte le regole previste per il tipo associato a ciascun campo. int Giorno, Mese, Anno; } DataEsame; int Giorno, Mese, Anno; } DataOrale; /* accesso alle variabili campo per campo */ DataOrale.Anno = DataEsame.Anno; DataOrale.Mese = DataEsame.Mese; DataOrale.Giorno= DataEsame.Giorno + 1; /* accesso alle variabili nel loro insieme */ DataOrale = DataEsame; 2

int Matr; char Sesso; int Età; } Stud; /* variabile Stud */ Stud.Mat Stud.Sess Stud.Et Stu r o à d 15 'F' 20 Modifichiamo Stud, aggiungendo un campo Nome come una stringa int Matr; char Nome[21]; char Sesso; int Età; } Stud; /* variabile Stud */ Stud.Mat Stud.Nom Stud.Sess Stud.Et Stu r e o à d 15 "Paola" 'F' 20 Questo è un primo esempio in cui un tipo strutturato (Nome di tipo stringa) è usato all interno di un altro tipo strutturato (Stud di tipo record) : composizione di tipi strutturati. una variabile di tipo record deve essere letta da input campo per campo, rispettando tutte le regole previste per il tipo associato a ciascun campo: printf("inserire Matricola Studente "); scanf("%d",&stud.matr); printf("inserire Nome Studente "); scanf("%20s", Stud.Nome); Il campo Nome di Stud è una stringa, quindi non ci vuole &! 3

COMPOSIZIONE DI TIPI STRUTTURATI Modifichiamo Stud, aggiungendo un campo DataDiNascita come record int Matr; char Nome[21]; int Giorno; char Sesso; int Età; } Stud; /* variabile Stud */ printf("inserire Data di Nascita dello Studente \n"); printf("giorno : "); scanf("%d",&stud.datadinascita.giorno); printf("mese : "); scanf("%d",&stud.datadinascita.mese); printf("anno : "); scanf("%d",&stud.datadinascita.anno); è possibile utilizzare come componenti dei tipi strutturati, costruendo così delle matrici di record, dei record di matrici, 1 Corso MaxStud Nome Parola DataDiNascita 1 NumCar Data Giorno Mese Anno char Nome[NumCar]; struct{int Giorno; } Corso[MaxStud]; 4

NOTA Consideriamo le seguenti dichiarazioni int Giorno, Mese, Anno; } DataEsame; int Giorno, Mese, Anno; } DataOrale; Non tutti i compilatori (compreso DEV-C++) accettano l assegnamento DataOrale=DataEsame; in quanto i tipi delle due variabili sono considerati incompatibili. Se invece viene utilizzata la seguente dichiarazione: int Giorno, Mese, Anno; } DataEsame,DataOrale; Allora l assegnamento DataOrale=DataEsame; viene considerato corretto! Nello stesso modo, se considero char Nome[NumCar]; struct{ int Giorno; } Corso[MaxStud]; char Nome[NumCar]; struct{ int Giorno; } MAX; Non tutti i compilatori (compreso DEV-C++) accettano l assegnamento MAX=Corso[0]; In questo caso si dovrebbe effettuare char Nome[NumCar]; struct{ int Giorno; } MAX, Corso[MaxStud]; Allora l assegnamento MAX=Corso[0]; viene considerato corretto. Questi problemi non si presentano con l uso del typedef. 5

Quando lo stesso tipo strutturato (array o record) deve essere usato in più di una dichiarazione di variabili, è bene dichiarare tale tipo esplicitamente con typedef: Ad esempio, nel caso di char Nome[NumCar]; struct{ int Giorno; } MAX, Corso[MaxStud]; si usa due volte lo stesso tipo strutturato, sia per dichiarare MAX che per Corso. Allora si definisce esplicitamente tale tipo tramite typedef: typedef char Nome[NumCar]; struct{int Giorno; } TipoStudente; e il nuovo tipo TipoStudente è quindi usato per dichiarare le due variabili: TipoStudente MAX; TipoStudente Corso[MaxStud]; In questo modo l assegnamento MAX=Corso[0]; viene considerato corretto. Nel seguito viene riportato l esempio completo Studente più giovane, ovvero studente con Data di Nascita maggiore utilizzando typedef. #include <stdio.h> #define NumCar 25 #define MaxStud 4 main(){ typedef char Nome[NumCar]; struct{ int G; int M; int A; } DataDiNascita; } TipoStudente; TipoStudente MAX; TipoStudente Corso[MaxStud]; int I; 6

/* lettura degli studenti */ for(i=0;i<maxstud;i++){ printf("inserire studente n. %d\n",i); printf("nome : "); scanf("%20s",corso[i].nome); printf("data di Nascita \n "); printf("giorno : "); scanf("%d",&corso[i].datadinascita.g); printf("mese : "); scanf("%d",&corso[i].datadinascita.m); printf("anno : "); scanf("%d",&corso[i].datadinascita.a); } /* stampa degli studenti inseriti */ printf("\n\n stampa degli studenti inseriti \n\n"); for(i=0;i<maxstud;i++){ printf("\nstudente n. %d\n",i); printf("nome = %-20s",Corso[I].Nome); printf("nato il %d-%d-%d: \n",corso[i].datadinascita.g, Corso[I].DataDiNascita.M,Corso[I].DataDiNascita.A); } /* Calcolo del MAX. cioe studente con DataDiNascita piu' grande*/ MAX=Corso[0]; for(i=1;i<maxstud;i++) if(corso[i].datadinascita.a > MAX.DataDiNascita.A Corso[I].DataDiNascita.A == MAX.DataDiNascita.A && Corso[I].DataDiNascita.M > MAX.DataDiNascita.M Corso[I].DataDiNascita.A==MAX.DataDiNascita.A && Corso[I].DataDiNascita.M == MAX.DataDiNascita.M && Corso[I].DataDiNascita.G > MAX.DataDiNascita.G ) MAX=Corso[I]; printf("\nlo studente piu' giovane e' \n"); printf("nome = %-20s",MAX.Nome); printf("nato il %d-%d-%d: \n",max.datadinascita.g, MAX.DataDiNascita.M,MAX.DataDiNascita.A); } Ovviamente il precedente programma è corretto se c e un solo studente con la massima DataDiNascita. Per considerare il caso in cui ci siano più studenti con la stessa data di nascita e quindi la possibilità di avere due o più studenti con la massima DataDiNascita, dopo aver caalcolato MAX, si scandisce di nuovo Corso e si stampano tutti gli studenti la cui data di nascita è quella di MAX. 7

Si noti che per controllare l uguaglianza di due record (in questo caso le due date) non possiamo confrontare i due record con == ma si deve usare il confronto elemento per elemento: infatti l operatore == si applica solo ai tipi semplici. In altre parole, è sbagliato scrivere if(corso[i].datadinascita == MAX.DataDiNascita) ma si deve scrivere if(corso[i].datadinascita.a == MAX.DataDiNascita.A && Corso[I].DataDiNascita.M == MAX.DataDiNascita.M && Corso[I].DataDiNascita.G == MAX.DataDiNascita.G ) Riportiamo il ciclo for che ci consente di stampare tutti gli studenti più giovani for(i=0;i<maxstud;i++) if( Corso[I].DataDiNascita.A == MAX.DataDiNascita.A && Corso[I].DataDiNascita.M == MAX.DataDiNascita.M && Corso[I].DataDiNascita.G == MAX.DataDiNascita.G ) { printf("\n Nome = %-20s",Corso[I].Nome); printf("nato il %d-%d-%d: \n", Corso[I].DataDiNascita.G, Corso[I].DataDiNascita.M, Corso[I].DataDiNascita.A); } 8