ומבוא ( ) המחלקה מחרוזת – 9פרק String לעצמים
Transcription
ומבוא ( ) המחלקה מחרוזת – 9פרק String לעצמים
פרק – 9המחלקה מחרוזת ) (Stringומבוא לעצמי בתוכניות שכתבנו עד כה השתמשנו בטיפוסי שוני המוגדרי בשפת :Javaשל ,ממשי ,תווי ובוליאני .יכולנו להגדיר משתני מטיפוסי אלו ,ולבצע עליה פעולות שונות )קלט ,פלט ,חישובי וכו'( .ע זאת ,מרבית התוכניות שכתבנו התייחסו ג למחרוזות ,סדרות של תווי .עד עתה השתמשנו במחרוזות כאשר רצינו להדפיס הודעות למשתמש ותחמנו אות במירכאות ,למשל ,בהוראה: ;)"System.out.println("Please insert two numbers ההודעה " "Please insert two numbersהיא מחרוזת. הנה דוגמאות נוספות למחרוזות בשפת :Java "?"" ,"J" ,"453" ,"Hello, How Are You )האחרונה היא מחרוזת ריקה ,שאינה מכילה א תו(. לעיתי נוח להתייחס למחרוזות במפורש ולבצע עליה פעולות נוספות ,פרט להדפסה .בפרק זה נראה כיצד נית לקלוט מחרוזות מהמשתמש ,לשמור אות ,ולבצע עיבודי על מחרוזות .א עד עתה יכולנו לקלוט מספרי או תווי בודדי בלבד ,עכשיו נוכל לבקש מהמשתמש להקיש את שמו ,כתובתו וכדומה ,ולבצע פעולות שונות על המחרוזות הנקלטות .דר! ההיכרות ע מחרוזות נערו! ג היכרות ראשונית ע מחלקות ועצמי. 9.1היכרות ראשונית עם המחלקה String בשפת Javaלא מוגדר טיפוס פשוט עבור מחרוזות ,בדומה לטיפוסי אחרי שראינו .אבל ,בשפת Javaמוגדרת המחלקה ,Stringובה נוכל להיעזר כאשר נרצה להשתמש במחרוזות. למעשה ,נית להתייחס אל מחלקה כאל טיפוס חדש בשפה ,המאפשר הצהרה ושימוש במשתני מטיפוס זה .למשל ,א Stringהיא מחלקה בשפה ,אפשר לכתוב: ;String s1, s2 בדומה להצהרה על משתני מטיפוס רגיל )למשל ,של או תווי(. נהוג לקרוא למשתני של טיפוסי חדשי כאלה מופעי של המחלקה Stringאו עצמי של המחלקה .Stringכפי שנראה מיד ,השימוש בעצמי שונה מעט משימוש במשתני רגילי .בפרק זה נכיר ,בעזרת המחלקה ,Stringמושגי בסיסיי הקשורי לשימוש במחלקות ובעצמי .ביחידת ההמש! )"יסודות מדעי המחשב ("2תלמדו כיצד להגדיר בעצמכ מחלקות חדשות. הוראת המדעים ,אוניברסיטת תל-אביב -383- מדעי המחשב אמנ ,הצהרה על עצמי דומה להצהרה על משתני מטיפוסי רגילי .אבל ,שלא כמו עבור משתני מטיפוסי רגילי ,בדר! כלל הצהרה על עצ חדש אינה מספיקה! עלינו להקצות מקו חדש בזיכרו עבור עצ זה .עבור משתני רגילי ,הקצאת המקו בזיכרו נעשית אוטומטית ע ההצהרה עליה .אי זה כ! עבור עצמי .בהמש! הפרק נראה כיצד מבוצעת הקצאת שטח עבור עצמי. בשפת Javaמחרוזת היא עצ ,כלומר ,מופע של המחלקה ) (classמחרוזת .נית להצהיר על מחרוזות בדומה להצהרת משתני רגילי. כדי שנית יהיה להשתמש בעצ מהמחלקה מחרוזת ,יש להקצות עבורו שטח זיכרו. בעיה 1 מטרת הבעיה ופתרונה :הצגת שימוש בסיסי במחלקה מחרוזת. פתחו ויישמו אלגורית שיקבל כקלט את שמכ ,וידפיס על המס! את המחרוזת Your name is ומיד אחריה את הש שנקלט. בחירת משתני ? באיזה טיפוס נשתמש כדי לשמור את הש שנקלט? כיוו שעלינו לקלוט מילה ,נשתמש במחלקה מחרוזת .א כ! ,רשימת המשתני תכלול את העצ nameמהמחלקה מחרוזת. האלגורית: name-ì úæåøçî èåì÷ .1 "Your name is " èìôë âöä .2 name úà èìôë âöä .3 יישו האלגורית עד כה ראינו כיצד לקלוט ערכי של טיפוסי פשוטי – שלמי ,ממשיי ותווי .ביצוע קלט של מחרוזת נעשה בצורה דומה .את הוראה 1נוכל לממש על ידי המשפט: ;)(name = In.readString בדומה להוראות קלט אחרות בה השתמשנו ,א נרצה לצר הנחיה למשתמש לגבי מהות הקלט לו מצפה התוכנית ,נכתוב את ההודעה המתאימה בתו! הסוגריי. הוראת המדעים ,אוניברסיטת תל-אביב -384- מדעי המחשב שימו ♥ :כמו הוראות קלט של ערכי מטיפוסי פשוטי ,ג הוראת קלט של מחרוזת היא למעשה הוראת השמה .בעת ביצוע ההוראה ;)( name = In.readStringנקראת מחרוזת מהקלט ,ונוצר עצ חדש מהמחלקה מחרוזת ,שהוקצה עבורו מקו בזיכרו כחלק מפעולת הקלט .עצ זה שומר את מחרוזת הקלט .הפעולה ,In.readStringמחזירה הפניה לשטח הזיכרו החדש שהוקצה .בעקבות ההשמה מפנה nameאל אותו שטח זיכרו ,ודר! nameנית להגיע אל אותו שטח ולבצע עליו פעולות שונות .בהמש! הפרק נעמיק בהשמה של מחרוזות. משו שפעולת קליטת מחרוזת מבצעת הקצאת שטח בזיכרו עבור המחרוזת הנקלטת אי צור! במקרה זה להקצות שטח זיכרו עבור מחרוזת זו ע הצהרתה. התוכנית המלאה */ קלט :שם ,הנקלט כמחרוזת פלט :השם ,מלווה בהודעה מקדימה */ public class YourName { )public static void main (String [] args { הצהרה על עצם מהמחלקה מחרוזת // ;String name הוראת קלט +הקצאת מקום בזיכרון // ;)"name = In.readString("Insert your name פלט // ;)System.out.println("your name is: " + name } // main } // class YourName סוף פתרון בעיה 1 נית לבצע קלט של מחרוזת באמצעות הפעולה .In.readString נית להעביר לפעולת הקלט מחרוזת שתנחה את המשתמש לגבי הקלט שהוא מתבקש לתת. פעולת הקלט מקצה שטח עבור המחרוזת החדשה. הוראת המדעים ,אוניברסיטת תל-אביב -385- מדעי המחשב 9.2ביצוע פעולות על מחרוזות כש שעל ערכי ומשתני של טיפוסי פשוטי ,כגו charו( ,intאפשר לבצע פעולות שונות )למשל ,פעולות חשבוניות או פעולות השוואה( ,נרצה לבצע פעולות שונות ג על מופעי של מחלקות, הטיפוסי החדשי בשפה .כאשר מוגדרת מחלקה בשפה ,מוגדרות איתה ג פעולות שנית לבצע על עצמי של המחלקה. כדי לבצע פעולה של מחלקה על עצ מהמחלקה יש לכתוב ראשית את שמו ,אחריו את הסימ נקודה, ולאחר מכ את ש הפעולה לביצוע .למשל ,אחת מהפעולות המוגדרות עבור המחלקה מחרוזת היא הפעולה ,lengthהמחשבת את אורכה של מחרוזת מסוימת .א s1הוא עצ של המחלקה מחרוזת, אז הביטוי )( s1.lengthמפעיל את הפעולה lengthעל העצ s1ומחזיר את תוצאת ההפעלה, כלומר את אורכה של המחרוזת .s1בכל הפעלה של פעולה של המחלקה מחרוזת נשתמש בסימו הנקודה ,כדי לציי את העצ שעליו היא מופעלת. הסוגריי שאחרי ש הפעולה נועדו להעברת ערכי )פרמטרי( לה נזקקת הפעולה .במקרה של הפעולה lengthאי צור! בהעברת ער! ,ולכ הסוגריי נותרי ריקי .בהמש! הפרק נכיר פעולות נוספות ,אשר מצפות לקבל ערכי מסוימי לצור! הפעלת. בעיה 2 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולות על מחרוזות .הכרת הפעולות lengthו( .charAt פתחו ויישמו אלגורית אשר יקבל כקלט מחרוזת .א אור! המחרוזת הוא זוגי יוצג כפלט התו הראשו במחרוזת ,וא אור! המחרוזת הוא אי(זוגי יוצג התו האחרו במחרוזת. למשל ,עבור הקלט shalomיוצג התו .'s' :ועבור הקלט dogיוצג התו.'g' : שימו ♥ :בשפת Javaמיקו התווי במחרוזת מתחיל מ( .0כלומר ,התו הראשו במחרוזת נמצא במקו ,0התו השני במחרוזת הוא במקו ,1השלישי במקו ,2וכ הלאה. ? א התו הראשו נמצא במקו ,0באיזה מקו נמצא התו האחרו? נתבונ למשל במחרוזת " "abcdשאורכה .4התו האחרו בה הוא ' 'dוהוא נמצא במקו .3 מיקו התווי במחרוזת מתחיל מ(.0 בכל מחרוזת ,א נסמ את אור! המחרוזת ב( ,lenאז התו האחרו במחרוזת נמצא במקו .len −1 הוראת המדעים ,אוניברסיטת תל-אביב -386- מדעי המחשב בחירת משתני נשתמש במשתני הבאי: – strעצ מהמחלקה מחרוזת – letterהאות המבוקשת ,מטיפוס char – lenלשמירת אור! המחרוזת ,מטיפוס של האלגורית str-ì úæåøçî èåì÷ .1 len-á str úæåøçîä ìù äëøåà úà íùä .2 .3 íà éâåæ len str-á 0 íå÷îá àöîðä åúä úà letter-á íùä 3.1 .4 úøçà str-á len−1 íå÷îá àöîðä åúä úà letter-á íùä 4.1 letter ìù åëøò úà èìôë âöä .5 יישו האלגורית ? כדי לבדוק את אורכה של המחרוזת נשתמש בפעולה ,lengthבאיזו פעולה נשתמש כדי לדעת מהו התו שנמצא במקו מסוי במחרוזת? במחלקה מחרוזת מוגדרות פעולות נוספות ואחת מה היא הפעולה ) .charAt(kפעולה זו מקבלת כפרמטר )בתו! הסוגריי( מספר של ,kומחזירה את התו שנמצא במקו ה( kבמחרוזת עבורה הופעלה .לכ ,למשל ,כדי לדעת מהו התו שנמצא במקו 0 במחרוזת strנכתוב ).str.charAt(0 התוכנית המלאה */ קלט :מחרוזת פלט :התו הראשון או האחרון במחרוזת ,בהתאם לאורכה )זוגי או אי-זוגי( */ public class IsEven { )public static void main (String[] args { ;String str ;int len ;char letter הוראת המדעים ,אוניברסיטת תל-אביב -387- מדעי המחשב ;)"str = In.readString("Insert a string please ;)(len = str.length )if (len % 2 == 0 { ;)letter = str.charAt(0 } else { ;)letter = str.charAt(len - 1 } ;)System.out.println("The letter is " + letter } // main } // class IsEven סוף פתרון בעיה 2 בסו הפרק תוכלו למצוא טבלה המפרטת את הפעולות השכיחות המוגדרות ב( Javaעבור עצמי מהמחלקה .String העמודה הימנית בטבלה מתארת את ש הפעולה ואת רשימת הפרמטרי שהיא מצפה לקבל )בתו! סוגריי( .כפי שראינו זה עתה ,הפעולה הראשונה בטבלה ,length ,אינה מצפה לקבל ער! כלשהו, ולכ הסוגריי ריקי .לעומתה ,הפעולה השנייה ,charAt ,מצפה לקבל פרמטר אחד מטיפוס של, והפעולה השלישית indexOf ,מצפה לקבל עצ מהמחלקה מחרוזת ,או תו. העמודה השלישית מתארת את טיפוס הער! המוחזר כתוצאת הפעולה .בדומה לפעולות המתמטיות שלמדנו בפרק ,4ג כא יש לשי לב לטיפוס הער! המוחזר ולוודא התאמה בינו לבי הפעולות המבוצעות עליו .למשל ,א נבצע השמה של ער! מוחזר מפעולה על מחרוזת לתו! משתנה ,עלינו לוודא התאמה בי טיפוס הער! המוחזר לטיפוס המשתנה אליו מתבצעת ההשמה. חלק מהגדרת המחלקה מחרוזת כוללת הגדרה של פעולות הניתנות לביצוע על מחרוזת. הפעלת פעולה של המחלקה מחרוזת על עצ מהמחלקה מחרוזת נכתבת כ!: )פרמטרי(ש הפעולה.ש העצ יש לבדוק היטב בתיאור הפעולה אילו ערכי היא מצפה לקבל ומה טיפוס הער! שהיא מחזירה. הוראת המדעים ,אוניברסיטת תל-אביב -388- מדעי המחשב בעיה 3 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולת השוואת מחרוזת של המחלקה ,Stringושילוב מחרוזות בתבנית מנייה. פתחו ויישמו אלגורית אשר הקלט שלו הוא רשימת מחרוזות שמסתיימת במחרוזת ""STOP )זקי ( ,והפלט הוא מספר המחרוזות ברשימה. למשל ,עבור הקלט "abc", "dog", "shalom", "people", "STOP" :הפלט המתאי הוא .4 פירוק הבעיה לתתמשימות למעשה ,האלגורית צרי! לבצע מנייה ,בדומה לאלגוריתמי אחרי שפיתחנו בפרקי אחרי .לכ, נית פשוט לכתוב את רשימת התת(משימות הבאה: .1מניית מספר המחרוזות שבקלט .2הצגה כפלט של מספר המחרוזות שנמנו תת(משימה 1תבוצע בדומה למשימות מנייה אחרות ,ההבדל הוא כמוב בטיפוס הערכי הנמני – מחרוזת במקרה זה – ובאופ ביצוע הפעולות עליה .בשלב יישו האלגורית נראה כיצד לעשות זאת. בחירת משתני – strהמחרוזת התורנית מהקלט ,עצ מהמחלקה מחרוזת – counterלמניית מספר המחרוזות ,מטיפוס של האלגורית 0-ì counter úà ìçúà .1 str-ì úæåøçî èåì÷ .2 .3 ãåò ìë ":òöá str ≠"STOP 1-á counter ìù åëøò úà ìãâä .3.1 str-ì úæåøçî èåì÷ .3.2 counter ìù åëøò úà èìôë âöä .4 הוראת המדעים ,אוניברסיטת תל-אביב -389- מדעי המחשב יישו האלגורית ? כיצד נבדוק הא המחרוזת הנקלטת שווה למחרוזת "?"STOP הפעולה equalsבודקת הא שתי מחרוזות שוות זו לזו .נשתמש בה ,כפי שמתואר בטבלה שבסו הפרק. התוכנית המלאה */ קלט :רשימת מחרוזות המסתיימת בזקיף פלט :מספר המחרוזות ברשימה */ public class HowManyStrings { )public static void main (String[] args { הגדרת משתנים ואתחולם // ;String str ;int counter = 0 לולאת זקיף // ;)"str = In.readString("Insert a string please כל עוד המחרוזת strשונה מwhile (! str.equals("STOP")) //"STOP"- { ;counter++ ;)"str = In.readString("Insert another string please } // while ;)" System.out.println(counter + " Strings } // main } // class HowManyStrings שימו ♥ :כפי שהסברנו קוד ,הוראת הקלט של מחרוזת מקצה בכל פע מקו בזיכרו עבור המחרוזת החדשה .לכ למעשה ,העצ strמפנה בכל פע אל מקו אחר בזיכרו ,משו שבכל פע ההשמה המתבצעת אליו מתייחסת לשטח זיכרו אחר. סוף פתרון בעיה 3 הוראת המדעים ,אוניברסיטת תל-אביב -390- מדעי המחשב שאלה 9.1 פתחו ויישמו אלגורית שיקבל כקלט מילה באנגלית ויציג אותה פעמיי ,פע באותיות גדולות ופע באותיות קטנות .למשל ,עבור הקלט Memoryהפלט יהיה MEMORY :ומיד אחר(כ! .memory שאלה 9.2 פתחו אלגורית שיקבל כקלט מחרוזת ותו .פלט האלגורית יהיה מספר ההופעות של התו הנתו בתו! המחרוזת הנתונה .ישמו את האלגורית בשפת .Java הדרכה :מאחר שנית לברר את אור! המחרוזת הנתונה נית להשתמש בהוראה לביצוע חוזר שמספר הסיבובי בה ידוע מראש )לולאת .(for שאלה 9.3 פתחו אלגורית המקבל כקלט רשימת מחרוזות המסתיימת במחרוזת "***". פלט האלגורית יהיה המחרוזת הארוכה ביותר ברשימה .ישמו את האלגורית בשפת .Java שרשור מחרוזות פעולה נוספת ושימושית מאוד על מחרוזות היא פעולת השרשור .פעולה זו מקבלת שתי מחרוזות ויוצרת מחרוזת חדשה ,המורכבת מהמחרוזת הראשונה כשאחריה מוצמדת המחרוזת השנייה .היא אינה משנה את המחרוזות המקוריות. בשפת Javaמתבצע שרשור בעזרת סימ הפעולה .+כלומר ,א s1ו( s2ה מחרוזות ,אז ער! הביטוי s1+s2הוא השרשור של s1ו( .s2למשל ,א ב( s1נמצאת המחרוזת " "heוב( s2נמצאת המחרוזת " ,"lloאז s1+s2היא המחרוזת החדשה "."hello שימו ♥ :פעולת השרשור אינה פעולה של המחלקה מחרוזת ולכ אופ הפעלתה שונה מזה של פעולות כמו charAt ,lengthאו פעולות אחרות של המחלקה .היא אינה מופעלת על עצ של המחלקה ,ולכ אי שימוש בסימ הנקודה .אופ הפעלת פעולת השרשור על מחרוזות דומה לאופ הפעלת פעולות על טיפוסי רגילי בשפה. למעשה ,כבר השתמשנו פעמי רבות בפעולת השרשור על מחרוזות .כזכור ,עד כה השתמשנו במחרוזות בהוראות הדפסה כגו ;)"System.out.println("hello לעיתי ,פקודות ההדפסה היו מעט יותר מורכבות .למשל ; )System.out.println("The number is: " + number או אפילו הוראת המדעים ,אוניברסיטת תל-אביב -391- מדעי המחשב System.out.println("There are " + bags + " bags, " + left + " are left ;)"over. בכל ההוראות האלו הפעולה printlnמקבלת מחרוזת להדפסה .בראשונה מבי דוגמאות ההדפסה שלעיל ,זוהי המחרוזת " ."helloבדוגמאות האחרות מועברות לפעולה printlnמחרוזות שהתקבלה כתוצאה מהפעלת פעולה ,פעולה שמחזירה מחרוזת .כ! למשל ,המחרוזת שקיבלה printlnבכל אחת משתי הדוגמאות האחרות ,התקבלה כתוצאה מהפעלת הפעולה ) +פע אחת בדוגמה הראשונה ,וארבע פעמי בשנייה(. למשל ,א ערכו של המשתנה numberהוא ,3אז המחרוזת שהועברה להדפסה בהוראה הראשונה היא שרשור של המחרוזת " "The number is:ע המחרוזת " ,"3כלומר המחרוזת "The ".number is: 3 שימו ♥ :מאחר שבמשתנה numberיש ער! מטיפוס של ,הרי שטר ביצוע פעולת השרשור התבצעה באופ אוטומטי פעולת הסבה של הער! המספרי למחרוזת המתאימה לו .כ! קורה תמיד כאשר אנו מבקשי לשרשר מחרוזת ע ער! מטיפוס שאינו מחרוזת :לפני ביצוע פעולת השרשור מתבצעת באופ אוטומטי פעולת הסבה של הערכי שאינ מחרוזות למחרוזות .לכ ,הפעולה + מתבצעת כפעולת שרשור של מחרוזות ולפעולה printlnמועברת מחרוזת אחת ,שהיא תוצאת השרשור. שרשור מחרוזות נית לבצע בעזרת הפעולה ,+כ!: מחרוזת + 2מחרוזת1 פעולת השרשור יוצרת מחרוזת חדשה ,ודואגת להקצות עבורה מקו .היא אינה משפיעה על המחרוזות המקוריות. לפני ביצוע שרשור של מחרוזת ע ער! שאינו מחרוזת ,הער! שאינו מחרוזת מוסב באופ אוטומטי למחרוזת. שאלה 9.4 פתחו אלגורית שיקבל כקלט 100זוגות של מחרוזות .עבור כל זוג מחרוזות תוצג כפלט מחרוזת שהיא שרשור של שתי המחרוזות )כלומר ,בס! הכל יוצגו 50מחרוזות( .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -392- מדעי המחשב ומה בפנים? פעולות המסתכלות אל תוך הקנקן למרות שכל מחרוזת היא עצ אחד ,כמה מ הפעולות המוגדרות על עצמי של המחלקה מחרוזת מאפשרות להתייחס באופ מפורש ג לתווי שמרכיבי מחרוזת .פעולות כאלו ,כמו הפעולה charAtשכבר היכרנו ,מסייעות מאוד בפתרו בעיות שונות ,כפי שמדגימה הבעיה הבאה: בעיה 4 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולות המגלות מידע על רכיביה של מחרוזת. פתחו אלגורית שהקלט שלו הוא מחרוזת המהווה משפט באנגלית ,והפלט הוא האות האחרונה של המילה הראשונה במשפט ,ומספר המילי במשפט. למשל ,עבור הקלט welcome to Israel and have a nice day! :הפלט המתאי הוא .e 8 ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות נתבונ במשפט שנית כדוגמה.welcome to Israel and have a nice day! : ? כיצד נית לדעת כמה מילי יש במשפט הנתו? כיוו שלפני כל מילה ,חו* מהראשונה ,יש רווח ,נוכל למנות את מספר הרווחי במחרוזת ולהוסי .1 למשל ,במשפט ! welcome to Israel and have a nice dayיש 7רווחי ,ולכ 8מילי) .זאת בהנחה שבי מילה למילה יש רווח אחד בלבד!( ? מהי האות האחרונה במילה הראשונה? האות האחרונה במילה הראשונה היא האות שנמצאת מיד לפני הרווח הראשו. פירוק הבעיה לתתמשימות לש פתרו הבעיה נפתור את התת(משימות הבאות: .1קליטת המחרוזת .2מניית מספר הרווחים במחרוזת שנקלטה .3חישוב מספר המילים במחרוזת .4מציאת הרווח הראשון במחרוזת .5מציאת התו שנמצא מיד לפני הרווח הראשון במחרוזת .6הצגה כפלט של מספר המילים במחרוזת ושל התו שנמצא בתת-משימה 5 הוראת המדעים ,אוניברסיטת תל-אביב -393- מדעי המחשב בחירת משתני – sentenceמחרוזת לשמירת המשפט שנקלט – numOfSpacesשל ,מונה את מספר הרווחי במשפט – numOfWordsשל ,שומר את מספר המילי במשפט – placeOfFirstSpaceשל ,שומר את מיקומו של הרווח הראשו )לפניו נמצאת האות המבוקשת( האלגורית sentence-á èôùî èåì÷ .1 0-ì numOfSpaces ìù åëøò úà ìçúà .2 .3 ìë øåáò íà .3.1 :òöá úæåøçîä êøåàî ïè÷ù i éìéìù-éà íìù øôñî çååø àåä sentence úæåøçîá i-ä íå÷îá àöîðù åúä .3.1.1 1-á numOfSpaces ìù åëøò úà ìãâä numOfSpaces+1 êøòä úà numOfWords-á íùä .4 placeOfFirstSpace-á íùäå ïåùàøä çååøä ìù åîå÷î úà àöî .5 sentence-á placeOfFirstSpace-1 íå÷îá úàöîðù úåàä úà èìôë âöä .6 numOfWords ìù åëøò úà èìôë âöä .7 יישו האלגורית את הוראה 3.1אפשר לייש בעזרת הפעולה .charAtאבל ,נשי לב שהפעולה charAtמחזירה ער! מטיפוס charולא מטיפוס מחרוזת ,ולכ יש להשוות את הער! המוחזר ממנה לתו רווח )ולא למחרוזת המכילה את התו היחיד רווח( .א כ! ,את הוראה 3.1נייש כ!: )' '==)if (sentence.charAt(i ליישו הוראה 5נשתמש בפעולה .indexOfכפי שמתואר בטבלה שבסו הפרק ,פעולה זו יכולה לקבל תו או מחרוזת .לכ נעביר לה את התו רווח והיא תחזיר את מקומו במחרוזת ,כמספר של: )' '(sentence.indexOf שימו ♥ :יש תמיד לדאוג להתאמה בי טיפוסי הערכי בה אנו משתמשי לבי אלו המתוארי בכותרת הפעולה. הוראת המדעים ,אוניברסיטת תל-אביב -394- מדעי המחשב התוכנית המלאה /* משפט באנגלית:קלט האות האחרונה במילה הראשונה ומספר המילים במשפט:פלט */ public class HowManyWords { public static void main (String[] args) { String sentence; int placeOfFirstSpace; int numOfSpaces = 0; int numOfWords; sentence = In.readString("Enter a sentence, with exactly one space between words"); // מניית הרווחים במשפט for (int i = 0 ; i < sentence.length() ; i++) { if (sentence.charAt(i) == ' ') { numOfSpaces++; } // if } // for numOfWords = numOfSpaces + 1; // מציאת מקומו של הרווח הראשון placeOfFirstSpace = sentence.indexOf(' '); System.out.println("The last letter of the first word is: " + sentence.charAt(placeOfFirstSpace - 1)); // כמה מילים במשפט System.out.println("There are " + numOfWords + " words"); }//main }// class HowManyWords 4 סוף פתרון בעיה מדעי המחשב -395- אביב- אוניברסיטת תל,הוראת המדעים שאלה 9.5 פתחו ויישמו אלגורית שהקלט שלו הוא תו ומחרוזת והפלט הוא הודעה הא התו נמצא במחרוזת או לא. שאלה ) 9.6בגרות (1995 פתחו ויישמו אלגורית שקולט מחרוזת .האלגורית מציג כפלט כל תו במחרוזת פעמיי ,פרט לתו '*' )כוכבית( אשר ג א הוא כלול במחרוזת הוא לא מוצג כלל .הפלט מוצג בשורה אחת. למשל ,עבור הקלט AB*3B*? :הפלט יהיה ??.AABB33BB שאלה 9.7 פתחו ויישמו אלגורית שמקבל כקלט רשימה של 100מחרוזות .האלגורית מחשב בכמה מחרוזות מתו! ה( 100התו הראשו שווה לתו האחרו ,ומציג כפלט את הער! שחישב. שאלה 9.8 פתחו אלגורית שהקלט שלו הוא שלוש מחרוזות ,והפלט שלו הוא שלוש המחרוזות לפי סדר מילוני. ישמו את האלגורית בשפת .Java למשל ,עבור הקלט good, today, apple :הפלט המתאי הואtoday : good .apple 9.3השמת מחרוזות עד כה ראינו כיצד לבצע פעולות קלט ופלט של מחרוזות ,והשתמשנו בפעולות שונות על מחרוזות, פעולות שמחזירות לנו מידע על המחרוזת .בעיבוד של משתני רגילי ,אחת מהפעולות השימושיות ביותר היא הוראת השמה .בסעי זה נדו בביצוע השמה עבור מחרוזות ,כלומר בהשמה של מחרוזת אל מחרוזת. למעשה ,כפי שכבר נאמר ,ג הוראת קלט של מחרוזת היא הוראת השמה .למשל ,בהוראה ;)(str = In.readString הפעולה In.readStringמחזירה הפניה לשטח הזיכרו החדש שהוקצה עבור מחרוזת הקלט. בעקבות ההשמה מפנה strאל אותו שטח זיכרו ,ודר! strנית להגיע אל אותו שטח ולבצע עליו פעולות שונות. בסעי זה נראה כיצד לבצע השמה של מחרוזות ,שאינה הוראת קלט או הוראת הקצאה ואתחול. הוראת המדעים ,אוניברסיטת תל-אביב -396- מדעי המחשב בעיה 5 מטרת הבעיה הבאה :הצגת השמת מחרוזת למחרוזת והדגמה נוספת של השימוש בפעולות של המחלקה .String נאמר שכתובת דואר אלקטרוני היא חוקית א היא מקיימת את התנאי הבאי: מתחילה באות לועזית ,מורכבת מרצ לא ריק של תווי שאחריו מגיע התו '@' ,אחריו שוב רצ לא ריק של תווי, אחריו התו ','. ולאחריו עוד רצ לא ריק של תווי. כתובת ישראלית מסתיימת במחרוזת "".il בקביעת חוקיות של כתובת דואר אי משמעות להבדל בי אותיות גדולות וקטנות. למשל ,המחרוזת d@ccv.hhhהיא כתובת דואר אלקטרוני חוקית ,וכ! ג .ILייי@ ,tשהיא כתובת ישראלית .לעומת ,המחרוזות הבאות אינ כתובות חוקיות.cc :יח@ח )לא מתחילה באות לועזית(, ) tr@.ilרצ התווי שבי התו '@' לבי התו ' '.הוא ריק() rt@jjj ,לא מכילה את התו '('. ) sda.asd@sadהתו ' '.מופיע לפני התו '@'(. פתחו אלגורית המקבל כקלט מחרוזת .נית להניח כי במחרוזת המתקבלת התו ' '.לא מופיע יותר מפע אחת וכ! ג התו '@' .האלגורית מציג כפלט את המחרוזת שנקלטה ,בצירו הודעה המבהירה א המחרוזת מהווה כתובת דואר אלקטרוני חוקית ,וא כ ,הא זוהי כתובת ישראלית. ישמו את האלגורית בשפת התכנות .Java ניתוח הבעיה בעזרת דוגמאות הכתובת tr@xxx.ILהיא חוקית וישראלית .ג הכתובת tr@xxx.ilהיא חוקית וישראלית .אכ ,אי משמעות לשימוש באותיות קטנות או גדולות – ההבדל ביניה אינו משפיע על קביעת חוקיות המחרוזת וג לא על סיווגה ככתובת ישראלית .אבל ,הפלט אינו לגמרי זהה בשני המקרי :אמנ, בשני המקרי נציג הודעה כי המחרוזת חוקית וישראלית ,א! במקרה הראשו נציג את המחרוזת tr@xxx.ILובמקרה השני את המחרוזת .tr@xxx.il כיוו שלצור! בדיקת חוקיות המחרוזת והקביעה א היא ישראלית או לא אי משמעות להבדל בי אותיות גדולות לקטנות ,נוכל לפשט את הבדיקה א נבצע אותה על מחרוזת זהה למחרוזת הקלט פרט לכ! שהיא אחידה ,כלומר ,מורכבת רק מאותיות גדולות או רק מאותיות קטנות .נחליט כי המחרוזת האחידה תורכב כולה מאותיות קטנות .את מחרוזת הקלט נשמור כמו שהיא ,כדי שנוכל להציגה כפלט. הוראת המדעים ,אוניברסיטת תל-אביב -397- מדעי המחשב קל לבדוק א התו הראשו הוא אות לועזית .ברגע שבדיקה זו הצליחה ,כבר ברור שהמילה אינה מתחילה בתו '@' ,כלומר ,שהרצ שלפני התו '@' אינו ריק. פירוק הבעיה לתתמשימות .1קליטת מחרוזת .2יצירת מחרוזת זהה לזו שנקלטה ,פרט לכך שבמקום כל אות גדולה מופיעה האות הקטנה המתאימה לה .3בדיקה שהתו הראשון הוא אות לועזית .4בדיקה שהתוים '@' ו '.'-מופיעים במחרוזת .5בדיקה שהתו ' '.מופיע אחרי התו '@' ,אך לא מיד אחריו .6בדיקה שהרצף אחרי התו ' '.אינו ריק .7עבור מחרוזת חוקית :בדיקה אם היא ישראלית .8הצגה כפלט של המחרוזת ושל הודעה מלווה מתאימה בחירת משתני בשאלה מתוארי כמה תנאי בה צריכה לעמוד מחרוזת חוקית .מספיק שאחד מה לא מתקיי, כדי לקבוע שהמחרוזת אינה חוקית .נוכל להיעזר במשתנה בוליאני :כל עוד לא מצאנו בעיה בכתובת הדואר האלקטרוני ערכו של המשתנה יהיה .trueכאשר נמצא שגיאה באחד התנאי נציב בו .false ההודעה לפלט תוצג על פי ערכו של המשתנה. בנוס נזדקק לשתי מחרוזות :האחת לשמירת מחרוזת הקלט המקורית ,והשנייה לשמירת המחרוזת האחידה. כדי לבדוק את חוקיות המחרוזת נשתמש בשני משתני שלמי שישמרו את מקו התווי '@' ו('.'. לבסו ,נקדיש משתנה ג לאור! המחרוזת שנקרא מהקלט .כ! נוכל לחשב את האור! פע אחת, ולהשתמש בער! המשתנה בכל הפעמי בה נזדקק לאור! המחרוזת. – isLegalמשתנה בוליאני )"דגל"( ,שיעיד הא הכתובת היא חוקית או לא – strמחרוזת לשמירת הכתובת הנקלטת – lowerCaseStrמחרוזת זהה למחרוזת הקלט פרט לכ! שבמקו כל אות גדולה נמצאת האות הקטנה המתאימה לה – atPlaceמספר של ,לשמירת מקומו של התו '@' – dotPlaceמספר של ,לשמירת מקומו של התו ''. – lenאור! מחרוזת הקלט הוראת המדעים ,אוניברסיטת תל-אביב -398- מדעי המחשב האלגורית true-ì isLegal êøò úà ìçúà .1 str-ì úáåúë èåì÷ .2 äìåãâ úåà ìë íå÷îáù êëì èøô ,str-áù úæåøçîì ääæ ,äùãç úæåøçî øåö .3 lowerCaseStr-á äúåà íùäå ,äì äîéàúîä äðè÷ä úåàä úàöîð úéìâðà úåà àì àéä äðåùàøä úåàä íà .4 false-ì isLegal êøò úà äðù .4.1 úæåøçîá íéòéôåî íðéà '@' åúä åà '.' åúä íà .5 false-ì isLegal êøò úà äðù .5.1 úøçà åéøçà ãééî àì êà '@' åúä éøçà òéôåî '.' åúä false-ì isLegal êøò úà äðù .6 íà .6.1 .6.1.1 (len – 1 íå÷îá) úæåøçîá ïåøçà òéôåî '.' åúä íà .7 false-ì isLegal êøò úà äðù .7.1 true-ì äååù isLegal ìù åëøò íà .8 úé÷åç úáåúëä éë äòãåä èìôë âöä .8.1 ".il" úæåøçîä íä íéðåøçàä íéååúä úùåìù úéìàøùé úáåúëä éë äòãåä èìôë âöä íà .8.2 .8.2.1 úøçà .8.3 úéìàøùé äðéà úáåúëä éë äòãåä èìôë âöä .8.3.1 úøçà .9 úé÷åç úáåúëä éë äòãåä èìôë âöä .9.1 מדעי המחשב -399- אביב- אוניברסיטת תל,הוראת המדעים יישו האלגורית כדי לבדוק הא התווי ' '.ו( '@' מופיעי במחרוזת ,strוא כ – הא מיקומ תקי ,נשתמש בפעולה str.indexOfהמקבלת תו ,ומחזירה את מקומו במחרוזת .str כדי ליצור ממחרוזת הקלט )השמורה ב( (strמחרוזת חדשה הזהה לה ,פרט לכ! שכל אות גדולה הוחלפה באות הקטנה המתאימה לה ,נשתמש בפעולה .str.toLowerCaseכמו כל פעולה הפועלת על מחרוזות ,ג הפעולה toLowerCaseאינה משנה את המחרוזת עליה היא מופעלת ,כלומר ,היא אכ יוצרת מחרוזת חדשה .כמו כל פעולה שיוצרת מחרוזת חדשה ,הפעולה toLowerCaseדואגת להקצות מקו עבור המחרוזת החדשה. אנו מעונייני שדר! המשתנה lowerCaseStrנית יהיה להגיע למחרוזת החדשה .לכ נשתמש במשפט השמה ,ונשי את הער! המוחזר מהפעולה str.toLowerCaseל( ,lowerCaseStrכ!: ;)(lowerCaseStr = str.toLowerCase בעקבות הוראה זאת העצ lowerCaseStrמפנה אל שטח בזיכרו ,בו שמורה מחרוזת חדשה ,הזהה למחרוזת הקלט ,פרט לכ! שבמקו כל אות גדולה נמצאת האות הקטנה המתאימה לה .במחרוזת המקורית ,השמורה ב( strלא חל כל שינוי. לא היינו צריכי להקצות במפורש שטח זיכרו לעצ ,lowerCaseStrמפני שההקצאה עבור השטח אליו הוא מפנה בוצעה בתו! הפעולה .toLowerCase התוכנית המלאה */ התוכנית מקבלת כקלט מחרוזת ,מציגה אותה כפלט ,ומציגה גם הודעה המבהירה אם זו מחרוזת דואר אלקטרוני חוקית ,ואם כן ,האם היא כתובת ישראלית */ public class EmailAddress { )public static void main (String[] args { מחרוזת הקלט // ;String str // ;String lowerCaseStr מחרוזת זהה למחרוזת הקלט ,פרט לכך שאותיות גדולות מוחלפות בקטנות שומר מיקום התו '@' // ;int atPlace שומר מיקום התו '// '. ;int dotPlace דגל חוקיות הכתובת // ;boolean isLegal = true אורך המחרוזת שנקלטה // הוראת המדעים ,אוניברסיטת תל-אביב -400- ;int len מדעי המחשב // קלט מחרוזת ושמירת אורכה str = In.readString("Insert an e-mail address, with only one . and one @"); len = str.length(); // יצירת המחרוזת החדשה ושמירתה lowerCaseStr = str.toLowerCase(); // בדיקה שהתו הראשון הוא אות לועזית if (!(str.charAt(0) >= 'a' && str.charAt(0) <= 'z')) { isLegal = false; } // if // '@'-' ו.' מציאת מקום התווים atPlace = lowerCaseStr.indexOf('@'); dotPlace = lowerCaseStr.indexOf('.'); if ((dotPlace == -1)||(atPlace == -1)) // אחד משני התווים חסר { isLegal = false; } else { if ((dotPlace < atPlace)|| (dotPlace == atPlace + 1)) { // הסדר בין התווים שגוי או שהם מופיעים ברצף isLegal = false; } } // else // ' אינו ריק.' בדיקה שרצף התווים שאחרי התו if (dotPlace == len - 1) { isLegal = false; } // הפלט if (isLegal) { System.out.println(str + " is a legal Email address"); // .il- האם שווים ל,בדיקת שלושת התווים האחרונים במחרוזת if (lowerCaseStr.IndexOf(".il") == len - 3) מדעי המחשב -401- אביב- אוניברסיטת תל,הוראת המדעים { ;)"System.out.println("Email address is Israeli } else { ;)"System.out.println("Email address is not Israeli } )}// if (isLegal else { ;)"System.out.println(str + " is not a legal Email address } } // main } // EmailAddress סוף פתרון בעיה 5 השמת מחרוזות נכתבת כהוראת השמה רגילה: ;string1 = string2 בעקבות ביצוע ההשמה ,מפנה string1אל אותו שטח זיכרו שאליו מפנה .string2לכ ,אי צור! לבצע קוד הקצאת זיכרו עבור .string1 בעיה 6 מטרת הבעיה ופתרונה :הדגמת בניית מחרוזת בשלבי .היכרות ע הפעולה .new פתחו אלגורית אשר הקלט שלו הוא מחרוזת .הפלט יהיה מחרוזת חדשה ,הזהה למחרוזת המקורית ,פרט לכ! שמופיעה בה האות cבכל מקו שבו הופיעה האות bאו Bבמחרוזת המקורית. למשל ,עבור המחרוזת " "abcdהפלט יהיה המחרוזת "."accd שימו ♥ :פרט לשינוי המתואר ,המחרוזת החדשה צריכה להיות זהה למקורית .בפרט ,לא נית להפו! בה אותיות גדולות לקטנות או להפ!. פירוק הבעיה לתתמשימות .1קליטת מחרוזת .2בניית המחרוזת החדשה .3הדפסת המחרוזת החדשה הוראת המדעים ,אוניברסיטת תל-אביב -402- מדעי המחשב את תת(משימה 2נוכל לפרק באופ הבא: .2.1יצירת מחרוזת חדשה ואתחולה למחרוזת ריקה .2.2בנייה הדרגתית של המחרוזת החדשה ,תו בכל פעם את תת(משימה 2.2נוכל לייש על ידי הוראה לביצוע חוזר ,בה מספר הפעמי לביצוע ידוע מראש ונקבע על פי אור! המחרוזת. בחירת משתני – strהמחרוזת שמתקבלת כקלט – new_strהמחרוזת החדשה האלגורית str-ì úæåøçî èåì÷ .1 ä÷éø úæåøçîë new_str úà ìçúà .2 .3 ìë øåáò :òöá str-á character åú åà 'b'-ì äååù character íà .3.1 .3.1.1 ''B 'c' åúä úà new_str-ì øùøù úøçà .3.2 .3.2.1 character åúä úà new_str-ì øùøù new_str úà èìôë âöä .4 יישו האלגורית בפתרו בעיה זו אנו מצהירי לראשונה על מחרוזת שתקבל את ערכה הראשוני לא על ידי הוראת קלט ולא על ידי השמה אלא על ידי אתחול )הוראה .(2משו כ! ,בניגוד לפתרונות הקודמי בה הקצאת השטח עבור המחרוזת נעשתה באופ סמוי )על ידי פעולת הקלט או על ידי פעולות אחרות המייצרות מחרוזות( בפתרו זה נדאג אנו להקצאת שטח עבור המחרוזת. הקצאה מקו לעצ מתבצעת על ידי הפעולה .newלמשל ,כדי להקצות מקו בזיכרו לעצ מהמחלקה מחרוזת נכתוב: str ;)(String str = new String הוראה זו מצהירה על העצ ומקצה לו מקו בזיכרו. כזכור ,עבור משתני רגילי נית לבצע אתחול תו! כדי הצהרה .ג עצמי נית לאתחל תו! כדי הצהרה ,על ידי העברת ער! לפעולה .newלמשל ,ההוראה הוראת המדעים ,אוניברסיטת תל-אביב -403- מדעי המחשב ;)"String str = new String("abc מצהירה על עצ של המחלקה מחרוזת בש ,strמקצה לו מקו בזיכרו ,ומאתחלת את ערכו ,כ! שכעת הוא שומר בתוכו את המחרוזת "."abc לא במקרה הוראת אתחול זו דומה להשמה .למעשה ,פעולת ,newמיד אחרי שהיא מקצה שטח בזיכרו ,היא מחזירה ער! ,שהוא הפניה לשטח הזיכרו שהוקצה. ההוראה )" str = new String("abcהיא אכ הוראת השמה ,בה מוש הער! המוחזר מהפעולה newב( .strכעת str ,מפנה אל השטח שהוקצה עבורו בזיכרו ,ובכל פע שנתייחס בתוכנית לעצ strונבצע עליו פעולות שונות ,ה יתבצעו על שטח הזיכרו המתאי. בדומה להשמת ער! ראשוני לתו! משתני ,ג הקצאת מקו בזיכרו לעצמי ,ואתחול המקו הזה לא חייבי להיעשות מיד ע ההצהרה .למשל ,נית לכתוב את ההוראות הבאות: ;String str ;)"str = new String("abc ע זאת ,בדיוק כמו שעבור משתני העדפנו לאתחל משתנה כמה שיותר מוקד ,מיד כשידוע ער! מתאי לאתחול ,ולא לדחות את האתחול ,כ! ג לגבי עצמי בכלל ,ומחרוזות בפרט. ביישו האלגורית לפתרו בעיה ,2האתחול כמחרוזת ריקה )הוראה (2יכול להתבצע יחד ע הקצאת המקו עבור המחרוזת ,כלומר ,בעזרת הפעולה ,newכ!: ;)""(new_str = new String את ערכו של כל תו תור במחרוזת נוכל לדעת )לצור! הוראה (3.1בעזרת הפעולה .charAt בהוראות 3.1.1ו( 3.2.1עלינו לשרשר תו נוס למחרוזת .נוכל להשתמש לש כ! בפעולת השרשור על מחרוזות .לכ ,למשל ,את הוראה 3.1.1נוכל לייש כ!: ;'new_str = new_str +'c שימו ♥ :פעולת השרשור היא פעולה שמחזירה מחרוזת .כמו כל פעולה שמחזירה מחרוזת ,פעולת השרשור אינה משנה את המחרוזות עליה היא פועלת ,אלא יוצרת מחרוזת חדשה )כמוב ,אחרי שדאגה להקצות מקו עבורה( ,השווה לשרשור המחרוזות המקוריות. נניח למשל ,שב( new_strנמצאת המחרוזת " ."adמה קורה בעת ביצוע הוראת ההשמה שלעיל? פעולת השרשור מקבלת שתי מחרוזות )במקרה זה new_str ,והמחרוזת " ,"cאחרי המרת התו ''c למחרוזת( ,יוצרת ,תו! הקצאת מקו מתאי בזיכרו ,מחרוזת חדשה שמכילה את שרשור שתי המחרוזות ,כלומר את המחרוזת " ."adcהיא מחזירה את המחרוזת החדשה. בפעולת ההשמה מושמת אותה מחרוזת חדשה אל .new_strכלומר ,במקו ש( new_strיפנה אל המחרוזת המקורית )" ,("adהוא מצביע כעת אל השטח החדש בזיכרו .מה קרה לעצ שהוא המחרוזת המקורית? נית לומר שהוא הל! לאיבוד .בכ! פעולת השמה של מחרוזות אינה שונה הוראת המדעים ,אוניברסיטת תל-אביב -404- מדעי המחשב מפעולת השמה רגילה של משתני :ג כאשר אנו מבצעי השמה כגו ,x = yכאשר xו( yמשתני רגילי ,ערכו המקורי של xאובד ,והער! החדש ,הלא הוא ערכו של ,yמחלי אותו. כאשר נשרשר למחרוזת תו נוס ,אותו תהלי! יחזור על עצמו :הקצאת שטח למחרוזת חדשה שהיא שרשור של המחרוזת המקורית והתו החדש ,והשמה ,הגורמת ל( new_strלהצביע על המחרוזת החדשה. א כ! ,בבנייה הדרגתית של מחרוזת ,כפי שתואר לעיל ,לא יהיה זה מדויק לומר שאותה מחרוזת צומחת כל פע בתו נוס .למעשה ,נוצרת סדרה של מחרוזות :בכל פע נוצרת מחרוזת חדשה ,ארוכה בתו אחד ,והיא תופסת את מקומה של המחרוזת הקודמת. התוכנית המלאה */ קלט :מחרוזת פלט :מחרוזת זהה למקורית ,פרט לכך שכל ' 'Bאו ' 'bמוחלף ב'c'- */ public class ReplaceCForB { )public static void main (String[] args { ;String str מחרוזת הקלט // המחרוזת החדשה // ;String new_str קלט // ;)"str = In.readString("Insert a string please בניית המחרוזת החדשה // אתחול המחרוזת החדשה למחרוזת ריקה new_str = new String("");// סריקת מחרוזת הקלט תו אחר תוfor(int i = 0; i<str.length(); i++)// { ))'if ((str.charAt(i) == 'b') || (str.charAt(i) == 'B { החלפת ' 'Bאו ' 'bבnew_str = new_str + 'c'; // 'c'- } else { העתקת התו המקורי new_str = new_str + str.charAt(i); // } } // for פלט // ;)System.out.println("The new String is: " + new_str } // main } // class ReplaceCForB סוף פתרון בעיה 6 הוראת המדעים ,אוניברסיטת תל-אביב -405- מדעי המחשב הקצאת שטח זיכרו למחרוזת נית לבצע בעזרת הפעולה .new נית להעביר לפעולה newער! לאתחול המחרוזת החדשה. כאשר אנו נדרשי לבנות מחרוזת חדשה בשלבי ,תו אחרי תו נית לעשות זאת באופ הבא :ליצור מחרוזת חדשה ולאתחל אותה כמחרוזת ריקה )""(; באמצעות הוראה לביצוע חוזר, לבצע בכל פע שרשור של המחרוזת הנוכחית ע תו מתאי ,והחלפת המחרוזת הנוכחית במחרוזת החדשה ,שהתקבלה מפעולת השרשור. שאלה 9.9 פתחו ויישמו אלגורית שהקלט שלו הוא מחרוזת המהווה משפט משובש :במקו כל רווח מופיע הסימ .$האלגורית מייצר מחרוזת חדשה ובה המשפט התקני ,ומציג אותו כפלט .ישמו את האלגורית בשפת .Java שאלה 9.10 ר וד המציאו שפה מוצפנת .המשפטי הניתני להצפנה כוללי מילי ורווחי בלבד ,כאשר כל מילה נכתבת רק באותיות לועזיות קטנות. ההצפנה מתבצעת באופ הבא :כל רווח מוחל בסימ '@' ,ולאחר כל אות מופיעה האות הלועזית הגדולה המתאימה לה. למשל ,המשפט good morningמוצפ כ! .gGoOoOdD@mMoOrRnNiInNgG פתחו אלגורית המקבל משפט כקלט ומציג כפלט את המשפט המוצפ המתאי לו .ישמו את האלגורית בשפת .Java שאלה 9.11 פתחו אלגורית שמקבל כקלט מחרוזת ,מייצר מחרוזת חדשה שבה סדר התווי הפו! ביחס למחרוזת המקורית ,ומציג את המחרוזת החדשה כפלט .בנוס ,האלגורית בודק א שתי המחרוזות )המקורית וההפוכה( שוות זו לזו .במילי אחרות ,האלגורית בודק א המחרוזת המקורית היא פלינדרו .האלגורית מציג כפלט הודעה מתאימה לתוצאת הבדיקה. למשל ,עבור הקלטdog : עבור הקלטaba : יהיה הפלט.god – not a palindrome : יהיה הפלט.aba – a palindrome : ישמו את האלגורית בשפת .Java שאלה 9.12 תלמידי הכיתה התעניינו לדעת למי יש סבתא ע הש הכי ארו! .פתחו אלגורית אשר יקבל כקלט את מספר התלמידי בכיתה ,ואחר כ! רשימה שאורכה כמספר תלמידי הכיתה ,של שמות הסבתות הוראת המדעים ,אוניברסיטת תל-אביב -406- מדעי המחשב של תלמידי הכיתה ,כמחרוזות .פלט האלגורית יהיה הש הארו! ביותר .ישמו את האלגורית בשפת .Java שאלה 9.13 כתובת אתר אינטרנט של חברה מסחרית בינלאומית בנויה בדר! כלל מ( 3חלקי המופרדי בנקודות: .comש החברהwww. פתחו אלגורית המקבל כקלט כתובת של אתר של חברה מסחרית בינלאומית ,במבנה שתואר לעיל, ומציגה כפלט את ש החברה .ישמו את האלגורית בשפת .Java הדרכה :השתמשו בפעולה substringשבטבלת הפעולות אשר בסו הפרק. שאלה 9.14 כתובת אתר אינטרנט של חברה מסחרית שאינה בינלאומית בנויה בדר! כלל מ( 3חלקי המופרדי בנקודות: סיומת המדינה.ש החברהwww. פתחו אלגורית המקבל כקלט רשימת כתובות של אתרי חברות מסחריות לאומיות )כל אחת מה במבנה שתואר לעיל( ,המסתיימת במחרוזת " ,"endומציגה כפלט עבור כל חברה את שמה ואת סיומת המדינה שלה .ישמו את האלגורית בשפת .Java שאלה 9.15 יואב ועומרי המציאו משחק .כל אחד בתורו רוש משפט המתחיל במילה האחרונה של המשפט מהתור הקוד .המשפט הראשו במשחק יתחיל במילה " ."startלמשל: start the game game is one of the best ways to kill the time time is money פתחו אלגורית המסייע למשחקי :האלגורית מקבל כקלט את מספר התורות המבוקש .בתחילת כל תור הוא מציג את המילה בה צרי! להתחיל המשפט הבא ,ולאחר מכ הוא מקבל כקלט את המשפט החדש .המשחק מסתיי כאשר מספר התורות הגיע לחס המבוקש ,או כאשר המשפט שבחר אחד השחקני מתחיל במילה שגויה .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -407- מדעי המחשב סיכום בפרק זה למדנו כיצד לבצע עיבוד של מחרוזות. בשפת Javaמחרוזת אינה טיפוס פשוט ,כמו intאו .charהטיפוס החדש מוגדר בשפה כמחלקה בש ,Stringומחרוזות ה עצמי של מחלקה זו. למעשה ,כבר הכרנו והשתמשנו במחלקות שונות כגו מחלקת המתמטיקה ששימשה אותנו לצור! ביצוע פעולות מתמטיות שונות ,או המחלקה Systemששימשה אותנו להוראות פלט )כמו .(System.out.printlnאבל ,בפרק זה הכרנו והגדרנו לראשונה מופעי של מחלקה ,עצמי ,שה, כאמור ,מעי משתני של הטיפוס החדש .בפרק זה ג הפעלנו לראשונה פעולות של מחלקה על עצ מהמחלקה .השימוש בעצמי שונה מהשימוש במשתני מהטיפוסי המוכרי לנו. הצהרה על עצ ממחלקה מסוימת דומה להצהרה על משתנה מטיפוס סטנדרטי )כגו intאו .(char למשל, ;string str בניגוד להצהרה על משתני מטיפוסי סטנדרטיי ,אחרי הצהרה על עצ צרי! ג לבצע עבורו הקצאת שטח זיכרו ,+על ידי הפעולה .newהפעולה newמשמשת ג לאתחול עצ ,תו! כדי הצהרה עליו או לאחר מכ. למשל ,ההוראה הבאה מקצה מקו עבור sומאתחלת אותו כ! שישמור את המחרוזת ": "ab ;)"s = new String("ab מיקו התווי במחרוזת מתחיל מ( .0בפרט ,בכל מחרוזת ,א נסמ את אור! המחרוזת ב( ,lenאז התו האחרו במחרוזת נמצא במקו ,len −1והתו הראשו נמצא במקו ה(.0 במחלקה Stringמוגדרות פעולות שנית +לבצע על מחרוזות ,כלומר ,על עצמי של המחלקה. לכל פעולה המוגדרת במחלקה יש חוקי משלה :איזה סוגי ערכי )פרמטרי( היא מצפה לקבל, ומאיזה טיפוס הער! המוחזר ממנה .חשוב לוודא התאמה בי טיפוסי הפרמטרי המועברי לפעולה לאלה אות היא מצפה לקבל ,ובי טיפוס הער! המוחזר ממנה לפעולות המתבצעות עליו .למשל ,א אנו מבצעי השמה של הער! המוחזר מפעולה לתו! משתנה ,יש לוודא התאמה בי הטיפוס של המשתנה לטיפוס הער! המוחזר. כדי לציי ביצוע פעולה של עצ מהמחלקה משתמשי בסימו +הנקודה :ראשית נכתב ש העצ, אחריו נכתבת נקודה ,לאחר מכ נכתב ש הפעולה לביצוע ,ומייד אחר כ! מפורטי בסוגריי הערכי המועברי לפעולה .למשל str.length() ,או ).str.charAt(5 הוראת המדעים ,אוניברסיטת תל-אביב -408- מדעי המחשב עבור עצמי של המחלקה Stringמוגדרות פעולות רבות ,המשמשות אותנו ביישו אלגוריתמי הקשורי למחרוזות .למחלקה זו פעולות רבות נוספות ,פרט לאלו שהוצגו בפרק ,ולא נרחיב עליה את הדיבור כא .תוכלו למצוא הרחבה על כל אחת מהפעולות בקישור הזה: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html ביחידה זו נשתמש רק בפעולות אות למדנו בפרק זה. כל הפעולות שמחזירות מחרוזת ,אינ משנות את המחרוזת עבורה הופעלו .ה יוצרות מחרוזת חדשה ומבצעות כבר הקצאת שטח עבורה. לביצוע קלט של מחרוזת השתמשנו בפעולה .In.readStringג פעולה זו מקצה שטח זיכרו עבור המחרוזת החדשה. בעקבות ביצוע השמה של מחרוזת אל מחרוזת ,string1 = string2 ,מפנה string1אל אותו שטח זיכרו שאליו מפנה .string2לכ ,אי צור! לבצע קוד הקצאת זיכרו עבור .string1 בנוס לפעולות הסטנדרטיות על מחרוזות ,למדנו בפרק זה על פעולת השרשור .פעולה זו מקבלת שתי מחרוזות ויוצרת מחרוזת חדשה שהיא שרשור של שתי המחרוזות .זוהי פעולה שימושית מאוד לצור! הדפסה .פעולת השרשור אינה פעולה של המחלקה Stringולכ בכתיבתה אי שימוש בסימו הנקודה .סימ פעולת השרשור הוא הסימ .+ ביחידת ההמש! )"יסודות מדעי המחשב ("2נלמד להגדיר מחלקות בעצמנו ,ולא רק להשתמש במחלקות קיימות. הוראת המדעים ,אוניברסיטת תל-אביב -409- מדעי המחשב רשימת פעולות על מחרוזות הפעולה תיאור הפעולה טיפוס התוצאה פעולה המחזירה את אורכה של המחרוזת )מספר התווי במחרוזת(. של דוגמאות הער ,המוחזר הפעולה )(s1.length )(length כאשר ב( s1נמצאת המחרוזת 3 ""dog )(s2.length כאשר ב( s1נמצאת המחרוזת 0 "" )charAt(int index )indexOf(String s )indexOf(char c פעולה המחזירה את התו הנמצא במחרוזת במקו )s1.charAt(2 תו כאשר ב( s1נמצאת המחרוזת )אינדקס( הנתו. ""shalom פעולה המקבלת מחרוזת ,או תו ומחזירה את המקו )"s1.indexOf("pl הראשו שממנו מופיעה המחרוזת הנתונה או התו הנתו בתו! המחרוזת שעליה מופעלת הפעולה .א כאשר ב( s1נמצאת המחרוזת ''a 3 ""people של )'s1.indexOf('o כאשר ב( s1נמצאת המחרוזת המחרוזת או התו לא מופיעי ,יוחזר הער! .(1 2 ""people )s1.equals(s2 )equals(String s פעולה המקבלת מחרוזת, כאשר ב( s1נמצאת המחרוזת ומחזירה trueא המחרוזת " "loveוב( s2נמצאת המחרוזת ""Love שעליה הופעלה הפעולה בוליאני והמחרוזת הנתונה שוות זו )s1.equals(s2 לזו בדיוק .אחרת ,היא כאשר ב( s1נמצאת המחרוזת " "loveוב( s2נמצאת מחזירה .false המחרוזת ""love הוראת המדעים ,אוניברסיטת תל-אביב -410- מדעי המחשב false true פעולה המקבלת מחרוזת, ומשווה בינה לבי המחרוזת שעליה הופעלה הפעולה .א ה שוות זו לזו מוחזר הער! )compareTo(String s .0א המחרוזת עליה )s1.compareTo(s2 מופעלת הפעולה קודמת כאשר ב( s1נמצאת המחרוזת " "aaוב( s2נמצאת המחרוזת למחרוזת הנתונה ,על פי סדר מילוני ,יוחזר מספר של שלילי .א המחרוזת הנתונה קודמת על פי סדר מילוני של ""ab מספר חיובי כלשהו למחרוזת שעליה מופעלת הפעולה ,יוחזר מספר של חיובי. )(toLowerCase פעולה שיוצרת ומחזירה מחרוזת שזהה למחרוזת עליה היא מופעלת ,פרט לכ! שבמקו כל אות לועזית גדולה נמצאת האות הקטנה המתאימה לה. )(s1.toLowerCase מחרוזת כאשר ב( s1נמצאת המחרוזת ""Peace המחרוזת החדשה ""peace פעולה שיוצרת ומחזירה )(toUpperCase )substring(int k מחרוזת שזהה למחרוזת עליה היא מופעלת ,פרט לכ! שבמקו כל אות לועזית גדולה נמצאת האות הקטנה המתאימה לה. פעולה שיוצרת ומחזירה מחרוזת שזהה לתת(מחרוזת המתחילה מהמקו ה( kשל המחרוזת עליה היא מופעלת, ועד סופה הוראת המדעים ,אוניברסיטת תל-אביב -411- מחרוזת מחרוזת )(s1.toUpperCase המחרוזת כאשר ב( s1נמצאת המחרוזת החדשה ""Peace ""PEACE )s1.substring(4 המחרוזת כאשר ב( s1נמצאת המחרוזת החדשה ""GoodBye ""Bye מדעי המחשב substring(int k, )int s פעולה שיוצרת ומחזירה מחרוזת שזהה לתת(מחרוזת המתחילה מהמקו ה( kשל המחרוזת עליה היא מופעלת, ואורכה הוא ,s-kכלומר, היא מסתיימת במקו ה( כאשר ב( s1נמצאת המחרוזת המחרוזת החדשה ""GoodBye Israel ""Bye Is )s1.substring(4,10 מחרוזת )(s-1 הוראת המדעים ,אוניברסיטת תל-אביב -412- מדעי המחשב