Διαδικαστικός Προγραμματισμός

Σχετικά έγγραφα
Διαδικαστικός Προγραμματισμός

Τυχαίοι αριθμοί Αλφαριθμητικά και χαρακτήρες

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

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

Αλφαριθμητικά, πίνακες και δείκτες

Κεφάλαιο 1. Συστήματα αρίθμησης και αναπαράστασης

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

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

Ψηφιακά Συστήματα. 2. Κώδικες

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

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

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

Διαδικασιακός Προγραμματισμός

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 9 Ο. Διαχείριση αλφαριθμητικών και πράξεις σε επίπεδο bit ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΙΝΑΤΚΑΣ Ι.

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

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

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

Διαδικασιακός Προγραμματισμός

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Μεταβλητές τύπου χαρακτήρα

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

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

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

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Διάλεξη 8η: Αλφαριθμητικά (strings)

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

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

Διαδικαστικός Προγραμματισμός

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

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

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

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

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

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

Πρόλογος. if (παράσταση) εντολή1 else εντολή2. Από εδώ και πέρα θα αναφέρεται ως K&R.

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

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

Στοιχειώδης προγραμματισμός σε C++

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

Συναρτήσεις διαχείρισης αλφαριθμητικών

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

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

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

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

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

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

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Ενδεικτική περιγραφή μαθήματος

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

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ψηφιακή Σχεδίαση

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

Διαδικαστικός Προγραμματισμός

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

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

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στην γλώσσα προγραμματισμού C

Δεδομένα, τελεστές, είσοδος/έξοδος

Τετάρτη 5-12/11/2014. ΣΗΜΕΙΩΣΕΙΣ 3 ου και 4 ου ΜΑΘΗΜΑΤΟΣ ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΑΡΧΙΤΕΚΤΟΝΙΚΗ Η/Υ Α ΕΞΑΜΗΝΟ

Χpήσιµες Βιβλιοθήκες της γλώσσας C

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

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δεδομένα, Τύποι και Τιμές

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Πρόλογος. if (παράσταση) εντολή1 else εντολή2. Από εδώ και πέρα θα αναφέρεται ως K&R.

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

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

Transcript:

ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Διαδικαστικός Προγραμματισμός Α Εξάμηνο Μάθημα 8 ο : Χαρακτήρες και Αλφαριθμητικά

Στόχοι μαθήματος 2 Να κατανοήσετε τον τρόπο με τον οποίο αναπαριστούν τα συστήματα υπολογιστών τον τύπο δεδομένων char και πώς να χειρίζεστε αντικείμενα αυτού του τύπου. Να μάθετε να χρησιμοποιείτε τις συναρτήσεις της διασύνδεσης ctype.h. Να κατανοήσετε την έννοια του αφηρημένου τύπου. Να μπορείτε να χρησιμοποιείτε τις συναρτήσεις της διασύνδεσης string.h για να χειρίζεστε αλφαριθμητικά. Να κατανοήσετε τις αρχές της απαρίθμησης και της κωδικοποίησης με ακεραίους ως στρατηγικές για τον ορισμό νέων τύπων δεδομένων. Να είστε σε θέση να ορίζετε και να χειρίζεστε απαριθμητούς τύπους στη C.

Αναπαράσταση Χαρακτήρων 3 Οι χαρακτήρες αποτελούν τη βάση για την επεξεργασία όλων των δεδομένων κειμένου. Αν τα αλφαριθμητικά εμφανίζονται συχνότερα στα προγράμματα, οι μεμονωμένοι χαρακτήρες αποτελούν τον θεμελιώδη τύπο για τη δόμηση όλων των άλλων μορφών δεδομένων κειμένου. Πως θα αναπαραστήσω χαρακτήρες στον Η/Υ? - Οι υπολογιστές είναι πολύ καλοί σε αριθμητικά δεδομένα (int, float) και σε πράξεις πάνω σε αυτά. - 'Αρα κάθε χαρακτήρας μπορεί να αντιστοιχιστεί σε ένα ακέραιο αριθμό...

Δηλαδή? 4 Αναπαράσταση (έστω ότι): Ο χαρακτήρας α αντιστοιχεί στο 97 Ο χαρακτήρας b αντιστοιχεί στο 98 Ο χαρακτήρας c αντιστοιχεί στο 99... Ο χαρακτήρας z αντιστοιχεί στο 122 Οθόνη + Πληκτρολόγιο Τιμή στη RAM Στο πρόγραμμα μου? α 97 97 Η 'a'

Χαρακτήρες 5 (Στην αρχή) λίγοι χαρακτήρες -> μικρός ακέραιος (< 255) άρα 1 byte είναι αρκετό. άρα ορίζω ένα νέο τύπο που συμπεριφέρεται σαν μικρός ακέραιος νεό τύπος char Aφού συμπεριφέρεται σαν ακέραιος μπορώ να κάνω και πράξεις. Οι τύποι που συμπεριφέρονται ως ακέραιοι ονομάζονται βαθμωτοί τύποι (scalar types). Οι χαρακτήρες είναι ένας βαθμωτός τύπος. Οι χαρακτήρες αποτελούν έναν ενσωματωμένο απαριθμητό τύπο (αν και δεν ορίζεται με τη χρήση της λέξης-κλειδιού enum).

Ο τύπος δεδομένων char (1) 6 Στη C, οι μεμονωμένοι χαρακτήρες αναπαριστάνονται με τη χρήση του προκαθορισμένου τύπου δεδομένων char. Πεδίο ορισμού: ανεπίσημα, το πεδίο ορισμού του τύπου δεδομένων char είναι το σύνολο των συμβόλων που είναι δυνατό να εμφανιστούν στην οθόνη ή υπάρχουν στο πληκτρολόγιο (γράμματα, ψηφία, σημεία στίξης, το κενό διάστημα, το πλήκτρο Enter κ.ο.κ.). Σύνολο πράξεων: εφόσον ο char είναι βαθμωτός τύπος, το σύνολο των πράξεων που είναι διαθέσιμες για τους χαρακτήρες είναι το ίδιο με τους ακέραιους. Διάβασμα χαρακτήρων από το πληκτρολόγιο: χρησιμοποιείτε τη συνάρτηση getchar(): char ch; ch = getchar(); Εμφάνιση χαρακτήρων: printf( %c %c, ch);

Ο τύπος δεδομένων char (2) 7 Οι μεμονωμένοι χαρακτήρες αναπαριστάνονται στο εσωτερικό του μηχανήματος, όπως και κάθε άλλος βαθμωτός τύπος, δηλ. με ένα αριθμό. Ο κωδικός που χρησιμοποιείται για την αναπαράσταση ενός συγκεκριμένου χαρακτήρα ονομάζεται κωδικός χαρακτήρα (character code). Συγκεκριμένα, έχει υιοθετηθεί το γνωστό πρότυπο κωδικοποίησης των χαρακτήρων ASCII. γιατί πριν κάθε σύστημα χρησιμοποιούσε τους δικούς του... American Standard Code for Information Interchange

Ο κώδικας ASCII 8 0 nul 16 dle 32 sp 48 0 64 @ 80 P 96 ` 112 p 1 soh 17 dc1 33! 49 1 65 A 81 Q 97 a 113 q 2 stx 18 dc2 34 " 50 2 66 B 82 R 98 b 114 r 3 etx 19 dc3 35 # 51 3 67 C 83 S 99 c 115 s 4 eot 20 dc4 36 $ 52 4 68 D 84 T 100 d 116 t 5 enq 21 nak 37 % 53 5 69 E 85 U 101 e 117 u 6 ack 22 syn 38 & 54 6 70 F 86 V 102 f 118 v 7 bel 23 etb 39 ' 55 7 71 G 87 W 103 g 119 w 8 bs 24 can 40 ( 56 8 72 H 88 X 104 h 120 x 9 ht 25 em 41 ) 57 9 73 I 89 Y 105 i 121 y 10 nl 26 sub 42 * 58 : 74 J 90 Z 106 j 122 z 11 vt 27 esc 43 + 59 ; 75 K 91 [ 107 k 123 { 12 np 28 fs 44, 60 < 76 L 92 \ 108 l 124 13 cr 29 gs 45-61 = 77 M 93 ] 109 m 125 } 14 so 30 rs 46. 62 > 78 N 94 ^ 110 n 126 ~ 15 si 31 us 47 / 63? 79 O 95 _ 111 o 127 del Κωδικός Χαρακτήρα Χαρακτήρας πχ 65 'Α'

Ο κώδικας ASCII (hex) 9 Για περισσότερες λεπτομέρειες για τον κώδικα ASCII εδώ Ιδιότητες της κωδικοποίησης ASCII: Οι κωδικοί των χαρακτήρων που παριστάνουν τα ψηφία 0 μέχρι 9 είναι διαδοχικοί. Τα γράμματα της αγγλικής αλφαβήτου χωρίζονται σε δύο χωριστά διαστήματα τιμών: ένα για τα κεφαλαία (A-Z) και ένα για τα πεζά γράμματα (a-z). Μέσα σε κάθε διάστημα τιμών, οι τιμές ASCII είναι διαδοχικές.

Ειδικοί χαρακτήρες Εκτός από τους γνωστούς χαρακτήρες που εμφανίζονται στην οθόνη και ονομάζονται εκτυπώσιμοι χαρακτήρες (printing characters), ο πίνακας ASCII περιλαμβάνει και διάφορους ειδικούς χαρακτήρες (special characters) που χρησιμοποιούνται για να επιτελούν συγκεκριμένες ενέργειες. Πίνακας ειδικών χαρακτήρων \a ηχητική προειδοποίηση (μπιπ ή κουδούνισμα) \b οπισθοδρόμηση (backspace) \f αλλαγή σελίδας \n αλλαγή γραμμής \r επιστροφή (επιστρέφει στην αρχή της τρέχουσας γραμμής χωρίς προώθηση \t στηλοθέτης (tab μεταφέρει στον επόμενο κατακόρυφο στηλοθέτη) \v κατακόρυφος στηλοθέτης \0 μηδενικός (null) χαρακτήρας (ο χαρακτήρας του οποίου ο κωδικός ASCII είναι 0) \\ ο χαρακτήρας \ \' ο χαρακτήρας ' (απαιτεί ανάποδη κάθετο μόνο σε σταθερές χαρακτήρων) \ ο χαρακτήρας (απαιτεί ανάποδη κάθετο μόνο σε αλφαριθμητικές σταθερές) \ddd ο χαρακτήρας του οποίου ο κωδικός ASCII είναι ο οκταδικός αριθμός ddd 1

Αριθμητική χαρακτήρων (1) 1 Στη C, οι τιμές χαρακτήρων μπορούν να χρησιμοποιηθούν σαν να ήταν ακέραιοι, χωρίς να απαιτείται κάποια ειδική μετατροπή. Το αποτέλεσμα μιας τέτοιας πράξης ορίζεται σύμφωνα με τους εσωτερικούς κωδικούς ASCII. Παρόλο που είναι έγκυρο να εφαρμόζετε οποιαδήποτε αριθμητική πράξη σε τιμές τύπου char, δεν έχουν νόημα όλες οι πράξεις για τους χαρακτήρες. Για παράδειγμα: η πράξη Α * Β είναι έγκυρη αλλά το αποτέλεσμα 4290 που προκύπτει από τον πολλαπλασιασμό των κωδικών ASCII (65 και 66 αντίστοιχα) βρίσκεται εκτός του συνόλου χαρακτήρων ASCII και δεν έχει καμία σημασία ως χαρακτήρας. int num = 'A' * 'B'; printf("%d\n", num); //εμφανίζει το 4290

Οι χαρακτήρες είναι αριθμοί... 1 Να γραφεί πρόγραμμα το οποίο τυπώνει όλους τους χαρακτήρες από 97-122 (πεζά αγγλικά γράμματα) μαζί με τον ASCII κωδικό τους στην οθόνη. #include <stdio.h> int main(){ char x; for(x=97;x<123;x++) printf(" Code: %d Char: %c \n", x, x); printf("\n"); }

Αριθμητική χαρακτήρων 1 Πρόσθεση ακεραίου σε χαρακτήρα: 0 + 5 αποτέλεσμα 5 Γενικά, η παράσταση 0 + n δίνει τον κωδικό χαρακτήρα του n-οστού ψηφίου, αν το n είναι μεταξύ 0 και 9. Αφαίρεση ακεραίου από χαρακτήρα: z 2 αποτέλεσμα x Γενικά, η παράσταση c - n δίνει τον κωδικό του χαρακτήρα που βρίσκεται n χαρακτήρες πριν από το c στην ακολουθία κωδικοποίησης. Αφαίρεση χαρακτήρα από άλλο χαρακτήρα: a A αποτέλεσμα 32 Γενικά, αν c1 και c2 είναι δύο χαρακτήρες τότε η παράσταση c1 1 c2 δίνει την απόσταση μεταξύ αυτών των χαρακτήρων στην ακολουθία κωδικοποίησης. Σύγκριση δύο χαρακτήρων μεταξύ τους: Γενικά, η παράσταση c1 1 < c2 είναι TRUE αν το c1 εμφανίζεται πριν από το c2 στον πίνακα ASCII.

Εφαρμογές 1 Διάγνωση αν ένας χαρακτήρας είναι αριθμητικό ψηφίο: if(ch >= '0' && ch <= '9') Διάγνωση κεφαλαίου αγγλικού γράμματος: if(ch >= 'A' && ch <= 'Z') Μετατροπή πεζού σε κεφαλαίο (συνάρτηση converttoupper()): char converttoupper(char c){ if (c >= 'a' && c <='z') return c - ('a'-'a'); return c; }

Η διασύνδεση ctype.h 1 islower(ch): isupper(ch): isalpha(ch): isdigit(ch): isalnum(ch): ispunct(ch): isspace(ch): tolower(ch): toupper(ch): επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι πεζό γράμμα επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι κεφαλαίο γράμμα επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι γράμμα επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι ψηφίο επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι αλφαριθμητικό (γράμμα ή ψηφίο) επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι σημείο στίξης επιστρέφει TRUE ο χαρακτήρας στη μεταβλητή ch είναι ένας από τους εξής: ' ' (κενό διάστημα), '\t', '\n', '\f', '\v' που εμφανίζονται στην οθόνη ως κενό διάστημα επιστρέφει το αντίστοιχο πεζό γράμμα επιστρέφει το αντίστοιχο κεφαλαίο γράμμα

Παράδειγμα 1 Η παρακάτω κατηγορηματική συνάρτηση isvowel επιστρέφει TRUE αν το όρισμα της είναι φωνήεν της αγγλικής αλφαβήτου, FALSE σε άλλη περίπτωση: bool IsVowel(char ch) { char lowerch; } lowerch = tolower(ch); switch( lowerch ) { case a : case e : case i : case o : case u : return (TRUE); default: return FALSE; }

Tα α αλφαριθμητικά 1 Αλφαριθμητικά = ακολουθία χαρακτήρων. για παράδειγμα : Hello Στην C (και σε άλλες γλώσσες) ένα αλφαριθμητικό (κυριολεκτικό) αναπαρίσταται μέσα σε διπλά εισαγωγικά " " "Hello" Πως μπορώ να αναπαραστήσω πολλά δεδομένα, ιδίου τύπου σε σειρά στη C? Πίνακες. Αλφαριθμητικά = Πίνακες Χαρακτήρων μιας διάστασης. Ποιο το σημαντικό στοιχείο που πρέπει να γνωρίζω όταν χειρίζομαι πίνακες? Μέγεθος του πίνακα ή αλλιώς που τελειώνει το αλφαριθμητικό.

Tα α αλφαριθμητικά ως πίνακες (1) 1 Στο εσωτερικό του υπολογιστή τα αλφαριθμητικά αναπαριστάνονται ως πίνακες χαρακτήρων. Οι χαρακτήρες ενός αλφαριθμητικού αποθηκεύονται σε συνεχόμενα byte. Για να προσδιοριστεί που τελειώνει το κάθε αλφαριθμητικό, αποθηκεύεται πάντα ένα μηδενικό (null) χαρακτήρα ( \0 ) στο byte που ακολουθεί αμέσως μετά τον τελευταίο χαρακτήρα ενός αλφαριθμητικού. Παράδειγμα: δήλωση του πίνακα carray και ανάθεση ως αρχική τιμή του αλφαριθμητικού Hello : char carray[6]; carray[0] = H ; carray[1] = e ; carray[2] = l ; carray[3] = l ; carray[4] = o ; carray[5] = \0 ; 0 H 1 e 2 l 3 l 4 o 5 \0

ΠΡΟΣΟΧΗ 1 Υπάρχει ΣΗΜΑΝΤΙΚΗ διαφορά μεταξύ ενός χαρακτήρα και ενός αλφαριθμητικού ενός χαρακτήρα. Χαρακτήρας 'α' = ακέραια τιμή 97. 'α' = 97 Αλφαριθμητικό "α" = πίνακας char με πρώτο στοιχείο το 97 και δεύτερο το '\0'. "α" 97 \0

Tα α αλφαριθμητικά ως πίνακες (2) 2 Επειδή κάθε αλφαριθμητικό είναι ένας πίνακας, μπορείτε να επιλέξετε τον i-οστό χαρακτήρα ενός αλφαριθμητικού str ως εξής: str [i] Για να χρησιμοποιήσετε, για οποιοδήποτε λόγο, τους χαρακτήρες ενός αλφαριθμητικού όταν χρησιμοποιείτε συμβολισμό πινάκων, μπορείτε να χρησιμοποιήσετε τον παρακάτω ιδιωματισμό for(i = 0; str[i]!= \0 ; i++){ } σώμα του βρόχου όπου γίνεται ο χειρισμός του str[i]

Tα α αλφαριθμητικά ως πίνακες (2) 2 Πρόγραμμα το οποίο ζητά από το χρήστη ένα αλφαριθμητικό με μέγιστο μήκος 100 και τυπώνει το αλφαριθμητικό και το μήκος του: int main() { char userstr[100]; int len; Δήλωση Αλφαριθμητικού Ανάγνωση Αλφαριθμητικού printf("please insert a String:"); gets(userstr); len = 0; for(len=0; userstr[len]!= '\0'; len++); Έλεγχος για τέλος Αλφαριθμητικού printf("%s with length %d",userstr, len); }

Tα α αλφαριθμητικά ως πίνακες (3) 2 Συνάρτηση που επιστρέφει τον αριθμοδείκτη θέσης του 1 ου φωνήεντος της λέξης που δέχεται, ή την τιμή -1 αν η λέξη δεν έχει κανένα φωνήεν int FindFirstVowel(char word[]) { int i; for(i = 0; word[i]!= \0 ; i++){ if (IsVowel(word[i])) return (i); } return (-1); }

Η διασύνδεση string.h (1) 2 Κλήση συνάρτησης strcpy(dst, src): strncpy(dst, src, n): n strcat(dst, src): strncat(dst, src, n): n strlen(s): Επιστρεφόμενη τιμή αντιγράφει χαρακτήρες από το αλφαριθμητικό src στο dst αντιγράφει το πολύ n χαρακτήρες από το αλφαριθμητικό src στο dst προσαρτά χαρακτήρες από το src στο τέλος του dst προσαρτά το πολύ n χαρακτήρες από το src στο τέλος του dst επιστρέφει το μήκος του αλφαριθμητικού s strcmp(s1, s1, s2): επιστρέφει έναν ακέραιο που υποδηλώνει το αποτέλεσμα της σύγκρισης των αλφαριθμητικών strncmp(s1, s1, s2, n): n όπως η, αλλά συγκρίνει το πολύ n χαρακτήρες

Συνάρτηση strcpy 2 Η συνάρτηση strcpy αντιγράφει χαρακτήρες από ένα αλφαριθμητικό (προέλευση) σε ένα άλλο αλφαριθμητικό (προορισμός Δέχεται πρώτα το όρισμα του προορισμού π.χ. char carray[6]; strcpy(carray, "hello"); Προσοχή δεν γίνεται έλεγχος! strcpy(carray, "A long string"); To μήκος του αλφαριθμητικού "A long string" είναι μεγαλύτερο από το μέγεθος του πίνακα carray. Αυτό θα προκαλέσει την εγγραφή δεδομένων μετά το τέλος του πίνακα και είναι συνηθισμένο προγραμματιστικό λάθος (υπερχείλιση περιοχής προσωρινής αποθήκευσης - buffer overflow). Τέτοια σφάλματα μπορεί να αποδειχθούν εξαιρετικά κρίσιμα σε θέματα ασφάλειας.

Μεταβίβαση αλφαριθμητικών σε συναρτήσεις 2 Τα αλφαριθμητικά μπορούν να μεταβιβαστούν σε συναρτήσεις ακριβώς όπως και οποιοσδήποτε άλλος πίνακας (κλήση κατ' αναφορά) Παράδειγμα: συνάρτηση αντιστροφής των χαρακτήρων ενός αλφαριθμητικού #include <stdio.h> #include <ctype.h> #include <string.h> void reverse(char array[]); main() { char str[1000]; strcpy(str,"hello my friend"); reverse(str); printf("%s\n", str); return 0; } void reverse(char array[]) { char temp[1000]; int i, end; strcpy(temp,array); end = strlen(array) - 1; i = 0; while(end >=0) { array[i] = temp[end]; i++; end--; } array[i] = '\0'; }

Αλφαριθμητικά 2 1. char name1[20], *name2; 2 τρόποι για να δηλώσω αλφαριθμητικό 1. printf("dwse 1o ONOMA "); 2. gets(name1); Με την gets() διαβάζω αλφαριθμητικό 3. printf("%s\n",name1); 4. 5. printf("dwse 2o ONOMA "); 6. // gets(name2); runtime error 7. name2=(char *)malloc(20*sizeof(char)); 8. gets(name2); Αν δηλώσω το αλφαριθμητικό ως δείκτη προς χαρακτήρα τότε όπως οι εντολές < 8. 9.> για να διαβάσω το αλφαριθμητικό 1. // name1=name2; error: incompatible types in assignment 11. strcpy(name1, name2); Εντολή ανάθεσης τιμής δε μπορώ να χρησιμοποιήσω μεταξύ αλφαριθμητικών αλλά την strcpy(dst, src)

Αλφαριθμητικά ως Δείκτες 2 Όπως συμβαίνει με οποιονδήποτε πίνακα, ένας πίνακας χαρακτήρων μπορεί να ερμηνευτεί και ως δείκτης προς το πρώτο του στοιχείο Επομένως, μέσω αριθμητικής δεικτών μπορεί ο προγραμματιστής να προσπελάσει μεμονωμένους χαρακτήρες ενός αλφαριθμητικού Παράδειγμα εύρεσης πρώτου φωνήεντος σε αλφαριθμητικό int FindFirstVowel(char* word) { char *cp; for(cp = word; *cp!= '\0'; cp++) if(isvowel(*cp)) return cp-word; return (-1); }

Η αρχή της απαρίθμησης 2 Σε αρκετές περιπτώσεις χρειάζεται να γράφουμε προγράμματα που χειρίζονται μη αριθμητικά δεδομένα. Για παράδειγμα, σε ένα πρόγραμμα υποβολής φορολογικής δήλωσης υπάρχει μια ερώτηση του τύπου Οικογενειακή κατάσταση (επιλέξτε ένα): ανύπαντρος παντρεμένος που υποβάλει κοινή δήλωση παντρεμένος που υποβάλει χωριστή δήλωση επικεφαλής νοικοκυριού χήρος/χήρα Η απάντηση σας δεν είναι ούτε αριθμητικά δεδομένα ούτε δεδομένα κειμένου.

Η αρχή της απαρίθμησης (2) 2 Ο καλύτερος τρόπος για να περιγράψετε τον τύπο δεδομένων θα ήταν απλώς να τον ονομάσετε δεδομένα οικογενειακής κατάστασης. Αυτός ο νέος τύπος δεδομένων έχει ως πεδίο ορισμού 5 τιμές: ανύπαντρος, παντρεμένος που υποβάλει κοινή δήλωση, παντρεμένος που υποβάλει χωριστή δήλωση, επικεφαλής νοικοκυριού, χήρος/χήρα Η διεργασία της παράθεσης όλων των δεδομένων του πεδίου ορισμού ενός τύπου δεδομένων με τη μορφή λίστας ονομάζεται απαρίθμηση (enumeration). Ένας τύπος που ορίζεται με την παράθεση όλων των στοιχείων του ονομάζεται απαριθμητός τύπος (enumeration type).

Αναπαράσταση απαριθμητών τύπων 3 Σε κάθε στοιχείο ενός απαριθμητού τύπου μπορούμε να αναθέσουμε ένα ακέραιο, διεργασία γνωστή ως κωδικοποίηση με ακεραίους (integer encoding). Για το παράδειγμα μας μπορούμε να εφαρμόσουμε αυτή τη στρατηγική ως εξής: #define Single 1 #define MarriedFillingJointReturn 2 #define MarriedFillingSeperateReturn 3 #define HeadOfHousehold 4 #define QualifyingSurvivingSpouse 5 Από τη στιγμή που θα ορίσετε τις σταθερές μπορείτε να δηλώσετε μια μεταβλητή τύπου int για να αναπαραστήσετε την οικογενειακή κατάσταση: int filingstatus;

Ορισμός νέων απαριθμητών τύπων 3 Στη C, αντί να χρησιμοποιήσετε τον τύπο int για να αναπαραστήσετε μη αριθμητικές τιμές, είναι δυνατό να ορίσετε ένα πραγματικό όνομα τύπου ο οποίος θα αναπαριστά έναν απαριθμητό τύπο. typedef enum{ λίστα στοιχείων } όνομα τύπου; όπου: - λίστα στοιχείων είναι ένας κατάλογος ονομάτων τα οποία είναι δυνατό να χρησιμοποιηθούν για την αναφορά στις μεμονωμένες τιμές που απαρτίζουν τον απαριθμητό τύπο. Τα στοιχεία της λίστας διαχωρίζονται με κόμματα. Κάθε στοιχείο μπορεί επίσης να ακολουθείται από ένα σύμβολο ίσον και μια ακέραιη σταθερά που καθορίζει μια συγκεκριμένη εσωτερική αναπαράσταση - όνομα_τύπου είναι το όνομα του νέου απαριθμητού τύπου

Παράδειγμα 3 Ορισμός ενός νέου τύπου weekdayt με πεδίο ορισμού τα ονόματα των ημερών της εβδομάδας typedef enum{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } weekdayt Στα στοιχεία του παραπάνω απαριθμητού τύπου ανατίθενται συνεχόμενες ακέραιες τιμές ξεκινώντας από το 0. Βέβαια, όπως θα δούμε στο επόμενο παράδειγμα, ο μεταγλωττιστής της C σας επιτρέπει να καθορίσετε ρητά την εσωτερική αναπαράσταση των στοιχείων ενός απαριθμητού τύπου κατά τον ορισμό του.

Παράδειγμα 3 Για το παράδειγμα με τη φορολογική δήλωση μπορούμε να έχουμε τη δήλωση του απαριθμητού τύπου ή typedef enum{ Single = 1, MarriedFillingJointReturn = 2, MarriedFillingSeperateReturn = 3, HeadOfHousehold = 4, QualifyingSurvivingSpouse = 5 } filingstatust; typedef enum{ Single = 1, MarriedFillingJointReturn, MarriedFillingSeperateReturn, HeadOfHousehold, QualifyingSurvivingSpouse } filingstatust;

Πράξεις με απαριθμητούς τύπους typedef enum{ } weekdayt Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Αφού οι απαριθμητοί τύποι είναι στη ουσία ακέραιοι μπορούμε να κάνουμε πράξεις, όπως για παράδειγμα weekday = weekday + 1; Πρέπει όμως να είμαστε προσεκτικοί γιατί ο μεταγλωττιστής δεν ελέγχει αν το αποτέλεσμα είναι έγκυρο μέλος ενός συγκεκριμένου απαριθμητού τύπου. Αν γράφαμε την παραπάνω εντολή ανάθεσης και η Saturday, ο υπολογιστής θα έπαιρνε την τιμή 6 θα weekday είχε την τιμή Saturday πρόσθετε το 1 και θα αποθήκευε την τιμή 7 στη μεταβλητή weekday Αντίθετα, η εντολή weekday = (weekday( + 1) % 7; εξασφαλίζει ότι το αποτέλεσμα θα είναι πάντα από 0 έως 6. Οι τύποι που συμπεριφέρονται ως ακέραιοι τύποι (scalar types). weekday. ονομάζονται βαθμωτοί 3