Τμήμα Πληροφορικής & Επικοινωνιών Εξεταζόμενο μάθημα: Προγραμματισμός ΙI Ονοματεπώνυμο σπουδαστή/άστριας:... Εξάμηνο σπουδών:... Α.Ε.Μ.:... 15/2/2006 ΔΙΑΡΚΕΙΑ ΕΞΕΤΑΣΗΣ: 2 ΩΡΕΣ Οι εξεταζόμενοι επιτρέπεται να χρησιμοποιήσουν παντός είδους έντυπα βοηθήματα. Tα θέματα επισυνάπτονται στο γραπτό με συμπληρωμένο το πλαίσιο της κορυφής. Θέμα 1 ο (20%) Για το πρόγραμμα που ακολουθεί να περιγραφεί αναλυτικά η λειτουργία του, να δοθούν τα αποτελέσματα και να απεικονισθεί το περιεχόμενο των θέσεων μνήμης που καταλαμβάνουν οι μεταβλητές σε κάθε γραμμή κώδικα. #include <stdio.h> #include <conio.h> void display(int *pnum); void change(int *pnum); void main() int t[10],i; for (i=0;i<3;i++) t[i]=3*i; printf("addr(t[%d])=%d\n",i,&t[i]); // Τέλος της for printf("\naddr(t)=%d\n\n",&t); display(t); change(t); display(t); // Τέλος της main void display(int *pnum) int i; printf("\naddr(pnum)=%d pnum=%d\n\n",&pnum,pnum); for (i=0;i<3;i++) 1/7
printf("addr(pnum[%d])=%d\t\t",i,&pnum[i]); printf( "%d\n",pnum[i] ); // Τέλος της for // Τέλος της συνάρτησης void change(int *pnum) int i; printf("\naddr(pnum)=%d pnum=%d\n\n",&pnum,pnum); for (i=0;i<3;i++) pnum[i]=pnum[i]*pnum[i]; display(pnum); // Τέλος της συνάρτησης Θέμα 2 ο (65%) Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα επιτελεί τα ακόλουθα: (1) Θα δέχεται από το πληκτρολόγιο τη διάσταση n ενός τετραγωνικού πίνακα διαστάσεων nxn, ο οποίος θα περιέχει πραγματικούς αριθμούς. Θα δεσμεύεται δυναμικά η απαραίτητη μνήμη, με χρήση του διπλού δείκτη float **parr. Θα γίνεται έλεγχος ώστε η διάσταση που θα δώσει ο χρήστης να είναι μεγαλύτερη ή ίση του 3. (2) Θα λαμβάνει από το πληκτρολόγιο τις τιμές των στοιχείων του πίνακα parr. (3) Θα υπολογίζει σε κάθε γραμμή το στοιχείο με τη μέγιστη απόλυτη τιμή. Για το σκοπό αυτό θα αναπτυχθεί η συνάρτηση int getmax(float **parray, int size, int i), η οποία θα δέχεται ως ορίσματα το δείκτη parr, τη διάσταση n του τετραγωνικού πίνακα και τη γραμμή του πίνακα στην οποία θα γίνει η αναζήτηση του μέγιστου στοιχείου. Η ακέραια επιστρεφόμενη τιμή θα είναι η στήλη στην οποία βρέθηκε το στοιχείο με τη μέγιστη απόλυτη τιμή. (4) Για κάθε γραμμή τού parr θα απεικονίζει στην οθόνη την απόλυτη τιμή του μέγιστου στοιχείου και τη στήλη στην οποία βρίσκεται το στοιχείο αυτό. (5) Θα υπολογίζει το άθροισμα των στοιχείων της κύριας διαγωνίου (ίχνος του πίνακα). 2/7
(6) Θα υπολογίζει τον πίνακα που θα προκύψει εάν αντιμετατεθούν η δεύτερη με την τρίτη στήλη του parr και, στη συνέχεια, η πρώτη με την τρίτη γραμμή. Για το σκοπό αυτό θα αναπτυχθούν δύο συναρτήσεις: (6.1) Η συνάρτηση void permute_columns(float **parray, int size, int column1, int column2), η οποία θα δέχεται ως ορίσματα το δείκτη parr, τη διάσταση n του τετραγωνικού πίνακα και τους αριθμούς των προς αντιμετάθεση στηλών (1 και 2 στην προκειμένη περίπτωση, σύμφωνα με την αρίθμηση πινάκων στη γλώσσα C). Η συνάρτηση θα αντιμεταθέτει τη στήλη column1 και τη στήλη column2 του parray. (6.2) Η συνάρτηση void permute_lines(float **parray, int size, int line1, int line2), η οποία θα δέχεται ως ορίσματα το δείκτη parr, τη διάσταση n του τετραγωνικού πίνακα και τους αριθμούς των προς αντιμετάθεση γραμμών (0 και 2 στην προκειμένη περίπτωση, σύμφωνα με την αρίθμηση πινάκων στη γλώσσα C). Η συνάρτηση θα αντιμεταθέτει τη γραμμή line1 και τη γραμμή line2 του parray. (7) Θα εμφανίζει στην οθόνη τον πίνακα που προέκυψε μετά τις αντιμεταθέσεις. Θέμα 3 ο (15%) Να περιγραφεί η λειτουργία του ακόλουθου προγράμματος και να δοθούν τα αποτελέσματα. #include <string.h> #include <stdio.h> main(void) FILE *pf; char string[]="department of Informatics and Communications"; char msg[81]; pf=fopen("file1.dat","w"); fwrite(string,strlen(string),1,pf); fclose(pf); pf=fopen("file1.dat","r"); fgets(msg,26,pf); printf("%s", msg); fclose(pf); // 2006_2_1 3/7
// 2006_2_2 #include <stdio.h> #include <math.h> #include <conio.h> #include <stdlib.h> #include <assert.h> int getmax(float **parray, int size, int i); void permute_columns(float **parray, int size, int column1, int column2); void permute_lines(float **parray, int size, int line1, int line2); void main() FILE *pf; int i,j,col,size; float **parr,*buffer,trace=0.0; do printf("give the size of the array (>=3): "); scanf("%d",&size); while (size<3); parr=(float **)malloc(size*sizeof(float *)); assert(parr!=null); parr[i]=(float *)malloc(size*sizeof(float)); assert(parr[i]!=null); 4/7
for (j=0;j<size;j++) printf("\na[%d][%d]: ",i+1,j+1); scanf("%f",&parr[i][j]); trace=trace+parr[i][i]; col=getmax(parr,size,i); printf("\nline %d: column %d, size=%f",i+1,col+1,fabs(parr[i][col])); printf("\n\ntrace(a)=%f\n",trace); printf("\n\nactual array:"); printf("\n"); for (j=0;j<size;j++) printf("\t%10.4f",parr[i][j]); permute_columns(parr,size,1,2); permute_lines(parr,size,0,2); printf("\n\nfinal array:"); printf("\n"); for (j=0;j<size;j++) printf("\t%10.4f",parr[i][j]); for (i=(size-1);i>=0;i--) free(parr[i]); free(parr); printf("\n"); system("pause"); int getmax(float **parray, int size, int i) int j,col; float maxim; maxim=fabs(parray[i][0]); col=0; for (j=1;j<size;j++) if (fabs(parray[i][j])>maxim) maxim=fabs(parray[i][j]); col=j; 5/7
return(col); void permute_columns(float **parray, int size, int column1, int column2) int j; float temp; for (j=0;j<size;j++) temp=parray[j][column1]; parray[j][column1]=parray[j][column2]; parray[j][column2]=temp; void permute_lines(float **parray, int size, int line1, int line2) int j; float temp; for (j=0;j<size;j++) temp=parray[line1][j]; parray[line1][j]=parray[line2][j]; parray[line2][j]=temp; 6/7
// 2006_2_3 7/7