מבוא למחשב בשפת Matlab : מטלאב לולאות נכתב על-ידי רמי כהן,אולג רוכלנקו, לימור ליבוביץ ואיתן אביאור כל הזכויות שמורות לטכניון מכון טכנולוגי לישראל
לולאת 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
לולאת for for i=100:200 statement 1 statement 2 גוף הלולאה מבוצע פעם אחת עבור כל איבר במערך 100:200, החל מהערך הראשון במערך. ( 100) במערך ראשון, איבר ראשון סיבוב ן סיבוב שני, איבר שני במערך (101) סיבוב אחרון, איבר אחרון במערך (200) מבוא למחשב בשפת מטלאב. כל הזכויות שמורות 3
לולאת for דוגמה חישוב סכום של מערך (ללא שימוש בפונקציה :(sum array = input( Enter an array: ); array_sum = 0; len = length(array); for(i=1:len) array_ sum = array_ sum + array(i); הפקודה 1:len יוצרת את הסדרה.[1,2,3,,len] for(i=1:len) באיטרציה הראשונה של לולאת ה- for המשתנה i שווה לאיבר הראשון בסדרה [n,,1,2,3] (כלומר ל- 1 ), באיטרציה השנייה לאיבר השני (כלומר ל- 2 ), וכך הלאה, עד לאיטרציה האחרונה בה שווה ל- len ). ל (כלומר האחרון בסדרה לאיבר 4
- דוגמה לולאת 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 %d\n', min); 5
תרגיל מבלי מספרי, תוכנת תוכנית הקולטת מחרוזת וממירה אותה לערך כתבו להשתמש ב- str2num. לדוגמה, המחרוזת 29 תומר לערך המספרי 29. str = input('please enter your number:', 's'); num = 0; for i=1:length(str) digit = str(i) - '0'; num = 10*num + digit; disp(num); 6
תרגיל ומדפיסה את שלמים, תוכנית תוכנת המקבלת מערך של מספרם מספריםשלמם כתבו הסכום של מספר המופעים של מספרים שמופיעים יותר מפעם אחת. למשל עבור הקלט: הפלט יהיה 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
continue או לסיום האטרצה האיטרציההנוכחת הנוכחית for) גורמת continue הוראת,(while ומעבר לאיטרציה הבאה, אם ניתן. ואם הוא מתקיים, מתחילים איטרציה את התנאי, בודקים חדשה; אם לא, סיימנו. 9
דוגמה לשימוש ב- continue sum=0; for(i=1:10) num = input('enter a number:'); if(num < 0) continue; sum = sum + num; התוכנית קוראת 10 מספרים שלמים ומסכמת את המספרים החיוביים שביניהם. 10
break,(while או for) גורמת ליציאה מתוך הלולאה break הוראת מבלי להמשיך. מפסיקים בלי לבדוק שוב את התנאי. מבוא למחשב בשפת מטלאב. כל הזכויות שמורות 11
דוגמה לשימוש ב- break while(true) x = input('please enter your number:'); if x > 0 break; התוכנית מנסה לקלוט מספר עד אשר המספר שנקלט הוא חיובי. 12
דוגמה break continue, cnt = 0; while true x = input('please enter your number:'); if x > 0 break if x == 0 continue cnt = cnt + 1; disp(cnt); התוכנית מדפיסה כמה איברים קטנים ממש מ- 0 מספר חיובי. נקלטו לפני שנקלט 13
מנגנון הפעולה של לולאת for מהו הפלט של התוכנית הבאה? A = [1 2 3; 4 5 6]; for j=a fprintf('in this iteration j = %s\n', mat2str(j)); in this iteration j = [1;4] in this iteration j = [2;5] in this iteration j = [3;6] הפלט יהיה: לולאת for מופעלת בכל איטרציה על עמודה אחת של A (שיכול להיות מערך מכל מימד שהוא) 14
תרגיל כתבו תוכנית הקולטת מטריצה, ומוצאת את האיבר המקסימלי מבין איברי המינימום של עמודות המטריצה. השתמשו בלולאת.for לדוגמה, עבור המטריצה 7] 9; 2 6 8; 3 4 [1 5 = A איברי המינימום של עמודות המטריצה הם: 1,4,7 והאיבר המקסימלי מביניהם הוא 7. A = input('please enter your matrix:'); minmax = min(a(:,1)); for col=a minimum = min(col); if minimum > minmax minmax = minimum; fprintf('the minmax element is %d\n', minmax); פתרון: 15
יעילות לולאת for נתבונן בקוד הבא: for n=1:50000 x(n) = sin(n*pi/10); לא יעיל. בכל איטרציה המערך x גדל באיבר נוסף, וכיוון שהמערך מוחזק באופן רציף בזיכרון, Matlab צריך להקצות מחדש מקום ל- x כל פעם שאין מקום לאיבר נוסף, ואז x כולו מועתק למקום אחר בזכרון. פתרון: ל- x מוקצה מקום בזכרון פעם אחת בלבד. x = zeros(1,50000); for n=1:50000 x(n) = sin(n*pi/10); 16
תרגיל בו. תוכנת תוכנית הקולטת מספר ומדפיסה כמה ספרות זוגיות יש כתבו יודפס 4. לדוגמה, עבור המספר 12,321,645 num = input('please enter a positive integer number:'); evens = 0; חילוץ הספרה הימנית while num > 0 ביותר במספר digit = mod(num,10); if mod(digit,2) == 0 בדיקה האם הספרה היא זוגית evens = evens + 1; הכנה לאיטרציה הבאה num = floor(num/10); fprintf('the number of even digits is %d\n', evens); 17
דוגמה π = 4 4 4 4... 3 + 5 7 + נחשב קירוב ל- π ע"י הנוסחה: זו נוסחה אינסופית, שככל שמחברים בה יותר איברים מקבלים תוצאה המקרבת טוב יותר את π. בכל איטרציה נחבר איבר נוסף בסדרה, ונעצור כאשר השינוי בקירוב של π נעשה קטן מאוד, כלומר יורד בערכו המוחלט מתחת לסף מסוים. my_pi = 0; i = 1; sign = 1; while(true) 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); 18
תרגיל a 1 = 1 a 2 = 1 a 3 =a 1 +a 2 = 2 a 4 = a 2 + a 3 = 3 סדרת פיבונאצ'י מוגדרת באופן הבא: a n = a n-2 + a n-1 כללי: ובאופן כתבו תוכנית הקולטת מספר,num ומדפיסה את האיבר המקסימלי ל- num. פיבונאצ'י אשר קטן או שווה ל בסדרת למשל, עבור הקלט 25 יוחזר המספר 21 (שהוא האיבר השמיני.( פיבונאצ'י בסדרת עבור הקלט 5, יוחזר המספר 5 (שהוא האיבר החמישי בסדרת פיבונאצ'י.( 19
פתרון num = input('please enter num:'); a1 = 1; a2 = 1; while(a2 <= num) tmp = a2; a2 = a1 + a2; a1 = tmp; disp(a1); בשלב הזה a1 הוא האיבר המקסימלי בסדרת פיבונאצ'י אשר קטן או שווה ל- num 20