Θέμα 1ο (25%) Για το πρόγραμμα που ακολουθεί να περιγραφεί αναλυτικά η λειτουργία του, να δοθούν τα αποτελέσματα και να απεικονισθεί το περιεχόμενο των θέσεων μνήμης που καταλαμβάνουν οι μεταβλητές σε κάθε γραμμή κώδικα. #include <stdio.h< stdio.h> #include <conio.h< conio.h> Δημιουργείται και αρχικοποιείται κατά την #include <stdlib.h< stdlib.h> πρώτη κλήση της συνάρτησης. Εφεξής int func(int *py, int n) { παραμένει στη μνήμη, διατηρώντας την τιμή static int j=0; που απέκτησε κατά την τελευταία κλήση τής j=j*n; func. printf("j=%d ("j=%d\t",j); return ((*py py)+j); // Τέλος της func main() { int i,*px px,, x[5]={0,1,4,9,16; px=x; for (i=0;i<(sizeof(x)/sizeof(x[0]));i=i+2) { printf("i=%d px+%d=% =%d\t",i,i,px+i); printf("*(px+%d)=%d\tfunc=%d tfunc=%d\n",i,*(px+i),func(px+i,(i+1)*(i+1))); n",i,*(px+i),func(px+i,(i+1)*(i+1))); // Τέλος της for system("pause"); "); // Τέλος της main
// 2006_3_1 _1 Προγραμματισμός II
Θέμα 2ο (30% 0%) Να γραφεί πρόγραμμα, το οποίο: (α) Θα διαβάζει έως το τέλος του το δυαδικό αρχείο input_file file.txt,, στο οποίο βρίσκονται αποθηκευμένοι ακέραιοι αριθμοί, και θα υπολογίζει το πλήθος τους, το οποίο θα αποθηκεύει στην ακέραια μεταβλητή size.. (Υπόδειξη( Υπόδειξη: : Για να διαβασθούν τα δεδομένα ένα προς ένα έως το τέλος του αρχείου, χωρίς να είναι γνωστός γ εκ των προτέρων ο αριθμός τους, μπορεί να χρησιμοποιηθεί ένας πίνακας μίας μ θέσης, π.χ. arr[1] [1],, ως προσωρινός χώρος αποθήκευσης του δεδομένου σε κάθε κλήση της fread() (). Λάβετε υπόψη ότι η fread() επιστρέφει έναν ακέραιο που ισούται με τον αριθμό των δεδομένων που ανεγνώσθησαν σε κάθε κλήση της, ανεξάρτητα του αριθμού των δεδομένων που ζητήθηκε να αναγνωσθούν). (β) Θα δεσμεύει μνήμη για size ακέραιους αριθμούς με χρήση της συνάρτησης malloc() ().. Τη μνήμη θα διαχειρίζεται ο δείκτης σε ακέραιο με όνομα array_ptr ptr. (γ) Θα διαβάζει εκ νέου το αρχείο input_file file.txt,, αποδίδοντας τους ακεραίους που περιέχει στον πίνακα array_ptr ptr. (δ) Στη συνέχεια θα καλείται η συνάρτηση void pwr(int *array, int array_size size),, η οποία θα μεταβάλλει τις τιμές των δεδομένων που διαχειρίζεται ο δείκτης array,, υψώνοντας στο τετράγωνο κάθε δεδομένο (κλήση της συνάρτησης μέσα στη main() (): pwr(array array_ptr, size); );).).
(ε) H main() θα τελειώνει με την εγγραφή στο δυαδικό αρχείο output_file file.txt των νέων τιμών των στοιχείων του πίνακα array_ptr ptr,, και την απελευθέρωση της δεσμευθείσας μνήμης με χρήση της συνάρτησης free() (). Σημείωση: H ανάγνωση από αρχείο και η εγγραφή σε αρχείο να γίνεται με χρήση των συναρτήσεων fread() (), fwrite() ().Το δυαδικό αρχείο input_file file.txt θεωρείται πως προϋπάρχει. #include <stdio.h< stdio.h> #include <conio.h< conio.h> #include <assert.h< assert.h> #include <stdlib.h< stdlib.h> void pwr(int *array_ptr, int array_size); void main() { int array[1],cnt,i,*array_ptr,size array_ptr,size=0; /* Ο πίνακας array[1] χρησιμοποιείται για να μπορέσουμε στο πρώτο σκέλος να διαβάσουμε ένα προς ένα τα δεδομένα και να υπολογίσουμε τον αριθμό του*/ FILE *f1; // 1ο σκέλος f1=fopen("input_file.txt","r fopen("input_file.txt","r"); "); while (fread(array,sizeof(int),1,f1)) size++; /* Όσο η fread() δίνει έξοδο διάφορη του μηδενός, δηλαδή διαβάζει ένα στοιχείο, συνέχισε να διαβάζεις από το αρχείο και αύξανε το μετρητή των στοιχείων που περιέχονται σε αυτό*/ fclose(f1);
// 2ο σκέλος f1=fopen("input_file.txt","r fopen("input_file.txt","r"); "); array_ptr ptr=( =(int *)malloc malloc(size*sizeof(int)); assert(array array_ptr!=!=null); // 3ο σκέλος fread( ( array_ptr,sizeof(int),size,f1 ); fclose(f1); // 4ο σκέλος pwr(array_ptr,size); f1=fopen("output_file.txt","w fopen("output_file.txt","w"); "); fwrite(array_ptr,sizeof(int),size,f1); fclose( ( f1 ); // 5ο σκέλος free(array_ptr); system("pause"); "); // Τέλος της main void pwr(int *array_address, int array_size) { int i; for (i=0;i<array_size;i array_size;i++) { array_address[i]= ]=array_address[i]*array_address[i]; // Εναλλακτικά: *(array_address+i array_address+i)=*( )=*(array_address+i)*(*(array_address+i)); // Τέλος της pwr
Τα αποτελέσματα που ακολουθούν εξάγονται εάν προστεθεί πριν και μετά το 4ο σκέλος ο ακόλουθος κώδικας: printf( ( "Before pwr:\n" " ); for (i=0;i<size;i size;i++) printf( ( "array_ptr[%d" array_ptr[%d]=% ]=%d\n",i,array_ptr[i]] ); και printf( ( "After pwr:\n" " ); for (i=0;i<size;i size;i++) printf("array_ptr[%d]=% ]=%d\n",i,array_ptr[i]] );
Θέμα 3ο (45%) Να δημιουργηθεί ο τύπος δεδομένου δομής circle,, που έχει ως μέλη τις τρεις πραγματικές μεταβλητές x (τετμημένη του κέντρου του κύκλου), y (τεταγμένη του κέντρου του κύκλου), r (ακτίνα του κύκλου). Να γραφούν οι ακόλουθες συναρτήσεις: (α) void readcircle(circle *pc, FILE *f1) 1),, η οποία θα διαβάζει από το αρχείο κειμένου, που προσπελαύνεται μέσω του δείκτη f1,, τιμές για τα μέλη της μεταβλητής, στην οποία δείχνει ο δείκτης pc (απαιτείται χρήση του τελεστή βέλους). (β) void printcircle(circle *pc, FILE *f1) 1),, η οποία θα τυπώνει τόσο στην οθόνη όσο και στο αρχείο κειμένου, που προσπελαύνεται μέσω του δείκτη f1,, τα περιεχόμενο της μεταβλητής, στην οποία δείχνει ο δείκτης pc (απαιτείται χρήση του τελεστή βέλους). (γ) float circlearea(circle *pc),, η οποία θα επιστρέφει στην καλούσα συνάρτηση το εμβαδό του κύκλου που περιγράφεται από τη μεταβλητή, στην οποία δείχνει ο δείκτης pc (απαιτείται χρήση του τελεστή βέλους). Να γραφεί ο κώδικας της main() (),, μέσα στην οποία θα δημιουργούνται οι δείκτες αρχείου κειμένου pf1 (για το αρχείο ανάγνωσης input_file file.txt) ) και pf2 (για το αρχείο εγγραφής output_file file.txt), καθώς και οι μεταβλητές τύπου circle με όνομα cir και τύπου float με όνομα area,, και θα καλούνται διαδοχικά οι τρεις συναρτήσεις readcircle(& (&cir, pf1) 1), printcircle(& (&cir, pf2) 2), area=circlearea circlearea(& (&cir).. Ακολούθως το εμβαδό θα τυπώνεται στην οθόνη. Το αρχείο input_file file.txt θεωρείται πως προϋπάρχει στον κατάλογο c:\temp\2006_3_3.. Στον ίδιο κατάλογο να τοποθετηθεί το αρχείο output_file file.txt.
#include <stdio.h< stdio.h> #include <conio.h< conio.h> #include <stdlib.h< stdlib.h> #include <math.h< math.h> struct circle { float x,y,r; ; void readcircle(circle *pc, FILE *f1); void printcircle(circle *pc, FILE *f1); float circlearea(circle *pc); main() { FILE *pf1,*pf2; circle cir; float area; pf1=fopen("c:\\temp temp\\2006_3_3\\input_file.txt","r"); readcircle(&cir,pf1); fclose(pf1); pf2=fopen("c:\\temp temp\\2006_3_3\\output_file.txt","w"); printcircle(&cir,pf2); fclose(pf2); area=circlearea(&cir circlearea(&cir); printf("\ne ne=% =%f\n",area); system("pause"); "); // Τέλος της main
void readcircle(circle *pc, FILE *f1) { fscanf(f1,"%f",&pc (f1,"%f",&pc->x); fscanf(f1,"%f",&pc (f1,"%f",&pc->y); fscanf(f1,"%f",&pc->r); void printcircle(circle *pc, FILE *f1) { printf("\n\nthe nthe x-coordinate is: %f",pc% f",pc->x); printf("\nthe nthe y-coordinate is: %f",pc% f",pc->y); printf("\nthe nthe radius is: %f",pc% f",pc->r); fprintf(f1,"\n\nthe nthe x-coordinate x is: %f",pc% f",pc->x); fprintf(f1,"\nthe nthe y-coordinate y is: %f",pc% f",pc->y); fprintf(f1,"\nthe nthe radius is: %f",pc% f",pc->r); float circlearea(circle *pc) { return(m_pi*pc *pc->r*pc->r); >r); // Τέλος της readcircle // Τέλος της printcircle // Τέλος της circlearea
// 2006_3_3 Προγραμματισμός II