Τυχαίοι αριθμοί Αλφαριθμητικά και χαρακτήρες
Παραγωγή τυχαίων αριθμών: Η συνάρτηση rand Η συνάρτηση rand() ανήκει στη βιβλιοθήκη stdlib της C. int rand(void); Για την χρήση της σε ένα πρόγραμμα εισάγουμε την οδηγία #include <stdlib.h> H rand() επιστρέφει έναν τυχαίο αριθμό μεταξύ 0 και RAND_MAX όπου RAND_MAX είναι μια σταθερή που εξαρτάται από το υπολογιστικό σύστημα 2
Παράδειγμα: Σελ. 320 του βιβλίου #include <stdio.h> #include <stdlib.h> #include "genlib.h" #define NTrials 10 /* Ένα πρόγραμμα που κάνει 10 ρίψεις ενός κέρματος */ main() { int i; } for (i = 0; i < NTrials; i++) { if (rand() <= RAND_MAX / 2) { printf("heads\n"); } else { printf("tails\n"); } } 3
Απαριθμητοί τύποι Τύποι δεδομένων που παίρνουν τιμές από ένα απαριθμητό (πεπερασμένο) σύνολο τιμών Παραδείγματα Οι ημέρες της εβδομάδας Κυριακή, Δευτέρα,..., Σάββατο Τα 4 σημεία του ορίζοντα Ανατολή, Δύση, Βορράς, Νότος. 4
Αναπαράσταση απαριθμητών τύπων ως ακεραίων Με χρήση της οδηγίας #define #define Sunday 0 #define Monday 1 #define Tuesday 2 #define Wednesday 3 #define Thursday 4 #define Friday 5 #define Saturday 6 5
Ορισμός νέων απαριθμητών τύπων Η λέξη κλειδί typedef Ορίζει νέους σύνθετους τύπους δεδομένων. Ορισμός απαριθμητών τύπων με την typedef enum typedef enum { λίστα στοιχείων } όνομα τύπου; 6
Παράδειγμα ορισμού απαριθμητού τύπου typedef enum { Sunday, Monday, Tuesday, Wednsday, Thursday, Friday, Saturday } weekdayt; Με την παραπάνω εντολή, οι σταθερές Sunday,..., Saturday αναπαρίστανται εσωτερικά ως διαδοχικοί ακέραιοι, ξεκινώντας από το 0. 7
Παράδειγμα ορισμού απαριθμητού τύπου (συνέχ.) Αν θέλουμε η αρίθμηση να ξεκινάει, π.χ. από το 1 γράφουμε typedef enum { Sunday = 1, Monday, Tuesday, Wednsday, Thursday, Friday, Saturday } weekdayt; Τώρα, η ανάθεση γίνεται ως εξής: Sunday = 1, Monday = 2,..., Saturday = 7. 8
Πράξεις με απαριθμητούς τύπους Οι απαριθμητοί παίρνουν σταθερές τιμές οι οποίες παριστάνονται από ακεραίους. Συμπεριφέρονται ως ακέραιοι. Είναι δυνατή η εκτέλεση πράξεων ακεραίων με απαριθμητούς τύπους: weekdayt wday; wday = Sunday; wday = wday + 1; wday = wday % 7; 9
Βαθμωτοί τύποι Οι απαριθμητοί τύποι περιλαμβάνονται στους βαθμωτούς τύπους της C. Οι βαθμωτοί τύποι χρησιμοποιούνται όπως οι ακέραιοι. 10
Παράδειγμα Χρήση τύπου enum με την εντολή switch typedef enum {North, East, South, West} directiont; /* H synarthsh directiont epistrefei thn anti8eth kateythynsh apo ayth toy orismatos ths */ directiont OppositeDirection(directionT dir) { } switch (dir) { } case North: return (South); case South: return (North); case East: return (West); case West: return (East); default: printf( Akyrh katey8ynsh\n ); 11
Χαρακτήρες Ο τύπος char Ο κώδικας ASCII Κωδικοποίηση χαρακτήρων με αριθμούς 7 δυαδικών ψηφίων. (Από 0 έως 127). Σήμερα υφίστανται νεώτεροι κώδικες χαρακτήρων (Unicode standard) υφίστανται Είναι δυνατόν να περιλαμβάνουν τους χαρακτήρες κάθε αλφαβήτου χρησιμοποιώντας έως και 32 bit για την κωδικοποίηση Παραδείγματα: ο χαρακτήρας 'Α' (αγγλικό) αναπαρίσταται στον κώδικα ASCII με τον αριθμό 65μ ο 'Β' με τον 66, ο 'a' με τον αριθμό 97, κλπ. 12
Πίνακας κωδικών ASCII (στο δεκαεξαδικό) 13
Σταθερές ειδικοί χαρακτήρες Σταθερές χαρακτήρων: Περικλείονται από τα σημάδια ' και '. Παράδείγματα: 'Α', 'c', '+','2' Δύο είδη χαρακτήρων: Εκτυπώσιμοι χαρακτήρες (όπως οι παραπάνω) Ειδικοί χαρακτήρες οι οποίοι εκτελούν συγκεκριμένες ενέργειες. Παραδείγματα: Χαρακτήρας αλλαγής γραμμής '\n', οριζόντιος στηλοθέτης (tab) '\t', κ.λπ. 14
Παράσταση ειδικών χαρακτήρων της C H δήλωση ειδικών χαρακτήρων στα προγράμματα γίνεται με το συνδυασμό \ [χαρακτήρας] o οποίος ονομάζεται χαρακτήρας διαφυγής (escape character). Παραδείγματα φαίνονται στον διπλανό πίνακα 15
Χαρακτήρες και αλφαριθμητικές σταθερές Μια αλφαριθμητική σταθερά είναι μια ακολουθία από χαρακτήρων, εκτυπώσιμων και ειδικών. Παράδειγμα: My name is \ John\ \n Στο παράδειγμα η αλφαριθμητική σταθερά αποτελείται από τους παρακάτω χαρακτήρες: 'M' 'y' ' ' 'n' 'a' 'm' 'e' ' ' 'i' 's' ' ' '\ ' 'J' 'o' 'h' 'n' '\ ' '\n' 16
Αριθμητική χαρακτήρων Οι χαρακτήρες αναπαρίστανται ως ακέραιοι και τους επεξεργαζόμαστε ως ακεραίους. Έτσι επιτρέπονται οι εξής πράξεις Πρόσθεση ακεραίου σε χαρακτήρα Αφαίρεση ακεραίου από χαρακτήρα Αφαίρεση χαρακτήρα από χαρακτήρα Σύγκριση δύο χαρακτήρων μεταξύ τους. 17
Πρόσθεση και αφαίρεση ακεραίου σε χαρακτήρα main() { } char c,nc; c = 'A'; c ++; /* Το c παίρνει την τιμή 'B' */ nc = '5'; nc -= 5; /*Το nc παίρνει την τιμή '0'(όχι 0!) */ 18
Αφαίρεση χαρακτήρα από χαρακτήρα main() { } char c1,c2, dc; c1 = 'A'; c2 = 'a'; dc = c2 - c1; /* To c1 έχει την τιμή '5'*/ 19
Σύγκριση δύο χαρακτήρων μεταξύ τους main() { char ch; /*...Ανάθεση τιμής στο c... */ if (ch >='0' && ch <= '9') printf( O %c paristanei arithmo\n,ch); else if (ch >='A' && ch <= 'Z') printf( O %c paristanei kefalaio\n,ch); else if (ch >='a' && ch <= 'z') printf( O %c paristanei mikro gramma\n,ch); else... 20
Η βιβλιοθήκη ctype Απαιτείται η οδηγία #include <ctype.h> Περιλαμβάνει τις συναρτήσεις islower(ch) isupper(ch) isalpha(ch) isdigit(ch) ispunct(ch) isspace(c) 21
Οι χαρακτήρες είναι δυνατόν να χρησιμοποιηθούν με την εντολή switch /*Είναι ο χαρακτήρας φωνήεν;*/ bool IsVowel(char ch) { } switch (tolower (ch)) { } case 'a': case 'e': case 'i': case 'o': case 'u': return (TRUE); default: return (FALSE); 22
Είσοδος χαρακτήρων και αλφαριθμητικών Είσοδος χαρακτήρων: Η συνάρτηση getchar της βιβλιοθήκης stdio Είσοδος συμβολοσειρών: Η συνάρτηση GetLine της βιβλιοθήκης simpio. 23
strlib: Μια βιβλιοθήκη χειρισμού συμβολοσειρών Η C δεν έχει ειδικό τύπο για τα αλφαριθμητικά. Χειρίζεται τα αλφαριθμητικά ως πίνακες χαρακτήρων (βλ. επόμενα μαθήματα). Η βιβλιοθήκη strlib του βιβλίου παρέχει έναν τύπο string, ο οποίος δεν είναι βασικός τύπος της C παρέχει ένα σύνολο συναρτήσεων για το χειρισμό αλφαριθμητικών. 24
Εύρεση του μήκους αλφαριθμητικού. Η συνάρτηση StringLength H συνάρτηση int StringLength(string s) υπολογίζει και επιστρέφει το μήκος του αλφαριθμητικού s. Για παράδειγμα η StringLength( Hello\n ) επιστρέφει 6. main() { string str; printf( Enter a string: ); } str = GetLine(); printf( The length is %d.\n, StringLength(str)); 25
Επιλογή χαρακτήρων Η συνάρτηση char char IthChar(string s, int i) επιστρέφει τον i-οστό χαρακτήρα της συμβολοσειράς s ξεκινώντας από το στοιχείο στη θέση 0. Η παρακάτω συνάρτηση επιστρέφει τον τελευταίο χαρακτήρα μιας συμβολοσειράς. char LastChar(string str) { return (IthChar(str, StringLength(str) 1)); } 26
Συνένωση αλφαριθμητικών Η συνάρτηση string Concat(string s1, string s2) επιστρέφει το μια συμβολοσειρά που προκύπτει από τη συνένωση των s1 και s2. string ConcatNCopies(int n, string str) { string result; int i; } result = ; for (i=0;i < n;i++) { result = Concat(result,str); } return result; 27
Άλλες συναρτήσεις Εξαγωγή τμημάτων αλφαριθμητικού string SubString(string str, int start, int end) Σύγκριση δύο αλφαριθμητικών bool StringCompare(string s1, string s2) Αναζήτηση στο εσωτερικό αλφαριθμητικού int FindChar(char ch, string text, int start) int FindString(string str, string text, int start) Μετατροπή πεζών-κεφαλαίων string ConvertToUpperCase(String str) string ConvertToLowerCase(String str) 28
Ασκήσεις Αντιστροφή αλφαριθμητικού Έλεγχος παλίνδρομου (ΑΝΝΑ, BOB) 29
Δείτε: Κεφάλαιο 9 του βιβλίου 30