Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:"— Μεταγράφημα παρουσίασης:

1 ΛΟΓ102: Τεχνολογία Λογισμικού Ι nickie@softlab.ntua.gr Διδάσκων: Νίκος Παπασπύρου http://www.softlab.ntua.gr/~nickie/TUC/log102/ 1Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Διαφάνειες παρουσίασης #7 4 Συναρτήσεις βιβλιοθήκης 4 Αναδρομικές συναρτήσεις 4 Αναγνωσιμότητα προγραμμάτων

2 2Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Συναρτήσεις βιβλιοθήκης(i) u Είσοδος και έξοδος l Περιέχει όλες τις συναρτήσεις εισόδου-εξόδου l Προκαθορισμένα αρχεία FILE * stdin; τυπική είσοδος FILE * stdout; τυπική έξοδος FILE * stderr; τυπική έξοδος σφαλμάτων l Ισοδυναμίες printf(...)  fprintf(stdout,...) scanf(...)  fscanf(stdin,...) κ.λπ. l Συναρτήσεις διαχείρισης αρχείων με τυχαία πρόσβαση (random access)

3 3Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Συναρτήσεις βιβλιοθήκης(ii) u Διαχείριση συμβολοσειρών l size_t strlen (const char * s); Μέτρηση αριθμού χαρακτήρων της συμβολοσειράς s. l char * strcpy (char * s1, const char * s2); Αντιγραφή της συμβολοσειράς s2 στην s1. l char * strcat (char * s1, const char * s2); Προσθήκη της συμβολοσειράς s2 στο τέλος της s1. l int strcmp (const char * s1, const char * s2); Σύγκριση των συμβολοσειρών s1 και s2.

4 4Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Συναρτήσεις βιβλιοθήκης(iii) u Μετατροπή συμβολοσειρών l int atoi (const char * s); Μετατροπή της συμβολοσειράς s σε int. l long int atol (const char * s); Μετατροπή της συμβολοσειράς s σε long int. l double atof (const char * s); Μετατροπή της συμβολοσειράς s σε double. u Δυναμική παραχώρηση μνήμης l void * malloc (size_t n); Δυναμική παραχώρηση μνήμης μήκους n bytes. l void free (void * p); Αποδέσμευση της μνήμης στην οποία δείχνει το p.

5 5Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Δυναμική παραχώρηση μνήμης  Παράδειγμα int * p; int i; p = (int *) malloc(sizeof(int)); *p = 42; free(p); p = (int *) malloc(10 * sizeof(int)); for (i=0; i<10; i++) p[i] = 42; free(p);

6 6Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Συναρτήσεις βιβλιοθήκης(iv) u Μαθηματικές συναρτήσεις double sqrt (double x); double exp (double x); double log (double x); double pow (double x, double y); double sin (double x); double cos (double x); l double tan (double x); double asin (double x); double acos (double x); l double atan (double x);

7 7Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Συναρτήσεις βιβλιοθήκης(v) u Άλλες συναρτήσεις βιβλιοθήκης l Διαχείριση χρόνου l Καθορισμός τύπου χαρακτήρων l Εναλλακτική διαχείριση αρχείων (όπως στο Unix) l Άλματα μεταξύ συναρτήσεων

8 8Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Αναδρομικές συναρτήσεις(i) u Προγραμματισμός επαναλαμβανόμενων διαδικασιών l επανάληψη (iteration) l αναδρομή (recursion) u Μια συνάρτηση είναι αναδρομική όταν στο σώμα της καλεί τον εαυτό της Έμμεση αναδρομή int f (int x) {... g(y)... } int g (int z) {... f(w)... } Άμεση αναδρομή int f (int x) {... f(y)... }

9 9Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Αναδρομικές συναρτήσεις(ii) u Κεντρική ιδέα l Η λύση ενός προβλήματος ανάγεται στη λύση ενός όμοιου προβλήματος αλλά απλούστερου l Η αναδρομή πρέπει να τερματίζεται u Παράδειγμα: συνάρτηση παραγοντικού l n! = 1 * 2 *... * n και 0! = 1 int fact (int n) { if (n == 0) return 1; else return n * fact(n-1); }

10 10Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Πύργοι του Hanoi(i) u Περιγραφή l Να μεταφερθούν οι n δακτύλιοι από τον πρώτο στον τρίτο στύλο, χρησιμοποιώντας το δεύτερο ως βοηθητικό χώρο u Κανόνες l Ένας δακτύλιος τη φορά l Δεν μπορεί να τοποθετηθεί μεγαλύτερος δακτύλιος πάνω από μικρότερο

11 11Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Πύργοι του Hanoi(ii) leftmiddleright u Αναδρομική επίλυση l Απλούστερο πρόβλημα = λιγότεροι δακτύλιοι

12 12Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Πύργοι του Hanoi(iii) void hanoi (int rings, const char * from, const char * to, const char * auxil) { if (rings >= 1) { hanoi(rings-1, from, auxil, to); printf("%s -> %s\n", from, to); hanoi(rings-1, auxil, to, from); } } void main () { hanoi(4, "left", "right", "middle"); }

13 13Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Αναγνωσιμότητα προγραμμάτων u Ευκολία με την οποία γίνεται κατανοητό το τί κάνει ένα πρόγραμμα από την ανάγνωσή του ως κειμένου και μόνο i=1; a=0; l1:if (feof(f)) goto l3; fscanf(f, "%d", &d); if (d==k) goto l2; i++; goto l1; l2:a=1; l3: count = 0; found = FALSE; while (!feof(inputFile)) { count++; fscanf(inputFile, "%d", &data); if (data == key) { found = TRUE; break; } }

14 14Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Κανόνες αναγνωσιμότητας(i) u Σαφήνεια και απλότητα l Ο πολύπλοκος κώδικας δυσκολεύει την ανάγνωση του προγράμματος l Επιπλέον, αυξάνει τις πιθανότητες ύπαρξης σφαλμάτων u Συμπέρασμα: l Να αποφεύγεται περιττή πολυπλοκότητα l Να προτιμώνται απλές και σαφείς λύσεις a ^= a; a = 0;

15 15Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Κανόνες αναγνωσιμότητας(ii) u Στίξη l Η χρήση παρενθέσεων και αγκίστρων διευκολύνει την αναγνωσιμότητα l Η υπερβολική χρήση όμως έχει αντίθετο αποτέλεσμα a = x - b & 0xf0f0; a = (x - b) & 0xf0f0; if (d > 0) if (positive) r = sqrt(d); else r = -sqrt(d); if (d > 0) { if (positive) r = sqrt(d); else r = -sqrt(d); }

16 16Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Κανόνες αναγνωσιμότητας(iii) u Επιλογή κατάλληλων ονομάτων l Περιγραφικά ονόματα c=0;count=0; l Χρήση μεγάλων αναγνωριστικών mlmaximum_length l Χρήση πεζών/κεφαλαίων ή underscore averagepriceperyear averagePricePerYear average_price_per_year l Χρήση επωνύμων σταθερών ή macros tax = 0.21 * (income - 2000); tax = TAX_RATE * (income - NON_TAXABLE);

17 17Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Κανόνες αναγνωσιμότητας(iv) u Σχόλια l Αναπόσπαστο μέρος του προγράμματος l Πρέπει να γράφονται μαζί με το πρόγραμμα l Να ενημερώνονται όταν αλλάζει το πρόγραμμα l Όχι περιττά και "κρυπτογραφικά" σχόλια u Σημεία που είναι απαραίτητα l Στην αρχή του ορισμού μιας συνάρτησης l Στις δηλώσεις σταθερών ή μεταβλητών l Στην αρχή κάθε τμήματος προγράμματος που επιτελεί μια ξεχωριστή λειτουργία l Στα άγκιστρα, όταν δεν είναι προφανές σε ποια δομημένη εντολή αυτά αντιστοιχούν

18 18Νίκος ΠαπασπύρουΛΟΓ102: Τεχνολογία Λογισμικού Ι Κανόνες αναγνωσιμότητας(v) u Στοίχιση των εντολών l Οι εσωτερικές εντολές στοιχίζονται 3 ως 5 διαστήματα δεξιότερα l Διευκολύνει πολύ την αναγνωσιμότητα l Τρόπος στοίχισης είναι υποκειμενικός l Πρέπει όμως να είναι συνεπής if (expression) statement; if (expression) statement_1; else statement_2; while (expression) { statement_1; statement_2;... statement_n; }


Κατέβασμα ppt "ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google