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

Σχετικά έγγραφα
Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

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

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

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

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

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

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

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

Υπολογισμός - Εντολές Επανάληψης

Διάλεξη 5η: Εντολές Επανάληψης

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

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

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

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

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

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

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

Προγραμματισμός I (Θ)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

Εργαστήριο 2: Πίνακες

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

1 ο ΦΥΛΛΑΔΙΟ ΑΣΚΗΣΕΩΝ - ΑΛΓΟΡΙΘΜΟΙ

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

C: Από τη Θεωρία στην Εφαρμογή

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

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

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Λυμένα παραδείγματα με τις for, while, do-while

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Αναδρομικοί Αλγόριθμοι

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

Επανάληψη για τις Τελικές εξετάσεις

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

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

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

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

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

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

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

Κεφάλαιο 5ο: Εντολές Επανάληψης

Λύσεις για τις ασκήσεις του lab5

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

Εντολές ελέγχου ροής if, for, while, do-while

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

Παραδείγματα. Γράψτε ένα πρόγραμμα που να τυπώνει τη μέση τιμή ενός συνόλου μη αρνητικών αριθμών

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

Εργαστήριο 3 Εντολή for while, do while

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Χαράλαµπος Σκόκος ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ I ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C ΕΞΕΤΑΣΕΙΣ ΧΕΙΜΕΡΙΝΟΥ ΕΞΑΜΗΝΟΥ Ερωτήσεις

Ενδεικτικές λύσεις και στατιστικά

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

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

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

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Προεπεξεργαστής C. Προγραμματισμός Ι 1

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

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

Δομημένος Προγραμματισμός

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

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

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

Transcript:

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου 2013 Θέµα 1 (α') Η απάντηση είναι λάθος. Αν χρησιµοποιήσουµε την µακροεντολή, για παράδειγµα, στην έκφραση 24/CUBE(2) η έκφραση αυτή θα αντικατασταθεί από την 24/(2)*(2)*(2) που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η 24/((2)*(2)*(2)) που θα έδινε σαν αποτέλεσµα το 3. Άρα, η µακροεντολή πρέπει να γραφεί ως: #define CUBE(X) ((X)*(X)*(X)) (β') char *mystrstr(char *s1, char *s2) char *ss1 = s1, *orig_s2 = s2; while (*s2!= '\0') /* Υπάρχουν ακόµα χαρακτήρες για έλεγχο στην s2 */ if (*s1 == '\0') /* Η s1 τελείωσε */ return NULL; /* εν υπάρχει ταίριασµα */ if (*s1 == *s2) /* Οι τρέχοντες χαρακτήρες ταιριάζουν */ s1++; /* Προχώρησε την s1 */ s2++; /* Προχώρησε την s2 */ else /* Οι τρέχοντες χαρακτήρες δεν ταιριάζουν */ s1 = ++ss1; /* Προχώρησε την αρχή πιθανού ταιριάσµατος στην s1 */ s2 = orig_s2; /* Η s2 πάλι από την αρχή */ /* Η s2 τελείωσε - βρέθηκε ταίριασµα */ return ss1; /* Επιστροφή της αρχής του ταιριάσµατος στην s1 */

(γ') Και οι δύο συναρτήσεις επιστρέφουν το άθροισµα των διαιρετών του ακεραίου n που τους δίνεται ως όρισµα. Η ds1 ελέγχει για πιθανούς διαιρέτες από το 1 έως το n, ενώ η ds2 από το 2 έως το n/2, έχοντας αθροίσει εξ αρχής στο τελικό αποτέλεσµα το 1 και το n ως διαιρέτες του n. ηλαδή, η ds2 κάνει περίπου τις µισές επαναλήψεις από την ds1. Με όρους πολυπλοκότητας, και οι δύο έχουν πολυπλοκότητα χρόνου O(n). Θα µπορούσαµε όµως να ελέγχουµε για διαιρέτες µέχρι την τετραγωνική ρίζα του n και, για κάθε διαιρέτη i που βρίσκουµε, να λαµβάνουµε υπόψη µας και τον "συµµετρικό" του διαιρέτη n/i (εκτός από την περίπτωση που το n είναι τέλειο τετράγωνο, οπότε όταν βρούµε την τετραγωνική του ρίζα ως διαιρέτη, θα τον λάβουµε υπόψη µόνο µία φορά, αφού ταυτίζεται µε τον "συµµετρικό" του. Μία συνάρτηση ds3 που υλοποιεί αυτόν τον αλγόριθµο είναι η εξής: int ds3(int n) int i, s; s = n+1; for (i = 2 ; i*i < n ; i++) if (n % i == 0) s += i + n/i; if (i*i == n) s += i; return s; Η πολυπλοκότητα χρόνου της συνάρτησης αυτής είναι O(n^(1/2)), αφού κάνει πλήθος επαναλήψεων περίπου ίσο µε την τετραγωνική ρίζα του n.

Θέµα 2 (α') int listlength(listptr list) int n = 0; while (list!= NULL) n++; list = list->next; return n; (β') Η συνάρτηση αντιστρέφει µία λίστα ακεραίων, χωρίς να µετακινήσει τους κόµβους της λίστας, απλώς αλλάζοντας κατάλληλα τους δείκτες προς τον επόµενο κόµβο κάθε κόµβου. Έστω η λίστα: 1000 1200 1300 +----+----+ +----+----+ +----+----+ 12 1200 --> 28 1300 --> 17 NULL +----+----+ +----+----+ +----+----+ Η συνάρτηση καλείται µε όρισµα τη διεύθυνση 1000 και επιστρέφει στο όνοµά της τη διεύθυνση 1300, έχοντας κάνει τις εξής αλλαγές στη λίστα: 1000 1200 1300 +----+----+ +----+----+ +----+----+ 12 NULL 28 1000 -+ 17 1200 -+ +----+----+ +----+----+ +----+----+ ^ ^ +--+------+ +--+

Θέµα 3 #include <stdio.h> int main(void) int maxnum, n, d, numb, digit, digits, sum, product; printf("please, give maximum number: "); scanf("%d", &maxnum); for (numb = 1 ; numb <= maxnum ; numb++) /* Για κάθε ακέραιο αριθµό στο διάστηµα [1,maxnum] */ digits = 0; n = numb; while (n) digits++; /* Μέτρησε το πλήθος των ψηφίων του αριθµού */ n /= 10; /* µέσω διαδοχικών διαιρέσεων µε το 10 */ sum = 0; /* Αρχικοποίησε το άθροισµα των δυνάµεων */ n = numb; while (n) digit = n % 10; /* Για κάθε ψηφίο του αριθµού */ product = 1; /* Βρες το αποτέλεσµα της ύψωσης */ for (d = 0 ; d!= digits ; d++) /* του ψηφίου σε δύναµη ίση µε */ product *= digit; /* το πλήθος των ψηφίων του αριθµού */ sum += product; /* Άθροισε το αποτέλεσµα */ n /= 10; if (sum == numb) /* Ο αριθµός είναι ναρκισσιστικός */ printf("%d ", numb); printf("\n"); return 0;

Θέµα 4 #include <stdio.h> #include <stdlib.h> int inboard(int, int, int); int main(int argc, char *argv[]) int i, j, ii, jj, k, m, n, br, pl, op; char **board; if (argc!= 3) n = atoi(argv[1]); if (n % 2) /* Μόνο για άρτια διάσταση */ pl = *argv[2]; if (pl == 'b') /* Ορισµός χρώµατος παίκτη και αντιπάλου */ op = 'w'; else if (pl == 'w') op = 'b'; else if ((board = malloc(n * sizeof(char *))) == NULL) for (i = 0 ; i < n ; i++) if ((board[i] = malloc(n * sizeof(char))) == NULL) printf("please, give the Othello board\n"); for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) board[i][j] = getchar(); /* Ανάγνωση πλαισίου παιγνιδιού */ getchar(); for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) if (board[i][j]!= '.') /* Αν το κελί είναι κατειληµµένο */ continue; /* πήγαινε στο επόµενο */ br = 0; for (k = -1 ; k <= 1 &&!br ; k++) /* Για κάθε πιθανή κατεύθυνση */ for (m = -1 ; m <= 1 &&!br ; m++) if (k == 0 && m == 0) /* Περίπτωση χωρίς κατεύθυνση */ continue; /* Πήγαινε στην επόµενη */ ii = i+k; /* Το αµέσως γειτονικό κελί του (i,j) στην */ jj = j+m; /* κατεύθυνση (k,m) είναι το (ii,jj) */ if (!inboard(n, ii, jj) board[ii][jj]!= op) continue; /* Αν το (ii,jj) είναι εκτός πλαισίου ή δεν είναι κατειληµµένο από αντίπαλο, πήγαινε στην επόµενη κατεύθυνση */ do /* Προχώρησε στην κατεύθυνση (k,m) */ ii += k; /* όσο είσαι εντός πλαισίου και το κελί */ jj += m; /* είναι κατειληµµένο από αντίπαλο */ while (inboard(n, ii, jj) && board[ii][jj] == op); if (inboard(n, ii, jj) && board[ii][jj] == pl) board[i][j] = '*'; /* Αν είσαι εντός πλαισίου και το */ br = 1; /* κελί είναι κατειληµµένο από τον παίκτη, σηµείωσε την ελεγχόµενη θέση ως νόµιµη και αγνόησε τις άλλες κατευθύνσεις */ printf("legal moves of player %c marked with *\n", pl); for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j++) putchar(board[i][j]); putchar('\n'); for (i = 0 ; i < n ; i++)

free(board[i]); free(board); return 0; int inboard(int n, int i, int j) if (i >=0 && i < n && j >= 0 && j < n) return 0;