ערכתי לאחרונה בתאריך 29.04.06 בשעה 14:18 בברכה, Yovav
פרק 1 - התוכנית הבסיסית
חלק ראשון – מרכיבי השפה ומבנה תוכנית שפת PASCAL מורכבת ממילים שמורות RESERVED WORDS , פונקציות/פרוצדורות משתנים ,ערכים ומשפטים.
מבנה תוכנית בסיסית:
כותרת התוכנית Program ---;
מדור ביצועי (גוף התוכנית) Begin
Program body
End.
מבנה התוכנית בשפת פסקל כמו בכל שפת תכנות פרוצדוריאלית אחרת , חייב להיות ברור וחד משמעי!
למרות הגמישות והתוספות שנלמד בהמשך , עדיין קיים מבנה ברור וחד משמעי לקוד.
חוק יסוד לתכנות בשפת פסקל :
המחשב "יודע" רק את מה שהגדירו לו מקודם.
כותרת התוכנית – בעלת חשיבות ייצוגית בלבד , וניתנת להשמטה.
מבנה הכותרת : מילה שמורה Program רווח שם התוכנית בפורמט אלפאנומרי (אותיות ומספרים) , נקודה-פסיק.
הגבלות: התו הראשון חייב להיות אות , אין להכניס רווחים (ניתן להוסיף תו "_" במקום).
מדור ביצועי – התוכנית עצמה (בשלב זה)המדור הביצועי (הבלוק הראשי) הכולל את המשפטים , וההוראות.
בפסקל , בלוק הוא כל קבוצת הוראות התחומות במילים Begin End , הבלוק הראשי מסתיים ב End. (שימו לב לנקודה) הצירוף מסמל סוף קובץ , הקומפיילר לא יבצע קומפילציה לקוד אחרי End. .
תוכנית בסיסית:
Program smp001;
Begin
Writeln(‘hello!’);
End.
* הפרוצדורה writeln תוסבר בהרחבה בהמשך
חלק שני – משתנים ופרוצדורות קלט/פלט בסיסיות
התוכנית smp001 השתמשה בפרוצדורת פלט בשם writeln , הפולטת ערכים למסך (במקרה זה) אם הרצתם את התוכנית קיבלתם את הטקסט hello! על המסך…
בשלב זה מספיק שנדע שהפרוצדורה writeln רושמת נתונים מסוג מסוים למסך , במקרה שלנו הדפסנו ישר ערך.
רוב התוכניות בימינו מתקשרות אם המשתמש , כלומר קולטות ממנו נתונים ופולטות נתונים בצורה מובנת למשתמש, בפסקל ישנן פרוצדורות קלט/פלט מוכנות ואותן נלמד בשיעור זה.
אבל לפני זה , מההיגיון נובע , שאם קולטים נתון , צריך לשים אותו איפה שהו? , למטרה זו קיימים משתנים.
הצהרת משתנים מתבצעת במדור ההצהרתי בצורה הבאה:
Var
Variable name : variable type ;
הערה: הסימון נקודה-פסיק מיועד להפריד בין שתי פקודות , לכן בסוף כל פקודה בא ";" (פרט למקרים שיפורטו בהמשך)
בפסקל סוגי משתנים מוגדרים רבים נעסוק בחלק קטן בפרק זה:
טווח נתונים סוג נתונים סוג (שם)
-32768..32767 שלם Integer
0..255 שלם Byte
2.9E-39..1.7E38 ממשי Real
תו אחד תווי Char
עד 255 תווים תווי String
*כתב מעריכי (EXX) יוסבר בהמשך
קליטת ערכים למשתנים מתבצעת בעזרת הפרוצדורה readln העובדת בצורה דומה ל writeln , המשתמש מקליד ערך למסך והתוכנית קוראת אותו.
התוכנית הבאה מדגימה פעולה בסיסית של קלט/פלט
Program smp002;
Var I:integer;
Begin
Readln(I);
Writeln(I);
End.
המילה השמורה Var –
במדור ההצהרתי פותחת את מדור המשתנים , Variables , בו מוגדרים כל המשתנים הכלליים של התוכנית.
בתוכנית יכולים להיות כמה מדורי משתנים , כולם במדור ההצהרתי.
סוג המשתנה Integer (שלם) –
אחד הסוגים הנפוצים בפסקל , אוגר מספרים שלמים חיוביים ושליליים , תופס 16 ביט בזיכרון (שני בתים).
הפרוצדורה Write –
מדפיסה את ערכי הפרמטרים למסך ולא קופצת שורה בסיום ההדפסה , מספר הפרמטרים לא מוגבל.
תחביר:
Write(param:edit,param:edit);
Param – פרמטר, שדה שמכיל ערך או משתנה
Edit – עריכה, עריכת פלט תפורט בהמשך.
הפרוצדורה Writeln –
כמו הפרוצדורה Write , בנוסף קופצת שורה בסיום ההדפסה.
תחביר:
Writeln(param:edit,param:edit);
הפרוצדורה Read –
קוראת ערכים מהמסך לפרמטרים ולא קופצת שורה בסיום הקליטה , מספר הפרמטרים לא מוגבל.
תחביר:
Read(param,param);
Param – משתנה מסוג כל-שהוא
הפרוצדורה Readln –
כמו הפרוצדורה Read , בנוסף קופצת שורה בסיום הקליטה , מספר הפרמטרים לא מוגבל.
Readln(param,param);
בתוכנית שכתבנו השתמשנו במשתנה מסוג Integer בשם "I" קלטנו לתוכו ערך , והדפסנו את תוכנו.
הערה: בפסקל אין חשיבות לאותיות קטנות או גדולות בקוד , לכן משתנה בשם "a" זהה למשתנה בשם "A".
עיצוב פלט:
עיצוב פלט נועד לתרגם את פלט התוכנית לפלט מובן יותר למשתמש , כמובן נועד להקצות מקום לפלט.
עיצוב EDIT בהוראות WRITE –
עבור סוגי נתונים שונים , הוראות העיצוב מבצעות פעולות שונות , למשל עבור שלמים ומחרוזות העריכה כוללת פרמטר אחד המקצה מספר תווים לפלט.
Write(param:spaces);
מספר התווים מוגדר אחרי הפרמטר ומופרד ע"י נקודתיים.
עבור מספרים ממשיים , עריכת פלט שונה במקצת , ישנם שני פרמטרים , הראשון מקצה מקומות , והשני אומר כמה ספרות אחרי הנקודה העשרונית יוצגו.
Write(param:spaces:decimals);
הוראות העיצוב מעגלות אוטומטית את המספר כך שהספרה האחרונה תוצג נכון.
חלק שלישי – עיבוד נתונים בסיסי
בחלק הקודם למדנו לקלוט ולפלוט נתונים , עכשיו נלמד לעבד אותם.
בפסקל רוב העיבוד מתבצע ע"י פעולות הנעשות אם משתנים , משפטי השמה מציבים ערכים (תוצאות ביטוים וכו.) למשתנים.
תחביר הוראת השמה:
Variable := expression ;
Expression (ביטוי) חייב להיות מסוג המשתנה, אחרת מדווחת טעות קומפיילר.
ביטוי יכול להיות כל ביטוי מתמטי (מומר לשפת פסקל) , כל ערך שהמשתנה יכול לקבל , תוצאה של פונקציה , משתנה מאותו הסוג , פעולות שנעשו על משתנה מאותו הסוג, כמוכן המשתנה עצמו.
אופרטורים מתמטיים בשפת פסקל:
חיבור (חיבור מתמטי , לוגי) +
חיסור מתמטי -
כפל מתמטי *
חילוק מתמטי (מחזיר תוצאה ממשית) /
למשל הביטוים הבאים מבצעים פעולות מתמטיות על משתנים וערכים:
A:=5+7;
B:=a+10;
C:=b+a;
D:=a*b;
E:=(a+10)*c;
בדוגמא האחרונה השתמשנו בסוגריים , משמעות סוגריים מעוגלות זהה למשמעות סוגריים מתמטית , סדר פעולות החשבון התקני מיושם במלואו בפסקל.
הערה: לסוגריים מרובעות ומסולסלות תפקידים אחרים, אין להשתמש בהם בביטוים מתמטיים בטור סוגריים רגילים!
מילים מתמטיות שמורות – DIV , MOD
שניהן מבצעות חילוק ומחזירות תוצאה שלמה.
DIV – חילוק שלם, מחזיר את החלק השלם של תוצאת החילוק.
MOD – מחזיר את שארית החילוק.
השימוש במילים מתמטיות שמורות זהה לשימוש באופרטורים מתמטיים.
A:=5 div 2;
A:=5 mod 2;
הביטוי הראשון יציב 2 (4/2) למשתנה , והביטוי השני יציב 1 למשתנה.
פונקציות מתמטיות סטנדרטיות:
פירוט שם הפונקציה
מחזיר ערך מוחלט , תלוי בסוג הפרמטר Abs(param)
מחזיר ארק טאנגנס של זווית Arctan(param)
מחזיר קוסינוס של זווית Cos(param)
מחזיר חלק שלם של מספר כממשי Int(param)
מחזיר ערך פי (ממשי) pi
מעגל לשלם עיגול מתמטי Round(param)
מחזיר סינוס של זווית Sin(param)
ריבוע , מחזיר ערך תליו בסוג הפרמטר Sqr(param)
שורש ריבועי , תמיד ממשי Sqrt(param)
מקצץ חלק עשרוני Trunc(param)
הערה: ערכים שהפונקציות הטריגונומטריות מקבלות חייבות להיות ברדיאנים ולא במעלות.
שימוש בפונקציות:
השימוש בפונקציות בפסקל זהה לשימוש בפונקציות מתמטיות
c:=abs(sqr(a)-b);
פונקציות שתוצאתן תלויה בסוג הפרמטר:
אם הפרמטר שלם , אז התוצאה שלמה , אם הפרמטר ממשי אז התוצאה ממשית.
כתב מעריכי:
צורת כתיבה המציגה מספרים בצורה מעריכית , כלומר מספר לפני E כפול 10 בחזקת המספר אחרי E (חיוביות או שליליות).
רוב המשתמשים לא יבינו כתב מעריכי , או יתעצלו להבינו , לכן מומלץ תמיד להמיר אותו לצורה מובנת יותר באמצעות עיצוב פלט.
חלק רביעי – רנדומציה
לעיטים קרובות נוצר צורך בערכים אקראיים ,ב PASCAL קיימת פונקציה שמחזירה ערכים אקראיים.
RANDOMIZE – הפעלת מנוע רנדומציה , על מנת לקבל ערכים אקראיים , אחרת הערכים לא משתנים.
RANDOM – פונקציה שמחזירה מספרים רנדומליים , מתחלקת לשני סוגים:
מחזיר ערך ממשי בין 0 ל 1 Random;
מחזיר ערך שלם בין 0 למציין הטווח (לא כולל את מציין הטווח) Random(range);
משל על מנת לקבל מספרים בין 0 ל 10 , יש לכתוב 11 במציין הטווח. , על מנת לקבל מספר ממשי בין 0 ל 10 יש לחבר RANDOM.
פרק שני - התראות תנאי

חלק ראשון – מרכיבי הוראת תנאי
על המתכנת להתאים את תוכניותיו למשתמשים שונים עם דרישות וצרכים שונים , מקטעים שירוצו עבור משתמש או מקרה אחד לא תמיד דרושים למקרים אחרים , הוראות התנאי מנתבות את התוכנית למקטעים המביאים יחד ליישום מטרה.
בפסקל מספר סוגי הוראות תנאי , בסיס כל הוראות התנאי
ישנה השוואה לוגית בין שתים או יותר גורמים Condition, תוצאת ההשוואה צריכה להיות חד משמעית , לכן סוג התוצאה הוא בוליאני Boolean המקבל אחד משני הערכים האפשריים True באם תנאי ההשוואה מתקיים ו False כאשר התנאי לא מתקיים.
ההשוואה נעשית ע"י אופרטורים מתמטיים ולוגיים גם יחד.
אופרטורי השוואה וחיבור
שווה לוגי , מתמטי =
שונה מתמטי , לוגי <>
גדול מתמטי >
קטן מתמטי <
גדול שווה מתמטי >=
קטן שווה מתמטי <=
שלילה לוגי Not
וגם לוגי And
או לוגי Or
חיבור מספר תנאים מתבצע ע"י מילות הקישור OR AND, תנאים מחוברים חייבים להיות מבודדים בסוגריים.
תחביר תנאי מחובר:
(a>=10)and(b<>70)
שלילת תנאי:
תנאי שנשלל מחזיר ערך הפוך למקורי , למשל אם התנאי מחזיר False ולפניו באה מלת NOT התנאי כולו יחזיר True.
תחביר שלילה:
(not a=10)or(not b=2)
החיבור במילות הקישור:
תוצאה גורם שני גורם ראשון מילת חיבור
False --- True Not
True --- False Not
True True True Or
True False True Or
True True False Or
False False False Or
True True True And
False False True And
False True False And
False False False And
OR – או לוגי, מספיק שתנאי אחד מתקיים
AND – וגם לוגי, שני התנאים צריכים להתקיים
חלק שני – משפט IF
הוראת התנאי IF היא אחת הנפוצות בפסקל , ההוראה מבצעת הוראה אחת שבאה אחריה , ואם נוסף משפט ELSE והתנאי לא מתקיים מתבצעת ההוראה הראשונה אחרי המילית ELSE.
תחביר ההוראה:
If condition then
Command
Else
Command;
החלק של ההוראה ELSE אופציונלי , לפני מילית ELSE לא בא ";" נקודה פסיק.
אם אין את חלק הוראת ה ELSE יבוא נקודה-פסיק אחרי ההוראה , הוראה המבוצעת יכולה להיות כל משפט , הוראה או בלוק הוראות.
משפט IF נחשב פקודה אחת.
חלק שלישי – קבוצת ותנאי IN
בפסקל ניתן לבדוק בתנאי אחד אם גורם מהווה חלק מקבוצה , בעזרת תנאי IN , הפועל כאופרטור השוואה תקני.
a in
האופרטור IN בודק אם ערך מסוים נמצא בתוך הקבוצה בסוגריים , הגדרת טווח מתבצעת ע"י כתיבת הערך הראשון , רצץ נקודות , הערך האחרון, הוספת גורמים נוספים לקבוצה מתבצעת ע"י הוספת פסיקים.
הגבלות:
מספר הערכים בקבוצה לא יעלה על 256!
חלק רביעי – חיבור תנאים
לפעמים נוצר צורך להשוות מספר משתנים , מספר קבוצות ומספר תת השוואות , בפסקל סדר ההשוואה כמו סדר פעולות חשבון , דבר המקל את השימוש בהוראות התנאי.
דוגמת IF מורכב:
If ((a in)and(b=10))or((c=5)or(not d=100))
Then
Command
Else
command;
מסובך כמה שיהיה , מבנה המשפט לא משתנה.
סדר קביעת תוצאת ההשוואה כסדר פעולות חשבון.
חלק חמישי – משפט CASE
עוד סוג של הוראת תנאי בפסקל הוא משפט CASE או משפט רב ברירה.
תחביר משפט CASE:
Case variable of
Values group1 : command;
Values group2 : command;
Values groupN: command;
Else command;
End;
מספר הקבוצות בCASE לא מוגבל , כל קבוצה יכולה להיות ערך אחד , טווח או כל קבוצה חוקית אחרת בפסקל.
סוג הערכים חייב להתאים לסוג המשתנה.
חייבת להיות לפחות קבוצה אחת , קבוצת ELSE אופציונלית.
קבוצות מופרדות מפקודות ע"י נקודתיים , בסוף כל פקודה חייב לבוא נקודה-פסיק , בסוף כל משפט CASE חייב לבוא End; נקודה-פסיק לפי חוקי ELSE.
כל פקודה יכולה להיות בלוק פקודות , משפט CASE נחשב פקודה אחת.
פרק שלישי - לולואת

חלק ראשון - הצורך בלולאות
בשלב זה לולאות ישמשו אותנו לבדיקת קלט ומספר חזרות , בהמשך , כל נושא המערכים מבוסס על לולאות.
לולאות מבצעות קטע קוד, גוף הלולאה , מספר פעמים היתרון הוא , שלא צריך לכתוב פקודה עבור כל פעולה חוזרת , למשל על מנת לחשב סכום מספרים בסדרה לא נכתוב N שורות עבור כל איבר.
כל לולאה בעלת תנאי כניסה או יציאה , אחרת נוצרת לולאה אינסופית התוקעת את התוכנית!
תנאי כניסה – תנאי שחייב להתקיים על מנת שהלולאה תכנס לגוף הלולאה.
תנאי יציאה – תנאי שחייב להתקיים על מנת לצאת מהלולאה.
בפסקל ישנם 2 סוגי לולאות עיקריים – לולאות תנאי כניסה ולולאות תנאי יציאה.
WHILE – לולאת תנאי כניסה רגילה
FOR – לולאת תנאי כניסה אוטומטית
REPEAT – לולאת תנאי יציאה רגילה
חלק שני – לולאת WHILE
לולאת WHILE היא לולאת תנאי כניסה , הלולאה נכנסת לגוף הלולאה רק אם תנאי הכניסה מתקיים , בסיום גוף הלולאה אם התנאי לא מתקיים , הלולאה מפסיקה.
מבנה לולאת WHILE:

תחביר לולאת WHILE:
While condition do
Command;
לולאת WHILE מבצעת פקודה בודדת! או בלוק הוראות שבאים אחריה.
חלק שלישי – לולאת REPEAT
לולאת REPEAT היא לולאת תנאי יציאה , גוף הלולאה מבוצע לפחות פעם אחת , החזרה על ביצואו תלויה בתנאי היציאה , אם התנאי לא מתקיים הלולאה תחזור ותבצע את גוף הלולאה , אם התנאי מתקיים הלולאה מפסיקה.
מבנה לולאת REPEAT:

תחביר לולאת REPEAT:
Repeat
Command;
Command;
Until condition;
לולאת REPEAT מבצעת את כל ההוראות בין REPEAT ל UNTIL , אין צורך בבלוקים כמו בWHILE.
חלק רביעי – לולאות FOR אוטומטיות
לולאות FOR מבוססות לולאות WHILE לכן מבנה הלולאה לא יוסבר ע"י תרשים זרימה , ראה WHILE.
קיימים שני סוגי לולאות FOR , לולאה עולה ולולאה יורדת.
ללולאות אוטומטיות חייבים מונה אורדינאלי (בדיד)!
לולאת FOR עולה:
מגדילה את המונה ביחידה אחת כל פעם.
תחביר:
For variable:=first to last do
Command;
בתחילת לולאת FOR , מוצב ערך למשתנה המניה , לכן אין צורף לאפס אותו לפני , הלולאה רצה כל עוד ערך המשתנה נמצא בין שני הערכים FIRST ו LAST כולל!
לולאת FOR יורדת:
מקטינה את המונה ביחידה אחת כל פעם.
תחביר:
For variable:=first downto last do
Command;
התנאי זהה לתנאי לולאה עולה.
מונים חוקיים:
כל משתנה אורדינאלי (בדיד) כגון INTEGER , BOOLEAN , CHAR יכולים לשמש כמונים בלולאה אוטומטית.
חלק חמישי – הפניות GOTO
בשפת פסקל ניתן לבצע הפניות לאחור בלבד , מכוון שתווית ההפניה חייבת להיות מוגדרת לפני ההפניה , שם תווית ההפניה מוגדר במדור ההצהרתי במדור LABEL , מיקום תווית ההפניה מוצהר בתוך הקוד.
תחביר הפניה תקנית:
Label name;
Begin
Commands;
Name:
Commands;
Goto name;
Commands;
End.
הפניות פועלות אך ורק! לבלוק מקומי , אם נקראת הפניה לבלוק אחר , מתקבלת טעות קומפיילר.
להבדיל מלולאות תקניות אחרות , הפניות לא ניתנות לשבירה , מכוון שלא נחשבות לולאות בפועל.
מבני לולאות תקניות דרך הפניות (ללא ההצהרות)
לולאת WHILE:
Loop:
If condition then
Begin
Commands;
Goto loop;
End;
לולאת REPEAT:
Loop:
Commands;
If condition then
Goto loop;
לולאת FOR עולה:
Loop:
If counter in then
Begin
Commands;
Counter:=succ(counter);
Goto loop;
End;
לולאת FOR יורדת:
Loop:
If counter in then
Begin
Commands;
Counter:=pred(counter);
Goto loop;
End;
מבני בלולאות בתקניות המוצגות דרך הפניות עוזרות להבין את היעילות של הלולאות התקניות , בכל מקום שאפשר להשתמש בו בלולאה תקנית במקום הפניות מומלץ לעשות כך , על מנת לחסוך זמן כתיבה , ולתת לתוכנית מראה מובן יותר.
חלק שישי – לולאות אינסופיות
לולאות אינסופיות הן לולאות שתנאי הכניסה שלהן תמיד מתקיים , או שתנאי היציאה שלהן לא מתקיים אף פעם.
הפניה אינסופית היא כאשר אין תנאי להפניה , כלומר פקודת ה GOTO מבוצעת תמיד.
רצוי להימנע מיצירת לולאות אינסופיות , למרות שהן לא נחשבות טעות קומפיילר , הן נוצרות לרוב מטעויות לוגיות.
חלק שביעי – שבירת לולאות תקניות
קיימים מקרים בהם צריך לצאת מיידית מלולאה בלי לשנות את ערכי המונים , בפסקל קיימת פקודה לשבירת לולאות.
Brake;
פקודת שבירה זו יכולה לבוא בכל מקום בתוך הלולאה , ביצוע הלולאה מפסיק מייד , והפקודות אחרי BRAKE לא מבוצעות כלל.
פרק רביעי - מערכים
חלק ראשון - הצורך במערכים ואופן השימוש
מערכים הם בעצם סדרות של נתונים מאותו סוג , נוצר צורך במערכים כאשר קלט מסוים אמור להיקלט מספר פעמים ולעבור עיבוד , כאשר נתון אחד תלוי במספר נתונים שכנים , כאשר רוצים לשמור בזיכרון רשימה וכל דבר אחר שדורש מספר תאים מאותו סוג.
קיימים מספר סוגי מערכים , מערך חד ממדי (או ליניארי) , מערך דו ממדי ,מערך תלת ממדי , ומערכים רב ממדיים.
הגדרת מערך:
מערך , כמו כל משתנה אחר , מוצהר במדור המשתנים במדור ההצהרתי , ניתן להגדיר מערכים בגדלים ומסוגים שונים.
תחביר הגדרה:
Var
A:arrayof type;
RANGE – טווח נתונים , או גודל המערך.
TYPE – סוג הנתונים במערך
עיבוד מערכים:
המערך הוא מעיין ארון מגירות בעל שם , על מנת למצוא משהו ב "ארון" צריך לציין את שם הארון , ואת מספר המגירה , ככה גם במערכים , שם המערך אינו מספיק , צריך גם את מציין המקום בתוך המערך.
מציין המערך , יכול להיות כל משתנה או ערך מספרי אורדינאלי , כלומר , אי אפשר לפנות ל תא מספר 10 וחצי.
חריגה מתחום המערך:
טעות נפוצה בשימוש במערכים היא חריגה מתחום המערך , חריגה בקריאה מהמערך יכולה לתת ערכים לא רצויים , וחריגה בכתיבה למערך (הצבה) יכולה לפגוע בנתונים אחרים המצויים בזיכרון , כגון משתנים אחרים , רכיבי מערכת ההפעלה , קוד התוכנית , ובכך לגרום לתוצאות לא רצויות , קריסות ופגיעות במידע.
חריגה מתחום המערך מתקבלת כאשר במציין שנקלט נמצא מחוץ לטווח הנתונים (למשל למערך בעל 10 איברים , קריאה לאיבר ה 20 היא חריגה)
יש להימנע מחריגות מתחומי המערך בכל מחיר , טעויות רבות נגרמות כתוצאה מחריגות.
חלק שני - מערכים חד ממדיים
מערכים חד ממדיים הם הנפוצים ביותר , אפשר לראות מערכים חד ממדיים מסדרות מספרים ועד מנגנוני גישה לזיכרון , כל המערכים מכילים בבסיסם מערכים חד ממדיים ואפשר להמירם למערכים חד ממדיים מתאימים.
דוג.
תחביר הגדרת מערך מספרים חד ממדי
Var
A:arrayof integer;
קריאת נתונים למערך חד ממדי:
מתבצעת בלולאה שקוראת לכל כתובת במערך ערך.
For I:=1 to 10 do
Readln(a);
מציין המיקום במערך בא בסוגריים מרובאות מייד אחרי שם המערך.
כל פעולות ההצבה מתבצעות על המערך תוך ציון הכתובת במערך
A:=200;
מציין המערך יכול להיות כל ביטוי , משתנה , קבוע בתנאי שיחזיר מספר שלם.
חלק שלישי – מיון מערך חד ממדי – שיטת הבועות
לעיטים יש צורך לסדר נתונים בסדר מסוים , למשל רשימת ציונים של תלמידים מהגבוה לנמוך בשביל לקחת את 10 הגבוהים, מכוון שאין אני מצפים מהמשתמש להכניס את הערכים בצורה ממוינת , עלינו למיין את הציונים לצורך הבידוד.
שיטת מיון הבועות: העיקרון במיון הבועות הוא – למצוא ערך מינימלי או מקסימלי במערך , להזיז אותו לתחילת המערך , ולמצוא את הערך המקסימלי או המינימלי בין שאר איברי המערך , לצורך מיון זה נידרש להשתמש בלולאת FOR אחת בתוך השניה.
היישום בפסקל של מיון בועות בסדר עולה יראה כך:
For I:=0 to n do
For J:=I+1 to n do
If a>a then
Begin
T:=a;
A:=a;
A:=t;
End;
בבסיס המיון , עומדת פעולת החלפה – המחליפה בין איברי המערך , פעולה זו משתמשת במשתנה עזר , השומר זמנית את הערך של איבר ב' , מכוון שבעת העתקת הערך מאיבר א' לאיבר ב' ערך איבר ב' נרמס , אם לא נשתמש במשתנה העזר , נקבל מערך הרוס.
על מנת לשנות את סדר המערך מסדר עולה כמוצג בדוגמא , לסדר יורד , יש לשנות את סימן ב"<" לסימן ">".
מיון בועות הוא מיון פשוט יחסית , ישנם אלגוריתמי מיון נוספים – קוויק סורט למשל אמנם מיון בועות הוא הפשוט ביותר.
מיון משמש לא רק למיון מערך בודד , ניתן למיין מספר מערכים לפי מערך אחד – למשל למיין מערך שמות תלמידים לפי מערך הציונים שלהם , למקרה זה נצטרך להחליף הן את הציון והן את השמות המתאימים במערך.
חלק רביעי – מיון מערך חד ממדי – שיטת מיון הכנסה
לעיתים יש צורך להכניס נתונים בסדר ממוין למערך , אמנם אפשר להכניס את הערך הזה לתא נוסף במערך ולהריץ מיון בועות על כל המערך , אבל הכנסה זו לא תהיה יעילה , שיטה יעילה יותר היא מיון הכנסה , המכניס את הערך בדיוק איפה שהוא אמור להיות , ומזיז את שאר הערכים הגדולים או הקטנים ממנו למיקומים הבאים במערך.
בצורה דומה אפשר גם למיין מערך למערך עזר , ולהתייחס לכל איבר במערך המקור כנתון חדש.
הנה יישום של פעולת הכנסה למערך ממוין בסדר עולה.
I:=0;
While (I<=N) and (A<X) do
I:=I+1;
S:=A;
A:=X;
For I:=I+1 to N do
Begin
X:=S;
S:=A;
A:=X;
End;
I הוא מונה הלולאה , S הוא משתנה עזר , X הוא הערך המוכנס ובהמשך גם משתנה עזר , N הוא קבוע המציין את גודל המערך.
הלולאה הראשונה מוצאת את המקום בו צריך להכניס את הערך , לאחר מכן ,שומרים את הערך שהיה באותו המקום ומכניסים את הערך החדש, והלולאה השניה מזיזה את כל הערכים אחרי הערך המוכנס למעלה.
בעיה נוצרת כאשר יש ערך רלוונטי בסוף המערך , כי אותו ערך כביכול נדחף החוצה מהמערך. , ביישום זה אין בעיה של חריגה מתחום מערך שכן הנתון נשמר בתא חיצוני ולא מוזז סתם לתא הבא שייתכן ולא קיים כלל.
חלק חמישי - מערך תווים – מחרוזת.
המחרוזות הן מערכים הכוללים תווים , ההבדל בין המחרוזת למערך תווים רגיל , הוא שבמחרוזת מיקום 0 במערך שומר את אורך המילה השמורה בו.
מחרוזת רגילה , יכולה לכלול עד 255 תווים , מחרוזת כזאת תתפוס 256 בתים בזיכרון.
ישנן מספר שיטות לדעת את אורך המחרוזת:
L:=byte(s)
*גישה ישירה לכתובת עם המרה מתו למספר בעזרת סיווג
L:=ord(s)
גישה ישירה עם המרה למספר בעזרת פונקציה סטנדרטית
L:=length(s)
שימוש בפונקציה סטנדרטית להשגת האורך
מקובל להשתמש בפונקציה הסטנדרטית מכוון שלא בכל הגרסאות רק כתובת 0 משמשת לציון אורך המחרוזת.
* סיווג לא נכלל בתוכנית הלימודים , לכן לא נשתמש בשיטה.
השימוש במחרוזות נפוץ מאד , למשל בתוכנית הבסיסית השתמשנו במחרוזת בשביל לשמור את שמינו ולהדפיסו בהמשך ישנן הרבה פונקציות סטנדרטיות לשימוש והמרת מחרוזות , וכן רצוי לבנות מספר פונקציות שימושיות נוספות.
פונקציות מחרוזת סטנדרטיות
פירוט שם הפונקציה
החזרת חלק ממחרוזת
S – מחרוזת גדולה
ST – מיקום התחלתי (תו ראשון)
CN – מספר תווים כולל תו ראשון Copy(s,st,cn)
מחיקת סדרת תווים מהמחרוזת וצמצומה (פרמטרים כמו בCOPY ) Delete(s,st,cn)
החזרת מיקום הופעה ראשון של תת מחרוזת SUB במחרוזת S Pos(sub,s)
מכניס תת מחרוזת SUB למחרוזת S במיקום ST Insert(sub,s,st)
מחזיר את אורך המחרוזת Length(s)
חלק שישי – מערך דו ממדי
מערכים דו ממדיים , משמשים לדברים רבים (למשל גראפיקה, מטריצות , מיפוי וכו.) , הם לא שונים בהרבה ממערכים חד ממדיים , ואופן העבודה אתם זהה.
תחביר הגדרת מערך מספרים דו ממדי
Var
A:arrayof integer;
קריאת נתונים למערך חד ממדי:
מתבצעת בלולאה שקוראת לכל כתובת במערך ערך.
For I:=1 to 10 do
For J:=1 to 10 do
Readln(a);
מציין המיקום במערך בא בסוגריים מרובאות מייד אחרי שם המערך.
כל פעולות ההצבה מתבצעות על המערך תוך ציון הכתובות במערך , במקרה זה שתי כתובות.
A:=200;
חלק שביעי – מערכים רב ממדיים
כפי שראיתם , הגדרת מערך דו ממדי שונה מהגדרת מערך חד ממדי , בכמות המציינים והטווחים שהוגדרו , אתם יכולים להוסיף כמה שאתם רוצים טווחים ומציינים , ובכך להגדיר ולהשתמש במערכים תלת , ארבע , וכו. ממדיים.
פרק חמישי - פרוצידורות ופונקציות
חלק ראשון – פרוצדורות
פרוצדורות נועדו לחסוך כתיבת קוד שמשמש במספר מקומות , עם הזמן יועלו הפרוצדורות והפכו לחלק אינטגרלי מהתכנות.
פרוצדורות בפסקל מוצהרות בחלק ההצהרתי של התוכנית , הן יכולות להשתמש בכל מה שהוגדר לפניהן , או לקבל פרמטרים אם הוגדרו לכך.
פרוצדורה כוללת שלוש חלקים עיקריים:
מדור פרמטרים , מדור הצהרתי , ומדור ביצועי (שני האחרונים זהים כמעט לכל תוכנית ראשית ולכן הפרוצדורה גם נקראת תת תוכנית) אפשר להגדיר משתנים , פרוצדורות ופונקציות בתוך המדור ההצהרתי של הפרוצדורה.
הגדרת הפרוצדורה בלי פרמטרים מתבצעת כך:
Procedure name;
Var
Some local variables…
Begin
Some commands…
End;
ההגדרה מתחילה במילה שמורה PROCEDURE , לאחר מכן מוגדר שם הפרוצדורה (בדיוק לפי כללי הגדרת שם התוכנית) , לאחר מכן נקודה פסיק , המדור ההצהרתי של הפרוצדורה , והבלוק הביצועי של הפרוצדורה (כמו בתוכנית) , לאחר ה END מופיע נקודה פסיק.
שימוש בפרוצדורה הוא כמו שימוש ב פרוצדורות שסטנדרטיות כמו READLN למשל , פשוט כותבים את שם הפרוצדורה והחלק המוצהר בפרוצדורה מתבצע.
משתנים:
בדוגמא הגדרתי כמה משתנים מקומיים לפרוצדורה , משתנים אלה קיימים ונגישים רק בתוך הפרוצדורה , ובשום אופן לא בתוכנית המקורית.
אפשר גם להשתמש בכל המשתנים הכלליים (משתני התוכנית) שהוצהרו לפני הפרוצדורה.
אם קיים משתנה כללי ומקומי בעלי אותו שם , אז הפרוצדורה תשתמש במשתנה המקומי , בגלל שהוא הוצהר לאחר המשתנה הכללי.
פרוצדורה עם פרמטרים:
בדרך כלל יש צורך להעביר לפרוצדורה פרמטרים שאתם היא אמורה לעבוד (כמו למשל WRITELN שמקבל את הפרמטרים אותם אנחנו רוצים להדפיס)
הצהרת הפרמטרים מתבצעת האופן הבא:
Procedure name(param,param:type;param:type);
הגדרות הפרמטרים הן בדיוק כמו משתנים מקומיים מבחינת הפרוצדורה , שמם המוצהר בכותרת ישמש כשם משתנה בפרוצדורה. אפשר לעשות עם הפרמטרים את כל מה שאפשר לעשות עם משתנה מקומי בפרוצדורה.
הצהרת פרמטרים משתנים:
לפעמים יש צורך לשנות את ערך הפרמטר חזרה בתוכנית , גם זה אפשרי , פשוט כותבים את המילה VAR לפני שם הפרמטר , ומכאן כל פעם שהפרמטר ישתנה בתוך הפרוצדורה הוא ישתנה גם בתוך התוכנית.
Procedure name(param,param:type;var param:type);
שימוש בהצהרה כזאת נדרש רק במקרים שיש צורך לשנות את ערך המשתנה המועבר בתוכנית , הצהרה זו אמנם מגבילה את האפשרויות שהפרוצדורה יכולה לקבל , שכן הגדרה בלי VAR יכולה לקבל כל ביטוי , קבוע או משתנה מהסוג המתאים , ואילו הפרמטרים המוגדרים עם VAR , מכוון שצריכים לשנות את ערך המשתנה בתוכנית , יכולים לקבל רק משתנים.
חלק שני – פונקציות
פונקציות מתנהגות ומוגדרות כמעט כמו פרוצדורות , ההבדל היחיד הוא שפונקציות גם מחזירות ערך.
מכוון שפונקציה צריכה להחזיר ערך , סוג הערך המוחזר צריך להיות מוגדר בהצהרת הפונקציה , בגרסאות רגילות של פסקל אפשר להגדיר פונקציות שמחזירות רק ערכים מסוגים סטנדרטיים (שלמים , תווים , בוליאניים , מחרוזות , ממשיים) , ואילו בגרסאות מתקדמות יותר אפשר להחזיר כל סוג של ערכים. (מכוון ולפי תוכנית הלימודים עובדים עם גרסאות סטנדרטיות , תוכלו להחזיר רק ערכים מסוגים סטנדרטיים.)
הפונקציה בפסקל מוגדרת כך:
Function name:type;
Var
Some local variables…
Begin
Some commands…
Name:=return value;
End;
כפי ששמתם לב , פתחתי במילה שמורה FUNCTION , המשכתי עם שם הפונקציה , וסוג הנתון שהיא תחזיר.
בנוסף , נוספה שורה בה אתם מציבים את הערך שאתם רוצים להציב לערך הפונקציה.
הגבלות עבודה עם ערך הפונקציה:
בתוך הפונקציה אתם יכולים רק להציב לערך הפונקציה , ולא יכולים להשתמש בו בתור משתנה פנימי רגיל , לכן מומלץ ליצור משתנה עזר , לעבוד אתו , ולהחזיר רק בסוף הפונקציה.
כמו פרוצדורה , גם פונקציה יכולה לקבל פרמטרים:
Function name(param,param:type;var param:type):type;
אתם יכולים לקרוא לפונקציה בתוך ביטוי כלשהו ולהציב את הערך המוחזר בתוף משתנה או להשתמש בערך המוחזר לכל ביטוי אחר…
למשל:
a:=sqr(b+abs(d));