ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Σχετικά έγγραφα
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Β' Περιόδου Θέµα 1. (α')

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Αλγόριθμοι Ταξινόμησης Μέρος 1

Ανάπτυξη και Σχεδίαση Λογισμικού

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

Επεξεργασία Αρχείων Κειµένου

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Σημειώσεις έκτης και έβδομης εβδομάδας

Περιεχόμενα. Πρόλογος... 21

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Προγραμματισμός Ι (ΗΥ120)

Σημειώσεις όγδοης εβδομάδας

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Προγραμματισμός Η/Υ (ΤΛ2007 )

ιαφάνειες παρουσίασης #9 (α)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στον Προγραμματισμό

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Διάλεξη 15η: Αναδρομή, μέρος 1ο

Προγραμματισμός Υπολογιστών με C++

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός Ι (ΗΥ120)

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Προγραµµατισµός Ι 1

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Ανάπτυξη και Σχεδίαση Λογισμικού

Εισαγωγή στον Προγραμματισμό (με. τη C)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Ι (HY120)

Δομές δεδομένων (2) Αλγόριθμοι

Μεθόδων Επίλυσης Προβλημάτων

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Προγραμματισμός Ι (ΗΥ120)

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Εισαγωγή στον δομημένο προγραμματισμό

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Προγραμματισμός Ι (ΗΥ120)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Προγραµµατισµός Ι (ΗΥ120)

Περιεχόμενα. Πρόλογος... 17

Προγραμματισμός Η/Υ (ΤΛ2007 )

12. Συναρτήσεις (Μέρος ΙI)

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Ι (ΗΥ120)

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

Εισαγωγή στον Προγραμματισμό

ιαφάνειες παρουσίασης #6 (α)

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Προγραμματισμό για ΗΜΥ

Γλώσσα Προγραμματισμού C

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Προγραμματισμός Ι (HY120)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης (Κεφάλαιο , KNK-2ED)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόμενη Λύση

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομές Δεδομένων και Αλγόριθμοι

Ανάπτυξη και Σχεδίαση Λογισμικού

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Η γλώσσα προγραμματισμού C

είκτες και Πίνακες (2)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Προγραμματισμός Δομές Δεδομένων

H ΓΛΩΣΣΑ C. Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα. ηµήτρης Ψούνης

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Transcript:

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου 2011 Θέµα 1 (α') 1 - i 2 - ii 3 - iii 4 - iv 5 - v 6 - vi 7 - vii 8 - viii 9 - ix 10 - x Το αποτέλεσµα είναι η αντιστοιχία των αριθµών από το 1 έως το 10, για το αραβικό και το ρωµαϊκό σύστηµα αρίθµησης. (β') Η realloc χρειάζεται όταν θέλουµε να τροποποιήσουµε (µειώσουµε ή αυξήσουµε) το µέγεθος δυναµικά δεσµευµένης µνήµης στον σωρό. Το πρόβληµα που υπάρχει είναι ότι όταν θέλουµε να αυξήσουµε τη µνήµη και η επιπλέον ποσότητα που θέλουµε δεν υπάρχει συνεχόµενη µετά την ήδη δεσµευµένη. Τότε, πρέπει να γίνει αντιγραφής της υπάρχουσας αλλού, ώστε να µπορέσει να επεκταθεί, κάτι που µπορεί να οδηγήσει σε αναποτελεσµατικότητα, ιδιαίτερα όταν η αρχική µνήµη είναι µεγάλη και η realloc γίνεται επαναλαµβανόµενα. (γ') Ο στόχος αυτού του τµήµατος προγράµµατος είναι η αντιγραφή των περιεχοµένων του αρχείου που αντιστοιχεί στον δείκτη αρχείου ifp στο αρχείο µε δείκτη αρχείου ofp. Η διαφορά στο µέγεθος του buf επιδρά στο πλήθος των επαναλήψεων της while. Μεγαλύτερο µέγεθος του buf σηµαίνει λιγότερες επαναλήψεις, και αντίστροφα. (δ') i) Η γρήγορη µέθοδος ταξινόµησης έχει καλύτερη µέση πολυπλοκότητα από τη µέθοδο της εισαγωγής, δηλαδή O(nlogn) έναντι O(n^2). ii) Η µέθοδος της συγχώνευσης έχει καλύτερη χείριστη πολυπλοκότητα από τη γρήγορη µέθοδο, δηλαδή O(nlogn) έναντι O(n^2). iii) Η µέθοδος του σωρού και η µέθοδος της συγχώνευσης έχουν την ίδια πολυπλοκότητα. ιαφέρουν στο ότι η µέθοδος του σωρού είναι επαναληπτική, ενώ η µέθοδος της συγχώνευσης είναι διπλά αναδροµική. Υπ' αυτή την έννοια, είναι προτιµότερη η χρήση της µεθόδου του σωρού, αν και η διπλή αναδροµή της µεθόδου της συγχώνευσης δεν είναι τόσο µεγάλο πρόβληµα, γιατί το βάθος του δέντρου, άρα και το πλήθος των κλήσεων συναρτήσεων στη στοίβα, είναι της τάξης του logn.

Θέµα 2 (α') typedef struct dlistnode *DListptr; struct dlistnode { int value; DListptr next; DListptr prev; ; void print_dlist_bf(dlistptr dlist) { if (dlist == NULL) printf("end"); else { printf("%d --> ", dlist->value); while (dlist->next!= NULL) { dlist = dlist->next; printf("%d --> ", dlist->value); printf("end --> %d", dlist->value); while (dlist->prev!= NULL) { dlist = dlist->prev; printf(" --> %d", dlist->value); (β') void insert_at_start_dlist(dlistptr *ptraddr, int v) { DListptr templist; templist = *ptraddr; *ptraddr = malloc(sizeof(struct dlistnode)); (*ptraddr)->value = v; (*ptraddr)->next = templist; (*ptraddr)->prev = NULL; if (templist!= NULL) templist->prev = *ptraddr; (γ') Πρωτότυπο: int delete_nth_dlist(dlistptr *, int) Η συνάρτηση επιστρέφει 1 όταν είναι εφικτή η διαγραφή, αλλιώς 0. Το πρώτο όρισµα είναι η διεύθυνση του δείκτη στο πρώτο στοιχείο της λίστας και το δεύτερο όρισµα είναι το N. Κλήση: delete_nth_dlist(500, 3) Λίστα µετά τη διαγραφή: 500 1000 1100 1300 +----+ +----+----+----+ +----+----+----+ +----+----+----+ 1000 --> 87 1100 NULL 23 1300 1000 10 NULL 1100 +----+ +----+----+----+ +----+----+----+ +----+----+----+ ^ ^^ ^ +-----+ +-----+ +------+ +------+

Θέµα 3 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a, b, c, n, lim; if (argc == 1) lim = atoi(argv[1]); for (n = 1 ; n <= lim ; n++) { /* Έστω n^3 = a^3 + b^3 + c^3 */ for (a = 1 ; 3*a*a*a <= n*n*n ; a++) { /* Το a κυµαίνεται από 1 έως µία τιµή τέτοια ώστε a^3 <= (n^3)/3 */ for (b = a ; 2*b*b*b <= n*n*n - a*a*a ; b++) { /* Το b κυµαίνεται από a έως µία τιµή τέτοια ώστε b^3 <= (n^3 - a^3)/2 */ for (c = b ; c*c*c <= n*n*n - a*a*a - b*b*b ; c++) /* Το c κυµαίνεται από b έως µία τιµή τέτοια ώστε c^3 <= n^3 - a^3 - b^3 */ if (n*n*n == a*a*a + b*b*b + c*c*c) /* Έλεγχος */ printf("%d^3 = %d^3 + %d^3 + %d^3\n", n, a, b, c); return 0;

Θέµα 4 #include <stdio.h> #include <stdlib.h> #include <time.h> /* Αποσχολιάστε την παρακάτω γραµµή για την έκδοση µε κατακόρυφη εκτύπωση */ /* #define VERT */ #ifndef VERT int main(int argc, char *argv[]) /* Έκδοση µε οριζόντια εκτύπωση */ { int i, j, k, n, m, d, ***grid; /* Ορίζουµε έναν 3-διάστατο πίνακα, αφού θα χρειαστούµε στο τέλος όλες τις καταστάσεις για να τις εκτυπώσουµε οριζόντια */ char beats, kinds[] = "RSP"; long seed; seed = time(null); scanf("%d %d %d", &n, &m, &d); if ((grid = malloc((d+1) * sizeof(int **))) == NULL) for (i = 0 ; i <= d ; i++) { if ((grid[i] = malloc(n * sizeof(int *))) == NULL) for (j = 0 ; j < n ; j++) if ((grid[i][j] = malloc(m * sizeof(int))) == NULL) if (argc > 1) seed = atoi(argv[1]); srand ((unsigned int) seed); for (j = 0 ; j < n ; j++) /* ηµιουργία τυχαίας αρχικής κατάστασης */ for (k = 0 ; k < m ; k++) grid[0][j][k] = kinds[rand() % 3]; for (i = 1 ; i <= d ; i++) for (j = 0 ; j < n ; j++) for (k = 0 ; k < m ; k++) { grid[i][j][k] = grid[i-1][j][k]; /* Αντιγραφή τρέχουσας κατάστασης στην επόµενη */ switch (grid[i-1][j][k]) { case 'R': beats = 'P'; /* Το χαρτί κερδίζει την πέτρα */ case 'S': beats = 'R'; /* Η πέτρα κερδίζει το ψαλίδι */ case 'P': beats = 'S'; /* Το ψαλίδι κερδίζει το χαρτί */ if ((k < m-1 && grid[i-1][j][k+1] == beats) (j < n-1 && grid[i-1][j+1][k] == beats) (k > 0 && grid[i-1][j][k-1] == beats) (j > 0 && grid[i-1][j-1][k] == beats)) grid[i][j][k] = beats; /* Αλλαγή γειτονικού κελιού */ for (i = 1 ; i <= d ; i++) { /* Εκτύπωση όλων των καταστάσεων */ printf("day %-2d", i); for (j = 0 ; j <= m ; j++) printf(" "); for (j = 0 ; j < n ; j++) { for (i = 0 ; i <= d ; i++) { if (i > 0) { if (j == 0) printf(" ----> "); else printf(" ");

for (k = 0 ; k < m ; k++) putchar(grid[i][j][k]); for (i = 0 ; i < d ; i++) { for (j = 0 ; j < n ; j++) free(grid[i][j]); free(grid[i]); free(grid); return 0; #else int main(int argc, char *argv[]) /* Έκδοση µε κατακόρυφη εκτύπωση */ { int i, j, day, n, m, d, **grid, **newgrid, **temp; /* Ορίζουµε δύο 2-διάστατους πίνακες, για να κρατάµε την τρέχουσα κατάσταση και την επόµενή της */ char beats, kinds[] = "RSP"; long seed; seed = time(null); scanf("%d %d %d", &n, &m, &d); if ((grid = malloc(n * sizeof(int *))) == NULL) if ((newgrid = malloc(n * sizeof(int *))) == NULL) for (i = 0 ; i < n ; i++) { if ((grid[i] = malloc(m * sizeof(int))) == NULL) if ((newgrid[i] = malloc(m * sizeof(int))) == NULL) if (argc > 1) seed = atoi(argv[1]); srand ((unsigned int) seed); for (i = 0 ; i < n ; i++) /* ηµιουργία τυχαίας αρχικής κατάστασης */ for (j = 0 ; j < m ; j++) grid[i][j] = kinds[rand() % 3]; for (day = 1 ; day <= d+1 ; day++) { for (i = 0 ; i < n ; i++) { /* Εκτύπωση τρέχουσας κατάστασης */ for (j = 0 ; j < m ; j++) printf("%c", grid[i][j]); if (day < d+1) printf("day %d\n", day); for (i = 0 ; i < n ; i++) for (j = 0 ; j < m ; j++) { newgrid[i][j] = grid[i][j]; /* Αντιγραφή τρέχουσας κατάστασης στην επόµενη */ switch (grid[i][j]) { /* Τι κερδίζει τι */ case 'R': beats = 'P'; case 'S': beats = 'R'; case 'P': beats = 'S'; if ((j < m-1 && grid[i][j+1] == beats) (i < n-1 && grid[i+1][j] == beats) (j > 0 && grid[i][j-1] == beats) (i > 0 && grid[i-1][j] == beats)) newgrid[i][j] = beats; /* Αλλαγή γειτονικού κελιού */

temp = grid; /* Επόµενη κατάσταση είναι η τρέχουσα */ grid = newgrid; newgrid = temp; for (i = 0 ; i < n ; i++) { free(grid[i]); free(newgrid[i]); free(grid); free(newgrid); return 0; #endif