פונקציות מתמטיות בפסקל
עד כה עסקנו רק בתוכניות שכללו רק את ארבע הפעולות הפשוטות. נוסיף עוד שתי פעולות חשבון פשוטות div ו- mod.
הפעולה div מבצעת חילוק שלמים כלומר המנה ללא השארית. התוצאה מוצבת במשתנה שלם.
הפעולה mod מחשבת את השארית שבחילוק שלמים.
לדוגמא: 9div 4 = 2
9mod 4 = 1
אם נרצה למצוא את ספרת היחידות Y במספר מסוים X, נרשום: Y:=X mod 10
ואם נרצה להציב את שאר הספרות משמאל לספרה האחרונה במספר X לתוך המשתנה Z :
Z:=X div 10
בשתי פעולות אלו, div ו- mod יהיו מעורבים משתנים שהוגדרו כ-integer בלבד.
מבחינת סדר הקדימויות בפעולות החשבון, פעולות אלו שוות-ערך לפעולת הכפל והחילוק.
סיכום פעולות אריתמטיות בפסקל:
Operator Operation Operands Result + Addition or unary positive real or integer real or integer - Subtraction or unary negative real or integer real or integer * Multiplication real or integer real or integer / Real division real or integer real div Integer division integer integer mod Modulus (remainder division) integer integer
בפסקל קיימות פונקציות נוספות המאפשרות ביצוע תוכניות מרוכבות יותר.
אנו נלמד כמה מהפונקציות השימושיות לנו.
ככל שהשפה מתקדמת יותר כך מספר הפונקציות המשכללות את השפה רב יותר (זה אחד ההבדלים שבין הגירסאות השונות של טורבו פסקל)
לדוגמא, תוכנית המשמשת למציאת שורש של מספר:
program SQUARE_ROOT; var X:real; begin readln(X); X:=sqrt(X); write(X); end.
|
להורדת הדוגמא לחץ כאן
דוגמת ריצה:
בדוגמא זו הוצגה הפונקציה sqrt, המבצעת את הוצאת השורש מהמשתנה הנתון בסוגריים. את תוצאת החישוב, ההוראה מציבה שוב במשתנה X.
השימוש בפונקציה הוא רישום שמה ובסוגריים את המשתנה או הערך שעליו תתבצע הפונקציה (לא לשכוח נקודה-פסיק בסיום ההוראה).
לאכל פונקציה יכולה לבצע פעולה על כל סוג משתנה. ישנן פונקציות שסוג המשתנה בסוגריים יכול להיות רק שלם או רק ממשי. וגם התוצאה היא ממשית או שלמה.
משתנה עליו מבוצעת הפעולה נקרא משתנה הכניסה לפונקציה.
המשתנה שלתוכו מוצבת תוצאת החישוב של הפונקציה נקרא משתנה היציאה של הפונקציה.
להלן מס' פונקציות שימושיות בפסקל:
פונקציית sqrt שמחזירה לנו את השורש של המספר.
דוגמא לתחביר בפסקל: ;(X:=sqrt(Y
דוגמא לתוצאה מספרית: sqrt(9) = 3
פונקציית trunc שקוצצת את הספרות שאחרי הנקודה.
דוגמא לתחביר בפסקל: ;(X:=trunc(Y
דוגמא לתוצאה מספרית: trunc(3.5)=3
פונקציית round שמעגלת את המספר.
דוגמא לתחביר בפסקל: ;(X:=round(Y
דוגמא לתוצאה מספרית: round(2.7) = 3
פונקצית abs שמחזירה את הערך המוחלט של המספר.
דוגמא לתחביר בפסקל: ;(X:=abs(Y
דוגמא לתוצאה מספרית: abs(-9) = 9
סיכום פונקציות שימושיות בפסקל
Function Name |
Description |
Argument type |
Return type |
abs |
absolute value | real or integer | same as argument type |
arctan |
arctan in radians | real or integer | real |
cos |
cosine of a radian measure | real or integer | real |
exp |
e to the given power | real or integer | real |
ln |
natural logarithm | real or integer | real |
round |
round to nearest integer | real | integer |
sin |
sin of a radian measure | real or integer | real |
sqr |
(square (power 2 | real or integer | same as argument type |
sqrt |
(square root (power 1/2 | real or integer | real |
trunc |
(truncate (round down | real or integer | integer |
דוגמא:
נניח שנתונים שני מספרים שלמים וחיוביים בני ארבע ספרות כל אחד.
נגדיר את המרחק בין שני המספרים כשורש סכום הריבועים בין הספרות.
לדוגמא, נתונים שני המספרים: 2345 ו- 7890 אזי המרחק X בין שני המספרים הוא:
יש להפחית מכל ספרה במספר הראשון את הספרה העומדת באותו מקום במספר השני ואת התוצאה לעלות בריבוע. לסכם את התוצאות ולהוציא שורש ריבועי.
פתרון:
בתוכנית זו, עלינו לפרק כל מספר לספרותיו כדי לבצע את המתבקש. לצורך זה נשתמש בפונקציות mod ו-div.
program DST; { תוכנית למציאת המרחק בין שני מספרים שלמים וחיוביים } var A,B:integer; (* המספר הראשון והשני,בהתאמה*) I: integer; (* משתנה הלולאה *) S: integer; (* צובר סכום הריבועים*) DEST: real; (* המרחק בין שני המספרים *) X,Y: integer; (* הספרות של המספרים *)
procedure INPUT_NUMBERS; {תת-תוכנית לקליטת שני המספרים } begin write (' הקש מספר שלם חיובי בן ארבע ספרות '); readln(A); write (' הקש מספר שלם חיובי בן ארבע ספרות '); readln(B); end;
procedure FIRST; { תת-תוכנית להצבת ערכים התחלתיים} begin S:=0; (* הוא צובר ולכן נאפס אותו S *) end;
procedure LAST_DIGIT_FIRST_NUM; { תת-תוכנית למציאת הספרה האחרונה מצד ימין של המספר הראשון } begin X:=A mod 10;(*אם נחלק בעשר השארית היא הסיפרה האחרונה מימין*) A:=A div 10;(* מנת החלוקה ב-10 הן שאר הספרות משמאל, לפעם הבאה*) end;
procedure LAST_DIGIT_SECOND_NUM; { תת-תוכנית למציאת הספרה האחרונה מצד ימין של המספר השני } begin Y:=B mod 10; (*אם נחלק בעשר אזי השארית היא הסיפרה האחרונה מימין*) B:=B div 10;(* מנת החלוקה ב-10 הן שאר הספרות משמאל, לפעם הבאה*) end;
procedure SQUARE_DIFFERENCE; { תת תוכנית לצבירת ריבועי ההפרש של הספרות המחושבות בכל פעם } begin S:= S+(X-Y)*(X-Y); (* אין פונקציה לחזקה ולכן נכפיל מספר בעצמו*) end;
procedure SQUARE_ROOT_OF_SUM; { תת-תוכנית להוצאת השורש מסכום הריבועים } begin DEST:=sqrt(S); end;
procedure PRINT; { תת-תוכנית להדפסת התוצאות } begin writeln (DEST, ' = המרחק בין המספרים ' ); end;
(********** התוכנית הראשית************) begin FIRST; (* בצע הצבת ערכים התחלתיים במשתנים *) INPUT_NUMBERS; (* קלוט מספרים *) for I:=1 to 4 do (* ארבע ספרות – לולאה מאחד עד ארבע *) begin LAST_DIGIT_FIRST_NUM; (* מצא הספרה הימנית *) LAST_DIGIT_FIRST_NUM; (* מצא הספרה הימנית *) |
להורדת הדוגמא לחץ כאן
דוגמת ריצה: