Esame di Calcolatori Elettronici Appello del 29/5/'02 (Telecomunicazioni) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct sru{ int aa[4]; char bb[4]; int cc[4];}; extern "C" sru ela(sru s1, sru& s2) { int i; sru ll; for (i=0; i<4; i++) { ll.aa[i]=s1.aa[i]-s2.aa[i]; ll.cc[i]=s1.cc[i]+s2.cc[2]; } ll.bb[0]=ll.bb[1]=s1.bb[0]; ll.bb[2]=ll.bb[3]=s2.bb[1]; return ll; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Siano date le seguenti dichiarazioni, contenute nel file cc.h: class vettore { struct elem {char nome[10]; double vv[4]; }; elem* vett; int size; public: vettore(); void build(const char nome[]); void salva(const char nome[]); vettore operator^(float p); int ind(const char []); void stampa(); }; La classe vettore realizza un vettore di strutture di tipo elem. Realizzare: 1) la funzione membro build(), che a) cancella gli eventuali elementi già presenti nel vettore, b) apre in lettura il file il cui nome e' passato come parametro, c) legge dal file un intero che rappresenta il numero di elementi del vettore, d) per ogni elemento, legge dal file una stringa e quattro numeri reali (gli elementi nel file sono organizzati per righe). In caso di errore nella lettura dal file, la funzione stampa un messaggio di errore ed esce. 2) la funzione membro salva() che salva il vettore nel file il cui nome è passato come parametro in modo tale che il vettore possa essere ricostruito utilizzando la funzione membro build(); 3) l'operatore operator^(), che eleva all'esponente passato come parametro ogni numero reale contenuto nel campo vv di ogni elemento del vettore (per calcolare l'elevamento a potenza si utilizzi la funzione pow(double a, double b) che restituisce a elevato a b; la funzione pow é dichiarata nel file math.h); la funzione restituisce l'oggetto su cui è applicato l'operatore; 4) la funzione membro ind() che restituisce l'indice minore tra quelli che individuano gli elementi il cui campo nome é uguale alla stringa passata come parametro; se non esiste nessun elemento il cui campo nome è uguale alla stringa la funzione restituisce –1. La funzione stampa() stampa su uscita standard tutti gli elementi del vettore. La funzione stampa() e' implementata nel file ccob.o. Esercizio 3) Realizzare quanto richiesto in C++ (scrivere sul file es3.cc ed eseguire). Scrivere un programma che: 1. dichiara una struttura ss1 di tipo sru inizializzando i campi aa, bb, e cc con gli interi da 0 a 3, i caratteri da '1' a '4' e gli interi da 2 a 5, rispettivamente; 2. dichiara una struttura ss2 di tipi sru inizializzandola con ss1; 3. dichiara una struttura ss3 di tipo sru; 4. chiama la funzione ela() passandole ss1 e ss2 come primo e secondo parametro, rispettivamente, e assegnando la struttura restituita dalla funzione a ss3; 5. stampa su uscita standard le strutture ss2 e ss3; 6. dichiara un vettore v1; 7. chiama la funzione build() su v1 passandole la stringa "ingr"; 8. stampa su uscita standard il vettore v1; 9. eleva v1 alla potenza di 2; 10. stampa il vettore v1 su uscita standard; 11. salva il vettore sul file di nome "temp"; 12. chiama la funzione build() su v1 passandole la stringa "temp"; 13. stampa su video l'indice minore tra quelli che individuano elementi di v1 che contengono "minni" nel campo nome; se non esiste nessun elemento stampa su video un messaggio di errore; 14. stampa su video l'indice minore tra quelli che individuano elementi di v1 che contengono "pluto" nel campo nome; se non esiste nessun elemento stampa su video un messaggio di errore. Esame di Calcolatori Elettronici Appello del 29/5/'02 - Soluzioni # file es1.s .text .global _ela _ela: pushl %ebp movl %esp,%ebp subl $40,%esp pushl %edi pushl %esi pushl %ebx pushl %ecx movl 48(%ebp),%ebx #indirizzo di s2 in ebx movl $0,-4(%ebp) for: cmpl $4,-4(%ebp) jl corpo jmp finefor corpo: movl -4(%ebp),%ecx movl 12(%ebp,%ecx,4),%edi #s1.aa[i] in edi subl (%ebx,%ecx,4),%edi #s1.aa[i]-s2.aa[i] movl %edi,-40(%ebp,%ecx,4) #ll.aa[i]=s1.aa[i]-s2.aa[i] movl 32(%ebp,%ecx,4),%edi #s1.cc[i] in edi addl 28(%ebx),%edi #s1.cc[i]+s2.cc[2] movl %edi,-20(%ebp,%ecx,4) #ll.cc[i]=s1.cc[i]+s2.cc[2] incl -4(%ebp) jmp for finefor:movb 28(%ebp),%cl #s1.bb[0] in cl movb %cl,-23(%ebp) #ll.bb[1]=s1.bb[0] movb %cl,-24(%ebp) #ll.bb[0]=ll.bb[1] movb 17(%ebx),%cl #s2.bb[1] in cl movb %cl,-21(%ebp) #ll.bb[3]=s2.bb[1] movb %cl,-22(%ebp) #ll.bb[2]=ll.bb[3] movl 8(%ebp),%eax #return ll movl %eax,%edi leal -40(%ebp),%esi cld movl $9,%ecx rep movsl popl %ecx popl %ebx popl %esi popl %edi leave ret Esercizio 2 // file cc.h esistente class vettore { struct elem {char nome[10]; double vv[4]; }; elem* vett; int size; public: vettore(); void build(const char nome[]); void salva(const char nome[]); vettore operator^(float p); int ind(const char []); void stampa(); }; /#include "cc.h" #include vettore::vettore() { vett=0; } void vettore::stampa() { for (int i=0; i #include #include #include void vettore:: build(const char nome[]) { ifstream in(nome); if (!in) { cerr << "Errore nell'apertura del file " << nome << endl; exit(1); } if (vett) delete[] vett; if (!(in >> size)) { cerr << "Errore nella lettura dal file" << endl; exit(1); } vett=new elem[size]; for (int i=0; i> vett[i].nome)) { cerr << "Errore nella lettura dal file " << endl; exit(1); } for(int j=0; j<4; j++) if (!(in >> vett[i].vv[j])) { cerr << "Errore nella lettura del file " << endl; exit(1); } } } void vettore::salva(const char nome[]) { ofstream out(nome); if (!out) { cerr << "Errore nell'apertura del file " << nome << endl; exit(1); } out << size << endl; for (int i=0; i #include "cc.h" struct sru{ int aa[4]; char bb[4]; int cc[4];}; extern "C" sru ela(sru s1, sru& s2); void stampa(const sru& s) { cout << "aa[]=\t"; for (int i=0; i<4; i++) cout << s.aa[i] << '\t'; cout << endl; cout << "bb[]=\t"; for (int i=0; i<4; i++) cout << s.bb[i] << '\t'; cout << endl; cout << "cc[]=\t"; for (int i=0; i<4; i++) cout << s.cc[i] << '\t'; cout << endl; } void main() { sru ss1={{0,1,2,3}, {'1','2','3','4'},{2,3,4,5}}; sru ss2=ss1, ss3; ss3=ela(ss1,ss2); cout << "Stampa della struttura ss2 " << endl; stampa(ss2); cout << "Stampa della struttura ss3 " << endl; stampa(ss3); vettore v1; v1.build("ingr"); cout << "Stampa del vettore v1 " << endl; v1.stampa(); v1^2; cout << "Stampa del vettore v1 " << endl; v1.stampa(); v1.salva("temp"); v1.build("temp"); int index=v1.ind("minni"); if (index!=-1) cout << "L'indice corrispondente a minni e' " << index << endl; else cout << "Nessun elemento con il campo nome uguale a minni"<< endl; index=v1.ind("pluto"); if (index!=-1) cout << "L'indice corrispondente a pluto e' " << index << endl; else cout << "Nessun elemento con il campo nome uguale a pluto" << endl; }