Προγραμματιςμόσ Μεκόδων Επίλυςθσ Προβλθμάτων 19. Αλφαριθμητικά II Ιωάννθσ Κατάκθσ
Αλφαρικμθτικά ςτθ C Ζνα string είναι μία ακολουκία αλφαρικμθτικϊν χαρακτήρων, ςθμείων ςτίξθσ κτλ. Π.χ. Hello How are you? 121212 *Apple#123*% Προθγοφμενθ Διάλεξθ 1. Ειςαγωγικζσ Ζννοιεσ (Αρχικοποίθςθ, Ανάγνωςθ & Eκτφπωςθ) 2. Πίνακεσ Strings 3. Συναρτιςεισ Βιβλιοκικθσ <string.h> Σιμερα Υλοποίθςθ Συναρτιςεων <string.h> + Συναρτιςεισ <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 και επιςτρζφει κετικι τιμι (1) εάν s1 μεγαλφτερο (αλφαβθτικά) από το s2, μθδζν αν είναι ίςα, και αρνθτικι τιμι (-1) εάν s1 μικρότερο από s2
Η ςυνάρτθςθ 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)); 1 2 3 4 5 6 \0??? Εκτφπωςθ: 6
Η ςυνάρτθςθ strcpy() H ςυνάρτθςθ strcpy(ma, mb) αντιγράφει το mb ςτο ma int main() char ma[10]; char mb[10]="hello"; strcpy(ma,mb); printf("ma=%s and mb=%s", ma, mb); Πρίν ma?? mb Μετά ma mb H E L L O \0 H E L L O \0 H E L L O \0
Υλοποίθςθ τθσ strcpy() Υλοποιιςτε τθν ςυνάρτθςθ mystrcpy(char to[], char from[]) θ οποία αντιγράφει τo string from ςτο string to Αλγόρικμοσ o Για κάκε ςτοιχείο from[i] αντίγραψε το from[i] ςτθν κζςθ to[i], μζχρι να φτάςεισ ςτο \0
Υλοποίθςθ τθσ strcpy() #include <stdio.h> /* To string from αντιγράφεται ςτο to */ void mystrcpy(char to[ ], char from[ ]) int i=0; while (from[i]!= '\0') to[i] = from[i]; i++; to[i]='\0'; int main() char ma[10]; char mb[10]="hello"; mystrcpy(ma,mb); printf("ma=%s and mb=%s", ma, mb);
Η ςυνάρτθςθ strcat() H ςυνάρτθςθ strcat(s1, s2) αντιγράφει το s2 ςτο τζλοσ του s1 int main() char ma[10]="hello"; char mb[10]="cat"; strcat(ma,mb); printf("ma=%s and mb=%s", ma, mb); Πρίν: s1 H E L L O \0 s2 Μετά: s1 H E L L O C A T \0? s2
Υλοποίθςθ strcat() Υλοποιιςτε τθν ςυνάρτθςθ mystrcat(char s1[], char s2[]) θ οποία προςκζτει τo string s2 ςτο τζλοσ του s1 Αλγόρικμοσ o Βρεσ το \0 ςτο s1 ςτθ κζςθ K o Αντζγραψε κάκε s2[i], ςτθν αντίςτοιχθ κζςθ s1[i+k] o Πρόςκεςε \0 ςτο τζλοσ του s1 Πρίν s1 H E L L O \0 κ s2 Μετά s1 s2 H E L L O C A T \0?
Υλοποίθςθ strcat() ζκδοςθ 1 void mystrcat(char s1[], char s2[]) int i=0, k=0; // Εφρεςθ \0 ςτο S1 while (s1[k]!= '\0') k++; // Αντιγραφι Στοιχείων while (s2[i]!= '\0') s1[k]=s2[i]; i++; k++; s1*k+= \0 ; // Προςκικθ NULL ςτο τζλοσ του s1 ι while (s2[i]!= '\0') s1[k+i]=s2[i]; i++; s1[k+i]='\0';
Υλοποίθςθ strcat() - ζκδοςθ 2 void mystrcat(char s1[], char s2[]) int i=0, k=0; // Εφρεςθ \0 ςτο S1 k = strlen(s1); // Αντιγραφι Στοιχείων while (s2[i]!= '\0') s1[k]=s2[i]; i++; k++; // προςκικθ NULL ςτο τζλοσ του s2 s1*k+= \0 ; κ Πρίν s1 H E L L O \0 s2 Μετά s1 s2 H E L L O C A T \0?
Η ςυνάρτθςθ strcmp() H ςυνάρτθςθ strcmp(s1, s2) ςυγκρίνει το s1 με s2 και επιςτρζφει: 1 : εάν s1>s2 (αλφαβθτικά) 0 : εάν s1==s2-1: εάν s1<s2 (αλφαβθτικά) s1 C U T \0?? > s2 Επιςτρζφει 1
Η ςυνάρτθςθ strcmp() Οι ςυγκρίςεισ γίνονται βάςθ του πίνακα ASCII
Η ςυνάρτθςθ strcmp() // Παράδειγμα κλιςθσ τθσ ςυνάρτθςθσ strcmp() #include <stdio.h> int main() char s1[10]="hello"; char s2[10]="cat"; int cmp = strcmp(s1,s2); if (cmp == 0) printf("οι δυο λζξεισ είναι οι ίδιεσ"); else if (cmp > 0) printf("%s > %s\n", s1, s2); else printf("%s < %s\n", s1, s2);
Υλοποίθςθ mystrcmp() Υλοποιιςτε τθν ςυνάρτθςθ int mystrcmp(char s1[], char s2[]) θ οποία ςυγκρίνει το s1 με s2 και επιςτρζφει κετικι τιμι εάν s1 μεγαλφτερο (αλφαβθτικά) από το s2, μθδζν αν είναι ίςα, και αρνθτικι τιμι εάν s1 μικρότερο από s2. Αλγόρικμοσ o Ζλεγξε επαναλθπτικά εάν κάκε ςτοιχείο s1[i] είναι ίςο με s2[i] o Εάν δεν είναι κάποιο ςτοιχείο ίςο επζςτρεψε το s1[i]-s2[i]
Υλοποίθςθ mystrcmp() int mystrcmp(char s1[], char s2[]) int i=0; // Ελζγχουμε κάκε ςτοιχείο // s1[i] αν είναι ίςο με s2[i] while (s1[i]!= '\0') if (s1[i]!= s2[i]) break; i++; return s1[i]-s2[i]; s1 > s2 s1 = s2 Περίπτωςθ Α C \0 Περίπτωςθ Β s1 C \0 < s2 Περίπτωςθ C
Υλοποίθςθ mystrcmp() Γιατί είναι λάκοσ θ πιο κάτω υλοποίθςθ τθσ mystrcmp? int mystrcmp(char s1[], char s2[]) int i=0; // Ελζγχουμε κάκε ςτοιχείο s1[i] αν είναι ίςο s2[i] while (s1[i] == s2[i]) i++; return s1[i]-s2[i]; s1 = s2
Η ςυνάρτθςθ gets() o Η ςυνάρτθςθ gets() χρθςιμοποιείται για να διαβάηει ςυμβολοςειρζσ από το χριςτθ o Η gets() είναι δθλωμζνθ ςτθν βιβλιοκικθ <string.h> o Η gets() διαβάηει χαρακτιρεσ από το πλθκτρολόγιο μζχρι να πατθκεί enter o Στθ ςυνζχεια αποκθκεφει τουσ χαρακτιρεσ που διάβαςε Στο τζλοσ προςκζτει τον χαρακτιρα \0 main() char protasi[40]; printf( Give a sentence: ); gets(protasi); 18/43
Η ςυνάρτθςθ puts() o Η ςυνάρτθςθ puts() χρθςιμοποιείται για να τυπϊνει ςυμβολοςειρζσ ςτθν οκόνθ o Η puts() είναι δθλωμζνθ ςτθν βιβλιοκικθ <string.h> o Η puts() τυπϊνει ςτθν οκόνθ τουσ χαρακτιρεσ που βρίςκονται ςτo αλφαρικμθτικό μζχρι να ςυναντιςει το \0 o Στθ ςυνζχεια τυπϊνει τον χαρακτιρα \n αλλάηοντασ γραμμι main() char lexi[40]="hello world"; puts(lexi); puts("today is Thursday");
Η ςυνάρτθςθ strstr() o Ελζγχει αν μια ςυμβολοςειρά εμπεριζχεται ςε μια άλλθ o Είναι δθλωμζνθ ςτθ βιβλιοκικθ <string.h> o Σφνταξθ: strstr(str,sub) Ελζγχει αν οι χαρακτιρεσ τθσ ςυμβολοςειράσ sub εμφανίηονται (με τθν ίδια ςειρά) ςε κάποιο ςθμείο τθσ str Η ςυνάρτθςθ επιςτρζφει τθ διεφκυνςθ του χαρακτιρα τθσ str όπου εντόπιςε για πρϊτθ φορά το sub Αν το sub δεν περιζχεται μζςα ςτθν str τότε επιςτρζφεται θ τιμι NULL main() char s1[40]; printf("give a sentence: "); gets(s1); if (strstr(s1,"arithmos")!=null) printf("your sentence contains \"arithmos\"!\n"); else printf("thank you!\n"); system("pause");
Παράδειγμα Φωνιεντα Να γίνει πρόγραμμα που κα διαβάηει μία φράςθ, κα αντικακιςτά όλα τα φωνιεντα του Λατινικοφ αλφάβθτου με το χαρακτιρα * και κα τυπϊνει τθ νζα ςυμβολοςειρά #include <stdio.h> #include <string.h> #define STRING_SIZE 250 main() char s[string_size]; int i=0; puts("give a word: "); gets(s); while (s[i]!='\0') if (s[i]=='a' s[i]=='e' s[i]=='o' s[i]=='i' s[i]=='u' s[i]=='y') s[i]='*'; i++; puts(s); system("pause");
Τζλοσ διάλεξθσ