Ρρογραμματιςμόσ Μεκόδων Επίλυςθσ Ρροβλθμάτων 18. Αλφαριθμητικά Ιωάννθσ Κατάκθσ
Αλφαρικμθτικά o Ζνα string είναι μία ακολουκία χαρακτιρων, ςθμείων ςτίξθσ κτλ Hello How are you? 121212 *Apple#123*% Σιμερα 1. Ειςαγωγικζσ Ζννοιεσ ςε Strings(Αρχικοποίθςθ, Ανάγνωςθ & Εκτφπωςθ) 2. Ρίνακεσ από Strings 3. Συναρτιςεισ Βιβλιοκικθσ <string.h>
Ειςαγωγι o Ζχουμε ιδθ χρθςιμοποιιςει ςε διάφορεσ περιπτϊςεισ τα strings printf( Hello ); o Μζχρι τϊρα όμωσ, δεν αναφερόμαςταν ςτα strings με τθ χριςθ μεταβλθτϊν o Στθ C δεν υπάρχει ο τφποσ String (όπωσ float, int και char), αλλά αυτόσ υλοποιείτε ωσ πίνακεσ χαρακτιρων 0 1 2 3 4 5 H E L L O \0 o Ειςάγουμε τϊρα τθν ζννοια των Strings (αντί πιο πριν), διότι τϊρα ζχουμε κάποια εμπειρία με πίνακεσ
Αρχικοποίθςθ String Ζνασ πίνακασ από χαρακτιρεσ που τελειϊνει με το χαρακτιρα NULL \0 Hello\0, Hi there\0, \0 (Ρροςοχι το \0 δεν φαίνεται ςτθν οκόνθ) Υπάρχουν διάφοροι τρόποι να ορίςουμε ζνα String ςτθ C, ανάλογα με το αν γνωρίηουμε το string εκ των προτζρων ι όχι Α) Αρχικοποίθςθ (γνωρίηοντασ εκ των πρότερων το String) o char msg[ += Hello ; o Δθμιουργεί αυτόματα το 0 1 2 3 4 5 H E L L O \0
Αρχικοποίθςθ string Σσνίζηαηαι ασηός ο οριζμός char msg[ ]= Hello αλλά σπάρτοσν και άλλοι ηρόποι Σωζηό char msg[6]; msg[0] = 'H'; msg[1] = 'e'; msg[2] = 'l'; msg[3] = 'l'; msg[4] = 'o'; msg[5] = '\0'; Λάθος char msg[ ]={ H, e, l, l, o }; Σωζηό char msg[ ]={ H, e, l, l, o, \0 }; Σωζηό char msg[6]={ H, e, l, l, o, \0 }; Σωζηό char msg[40]= Hello Λάθος char msg[5]={'h','e','l','l','o','\0'}; Δεν δεζμεύοσμε αρκεηό τώρο Πίνακας ταρακηήρων ποσ δεν ηελειώνει ζε \0. Επομένως δεν είναι String
Αρχικοποίθςθ string Ασ δοφμε πωσ εκτελοφνται οι ακόλουκοι οριςμοί char msg*10+= Hello ; 0 1 2 3 4 5 H E L L O \0 6 7 8 9???? SIZE=10 Τν? είλαη απξνζδηόξηζηνο ραξαθηήξαο char msg[ += Hello ; SIZE=6 0 1 2 3 4 5 H E L L O \0
Διάφορα char και string Ασ δοφμε πωσ μοιάηουν εικονικά οι ακόλουκοι οριςμοί char c = H ; Ο ραξαθηήξαο H βξίζθεηαη θάπνπ ζηελ κλήκε??? H?????? char c[ ]= H ; Τν string H βξίζθεηαη θάπνπ ζηελ κλήκε 0 1 2 3 4 5 H \0 char c= H ; ΛΑΘΟΣ ζηη μεηαγλώηηιζη
Αρχικοποίθςθ string Ερϊτθςθ o Τι γίνεται αν δεν γνωρίηουμε το String εκ των πρότερων? o Ρόςο χϊρο πρζπει να δεςμεφςουμε? Απάντθςθ o Αρκετό για να χωρζςει διάφορα δεδομζνα ειςόδου που πρόκειται να ειςάγουμε Αν πρόκειται να αποκθκεφςουμε κάποιο όνομα τότε 20 χαρακτιρεσ φαίνεται να αρκοφν
Ανάγνωςθ / Εκτφπωςθ scanf ( %s, name) Ρροςοχι: Δεν χρθςιμοποιείτε το &, γιατί το name είναι πίνακασ printf ( %s, name)
Ανάγνωςθ / Εκτφπωςθ #include <stdio.h> int main() { char name[20]; scanf("%s", name); printf("%s", name); return 0; } 0 1 2 3 4 5 M A R I A \0 Τν printf γλωξίδεη όηη ε εθηύπωζε πξέπεη λα γίλεη κέρξη ην \0 6.. 19????
Ανάγνωςθ / Εκτφπωςθ string Ρρόγραμμα που προςκζτει ζνα «Α» ςτθν κζςθ 5 και τερματίηει το string #include <stdio.h> int main() { char name[20]; scanf("%s", name); name[5]= Α ; name[6]= \0 ; printf("%s", name); return 0; } Πξίλ 0 1 2 3 4 5 M A R I A \0 Μεηά 0 1 2 3 4 5 M A R I A A 6.. 19???? 6.. 19 \0???
Ανάγνωςθ / Εκτφπωςθ string Μποροφμε βζβαια, να διαβάςουμε πολλαπλά πεδία ταυτόχρονα int id; char tname[20]; scanf( %s %d,tname,&id); printf( You entered : %s and %d,tname, id); Αν δϊςει κανείσ τιμι ειςόδου MARIA 5 Τότε κα εκτυπωκεί «You entered : MARIA and 5»
Κοινό Λάκοσ (Ανάκεςθ ςε String) o Υποκζςτε ότι ζχουμε τθν παρακάτω διλωςθ char name [50]= ioannis ; o Δεν επιτρζπετε να ανακζςουμε ζνα string ςε ζνα άλλο (όπωσ ςτουσ υπόλοιπουσ τφπουσ) name= hydrogen ; Λάκοσ (compiler error) name={ h, y, d, r, o, \0 }; Λάκοσ (compiler error) o Μποροφμε όμωσ να αλλάξουμε τα ςτοιχεία του πίνακα όπωσ γνωρίηουμε name[0+= h ; name*1+= y ; Σωςτό Πμωσ, υπάρχει ευκολότεροσ τρόποσ τον οποίο κα δοφμε ςε λίγο
Ρίνακεσ από Strings o Είπαμε ότι το String είναι ζνασ μονοδιάςτατοσ πίνακασ από χαρακτιρεσ που τελειϊνει ςε \0 o Μποροφμε να ζχουμε πίνακεσ από Strings? Ναι (Λίςτα με ονόματα, θμζρεσ, κτλ) o Ραραδείγματα char names[num_students][name_len]; char weekdays*7+*10+=, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday -; 0 1 2 3 4 5 6 0 M o n d a y \0 \0? \0?? 1 T u e s d a y \0?? 6 S u n d a y \0???
Συχνζσ λειτουργίεσ με string Υπάρχουν κάποιεσ λειτουργίεσ που είναι πολφ ςυχνζσ πάνω ςε αλφαρικμθτικά: o Σφγκριςθ δυο strings o Αντιγραφι από ζνα string ςε άλλο Ολόκλθρο ι μζροσ του o Ζνωςθ δφο strings o Διαπίςτωςθ αν υπάρχει κάποιο string μζςα ςε ζνα άλλο Η Βηβιηνζήθε <String.h> πεξηέρεη ζπλαξηήζεηο γηα όια ηα παξαπάλω Γηα εμάζθεζε ζα πινπνηήζνπκε θάπνηεο από ηηο ζπλαξηήζεηο κόλνη καο
Η βιβλιοκικθ string.h o Το αρχείο επικεφαλίδα (header file), string.h, παρζχει ςυναρτιςεισ για χειριςμό strings o Ρεριζχει διάφορεσ ςυναρτιςεισ strlen(s), υπολογίηει το μζγεκοσ του string strcpy(s1,s2), αντιγράφει το s2 ςτο s1 strcat(s1,s2), προςκζτει το s2 ςτο s1 strcmp(s1,s2), ςυγκρίνει το s1 με s2 και επιςτρζφει κετικι τιμι εάν s1 μεγαλφτερο (αλφαβθτικά) από το s2, μθδζν αν είναι ίςα, και αρνθτικι τιμι εάν s1 μικρότερο από s2 (θ ςφγκριςθ γίνεται βάςει του πίνακα ASCII)
Η ςυνάρτθςθ strlen() o H ςυνάρτθςθ strlen μετρά το μζγεκοσ ενόσ String char msg*10+= HELLO 0 1 2 3 4 5 H E L L O \0 6 7 8 9???? o printf( %d, strlen(msg)); Εκτυπϊνει: 5 Δθλαδι τον αρικμό των χαρακτιρων ζωσ το \0 o Ρροςοχι Tο strlen δεν μασ λζει το μζγιςτο μζγεκοσ του String Αυτό είναι 10 χαρακτιρεσ και το ξζρουμε πριν το compile
Η ςυνάρτθςθ strlen() #include <stdio.h> #include <string.h> int main() { char x[10] = "123456" ; printf("%d", strlen(x)); } Εθηύπωζε: 6
Η ςυνάρτθςθ strlen() o Ξζρουμε ότι θ strlen είναι ζτοιμθ ςυνάρτθςθ o Για εξάςκθςθ, κα τθν υλοποιιςουμε μόνοι μασ Άςκθςθ o Γράψετε τθ ςυνάρτθςθ int mystrlen(char c[]) που υπολογίηει και επιςτρζφει το μικοσ ενόσ αλφαρικμθτικοφ o Ραραδείγματα εκτζλεςθσ mystrlen( abc ) 3 char x[10+ = 123456 ; mystrlen(x); 6 mystrlen( abc abc ); 7
Η ςυνάρτθςθ strlen() Αλγόρικμοσ o Διάβαςε το string από τθν αρχι μζχρι να βρεισ το \0 o Σε κάκε βιμα αφξθςε κάποιο μετρθτι κατά 1 name 0 1 2 3 4 5 M A R I A A 6.. 19 \0???
Η ςυνάρτθςθ strlen() #include <stdio.h> int mystrlen (char s[]) { int i=0; while (s[i]!= '\0') i++; return i; } int main() { char x[10] = "123456" ; printf("%d", mystrlen(x)); }
Τζλοσ διάλεξθσ