250 likes | 421 Views
תכנות פרוצדורלי - II. מקור: Sethi, R. (1996). Programming Languages concepts & constructs , Addison-Wesley, 2nd Ed. פרדיגמה תכנותית בכלל והפרדיגמה הפרוצדורלית בפרט ניתנת לביטוי באמצעות שפות תכנות שונות. בתרגול זה נסקור שתי שפות אשר שייכות לפרדיגמה פרוצדורלית C ו- Pascal :
E N D
תכנות פרוצדורלי - II מקור: Sethi, R. (1996). Programming Languages concepts & constructs, Addison-Wesley, 2nd Ed.
פרדיגמה תכנותית בכלל והפרדיגמה הפרוצדורלית בפרט ניתנת לביטוי באמצעות שפות תכנות שונות. • בתרגול זה נסקור שתי שפות אשר שייכות לפרדיגמה פרוצדורלית C ו- Pascal: • שפת Pascal שהיא strong type language. • שפת C שהיא weak type language.
C Pascal type conversion character type values -- Boolean true, false int %d integer …-1,0,1,2,… double %f real …, 0.0, ..3.14, … char %c char a,b…!,#,8 7,… char* %s string[<size>] “ hello” unsigned <type> %u short <type> %h<tav-type> long <type> %l<tav-type> טיפוסים בסיסיים -- basic types ניתן להשוות בין ערכים של אותו טיפוס, מותר לרשמם בצד ימין של משפטי השמה, ניתן להעביר אותם כפרמטר.
ב- C: תו המרה/בקרה (conversion character) מציין איך להתייחס לערך הניתן לפונקציות קלט/פלט. • שימו לב: • בשפת Pascal אין תווי המרה. • טיפוסvoid קיים רק ב- C
C Pascal int x; double y = 5.0; char * st = “ entered”; printf(“Enter the number\n”); scanf(“%d”, &x); printf(“%lf”, y); printf(“ %s the number %d \n”, st,x); var x: integer; y: double; st: string[10]; begin y := 5.0 ; st:= ‘entered’; writeln(‘Enter the number’); read(x); writeln(y); writeln(st,’the number’,st,x); דוגמא לשימוש בתווי המרה היא קלט/פלט:
C Pascal typedef enum { Mon,Tue,Wed,Thu,Fri,Sat,Sun } Result type day = (Mon,Tue,Wed,Thu,Fri,Sat,Sun); Mon<Tue< … <Sat<Sun טיפוסים ממוספריםenumerated types • enumerationזוהי קבוצה סופית של פריטים. הפריטים בקבוצה זו ממוינים. • כל הפעולות שניתן לבצע על טיפוסים בסיסיים ניתן לבצע גם על טיפוסים ממוספרים (enumerated types).
С Pascal struct <name> { <type1> name1; <type2> name2; … } record <name1>: <type1> <name2>: <type2> … end טיפוס רשומה
С Pascal struct book { char name[20]; int num[10]; double price; } type book = record name: string[20]; num: array[1..10] of integer; price: real; end struct book b; b: book; רשומות רגילות • רשומות פשוטות הן רשומות המורכבות מטיפוסים פשוטים בלבד.
בשפת C ניתן גם לקצר את תהליך הגדרת המשתנה ע"י שימוש ב - typedef . • לדוגמא: typedef struct Sbook{ …. } book; … book b;
C Pascal typedef struct Snode { int info; struct Snode * next; } node; type link = ↑ node; node = record info : integer; next : link; end; מצביעים • בשפת C ניתן להגדיר מצביע לאותו טיפוס עוד לפני שסיימנו להגדיר אותו. • לעומת זאת בשפת Pascal חייבים להכריז על קיום טיפוס.
גישה לשדות של רשומה • בשפת Pascal ניגשים לשדות של רשומה ע"י " . ↑ ". לדוגמא: b . ↑ price := 5.12 • בשפת C גישה לרשומה תלויה בסוג המשתנה: • אם משתנה הוא מצביע על רשומה אז הגישה לכל השדות היא ע"י ' ' . לדוגמא : b->price = 5.12 • ואם משתנה מכיל רשומה עצמה אז הגישה לכל השדות ע"י ' . '. לדוגמא: b.price = 5.12
Variant Records(רק בשפת Pascal ) type kind = (leaf, unary, binary); type link = ↑ node; node = record c1: integer; c2: real; case k: kind of leaf: (); unary: (child :link); binary: (lchild, rchild: link) end; … var x : node;
2. משתנים וטווח חייהם • גלובליים • לוקליים • תחום הגדרה scope
3.מבני בקרה • תנאים if ...else • בחירה/הסתעפות case... swich • לולאות for, while …
C Pascal <return type> <name> (<parameters>) { body return <something> } function <name> (<parameters>) :<return type> begin body <name> = <something> end פונקציה מחזירה ערך ע"י פקודת return פונקציה מחזירה ערך ע"י פעולת השמה לשם הפונקציה 4.פונקציות • הגדרת פונקציה
פרוצדורות • בשפת C כל הפונקציות מחזירות ערך (גם כשפונקציה מחזירה void פעולה זו נחשבת להחזרת ערך). לעומת זאת בשפתPascal קיימות גם פרוצדורות, כאשר פרוצדורה אינה מחזירה ערך. • דוגמא לפרוצדורה ב Pascal- : procedure print_array ( a: array [1..5] of integer, int n) var i:integer; begin for i:=1 to 5 do writeln (a[i]); end
העברת פרמטרים • העברת פרמטרים לפונקציות by value • לפונקציה/לפרצדורה מועברים רק ערכים של פרמטרים. • אין תופעות לוואי side-effect – פונקציה לא יכולה לשנות ערכים של משתנים שאינם מוגדרים בה. העברת פרמטרים by reference • לפונקציה/לפרצדורה מועברות כתובות. • פונקציה יכולה לגרום תופעות לוואי side-effect – לאחר ריצה של פונקציה ערכי משתנים שאינן מוגדרים בה יכולים להשתנות.
C Pascal void swap (int* x, int * y) {int tmp; tmp:= *x ; *x:=*y ; *y:=tmp; } procedure swap (var x:integer; var y:integer) var tmp :integer; begin tmp:=x ; x:=y ; y:=tmp; End { int x,y; x = 5; y= 6; swap (&x, &y); } var x,y: integer; begin x := 5; y := 6; swap (x,y); End
Pascal С 1) 2) a: array[1..10] of integer; b: array [2 .. 7] of integer; int a [10]; 5.מבני נתונים - מערך חד-ממדי • בשפת פסקל ניתן להגדיר תחום של מערך, במילים אחרות אינדקס התחלה ואינדקס סיום. • לעומת זאת בשפת C ניתן לציין גודל בלבד. אינדקס התחלה תמיד יהיה 0, ואינדקס סיום יהיה < 1-גודל> . • בשתי השפות הגישה לתא של מערך מתבצעת באמצעות ציון האינדקס בין סוגריים [ ]. לדוגמא: a[5].
Static vs Dinamic Array bounds • בשפת Pascal אינדקס של מערך לא חייב להיות מספר A : array[char] of int; A[‘+’] = 3; • בשפת Pascal טיפוס המערך של 10 מספרים שונה מטיפוס המערך של 100 מספרים. האם לדעתכם זה בעיה? ואם כן למה?
קבוצה set type • ב- Pascal ניתן להגדיר מבני נתונים קבוצה (set) ע"י ציון רשימת איבריה בין סוגריים [ ] . כל איברי הקבוצה חייבים להיות בעלי אותו טיפוס. בשפת C אין טיפוס כזה. • דוגמאות לקבוצות: • [ ] • [ `0`…`9`] • [`a`…`z`,`A`…`Z`]
פעולה משמעות + set union A B - set difference A-B = { x | x A and x B } * set intersection A B / symmetric difference (A-B) (B-A) =, , , comparing operators הגדרת קבוצה: • A יכול להיות: [ ], [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3] • פעולות:
Pascal С 1) 2) a: array[1..10][1..20] of integer; b: array [2..7][3..5] of integer; int a [10][20]; מערך דו-ממדי (מטריצה) • בהגדרת מטריצה הפרמטר הראשון מציין מספר שורות, והפרמטר שני מציין את מספר העמודות. כלומר: • בדוגמה (1) הגדרנו מטריצה בגודל 10x20 (10 שורות, ו20 עמודות); • ובדוגמא (2) הגדרנו מטריצה בעלת 5 שורות (שורה ראשונה אינדקס 2, שורה אחרונה אינדקס 7)ו- 3 עמודות (עמודה ראשונה אינדקס 3, עמודה אחרונה אינדקס 5). • בשתי השפות הגישה לתא של מטריצה מתבצעת באמצעות ציון אינדקסים בין סוגריים [ ]: קודם אינדקס שורה ואחרי זה אינדקס עמודה.
Pascal С a: array[1..5][1..6][1..3] of integer; int a [5][6][3]; a: array[1..1][1..2]… [1..n] of integer; int a [1][2]…[n] מערך רב-ממדי • בשתי שפות ניתן להגדיר מערכים רב-ממדיים.