פרק 8 מחרוזות


string דומה למערך

מחלקת טיפוס הנתונים מחרוזת (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 - מחרוזות

סרטונים

סרטוני פרק 8: מחרוזות