מחלקת טיפוס הנתונים מחרוזת (String) כוללת בתכנית הלימודים, אך מוגבלת לפעולות הבאות בלבד: myString[ind], .Contains(value), .IndexOf(char), .Length
הערה למורים
נובע, שאין הכרח ללמד את הכלים הנוחים שראינו שהם שימושיים ליום יום להדפסות, ולהקנייה של פעולות בשרשרת על עצמים, אבל פחות רלוונטית בהמשך בעבודה עם פונקציות שמטפלות במערכים ובעצמים: .Replace(), .Substring(), .Split(“,”). תלמידים במקרים רבים גם ישכחו את אופן השימוש הנכון ולכן עדיף להקדיש כמה שפחות זמן לדברים האלו.
לטעמי גם הבנה ההתנהגות של מחרוזת בהיבט של מצביעים לכתובות זכרון הפניות, הבנת המושג immutable הם מיותרים, במיוחד בשלב זה של הלמידה. עדיף להבין לעומק מהו מצביע לאובייקט כשעובדים עם מערכים, ואחר כך מחלקות.
למי שרוצה להתעמק בהבנה הנושא כבר בשלב זה, ניתן להיעזר בפרוייקט שהכנתי כאן. לא נראה זאת בשיעור (למניעת בלבול מיותר). מומלץ לחזור לפרוייקט הזה לאחר לימוד עצמים (הדוגמא מכילה שני פרוייקטים - אחד לעצמים ואחד למחרוזות. יתכן שבהמשך אוסיף גרסה לשלמים)
וכעת, השאלה היא מה נותר ללמד?
כיוון שאנחנו לא בתחילת הלמידה - ניגע ישר בעצם העניין. מחרוזת היא טיפוס שדומה במקצת למערך בכך שניתן לגשת לתו לפי מיקום:
מחרוזת מתנהגת לצורכי קריאה (שליפת נתון) כמו מערך של תווים, ונראה זאת בדוגמא הפשוטה הבאה הממחישה את הנקודה
string s = "Great";
Console.WriteLine(s[1]); // r ידפיס
Console.WriteLine(s[5]); // Exception: index out of range : שגיאת זמן ריצה
// האינדקס האחרון כאן הוא 4, כי האינדקס מתחיל מ-0
אולם מחרוזת אינה באמת מערך מפני שהיא immutable, כלומר, לא ניתן לשנות אותה - לכתוב בתוכה.
s[1] = 'G'; // Property or indexr cannot be assigned to -- it is read only
הגדרות קצרות: IndexOf / Contains / Substring / string.Join
IndexOf- מחזירה את המיקום (אינדקס) הראשון של תו/מחרוזת בתוך המחרוזת; אם לא נמצא מחזירה -1.Contains- מחזירהtrueאם המחרוזת מכילה תו/מחרוזת; אחרתfalse.Substring(start, length)- מחזירה תת-מחרוזת החל ממיקוםstartובאורךlength.string.Join(" ", arr)- מחברת את איברי המערך עם רווחים ביניהם; מומלץ להימנע בשאלות בגרות (יכול להיות שלא יקבלו בבגרות).
דוגמאות קצרות:
שאלה: עבור כל מילה במערך, הדפס את מיקום האות ‘a’.
פתרון (הזדמנות טובה ללמוד foreach)
string[] words = { "cat", "dog", "banana" };
foreach (string word in words)
{
int index = word.IndexOf('a');
Console.WriteLine(index);
}
שאלה: הדפס רק את המילים שמכילות את הרצף “car”.
פתרון (הזדמנות טובה ללמוד foreach)
string[] words = { "car", "cartoon", "dog", "scar" };
foreach (string word in words)
{
if (word.Contains("car"))
{
Console.WriteLine(word);
}
}
שאלה: הדפס את שלושת התווים הראשונים מכל מילה (אם האורך מספיק).
פתרון (הזדמנות טובה ללמוד foreach)
string[] words = { "hello", "to", "world" };
foreach (string word in words)
{
if (word.Length >= 3)
{
Console.WriteLine(word.Substring(0, 3));
}
}
שאלה: חבר את כל המילים במערך למשפט עם רווחים.
פתרון (הזדמנות טובה ללמוד foreach)
string[] arr = { "I", "love", "C#" };
string result = "";
foreach (string word in arr)
{
if (result != "")
{
result += " ";
}
result += word;
}
Console.WriteLine(result);
// אפשר גם: string.Join(" ", arr) אבל מומלץ להימנע (יכול להיות שלא יקבלו בבגרות)
מיון לקסיקוגרפי:
string s1 = "Goat";
string s2 = "great";
string s3 = "car";
string s4 = "Car";
Console.WriteLine(s1.CompareTo(s2)); // -1 meaning s2 comes before
Console.WriteLine(s4.CompareTo(s2)); // -1 meaning car comes before
Console.WriteLine(s4.CompareTo(s3)); // 1 meaning Car comes after car
Console.WriteLine(s4.CompareTo(s4)); // 0 meaning same position
תרגילים להתנסות
st1 = "Take a fake pen";
n = st1.LastIndexOf("ake");
// n = ?
st1 = "Keep it simple";
st2 = "it";
n = st1.IndexOf(st2); // n = ?
s1 = "Think about jumping";
s2 = s1.Remove(5,11);
// s2 = ?
st = "Dont say hello";
s1 = st.Substring(5, 8);
// s1 = ?
s1 = "You are OK";
s2 = "OK";
st = s1.Replace(s2, "awesome");
// st = ?
s1 = "Jish";
s2 = "beri";
st = s1.Insert(2, s2);
// st = ?
השוואה בין Java ל-#C
| פעולה | Java | C# | הערות חשובות |
|---|---|---|---|
| גישה לתו במיקום מסוים | str.charAt(i) |
str[i] |
ב-C# המחרוזת מתנהגת כמו מערך לקריאה בלבד |
| SubString | str.substring(start, end) |
str.Substring(start, length) |
Java: end לא כלול • C#: מציינים אורך |
| IndexOf | str.indexOf("abc") |
str.IndexOf("abc") |
מחזיר -1 אם לא נמצא |
| IndexOf עם התחלה | str.indexOf("a", fromIndex) |
str.IndexOf("a", startIndex) |
חיפוש החל ממיקום נתון |
| אורך מחרוזת | ()str.length |
str.Length |
ב-C# זהו property ולא פעולה |
תרגול
⬅ עִבְרוּ לתרגול 8.1 - מחרוזות