עבודה עם מחרוזות – string
הכרנו קודם את טיפוס הנתונים הטקסטואלי (משפטים), ובפרק זה נרחיב מעט בטיפול במחרוזות אלה. ראוי לציין שטיפוס המחרוזת string הוא מחלקה בשפת סי שארפ, שיש לה חשיבות רבה בטיפול בטקסטים.
המחרוזות שנשמרות במשתנה מטיפוס string הן קבוצה של תווים המסודרים זה ליד זה, והם קיימים בכל הטקסטים של המחשבים (UNICODE). הסידור שלהם מזכיר את המערך, שהרי המחרוזת היא מערך של תווים (chars), אבל הטיפוס של מחרוזת זו הוא string.
הגדרת משתנה מטיפוס string:
כמובן, זו הכרזה על המשתנה, אבל הוא אינו מכיל ערך בעל משמעות (יש בו זבל), ולכן ראוי לתת לו ערך התחלתי או לקלוט ערך מן המשתמש ולשמור אותו בו.
מתן ערך התחלתי באופן הבא:
string name = "Hammam";
אפשר גם:
string name; name = "Hammam";
קליטה מן המשתמש:
נשים לב שקליטת נתונים מטיפוס string נעשית בעזרת Console.ReadLine(), ואין צורך להשתמש בפעולה Parse
כאן לא כתבנו משפט שאלה, אבל עדיף תמיד לכתוב משפט שאלה למשתמש, כדי להבהיר לו אילו נתונים אנו רוצים לקלוט ממנו.
string name;
Console.Write("Insert your name: "); // משפט שאלה
name = Console.ReadLine();הדפסת מחרוזות נעשית בעזרת Console.Write( ), כפי שלמדנו קודם, וכך גם הדפסת הערך של משתנים מטיפוס string
Console.WriteLine("I am Hammam!");נלמד פעולות שפועלות על מחרוזות:
9.1 Length
אם נפעיל את הפעולה Length על משתנה מטיפוס מחרוזת, פעולה זו תיתן לנו ערך שלם, והוא אורך המחרוזת מבחינת תווים (מספר התווים במחרוזת, כולל תו הרווח).
static void Main(string[] args)
{
int l1;
string name = "Hammam Wattad!";
string user_name; // קולטים את שם המשתמש
Console.Write("insert your name with your family name:");
user_name = Console.ReadLine();
l1 = name.Length;
Console.WriteLine("The length of my name is {0}",l1);
Console.WriteLine("The length of your name is {0}",user_name.Length);
}insert your name with your family name:Abd wattad The length of my name is 14 The length of your name is 10
כבר טיפלנו בפעולה זו במערך, וזה מראה שאנו מטפלים במחרוזת כמו במערך, שהרי המחרוזת היא מערך של תווים (chars), אבל הטיפוס של מחרוזת זו הוא string.
9.2 הסוגריים [ ]
בדיוק כמו במערך, אפשר לפנות לכל תו ותו בתוך המערך לפי המספר הסידורי שלו, בעזרת הסוגריים המרובעים [ ] עם שם המשתנה מטיפוס מחרוזת string, כפי שראינו במערכים. לתו הראשון במחרוזת יש המספר הסידורי 0, ואילו לאות האחרונה במחרוזת יש המספר הסידורי Length-1
משתנים מטיפוס מחרוזת string הם משתנים לקריאה, ואי אפשר לשנות את תוכן התווים שלהם במהלך עבודת התוכנית.
static void Main(string[] args)
{
string name = "Hammam";
char first_char = name[0];
char last_char = name[name.Length-1];
Console.WriteLine("The first character of my name is: {0}",first_char);
Console.WriteLine("The last character of my name is: {0}", last_char);
}בהרצת התוכנית נקבל את התוצאה הבאה:
The first character of my name is: H The last character of my name is: m
פתרון:
static void Main(string[] args)
{
string name;
Console.Write("Insert your name: ");
name = Console.ReadLine();
char first_char = name[0] ;
char last_char = name[name.Length - 1];
if(first_char == last_char)
Console.WriteLine("Your name is unique");
}אם נריץ את התוכנית עבור הקלט mriam נקבל את התוצאה הבאה:
Insert your name: mriam Your name is unique
9.3 התאמת מחרוזות (שוויון) Equals
פעולה זו משווה בין שתי מחרוזות לפי התווים שבהן.
הפעולה נותנת ערך:
- true אם שתי המחרוזות שוות.
- false אם שתי המחרוזות אינן שוות.
לכן נשמור את ערך הפעולה (הערך שהיא מחזירה לנו) במשתנה מטיפוס בוליאני (bool).
"Hammam".Equals("hammam"); //false
"hammam".Equals("hammam"); // true
string.Equals("Hammam", "hammam"); //false
string.Equals("hammam", "hammam"); //trueעל התוכנית לקלוט סיסמה (פסוורד) מן המשתמש. אם המשתמש הכניס סיסמה נכונה (התואמת גם באותיות גדולות וקטנות), התוכנית מדפיסה את סכום הכסף שנמצא בחשבון הבנק של המשתמש (נניח שהוא 3243.2 שקלים), ואם הסיסמה שגויה התוכנית לא תיתן שום מידע ותדפיס שהסיסמה שגויה.
static void Main(string[] args)
{
string real_password = "A4fortN8";
string password;
bool pass;
Console.Write("Insert a password: ");
password = Console.ReadLine();
pass = real_password.Equals(password);
if (pass)
Console.WriteLine("you own 3243.2 shekels");
else
Console.WriteLine("Password incorrect");
}כמה תוצאות אחרי ההרצה:
Insert a password: Hammam Password incorrect
Insert a password: A4fortN8 you own 3243.2 shekels
Insert a password: A4fortn8 Password incorrect
9.4 השוואת מחרוזות CompareTo
זו פעולה שמשווה בין שתי מחרוזות לפי כללי המיון של התרבות המוגדרת במחשב (culture), ולא לפי המספר הסידורי (הקוד) שלהן בטבלת ASCII.
int string.CompareTo(string? strB)
אם:
- המחרוזות שוות, היא נותנת לנו 0
- המחרוזת הראשונה קטנה (קודמת או לפני) מן המחרוזת השנייה, היא נותנת לנו ערך שלילי
- המחרוזת הראשונה גדולה מן המחרוזת השנייה (אחרי), היא נותנת לנו ערך חיובי
static void Main(string[] args)
{
string s1 = "ahmad";
string s2 = "ahmed";
string s3 = "ali";
string s4 = "hammam";
Console.WriteLine(s4.CompareTo(s3)); // 1
Console.WriteLine(s1.CompareTo(s2)); //-1
Console.WriteLine(s3.CompareTo(s1)); //1
Console.WriteLine(s4.CompareTo("hammam")); //0
}פעולה זו משמשת למיון מילים בסדר אלפביתי (כמו במילון).
9.5 ביטול הרווחים המיותרים Trim, TrimStart ו-TrimEnd
זו פעולה שפועלת על מחרוזת ומוחקת את הרווחים המיותרים (החוזרים) מן המחרוזת.
Trimמוחקת את הרווחים המיותרים מתחילת המחרוזת ומסוף המחרוזת.TrimStartמוחקת את הרווחים המיותרים מתחילת המחרוזת בלבד.TrimEndמוחקת את הרווחים המיותרים מסוף המחרוזת בלבד.
static void Main(string[] args)
{
string str = " Hammam abd wattad ";
string str_all, str_start, str_end;
str_all = str.Trim();
str_start = str.TrimStart();
str_end = str.TrimEnd();
Console.WriteLine("str_all ={0}"+"!",str_all);
Console.WriteLine("str_start ={0}"+"!", str_start);
Console.WriteLine("str_end ={0}"+"!", str_end);
}אחרי הרצת התוכנית נקבל את התוצאה הבאה:
str_all =Hammam abd wattad! str_start =Hammam abd wattad ! str_end = Hammam abd wattad!
9.6 המרת אותיות ToUpper ו-ToLower
ToUpper היא פעולה שהופכת את האותיות הקטנות במחרוזת לגדולות.
string string.ToUpper()
ToLower היא פעולה שהופכת את האותיות הגדולות במחרוזת לקטנות.
string string.ToLower()
static void Main(string[] args)
{
string s1 = "Hammam Abd Wattad \nMr.Wattad is a teacher";
Console.WriteLine(s1);
Console.WriteLine("************");
s1 = s1.ToUpper();
Console.WriteLine(s1);
Console.WriteLine("************");
s1 = s1.ToLower();
Console.WriteLine(s1);
}אחרי הרצת התוכנית קיבלנו את התוצאה הבאה:
Hammam Abd Wattad Mr.Wattad is a teacher ************ HAMMAM ABD WATTAD MR.WATTAD IS A TEACHER ************ hammam abd wattad mr.wattad is a teacher
9.7 מיקום תו במחרוזת IndexOf
זו פעולה שנותנת לנו את המקום שבו תו מופיע בתוך מחרוזת (לפי מספר האינדקס הסידורי, כלומר התא הראשון הוא אפס). אם התו אינו נמצא, הפעולה נותנת את הערך 1-.
static void Main(string[] args)
{
string s1 = "Hammam Abd Wattad";
int i,j,k;
i = s1.IndexOf("b"); //8
j = s1.IndexOf('b'); //8
k = s1.IndexOf("Abd"); //7
Console.WriteLine("i = {0}",i);
Console.WriteLine("j = {0}", j);
Console.WriteLine("k = {0}", k);
}בהרצת התוכנית נקבל:
i = 8 j = 8 k = 7
9.8 החלפת תו באחר במחרוזת Replace
זו פעולה שמחליפה תו או קטע מן המחרוזת בתו אחר או במחרוזת אחרת.
string string.Replace(char oldChar, char newChar)
static void Main(string[] args)
{
string s1 = "Hammam Abd Wattad \nMr.Wattad is a teacher";
Console.WriteLine(s1);
Console.WriteLine("*********");
s1=s1.Replace("Wattad", "Hamad");
Console.WriteLine(s1);
}אחרי הרצת התוכנית נקבל:
Hammam Abd Wattad Mr.Wattad is a teacher ********* Hammam Abd Hamad Mr.Hamad is a teacher
9.9 חיתוך חלק מן המחרוזת Substring
זו פעולה שנותנת לנו חלק ממחרוזת, ממקום מסוים שאנו קובעים ובאורך שאנו קובעים.
static void Main(string[] args)
{
string s1 = "Hammam Abd Wattad";
string s2;
s2 = s1.Substring(7, 3); // "Abd"
Console.WriteLine(s2);
Console.WriteLine(s1.Substring(11,1));// "W"
Console.WriteLine(s2.Substring(0, 1));// "A"
}אחרי ההרצה נקבל את התוצאה הבאה:
Abd W A