720 likes | 905 Views
לולאות - Loops. שני סוגי לולאות: 1. Do While Loop - תיכנס ללולאה אם תנאי כלשהו מתקיים, ותמשיך להיכנס ללולאה כל עוד התנאי ממשיך להתקיים וריאציה: Do Until Loop - תיכנס ללולאה אם תנאי כלשהו לא מתקיים, ותמשיך להיכנס ללולאה כל עוד התנאי ממשיך לא להתקיים. Do-While-Loop
E N D
לולאות- Loops • שני סוגי לולאות: • 1. Do While Loop - תיכנס ללולאה אם תנאי כלשהו מתקיים, ותמשיך להיכנס ללולאה כל עוד התנאי ממשיך להתקיים • וריאציה: Do Until Loop - תיכנס ללולאה אם תנאי כלשהו לא מתקיים, ותמשיך להיכנס ללולאה כל עוד התנאי ממשיך לא להתקיים Do-While-Loop לא מתבצע אם התנאי לא קיים בהתחלה Do Until Loop לא מתבצע אם התנאי קיים בהתחלה
לולאות- Loops • 2. Do Loop While - תיכנס ללולאה בכל מקרה, ואז תבדוק אם התנאי מתקיים, ואם כן, תמשיך להיכנס ללולאה • ווריאציה: Do Loop Until - תיכנס ללולאה בכל מקרה, ואז תבדוק אם התנאי לא מתקיים, ואם לא, תמשיך להיכנס ללולאה Do-Loop-While מתבצע לפחות פעם אחת ובודק. אם התנאי קיים ממשיך. Do-Loop-Until מתבצע לפחות פעם אחת ובודק. אם התנאי לא קיים ממשיך.
Do-While-Loop קידוד - Do [{While |Until}]ביטוי בוליאני [פקודות] [Exit Do] [פקודות] Loop Do While – ממשיכים להיכנס ללולאה כל עוד התנאי מתקיים, ויוצאים מיד כאשר הוא מפסיק להתקיים Do Until - ממשיכים להיכנס ללולאה כל עוד התנאי לא מתקיים, ויוצאים מיד כאשר הוא מתחיל להתקיים הערה: המילים Do ו-Loop מיושרים. התוכן של הלולאה מוכנס פנימה.
Alternative Coding for Do-While-Loop השימוש הכי נפוץ של פקודת Do הוא כדלהלן: Do While ביטוי בוליאני [פקודות] [Exit Do] [פקודות] Loop היות והוא כל כך נפוץ, קיימת צורה מיוחדת עבורו: While ביטוי בוליאני [פקודות] [Exit While] [פקודות] End While
תרשים זרימה עבור Do-While התחל Count 1 Count<=10 Count Count+1 Count סיים
תוכנית ללולאה פשוטה • Dim Count As Integer • Count = 1 • Do While (Count <= 10) • Console.WriteLine _ • ("Number of cycle through the loop: {0}", Count) • Count = Count + 1 • Loop
אופרטור חדש: += • במקום Count = Count + 1, נוכל לכתוב: Count += 1 • אופרטורים דומים: יהי x = 6, y = “Hello “. נבצע את הפעולות הבאות אחת אחרי השניה. • -= x -=3 means x = x – 3 => x = 3 • *= x *=3 means x = x * 3 => x = 9 • /= x /=3 means x = x / 3 => x = 3 • &= y &=“ John” means y = y & ”John”, • y = “Hello John”
דוגמא קלטים: A – ספרה, למשל 8 B – מספר כלשהו עם הרבה ספרות, למשל 57382 פלט: True אם A סיפרה המוכלת ב-B, אחרת False
התחל תרשים זרימה A, B Found <--False Found True לא B=0 or Found C=A C B Mod 10 כן B B\10 Found סיים
קוד ב-VB Sub Main () Dim Found as Boolean Dim A ,B, C, D as Integer Console.writeline (“What number do you want?”) D= console.readline() B = D Console.writeline (“What digit do you want?”) A = console.readline() Do Until B = 0 or Found C = B Mod 10 If C = A Then Found = True: Console.Writeline (“{0} contained in {1}”, A, D) Else B = B \ 10 End If Loop End Sub חילוק שלם נותן רק את החלק השלם של המנה
פתרון יותר קל ויותר קצר • Sub Main • Dim A_IN, B_IN as string • Console.writeline (“What number do you want?”) • B_IN = console.readline() • Console.writeline (“What digit do you want?”) • A_IN = console.readline() • If B_IN.contains (A_IN) thenConsole.Writeline (“{0} contained in {1}”, A_IN,B_IN) • End If • End Sub
לולאות - בדיקה בסוף Do [פקודות] [Exit Do] [פקודות] Loop [{While |Until}] בוליאניביטוי Do Loop While - Next iteration only if condition holds Do Loop Until - Next iteration only if condition doesn’t hold היות והתנאי נבדק רק בסוף, תמיד יש לפחות איטרציה אחת
Do-Loop-While/Until התחל Count 11 Count Count Count + 1 Count > 10 לא סיים
Code: Ex2.8 –DoLoopUntilדוגמא של לולאה שמתבצעת פעם אחת גם כאשר התנאי לא מתקיים • Dim Count As Integer • Count = 11 ‘still allows one loop • Do • Console.WriteLine _ ("Number of cycle through the loop: " & Count) • Count = Count + 1 • Loop Until Count > 10
עוד דוגמא • קלט: טקסט באנגלית. • כללי איות: • האות i קודם לאות e, אם מיד לפני ה-i יש כל אות חוץ מ-c • האות e קודם לאות i, אם מיד לפני ה-e יש האות c • בהתחלת מילה האות e תמיד קודם לאות i • פלט: מספר הפעמים שהאות i מופיע במילה, ובנוסף מיקומו של כל טעות, כאשר טעות קורית כאשר e מופיע לפני i (אלא אם זה בהתחלת המלה), או i מופיע לפני e והאות הקודמת הייתה c, למשל • chief not cheif, but • receive not recieve
התחל Text pos -1, num 0 Check for Spelling Mistake pos = -1? לא כן סיים
Check for Problem מיקומו של האות i הבא pos לא pos =-1” כן כן pos = 0 לא מספר פעמים שהאותi מופיע שווה ל-num כן האם במקום pos+1 יש “e” לא לא כן pos = 1 לא – יש “i" במקום האחרון במילה pos >= 2 <mila.length - 1 כן האם יש “c” לפניו ו-“e” אחריו כן בעיה במקום pos לא לא האם יש ""ce לפניו האם יש “c” לפניו ו-“e” אחריו או ""ce לפניו כן בעיה במקום pos לא כן בעיה במקום pos בעיה במקום pos num +=1 חזור
Sub Main () Dim mila As String ‘pos is present position, num is number of i’s Dim pos, num As Integer Console.WriteLine("insert a word:") mila = Console.ReadLine() pos = -1 Do pos = mila.IndexOf("i", pos + 1) If pos = -1 Then Console.WriteLine("The number of i's is {0}", num) ElseIf pos = 0 Then If mila.Chars(pos + 1) = "e" Then Console.WriteLine("taut bekom 0") ElseIf pos = 1 Then If mila.Chars(0) = "c" And mila.Chars(2) = "e" Then Console.WriteLine("taut bekom 1") End If קוד ב-VB
Code in VB ElseIf pos >= 2 And pos < mila.Length - 1 Then If mila.Chars(pos - 1) = "c" And mila.Chars(pos + 1) = "e" _ Or mila.Chars(pos - 2) <> "c" And mila.Chars(pos - 1) = "e" Then Console.WriteLine("taut bekom {0}", pos) End If Else If mila.Chars(pos - 2) <> "c" And mila.Chars(pos - 1) = "e" Then Console.WriteLine("taut bekom {0}", pos) End If End If num += 1 Loop Until pos = -1 end sub
הסבר התוכנית • עוברים דרך המילה בקפיצות מאות "i" לאות "i" עד שמגיעים לסוף המילה. מוצאים כל אות "i" בעזרת פקודת indexof כאשר בכל פעם מתחילים את החיפוש מן התו שבא אחרי ה- "i" הקודם. • ישנן 5 אפשרויות, ומתייחסים לכל אחת בנפרד. • 1. pos = -1. זה קורה כאשר לא נשארו הופעות נוספות של האות (או שכלל לא היו). מדפיסים אז את מספר ההופעות • 2. pos=0, דהיינו שיש "i" במקום הראשון במלה, ואז אם יש "e" במקום השני התוכנית מתריעה על טעות • 3. pos=1, דהיינו שיש "i" במקום השני במלה, , ואז אם יש "c" לפניו ו- "e" אחריו, התוכנית מתריעה על טעות
הסבר התוכנית • 4. pos>=2, אבל לא שווה למקום האחרון במילה דהיינו שיש "i" במקום שני והלאה אבל לא במקום האחרון, ואז אם יש "c" לפניו ו- "e" אחריו, או "xe" לפניו, כאשר "x" מסמן כל אות חוץ מ-"c", אזי שוב פעם התוכנית מתריעה על טעות. • 5. יש "i" במקום האחרון, ואז אם יש "xe" לפניו, כאשר "x" מסמן כל אות חוץ מ-"c", אזי שוב פעם התוכנית מתריעה על טעות.
מאפיינים של לולאות • 1. אתחל משתנה האינדקס • 2. בדוק תנאי (או בהתחלה או בסוף של הלולאה) שמכיל את משתנה האינדקס. תנאי זה חייב לשנות את ערכו באיזשהו מקום בלולאה, אחרת נגיע ללולאה אינסופית • 3.הגדל את ערכו של משתנה האינדקס.
For – Next Loop • לולאת For – Next משלב כל 3 המאפיינים לפקודה אחת. General Format: • For counter [as datatype] = first to last [Step כמות] [פקודות] [Exit For] [פקודות]Next [counter]
Ex2.9-BasicForLoop • 1: Dim Count As Integer, Ans As String • 2: For Count = 1 To 10 • 3: Console.WriteLine("Counting at {0}”, Count) • 4: Console.WriteLine("Another? Yes or No") • 5: Ans = Console.ReadLine() • 6: If Ans.ToUpper = "NO" Then Exit For • 'Chance to leave early. 1 line If • 7: Next Count ‘The word count is optional
הסבר Ex2.9-BasicForLoop – • שורות 2,3,8: Basic For Loop מדפיס ערכים מ-1 עד 10. גידול, אתחול, ובדיקת תנאי הוא אוטומטי בפקודה זו. בשורה 2, אילו הוספנו ,STEP 2 רק 1,3,5,7 ו-9 היו מודפסים. • שורה 2. האפשרות של [as datatype] מאפשרת לנו לשכתב שורה 2 ככה: For Count as Integer = 1 To 10, ואז לא צריכים להגדיר מראש את Count (לפעמים עובד גם בלי להוסיף As Integer). • שורה 6: מאפשרת יציאה מוקדמת מן הלולאה בעזרת Exit For אם עונים לשאלה תשובה שלילית.
דוגמא - חישובN! התחל N Natzeret 1 i1 i >N לא Natzeret<--Natzeret * i ii + 1 כן סיים
קוד ב-VB Dim i as integer, Natzeret as integer, N as integer Console.writeline (“What factorial do you want?”) N = console.readline() Natzeret = 1 For i = 1 to N Natzeret = Natzeret * i ‘Natzeret *= i Next Console.writeline (Natzeret) עבור N=0, הלולאה לא תתבצע כלל
דוגמא קשה - פענוח ספרות רומיות • מספר רומי מיוצג על ידי רצף של תווים כאשר לכל תו יש משמעות מספרית לפי הערכים הבאים: • I=1 • V=5 • X=10 • L=50 • C=100 • D=500 • M=1000 • מקובל לקרוא מספר רומי משמאל לימין וערכו המספרי שווה לסכום כל התווים. לדוגמא המספר 38 נכתב בייצוג רומי כך: XXXVIII. • כלל זה נכון לכל הספרות פרט ל: 4 שנכתב על ידי IV כלומר 5-1 • 9 שנכתב על ידי IX כלומר 10-1 • ובאותו האופן מיצגים את כל המספרים שמכילים ספרות אילו. לדוגמא 40 מיוצג על ידי XL (50-10) וכו'. לפי כלל זה המספר 1999 נכתב MCMXCIX. • לכתוב תוכנית המקבלת מספר רומי כמחרוזת ומחשבת את ערכו המספרי.
פענוח ספרות רומיות • Module Module1 • Sub Main() • Dim I, V, X, L, C, D, M, lng, q, num As Integer • Dim str, w As String • I = 1 : V = 5 : X = 10 : L = 50 : C = 100 : D = 500 : M = 1000 • Console.WriteLine(“Insert number in Roman numerals") • Console.WriteLine("I = 1 : V = 5 : X = 10 : L = 50 : C = 100 : D = 500 : M = 1000") • str = Console.ReadLine() • str = str.ToUpper • lng = str.Length • For q = 0 To (lng - 1) ‘Test to be sure no illegal characters • If (str.Chars(q) <> "I") And (str.Chars(q) <> "V") _ • And (str.Chars(q) <> "X") And (str.Chars(q) <> "L") _ • And (str.Chars(q) <> "C") And (str.Chars(q) <> "D") _ • And (str.Chars(q) <> "M") Then • Console.WriteLine(“Some letters are not Roman Numerals") • Exit Sub • End If • Next q
פענוח ספרות רומיות • q = str.IndexOf("IV") ‘removing meaningful doubles • If q >= 0 Then • num = num + 4 • str = str.Replace("IV", "") • Console.WriteLine(str & num & " " & q) • End If • q = str.IndexOf("IX") • If q >= 0 Then • num = num + 9 • str = str.Replace("IX", "") • End If • q = str.IndexOf("XL") • If q >= 0 Then • num = num + 40 • str = str.Replace("XL", "") • End If • q = str.IndexOf("XC") • If q >= 0 Then • num = num + 90 • str = str.Replace("XC", "") • End If
פענוח ספרות רומיות • q = str.IndexOf(“CD") • If q >= 0 Then • num = num + 400 • str = str.Replace(“CD", "") • End If • q = str.IndexOf("CM") • If q >= 0 Then • num = num + 900 • str = str.Replace("CM", "") • End If • For q = 0 To str.Length – 1 ‘evaluating remaining valid numerals • w = str.Chars(q) • If w = "I" Then num = num + I • If w = "V" Then num = num + V • If w = "X" Then num = num + X • If w = "L" Then num = num + L • If w = "C" Then num = num + C • If w = "D" Then num = num + D • If w = "M" Then num = num + M • Next q • Console.WriteLine(num) • Console.ReadKey() • End Sub • End Module
Ex2.10-ForWithinFor • 1: Dim Outer As Integer, In1 As Integer • 2: For Outer = 5 To 1 Step -1 • 3: For In1 = 1 To Outer • 4: Console.Write(In1 & " ") • 5: Next In1 • 6: Console.WriteLine() 'new line • 7: Next Outer
Ex2.10-ForWithinFor - Explanation • שורה 2: Step -1 גורם למשתנה Outer לקטון מ-5 ל-1 • שורה 4: כזכור, WRITE גורם לכתיבה בלי לעבור לשורה הבאה (כמו ש-WRITELINE עושה), כך שהמספרים יהיו צמודים אחד לשני. • שורה 6: מעבר לשורה הבאה. • תוצאות : 1 2 3 4 5 • 1 2 3 4 • 1 2 3 • 1 2 • 1
לולאות עם גבול עליון לא ידוע • דוגמא: חשב את המשכורת של מספר לא ידוע של עובדים. • שתי אפשריות: • 1. מספר העובדים לא ידוע בזמן כתיבת התוכנית, אבל כן ידוע בזמן הרצת התוכנית. • פתרון: הזן בזמן ההרצה את מספר העובדים. • 2. מספר העובדים לא ידוע גם בזמן ההרצה. • פתרון: Do-Whileשמכיל תנאי שהופך להיות False אחרי הזנת פרטי העובד האחרון.
דוגמא: הענקת ערך לא מציאותי למשתנה כלשהו בסוף קריאת הנתונים התחל מכיוון שאנחנו יודעים ש:1- אינו ערך מציאותי עבור Rate, אנחנו יוצאים מן הלולאה Rate Rate <>-1 Hours Salary Hours * Rate Salary Rate סיים
Ex2.11-Flags • ' Read input data until the input rate equals the flag • ' Requires reading rate input twice, before the loop ‘and in the loop • 1: Const EndOfData = -1 ' Serves as a flag • 2: Dim Rate, Hours, Salary As Decimal • 3: Console.WriteLine("What is the Rate?") • 4: Rate = Console.ReadLine()
Ex2.11-Flags • 5: Do While Rate <> EndOfData • 6: Console.WriteLine("How many hours?") • 7: Hours = Console.ReadLine() • 8: Salary = Hours * Rate • 9: Console.WriteLine("Your Salary is: {0: C}”,Salary) • 10: Console.WriteLine("What is the Rate?") • 11: Rate = Console.ReadLine() • 12: Loop
הסבר Ex2.11-Flags - • שורות 3,4: קריאת Rate לפני הלולאה. בסוף, כשיהיה -1, לא ניכנס ללולאה. • שורות 10, 11: קריאת Rate לפני סוף הלולאה. כשמזינים -1, לא ניכנס שוב ללולאה. נמשיך עם יתר התוכנית.
דרך שנייה לציין הסוף: הצבת “NO” במשתנה המשמש כדגל הלולאה תמשיך להתבצע כל עוד לא נתנו ערך של "NO" למשתנה שנקרא Flag. כל ערך אחר יאפשר ללולאה להמשיך להתבצע, ולכן זה מפסיק ללחוץ על Enter כל פעם שהשאלה אם להמשיך נשאלת, חוץ מאשר בפעם האחרונה, שאז חייבים להזין "NO". התחל Flag ”YES” Flag <>”NO” Rate Hours לא Salary Salary Hours * Rate No More? כן Flag ”NO” See Ex2.12-QuestionFlag סיים
Program Ex12-QuestionFlag • ' Read input data until the flag variable indicates end of data • ' Requires defining a special flag variable • Const EndOfData = "NO" ' Serves as a flag • Dim Rate, Hours, Salary As Decimal • Dim Flag As String = "Yes" • Do While Flag.ToUpper <> EndOfData • Console.WriteLine("What is the Rate?") • Rate = Console.ReadLine() • Console.WriteLine("How many hours?") • Hours = Console.ReadLine() • Salary = Hours * Rate • Console.WriteLine("Your Salary is: {0: C}” , Salary) • Console.WriteLine("Any more(Yes/No)?") • Flag = Console.ReadLine() • Loop • End Sub
הסבר - Ex12.2-QuestionFlag • יתרונות לשיטה זו • פקודת קריאה למשתנה Rate מופיעה רק פעם אחת • משתנה נוסף – Flag – משמש כדגל • התנאי מתבסס על משתנה הדגל. • חסרון: חייבים לענות על שאלת ההמשך כל פעם שהלולאה מתבצעת
דרך שלישית לציין סוף נתונים • Dim Rate as string, Rate_Num as Single • Dim EndOfData as Boolean • Do Until EndOfData • If Rate = “” thenEndOfData = True • Else If IsNumeric (Rate) Then Rate_Num = Rate …. End If • EndIf • Loop • מאפשר לחיצת ENTER כשהנתונים נגמרים • תרגיל 8 – שאלות אי-זוגיות
Select • הרחבה של IF, שבמקור עובד עם רק 2 אפשרויות • מחלק את כל האופציות לקבוצות מקבילות • דרך פשוטה לתאר כל קבוצה ואבריה • מסתיים בטיפול בקבוצה הראשונה שהקלט תואם לה (גם אם הוא תואם לכמה קבוצות)
דוגמא • ילדים מגיל 1 עד 13 יכולים רק לרכב על אופניים • ילדים בגיל 14,15 יכולים גם לרכב על אופנוע • אנשים בני 16 ומעלה יכולים גם לנהוג ברכב • תוכנית: קולט גיל, מדפיס אופציות הפתוחות לאותו אדם
קוד לדוגמא עם Select • 1: Dim Age As Integer • 2: Console.WriteLine("Input Age") • 3: Age = Console.ReadLine() • 4: Select Case Age • 5: Case 1 • 6: Console.WriteLine("Only bike") • 7: Case 2, 3, 4 • 8: Console.WriteLine("Only bike") • 9: Case 5, 6, 7 To 13 • 10: Console.WriteLine("Only bike") • 11: ' Alternative way of showing this • 12: ' Case Is < 14 • 13: ' Console.WriteLine("Only bike") • 14: Case Is < 16 • 15: Console.WriteLine("Only bike or motorcycle") • 16: Case Else • 17: Console.WriteLine(“Even a Car") • 18: End Select
Select Format • Format: • Select Case <ביטוי לבדיקה> • [Case <רשימה להשוואה> • פקודות] • ……………………… • [Case Else • פקודות] • End Select
Select Format - Explanation • ביטוי לבדיקה (test expression) : 1 מתוך 4 אפשרויות • 1. ביטוי אריתמטי אם ערך שלם או דצימלי. אם החלק העשרוני חוזר על עצמו ( למשל 4/3), רשימת ההשוואה צריכה להכיל טווח ולא ערך מדויק. • 2. ביטוי בוליאני • 3. ביטוי מסוג מחרוזת (1 או יותר מחרוזות מחוברות על ידי אופרטורים המתאימים למחרוזות) • 4. תאריך
הסבר Select Format - • רשימה להשוואה 1 או יותר מ-3 האפשרויות דלהלן, מופרדות על ידי פסיקים: 1. ביטוי (Expression), למשל אריתמטי עם ערך שלם או דצימלי, מסוג מחרוזת, תאריך, או בוליאני • 2. Expression1 TO expression2. אם מדובר על ביטוי מסוג מחרוזת, אנו מקבלים כל מחרוזת שערכו האלפביתי הוא בין expression1 ו-expression2. למשל “black” to “green” כולל "brown" • 3.IS <operator> expression כאשר operator הוא אחד מתוך: <,>,<=,>=,=,<>
הסבר התוכנית • שורה 4: הביטוי האריתמטי מכיל רק משתנה אחד, Age • שורה 5: ביטוי אריתמטי המורכב ממספר אחד • שורה 7: ביטויים אריתמטיים חד-ערכיים מופרדים על ידי פסיקים • שורה 9: כולל אופציית הטווח: 7 To 13