מבוא למחשב בשפת Matlab לולאות בלוקי try-catch :10 תרגול מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן אביאור, סאהר אסמיר וטל כהן עבור הקורס "מבוא למדעי המחשב" נכתב על-ידי רמי כהן,אולג רוכלנקו, איתן אביאור ולימור ליבוביץ. כל הזכויות שמורות לטכניון מכון טכנולוגי לישראל
לולאת while a=input('enter a positive number:'); קליטת מספר חיובי : דוגמה התנאי 0=>a מתקיים כל עוד המספר שנקלט חיובי, והפקודות אינו ח שבתוך גוף הלולאה מבוצעות while(a<=0) fprintf('number must be positive, try again\n'); a=input('enter a positive number:'); לא יתקיים, אם ל מלכתחילה נקלט מספר חיובי, תנאי לל הלולאה "ידלג" על הלולאה (כלומר ימשיך מהשורה שאחרי ה- ). ו- Matlab 2
- המשך לולאת while דוגמה דיוק סופי של משתנה מסוג double ב- Matlab : num = 0; EPS = 1; while (1+EPS)>1 EPS = EPS/2; num = num+1; num מוקטן פי שניים, והמשתנה איטרציה של הלולאה, EPS בכל סופר עבורנו את מספר הפעמים שצריך להקטין את EPS עד ש- ממ- 1. חשב יחשיב את 1+EPS כגדול לא Matlab אם נדפיס את ערכי num ו- EPS אחרי ביצוע הלולאה, נקבל: num = 53 EPS = 1.1102e-016 הדיוק הסופי נובע מכך שהמחשב משתמש במספר סופי של סיביות לייצוג מספרים. 3
לולאת for דוגמה חישוב סכום של מערך: array = input( Enter an array: ); array_sum = 0; len = length(array); for(i=1:len) array_sum = array_sum + array(i);.[1,2,3,,len] את הסדרה יוצרת 1:len הפקודה for(i=1:len) באיטרציה הראשונה של לולאת ה- for המשתנה i שווה באיטרציה השנייה ל- 1 ), ל (כלומר [1,2,3,,n] הראשון בסדרה לאיבר לאיבר השני (כלומר ל- 2 ), וכך הלאה, עד לאיטרציה האחרונה בה שווה.( האחרון בסדרה ) (כלומר ל- len לאיבר 4
יעילות נתבונן בקוד הבא: x = []; for n=1:50000 x = [x sin(n*pi/10)]; לא יעיל. בכל איטרציה המערך x גדל באיבר נוסף, וכיוון שהמערך מוחזק באופן רציף בזיכרון, Matlab צריך להקצות מחדש מקום ל- x כל פעם שאין מקום לאיבר נוסף, ואז x כולו מועתק למקום אחר בזכרון. פתרון: ל- x מוקצה מקום בזכרון פעם אחת בלבד. x = zeros(1,50000); for n=1:50000 x(n) = sin(n*pi/10); 5
- דוגמה לולאת for כיצד נמצא את הערך המינימלי במטריצה, ללא שימוש בפונקציה?min A = input('enter a matrix:'); [rows,cols] = size(a); min = A(1,1); for(i=1:rows) for(j=1:cols) if(a(i,j)<min) min = A(i,j); fprintf('the minimum value is %g\n', min); 6
תרגיל 1 ומדפיסה את שלמים, עלינו לכתוב תוכנת תוכנית המקבלת מערך שלמספרם מספריםשלמם הסכום של מספר המופעים של מספרים שמופיעים יותר מפעם אחת. למשל עבור הקלט: הפלט יהיה 5. 8 1 8 4 8 6 4 ועבור הקלט: הפלט יהיה 0. 8-9 6 4 3 2 1 7
פתרון x = input('enter a vector:'); sum = 0; for(i=1:length(x)) indices = find(x == x(i)); count = length(indices); if(count > 1 & indices(1)==i) sum = sum + count; fprintf('the sum is %d\n', sum); 8
תרגיל 2 מבלי מספרי, תוכנת תוכנית הקולטת מחרוזת וממירה אותה לערך כתבו להשתמש ב- str2num. str = input('please enter your number:', 's'); num = 0; for i=1:length(str) digit = str(i) - '0'; num = 10*num + digit; disp(num); 9
תרגיל 3 מרצף תווים כלשהו מקבלת מחרוזת המורכבת כתבו תוכנית אשר ומדפיסה את סכום המספרים השלמים המופיעים במחרוזת. כל שני מספרים שלמים מופרדים ע"י תו כלשהו שאינו ספרה. ) כל המספרים חיוביים (אין צורך להתחשב בסימני '-') ). דוגמאות: עבור המחרוזת 12,34,56 יודפס 102=12+34+56. עבור המחרוזת 10 1 plus 1 equals יודפס.1+1+10=12 עבור המחרוזת 13.71=3.14+10.57 יודפס.3+14+10+57+13+71=168 10
פתרון str = input('enter your string:','s'); sum = 0; number = 0; for i=1:length(str) if (str(i)>='0' & str(i)<='9') % str(i) is a digit digit = str(i) - '0'; number = number*10 + digit; if i==length(str) sum = sum + number; else % str(i) is not a digit sum = sum + number; number = 0; fprintf('the sum is %d\n', sum); 11
ו- continue break,(while או for) גורמת ליציאה מתוך הלולאה break הוראת מבלי להמשיך. מפסיקים בלי לבדוק שוב את התנאי. הוראת continue גורמת לסיום האיטרציה הנוכחית for) או,(while ומעבר לאיטרציה הבאה, אם ניתן. בודקים את התנאי, ואם הוא מתקיים, מתחילים איטרציה לא, סיימנו. חדשה; אם 12
דוגמה לשימוש ב- continue sum=0; for(i=1:10) num=input('enter a number:'); if(num<0) continue; sum = sum+num; התוכנית קוראת 10 מספרים שלמים ומסכמת את המספרים החיוביים שביניהם. 13
דוגמה לשימוש ב- break π = 4 4 4 4... 3 + 5 7 + נחשב קירוב ל- π ע"י הנוסחה: זו נוסחה אינסופית, שככל שמחברים בה יותר איברים מקבלים תוצאה המקרבת טוב יותר את π. כל איטרציה נחבר איבר נוסף בסדרה, ונעצור כאשר השינוי בקירוב של π נעשה קטן מאוד, כלומר יורד בערכו המוחלט מתחת לסף מסוים. my_pi = 0; i = 1; sign = 1; while (1) delta = 4/i; my_pi = my_pi + sign*delta; if (delta < 1e-6) break; The approximation is 3.141593 i = i+2; sign = sign*(-1); fprintf('the approximation is %f', my_pi); 14
לולאות אינסופיות אנסופת אינסופיתהא היא לולאה בה ערך הביטוי שנבדק כתנאי כניסה לולאה ללולאה שונה מאפס תמיד. ניתן ובמקרים אלו לולאות אינסופיות נגרמות לעיתים בשל שגיאה, לצאת מהן ע"י עצירת התכנית באמצעות מערכת ההפעלה (או ע"י כיבוי המחשב). ניתן לייצר לולאות אינסופיות במכוון,.while(1) כמו בדוגמה הקודמת היציאה מלולאה אינסופית מכוונת נעשית באמצעות פקודות כמו ו- return (אותה נלמד בהמשך). ע"י למשל, break 15
תרגיל A = eye(2); while (A) A = A / 2 הבא: מה עושה הקוד expression while expression יכול להיות סקלר או מערך. בכל קמקרה, להיות true כל האיברים צריכים להיות ממשיים, והביטוי כדי ש- expression יהיה.true צריך all(a(:)) ( לכן במקרה הזה, לא יודפס דבר. 16
תרגיל A = eye(2); for i=a j = i + 1 הבא: מה עושה הקוד במקרה של for קיים משתנה לולאה והוא "רץ" על העמודות של A. j = 2 לכן, יתקבל הפלט הבא: פלט האיטרציה הראשונה j = 1 1 פלט האיטרציה השנייה 2 17
בלוקי try - catch try-catch מגן מפני שגיאות שעלולות לעצור את התוכנית התוכנת. בלוק המבנה הכללי של בלוק try-catch הוא: :try-catch אופן ביצוע בלוק try (commands1) catch (commands2) הפקודות commands1 מבוצעות. אם לא מתרחשת שגיאת,Matlab עוברים ל-. אם התרחשה שגיאת Matlab במהלך ביצוע הפקודות,commands1 עוברים לבצע את.commands2 Matlab מעביר את הטיפול בשגיאה לשליטת המשתמש. 18
בלוקי :try catch דוגמה לדוגמה: x = ones(4,2); y = 4*eye(2); try z = x*y; catch z=nan; disp('x and Y are not conformable.') z עבור הערכים הללו של x ו- y, מתקבל הפלט הבא: z = 4 4 4 4 4 4 4 4 19
המשך הדוגמה x = ones(4,2); y = 4*eye(3); try z = x*y; catch z=nan; disp('x and Y are not conformable.') z X and Y are not conformable. z = NaN הבא: במקרה נתבונן הפעם מתקבל פלט אחר: 20
הפונקציות lasterr ו- lasterror מ- commands2 ), ניתן נתן להשתמש בפונקציות מ ה- catch (כחלק ה בתוך lasterr ו- lasterror על מנת לקבל מידע נוסף על השגיאה. x = ones(4,2); y = 4*eye(3); try z = x*y; catch z=nan; lasterr ans = Error using ==> mtimes Inner matrix dimensions must agree. לדוגמה, יודפס: 21
הפונקציות lasterr ו- lasterror - המשך הפונקציה lasterror מחזירה מידע מפורט יותר מ- lasterr. המידע מוחזר במבנה. עבור הדוגמה הנ"ל, הפלט: נכתוב מחדש את בלוק ה- catch : catch z=nan; error = lasterror error = message: [1x58 char] identifier: 'MATLAB:innerdim' stack: [1x1 struct] את הודעת השגיאה כך: למשל, לחלץ ניתן,,error המידע נמצא במשתנה >> error.message ans = Error using ==> mtimes Inner matrix dimensions must agree. 22
הפונקציה rethrow בתוך ה- catch (כחלק מ- commands2 ), ניתן להשתמש בפונקציה השליטה ביחס לטיפול ל- Matlab את מחזירה ל, אשר rethrow בשגיאה. x = ones(4,2); y = 4*eye(3); try z = x*y; catch z=nan; disp('x and Y are not conformable.') rethrow(lasterror) פונקצית ה- rethrow גרמה z ליציאה מהתוכנית, ולכן z לא הודפס. X and Y are not conformable.??? Error using ==> mtimes Inner matrix dimensions must agree. הפלט: 23