שיעור שישי: מערכים ופונקציות 9012345678 0987654321 מבוא כללי...

87
םםםםם םםםם: םםםםםם םםםםםםםםםwww.cs.tau.ac.il/courses/cs4ma th/10b 9 0 1 2 3 4 5 6 7 8 0 9 8 7 6 5 4 3 2 1 םםםם םםםם םםםםם םםםם םםםם םםםםם םםםםם םםםםם

Post on 20-Dec-2015

231 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שיעור שישי: מערכים ופונקציות

www.cs.tau.ac.il/courses/cs4math/10b

90 1 2 3 4 5 6 7 8

09 8 7 6 5 4 3 2 1

מבוא כללי למדעי המחשבמבוא כללי למדעי המחשב

Page 2: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שאלהשאלה מספרים שלמים, ולאחר מכן להדפיס מספרים שלמים, ולאחר מכן להדפיס 3030רוצים לקלוט רוצים לקלוט

מהסדר שקלטנו אותם )כלומר מהסוף מהסדר שקלטנו אותם )כלומר מהסוף הפוךהפוךאותם בסדר אותם בסדר כיצד נוכל לעשות זאת? כיצד נוכל לעשות זאת?להתחלה(.להתחלה(.

מספרים: מספרים:33לדוגמא, אם היה מדובר על קלט של לדוגמא, אם היה מדובר על קלט של •

200200

100100

7070הפלט היה צריך להיות:הפלט היה צריך להיות:•

7070

100100

200200

Page 3: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פתרון אפשריפתרון אפשרי,a1,a1, משתנה לכל ערך מהקלט: , משתנה לכל ערך מהקלט: משתנים משתנים3030ב-ב-נשתמש נשתמש •

…,a30…,a30..

לתוך משתנה )הראשון לתוך משתנה )הראשון המספרים המספרים 3030כל אחד מ-כל אחד מ-נקלוט את נקלוט את •, וכן הלאה(, וכן הלאה(a2a2, השני ל- , השני ל- a1a1ל- ל-

נדפיס את ערכי שלושים המשתנים בסדר הפוך מסדר נדפיס את ערכי שלושים המשתנים בסדר הפוך מסדר •..a1a1, וכך הלאה עד , וכך הלאה עד a29a29, אחר-כך , אחר-כך a30a30הקלט: קודם הקלט: קודם

..., פקודות הדפסה30 פקודות קלט, 30 משתנים, 30אז בתוכנית יהיו

10001000זו תהיה תוכנית מאוד מסורבלת )ומה נעשה אם יהיו זו תהיה תוכנית מאוד מסורבלת )ומה נעשה אם יהיו מספרים?(מספרים?(

Page 4: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מה היינו רוציםמה היינו רוצים

יש פה הרבה פעולות זהות על משתנים מאותו סוג – היינו יש פה הרבה פעולות זהות על משתנים מאותו סוג – היינו •רוצים לכתוב אותן פעם אחת בלבד:רוצים לכתוב אותן פעם אחת בלבד:

מאותו סוג עבור הקלט. מאותו סוג עבור הקלט. משתנים משתנים3030להגדיר בבת-אחת להגדיר בבת-אחת • ושהמחשב יבצע ושהמחשב יבצע לכתוב פעם אחת את פקודת הקלט,לכתוב פעם אחת את פקודת הקלט,•

פעם, כל פעם למשתנה המתאים. פעם, כל פעם למשתנה המתאים.3030אותה אותה ושזה יבוצע עבור כל ושזה יבוצע עבור כל לכתוב פעם אחת את הדפסת הפלט,לכתוב פעם אחת את הדפסת הפלט,•

אחד מהמשתנים בסדר המתאים. אחד מהמשתנים בסדר המתאים.

Page 5: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הפתרון: מערךהפתרון: מערך מאפשרת להגדיר בבת-אחת אוסף של משתנים מאפשרת להגדיר בבת-אחת אוסף של משתנים CCשפת שפת •

מאותו סוג, ולגשת לכל אחד מהם בעזרת אינדקס )מספר מאותו סוג, ולגשת לכל אחד מהם בעזרת אינדקס )מספר ..מערך"מערך"""סידורי(. אוסף כזה נקרא סידורי(. אוסף כזה נקרא

זה מאפשר לעשות לולאה על המספר הסידורי של זה מאפשר לעשות לולאה על המספר הסידורי של •המשתנה, ולבצע אותו דבר על כל אחד מהמשתנים המשתנה, ולבצע אותו דבר על כל אחד מהמשתנים

)"התאים"( במערך.)"התאים"( במערך.

A[0] A[29]

9599 . . . . . . . .

Page 6: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

איך ניראה הפיתרוןאיך ניראה הפיתרון

#include<stdio.h>#include<stdio.h>

int main)(int main)(

{{

int i,int i, input[30] input[30];;

printf)“Enter the 30 integers:\n”(;printf)“Enter the 30 integers:\n”(;

for )i=0; i<=29; i++(for )i=0; i<=29; i++(

scanf)“%d”, scanf)“%d”, &input[i]&input[i](;(;

for )i=29; i>=0; i--(for )i=29; i>=0; i--(

printf)“%d”, printf)“%d”, input[i]input[i](;(;

}}

עד תא 0קלט לתאי המערך, מתא 29

עד 29הדפסה בסדר הפוך, מתא 0תא

30התוכנית קולטת מספרים ומדפיסה אותם

בסדר הפוך

משתנים מסוג 30מגדירים מערך של int

עוברים בלולאה על המשתנים האלה

Page 7: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מערכים - נושאיםמערכים - נושאים

מה זה מערך ולמה הוא משמשמה זה מערך ולמה הוא משמש•הגדרה ואיתחולהגדרה ואיתחול•גישה לתאיםגישה לתאים•

Page 8: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שימוש במערכיםשימוש במערכים

, ויכולנו לעבוד כך רק עם מספר , ויכולנו לעבוד כך רק עם מספר בנפרד בנפרדעד עכשיו הגדרנו כל משתנהעד עכשיו הגדרנו כל משתנה•קטן של משתנים.קטן של משתנים.

ולעשות ולעשות הרבה נתונים מאותו סוגהרבה נתונים מאותו סוגבמקרים רבים צריך לשמור בזיכרון במקרים רבים צריך לשמור בזיכרון •על כל אחד מהם אותן פעולות )למשל שכר של כל אחד מהעובדים על כל אחד מהם אותן פעולות )למשל שכר של כל אחד מהעובדים

בחברה, ציונים של כל התלמידים, הפז"מ של כל חייל וכו'(. בחברה, ציונים של כל התלמידים, הפז"מ של כל חייל וכו'(.

מאפשרת להגדיר קבוצה של כמה משתנים מאותו סוג בבת מאפשרת להגדיר קבוצה של כמה משתנים מאותו סוג בבת CCשפת שפת •"מערך"."מערך".אחת. קבוצה כזאת נקראת אחת. קבוצה כזאת נקראת

אפשר לעשות לולאה על אפשר לעשות לולאה על כפי שראינו בדוגמא, בעבודה עם מערכים כפי שראינו בדוגמא, בעבודה עם מערכים • פעם אחתפעם אחת וזה מאפשר לכתוב וזה מאפשר לכתוב של המשתנה במערך,של המשתנה במערך, המס' הסידוריהמס' הסידורי

את פעולות הקלט/פלט והחישובים ולבצע אותן באמצעות הלולאה על את פעולות הקלט/פלט והחישובים ולבצע אותן באמצעות הלולאה על מהמשתנים. מהמשתנים.כל אחדכל אחד

Page 9: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מערכים – משמעות והגדרהמערכים – משמעות והגדרה

כאמור, מערך הוא אוסף של משתנים מאותו טיפוס )הטיפוס כאמור, מערך הוא אוסף של משתנים מאותו טיפוס )הטיפוס • או כל טיפוס אחר או כל טיפוס אחר int, char, float, doubleint, char, float, doubleיכול להיות יכול להיות

שנכיר(.שנכיר(.

רושמים את טיפוס המשתנים ואת רושמים את טיפוס המשתנים ואת בהגדרת המערךבהגדרת המערך•מספרם.מספרם.

::doubledouble משתנים מטיפוס משתנים מטיפוס 100100למשל כך נגדיר מערך של למשל כך נגדיר מערך של •

double prices[double prices[10100];0];

הגדרת מערך מקצה רצף של מקומות בזיכרון שיכילו את הגדרת מערך מקצה רצף של מקומות בזיכרון שיכילו את •ערכי תאי )משתני( המערך. למשל:ערכי תאי )משתני( המערך. למשל:

A[0] A[9]

59 . . . . . . . .

Page 10: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הכנסת ערך לתא במערךהכנסת ערך לתא במערך

לכל אחד מהתאים במערך יש מספר סידורי )אינדקס(, החל לכל אחד מהתאים במערך יש מספר סידורי )אינדקס(, החל •. . 00מ-מ-

ההתייחסות אל כל תא היא על-ידי שם המערך והמספר ההתייחסות אל כל תא היא על-ידי שם המערך והמספר • בתוך סוגריים מרובעים.בתוך סוגריים מרובעים.הסידורי של התא, הסידורי של התא,

5151, ונשים , ונשים intint משתנים מסוג משתנים מסוג 1010לדוגמא, נגדיר מערך של לדוגמא, נגדיר מערך של • בתא העשירי: בתא העשירי:4545בתא הראשון ו-בתא הראשון ו-

int A[10];int A[10];

A[0]=51;A[0]=51;

A[9]=45;A[9]=45; A[0] A[9]

4551 . . . . . . . .

Page 11: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

קריאת ערך מתא במערךקריאת ערך מתא במערך

את את לקבללקבל ערך בתא מסויים, אפשר גם ערך בתא מסויים, אפשר גם לשיםלשיםכמו שאפשר כמו שאפשר •הערך שנמצא בתא מסויים. למשל:הערך שנמצא בתא מסויים. למשל:

printf)“%d”, A[printf)“%d”, A[00](;](;

i=A[5];i=A[5];

כדי להתייחס לתא במערך צריך תמיד לציין את כדי להתייחס לתא במערך צריך תמיד לציין את נשים לב:נשים לב:•המספר הסידורי שלו בתוך סוגריים מרובעים.המספר הסידורי שלו בתוך סוגריים מרובעים.

לכתובת ההתחלהלכתובת ההתחלהשם המערך ללא סוגריים מרובעים מתייחס שם המערך ללא סוגריים מרובעים מתייחס •של המערך בזיכרון, ולא לתא במערך.של המערך בזיכרון, ולא לתא במערך.

Page 12: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדוגמא שראינוהדוגמא שראינו

#include<stdio.h>#include<stdio.h>

int main)(int main)(

{{

int i,int i, input[30] input[30];;

printf)“Enter the 30 integers:\n”(;printf)“Enter the 30 integers:\n”(;

for )i=0; i<=29; i++(for )i=0; i<=29; i++(

scanf)“%d”, scanf)“%d”, &input[i]&input[i](;(;

for )i=29; i>=0; i--(for )i=29; i>=0; i--(

printf)“%d”, printf)“%d”, input[i]input[i](;(;

}}

עד תא 0קלט לתאי המערך, מתא 29

עד 29הדפסה בסדר הפוך, מתא 0תא

30התוכנית קולטת מספרים ומדפיסה אותם

בסדר הפוך

משתנים מסוג 30מגדירים מערך של int

עוברים בלולאה על המשתנים האלה

Page 13: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

איתחול מערכים בשורת ההגדרהאיתחול מערכים בשורת ההגדרהכמו טיפוסי משתנים אחרים, ניתן לאתחל מערך כשמגדירים כמו טיפוסי משתנים אחרים, ניתן לאתחל מערך כשמגדירים •

אותו. זה נעשה באופן הבא:אותו. זה נעשה באופן הבא:• int A[5]={7,43,15,17,235};int A[5]={7,43,15,17,235};

ערכי האיתחול נכנסים לתאי-המערך לפי הסדר )משמאל לימין(.ערכי האיתחול נכנסים לתאי-המערך לפי הסדר )משמאל לימין(.•

מהתאים, שאר התאים יאותחלו עם מהתאים, שאר התאים יאותחלו עם לחלק לחלק אם ניתן ערכים רק אם ניתן ערכים רק •..00הערך הערך

int A[5]={9,42};int A[5]={9,42};;;int A[5]={0}int A[5]={0} אז אפשר למשל לאתחל מערך באפסים על-ידי אז אפשר למשל לאתחל מערך באפסים על-ידי

כמספר ערכי כמספר ערכי אם לא נציין את מספר תאי המערך, הוא יהיה אם לא נציין את מספר תאי המערך, הוא יהיה • תאים(: תאים(:66)בדוגמא הבאה יהיו לו )בדוגמא הבאה יהיו לו האיתחול האיתחול

• int A[]={16,2,19,256,5,1432};int A[]={16,2,19,256,5,1432};

לא ניתן להכניס ערכים למערך באופן הזה אחרי ההגדרה שלו.לא ניתן להכניס ערכים למערך באופן הזה אחרי ההגדרה שלו.•

Page 14: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

אין גישה לכל המערך בבת-אחתאין גישה לכל המערך בבת-אחתאחרי הגדרת המערך אפשר רק להתייחס לכל אחד אחרי הגדרת המערך אפשר רק להתייחס לכל אחד •

מהתאים שלו בנפרד.מהתאים שלו בנפרד.אי-אפשר לשים ערכים בתאי המערך בבת-אחת:אי-אפשר לשים ערכים בתאי המערך בבת-אחת:•

למשל אי-אפשר לאפס בבת-אחת את כל התאים, וצריך לעשות למשל אי-אפשר לאפס בבת-אחת את כל התאים, וצריך לעשות •זאת ע"י לולאה:זאת ע"י לולאה:

• for)i=0; i<10; i++( for)i=0; i<10; i++( A=0A=0

A[i]=0; A[i]=0;

= = אי-אפשר להעתיק מערך למערך אחר ע"י פעולת אי-אפשר להעתיק מערך למערך אחר ע"י פעולת •גם זה דורש לולאה:גם זה דורש לולאה:

• for)i=0; i<10; i++( for)i=0; i<10; i++( A=BA=B

A[i]=B[i]; A[i]=B[i];

, וכו' )דרושה לולאה(. , וכו' )דרושה לולאה(. השוואה, הדפסה, קלטהשוואה, הדפסה, קלטכך גם לגבי פעולות כך גם לגבי פעולות •

Page 15: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

חריגה מגבולות המערךחריגה מגבולות המערך אם נכתוב לתא במערך מעבר לגודל שהוגדר, בסבירות אם נכתוב לתא במערך מעבר לגודל שהוגדר, בסבירות

גבוהה יפגעו נתונים של תוכנות אחרות, והתוכנית גבוהה יפגעו נתונים של תוכנות אחרות, והתוכנית "תעוף"."תעוף".

למשל: למשל:

int a[10];int a[10];

a[1a[100]=1;]=1;

a[-1]=5;a[-1]=5;

Page 16: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

נקודה תשומת-לבנקודה תשומת-לבבהגדרת מערך הגודל שלו חייב להיות מספר קבוע, ולא בהגדרת מערך הגודל שלו חייב להיות מספר קבוע, ולא •

יכול להיות ערך של משתנה.יכול להיות ערך של משתנה.

למשל: למשל:

int a[10];int a[10];

int my_size=10; int my_size=10; ולאולא: :

int a[my_size];int a[my_size];

)כי זה )כי זה definedefine##גודל מערך יכול להיות קבוע שמוגדר ב- גודל מערך יכול להיות קבוע שמוגדר ב- •מספר שכתוב בתוכנית ולא יכול להשתנות במהלך הריצה(.מספר שכתוב בתוכנית ולא יכול להשתנות במהלך הריצה(.

#define SIZE 10#define SIZE 10

int a[SIZE];int a[SIZE];

Page 17: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מערכים - דוגמא נוספתמערכים - דוגמא נוספת

#include<stdio.h>#include<stdio.h>int main)(int main)({{ int i, num, int i, num, digits[10]={0};digits[10]={0};

printf)“Enter a positive integer:\n”(;printf)“Enter a positive integer:\n”(; scanf)“%d”, &num(;scanf)“%d”, &num(; while )num!=0(while )num!=0( {{ digits[num%10]++;digits[num%10]++; num=num/10;num=num/10; }} for )i=0; i<10; i++(for )i=0; i<10; i++( printf)“Digit %d appeared %d times\n”, i, printf)“Digit %d appeared %d times\n”, i, digits[i]digits[i](;(; }}

התוכנית הזו קולטת מספר שלם חיובי כמה פעמים הופיעה בו כל ומדפיסה

סיפרה

מדפיסים כמה פעמים כל ספרה הופיעה

כל תאי המערך מאותחלים לאפס

מניחים כאן שהקלט ()תקין

את התא שמתאים 1מגדילים ב-ומחלקים לספרת האחדות של המספר,

10אותו ב-

לולאה שנמשכת כל עוד המספר לא מתאפס

i במערך יכיל את מספר ההופעות של הספרה i תא

00 0 0 0 0 0 0 0 0

נניח לדוגמא 557

112

5550

Page 18: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

נקודה לתשומת-לב: מערך קבוענקודה לתשומת-לב: מערך קבוע

(.(.constconstכקבוע )כקבוע )כמו כל משתנה, אפשר להגדיר מערך כמו כל משתנה, אפשר להגדיר מערך •

constconst int M[12]={ int M[12]={31,28,31,30,31,30,31,31,30,31,30,3131,28,31,30,31,30,31,31,30,31,30,31};};

ערכי המערך הוגדרו כקבועים, ולכן לא ניתן להעביר אותו

Page 19: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מערכים רב-מימדייםמערכים רב-מימדיים

לפעמים נירצה לייצג מטריצות, או מערכים ממימדים גבוהים יותר.לפעמים נירצה לייצג מטריצות, או מערכים ממימדים גבוהים יותר.•נוכל להגדיר מערכים כאלה למשל על-ידי:נוכל להגדיר מערכים כאלה למשל על-ידי:•

int a[10][100];int a[10][100];

של מספרים של מספרים 100100 מערכים בגודל מערכים בגודל 1010המשמעות היא שהגדרנו המשמעות היא שהגדרנו •שלמים.שלמים.

ואז נוכל לגשת לכל תא ע"י שני אינדקסים, למשל:ואז נוכל לגשת לכל תא ע"י שני אינדקסים, למשל:•

a[5][8]=4;a[5][8]=4;

Page 20: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מערכים רב-מימדיים - איתחולמערכים רב-מימדיים - איתחול

ניתן לתת ערכים התחלתיים גם כשמגדירים מערך ניתן לתת ערכים התחלתיים גם כשמגדירים מערך •רב-מימדי.רב-מימדי.

מתייחסים אליו כאל מערך של מערכים חד-מימדיים, מתייחסים אליו כאל מערך של מערכים חד-מימדיים, •ומעבירים ערכי איתחול לכל אחד מהם. למשל:ומעבירים ערכי איתחול לכל אחד מהם. למשל:

int my_matrix[3][2]={ {1,0}, {0,1}, {1,1}int my_matrix[3][2]={ {1,0}, {0,1}, {1,1} };};

איתחול נפוץ יותר הוא בעזרת לולאות מקוננות )אם יש איתחול נפוץ יותר הוא בעזרת לולאות מקוננות )אם יש •הרבה תאים לא נירצה לכתוב את ערכי כולם(.הרבה תאים לא נירצה לכתוב את ערכי כולם(.

Page 21: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: איפוס מערך דו-מימדי בגודל דוגמא: איפוס מערך דו-מימדי בגודל 100100100x100x

int main()int main(){{ int a[int a[100100][][100100]]

int i ,j;int i ,j; for(i=0; i<for(i=0; i<100100; i++); i++) for(j=0; j<for(j=0; j<100100; j++); j++) a[ i ][ j ] = a[ i ][ j ] = 00;;

return 0;return 0;}}

המימד אין צורך לרשום את בסוגריים הראשון

המרובעים )כמו במערכים חייבים לרשום רגילים(, אבל

.גודל בסוגריים השניים

Page 22: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

??דוגמא: מה עושה התוכנית הבאהדוגמא: מה עושה התוכנית הבאה#include<stdio.h>#include<stdio.h>int main)(int main)({{ int i ,j, int i ,j, a[11][11];a[11][11];

for)i=1; i<=10; i++(for)i=1; i<=10; i++( for)j=1; j<=10; j++(for)j=1; j<=10; j++( a[ i ][ j ] = i*j;a[ i ][ j ] = i*j;

for)i=1; i<=10; i++(for)i=1; i<=10; i++( {{ for)j=1; j<=10; j++(for)j=1; j<=10; j++( printf)“%printf)“%44d”, a[ i ][ j ] (;d”, a[ i ][ j ] (; printf)“\n”(;printf)“\n”(; }}}}

מדפיסה את לוח הכפל

תווים להדפסת 4כך יוקצו כל מספר )ואם יש פחות

ספרות יהיו משמאל רווחים(

יודפס:

1 2 3 4 5 6 7 8 9 10

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

.

.

.

Page 23: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מבוא כללי למדעי המחשבמבוא כללי למדעי המחשב

פונקציות

www.cs.tau.ac.il/courses/cs4math/09b

Page 24: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שאלהשאלה

כיצד נוכל לחשב את הסכום הבא:כיצד נוכל לחשב את הסכום הבא:•

222020+3+31515+5+51717= ?= ?

Page 25: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פתרון אפשריפתרון אפשרי#include <stdio.h>#include <stdio.h>int main)(int main)({{

int i; int i; double sum=0, result=double sum=0, result=11;;for)i=1; i<for)i=1; i<==20; i++(20; i++( result=result*2;result=result*2;sum +=result;sum +=result;result=result=11;;for)i=1; i<for)i=1; i<==15; i++(15; i++( result=result*3;result=result*3;sum +=result;sum +=result;result=result=11;;for)i=1; i<for)i=1; i<==17; i++(17; i++( result=result*5;result=result*5;sum +=result;sum +=result;printf)“2^20 + 3^15 + 5^17= %g”, sum(; printf)“2^20 + 3^15 + 5^17= %g”, sum(; return 0;return 0;

}}

אם היו יותר מחוברים - היינו צריכים לחזור פעמים נוספות על אותן שורות עם מספרים

אחרים

זה מאריך את התוכנית פי כמה וכמה, מסרבל אותה, ויוצר פתח

לבאגים

Page 26: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

??מה היינו רוציםמה היינו רוצים, שתבצע חישוב של , שתבצע חישוב של פקודה חדשהפקודה חדשההיינו רוצים להגדיר פעם אחת היינו רוצים להגדיר פעם אחת

בפקודה החדשה הזאת כמה פעמים, כל פעם בפקודה החדשה הזאת כמה פעמים, כל פעם להשתמש להשתמש חזקה, ואז חזקה, ואז עבור מספרים אחרים. עבור מספרים אחרים.

222020+3+31515+5+51717 למשל היינו רוצים שנוכל לחשב את התוצאה של למשל היינו רוצים שנוכל לחשב את התוצאה של על-ידי:על-ידי:

sum = power )2, 20( + power )3,15( + power )5,17(;sum = power )2, 20( + power )3,15( + power )5,17(;

אכן מאפשרת הגדרת פקודות חדשות, כפי שניראה היום. אכן מאפשרת הגדרת פקודות חדשות, כפי שניראה היום. CC שפת שפת "פונקציות". "פונקציות".CCפקודות חדשות כאלה נקראות ב-פקודות חדשות כאלה נקראות ב-

Page 27: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

הגדרת הפונקציה מופיעה לפני התוכנית )לפני ה-

(main

Page 28: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>double double powerpower)double base, int exponent()double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

ההגדרה כוללת את שם הפונקציה

Page 29: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>double double powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

ההגדרה כוללת את שם הפונקציה

היא כוללת גם את המשתנים שעליהם הפונקציה מוגדרת

)בדומה לפונקציות במתמטיקה(

Page 30: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>doubledouble powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

ההגדרה כוללת את שם הפונקציה

היא כוללת גם את המשתנים שעליהם הפונקציה מוגדרת

)בדומה לפונקציות במתמטיקה(

ואת סוג הערך שהפונקציה מחשבת

)"מחזירה"(

Page 31: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>doubledouble powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

השורה הראשונה נקראת "כותרת הפונקציה"

(header, prototype)גוף הפונקציה )מה שרוצים

שיתבצע כשמשתמשים בה( מופיע אחרי הכותרת בתוך

סוגריים מסולסלים. אומרת מה ערך returnפקודת

הפונקציה )"מה היא מחזירה"(

Page 32: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>doubledouble powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)2,20(+power)3,15(+power)5,17(;power)2,20(+power)3,15(+power)5,17(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

השורה הראשונה נקראת "כותרת הפונקציה"

(header, prototype)כאן גוף הפונקציה מחשב

בחזקת baseכמה זה exponent ושם את התוצאה

resultבמשתנה בשם הפונקציה הזו מחזירה את הערך

resultשנמצא במשתנה בשם

Page 33: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

CCאיך זה ניראה ב-איך זה ניראה ב-#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=powerpower))2,202,20(+(+powerpower))3,153,15(+(+powerpower))5,175,17(;(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

, רושמים כשמשתמשים בפונקציהבסוגריים עבור איזה ערכים מעוניינים

לחשב אותה

בזמן הריצה, כשמגיעים לשימוש בפונקציה, המחשב יעבור לחשב את ערך הפונקציה, ורק לאחר מכן ימשיך בתוכנית

תמיד תתחיל ריצת התוכנית:כאן

Page 34: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

Page 35: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

Page 36: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

Page 37: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)solution=power)22,,1010(; (;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

Page 38: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

Page 39: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 1

Page 40: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 1

1

Page 41: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 2

1

Page 42: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 2

2

Page 43: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 4

2

Page 44: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 1024

10אחרי 11איטרציו

ת

Page 45: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=solution=power)2,10(power)2,10(; ;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution

base

exponent

2

10

i

result 1024

11

Page 46: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution 1024

Page 47: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution 1024

1024

Page 48: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הדגמת הריצה בשימוש פונקציההדגמת הריצה בשימוש פונקציה#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution; solution=power)2,10(; solution=power)2,10(;

printf)“2^10 = %g”, solution(; printf)“2^10 = %g”, solution(; return 0;return 0;

}}

solution 1024

1024

Page 49: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פונקציות – נושאיםפונקציות – נושאים

איך יוצרים פקודה חדשה: הגדרת פונקציותאיך יוצרים פקודה חדשה: הגדרת פונקציות•שימוש בפונקציות: קריאה לפונקציה והערך המוחזר שימוש בפונקציות: קריאה לפונקציה והערך המוחזר •

ממנה ממנה משתנים בפונקציות והעברת ערכים לפונקציה משתנים בפונקציות והעברת ערכים לפונקציה •הכרזות על פונקציות וספריות של פונקציותהכרזות על פונקציות וספריות של פונקציות•העברת מערכים לפונקציותהעברת מערכים לפונקציות•

...בונוס: מחרוזות...בונוס: מחרוזות•

Page 50: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שימוש בפונקציותשימוש בפונקציות

בתכנות קורה לעיתים קרובות שרוצים להגדיר פקודות חדשות. בתכנות קורה לעיתים קרובות שרוצים להגדיר פקודות חדשות. •

להשתמש באותו קטע להשתמש באותו קטע הסיבה הנפוצה ביותר לכך היא כשרוצים הסיבה הנפוצה ביותר לכך היא כשרוצים • כמה פעמים בתוכנית )יתכן שעם נתונים שונים(. כמה פעמים בתוכנית )יתכן שעם נתונים שונים(.תוכניתתוכנית

מאפשרת כאמור להגדיר פקודות חדשות )שנקראות מאפשרת כאמור להגדיר פקודות חדשות )שנקראות CCשפת שפת •"פונקציות"(, ולאחר מכן להשתמש בהן. "פונקציות"(, ולאחר מכן להשתמש בהן.

(.(.mainmainהגדרות פונקציות יופיעו לפני התוכנית הראשית )לפני ה- הגדרות פונקציות יופיעו לפני התוכנית הראשית )לפני ה- •

נתאר מה הגדרה כזאת כוללת )כותרת הפונקציה וגוף הפונקציה(.נתאר מה הגדרה כזאת כוללת )כותרת הפונקציה וגוף הפונקציה(.•

Page 51: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

? ?מה כוללת הגדרת פונקציה )פקודה חדשה(מה כוללת הגדרת פונקציה )פקודה חדשה(

עבור חזקה(. עבור חזקה(.powerpower שבחרנו לפונקציה )למשל שבחרנו לפונקציה )למשל השםהשם. . 11- כללי השמות המותרים הם כמו הכללים לשמות-משתנים. - כללי השמות המותרים הם כמו הכללים לשמות-משתנים.

- אסור לתת לפונקציה שם שכבר נתנו למשתנה.- אסור לתת לפונקציה שם שכבר נתנו למשתנה.

)"המשתנים שעליהם )"המשתנים שעליהם איזה ערכים דרושים לביצוע הפונקציהאיזה ערכים דרושים לביצוע הפונקציה. . 22 היא פועלת"(. היא פועלת"(.

)בסיס ומעריך(. שניהם )בסיס ומעריך(. שניהם שני ערכים שני ערכים - למשל לחישוב חזקה דרושים - למשל לחישוב חזקה דרושים . . מספרים ממשייםמספרים ממשיים אמורים להיות אמורים להיות

למשל התוצאה למשל התוצאה )"מחזירה"(. )"מחזירה"(. מחשבתמחשבת סוג הערך שהפונקציהסוג הערך שהפונקציה. . 33..מספר ממשימספר ממשישל חזקה היא של חזקה היא

(.(.prototype, headerprototype, header ) )"כותרת הפונקציה""כותרת הפונקציה"כל אלה נקראים כל אלה נקראים --

Page 52: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: כותרת להגדרת פונקציה שמחשבת דוגמא: כותרת להגדרת פונקציה שמחשבת חזקהחזקה

doubledouble powerpower ) )double base, double exponentdouble base, double exponent((

סוג סוג שם שם הערכים שהפונקציה מקבלת הערכים שהפונקציה מקבלת

הערך הערךהפונקציההפונקציה

המוחזר המוחזר)מוגדרים עבורם משתנים, שיש

להם שמות, כך שניתן להשתמש בהם לתיאור גוף הפונקציה(

Page 53: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: אם מגדירים חזקה רק למעריכים שלמיםדוגמא: אם מגדירים חזקה רק למעריכים שלמים

doubledouble powerpower ) )double base, int exponentdouble base, int exponent((

סוג סוג שם שם הערכים שהפונקציה מקבלת הערכים שהפונקציה מקבלת

הערך הערךהפונקציההפונקציה

המוחזר המוחזר)מוגדרים עבורם משתנים, שיש

להם שמות, כך שניתן להשתמש בהם לתיאור גוף הפונקציה(

Page 54: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

? ?מה עוד כוללת הגדרת פונקציה )פקודה חדשה(מה עוד כוללת הגדרת פונקציה )פקודה חדשה(

צריך כמובן לרשום את קטע-התוכנית שמבצע את צריך כמובן לרשום את קטע-התוכנית שמבצע את . . 44)מה שאנחנו רוצים שיקרה )מה שאנחנו רוצים שיקרה הפקודה החדשה הפקודה החדשה

כשמשתמשים בה(. כשמשתמשים בה(. יופיע בתוך סוגריים מסולסלים אחרי כותרת הפונקציה.יופיע בתוך סוגריים מסולסלים אחרי כותרת הפונקציה.-מותר להגדיר בתחילתו משתנים נוספים.מותר להגדיר בתחילתו משתנים נוספים.-

צריך להגדיר מה הערך שהפונקציה מחזירה.צריך להגדיר מה הערך שהפונקציה מחזירה.. . 55..returnreturn- נעשה בעזרת פקודת - נעשה בעזרת פקודת

Page 55: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: הגדרת פונקציה לחישוב חזקהדוגמא: הגדרת פונקציה לחישוב חזקה

doubledouble powerpower))double base, int exponentdouble base, int exponent((

{{

int i; int i;

double result=1;double result=1;

for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++(

result=result*base;result=result*base;

return result;return result;

}}

הערך שהפונקציה מחשבת )מחזירה(

חישוב החזקה )הערך baseשנמצא במשתנה

בחזקת הערך שנמצא (exponentבמשתנה

Page 56: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הגדרת פונקציותהגדרת פונקציותלסיכום, הגדרת פונקציה מבוצעת באופן הבא:לסיכום, הגדרת פונקציה מבוצעת באופן הבא:•

טיפוס הערך טיפוס הערך שם הפונקציהשם הפונקציה ))הגדרת משתנים לערכים שמועברים לפונקציההגדרת משתנים לערכים שמועברים לפונקציה((המוחזרהמוחזר

{{פקודות הפונקציהפקודות הפונקציה return return הערך המוחזרהערך המוחזר {{

למשל:למשל:•doubledouble power) power)double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

בתוך פונקציה אפשר לעשות כל : mainמה שאפשר לעשות ב-

להגדיר משתנים ולבצע פקודות )כולל להפעיל פונקציות(.

Page 57: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

שימוש בפונקציה )"קריאה לפונקציה"(שימוש בפונקציה )"קריאה לפונקציה"(

איזה איזה בשימוש בפונקציה רושמים את שמה, ורושמים בסוגריים עבור בשימוש בפונקציה רושמים את שמה, ורושמים בסוגריים עבור • ספציפיים רוצים להשתמש בה. ספציפיים רוצים להשתמש בה.ערכיםערכים

;;))result=result=power)power)5,105,10למשל: למשל: •

a=32*)a=32*)power)power)bb,,55((+17(+17(;; הערכים יכולים להיות גם ערכים של משתנים או תוצאה של הערכים יכולים להיות גם ערכים של משתנים או תוצאה של •

חישוב )צריכים להתאים לטיפוסים שנקבעו בהגדרת הפונקציה(. חישוב )צריכים להתאים לטיפוסים שנקבעו בהגדרת הפונקציה(.

המחשב עובר לבצע את קטע-התוכנית של המחשב עובר לבצע את קטע-התוכנית של כשקוראים לפונקציה, כשקוראים לפונקציה, • מחשב מה הערך שלה )כלומר מה הערך שהיא מחזירה(, מחשב מה הערך שלה )כלומר מה הערך שהיא מחזירה(, הפונקציה,הפונקציה,

ולאחר מכן ממשיך בביצוע התוכנית.ולאחר מכן ממשיך בביצוע התוכנית.ניתן לשמור את הערך המוחזר במשתנה או לבצע איתו חישובים.ניתן לשמור את הערך המוחזר במשתנה או לבצע איתו חישובים.•..mainmainהתחלת הריצה היא תמיד ב- התחלת הריצה היא תמיד ב- •

Page 58: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: שימוש בפונקציית חזקהדוגמא: שימוש בפונקציית חזקה#include <stdio.h>#include <stdio.h>doubledouble powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=powerpower))2,202,20(+(+powerpower))3,153,15(+(+powerpower))5,175,17(;(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

תמיד תתחיל ריצת התוכנית:כאן

נקראת )מחושבת( כל פעם הפונקציהוהתוצאות ,הערכים המתאימים עבור

מוחזרות

Page 59: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

voidvoidהגדרת פונקציותהגדרת פונקציות: :

אם הפונקציה לא מקבלת ערכים, אפשר להשאיר את אם הפונקציה לא מקבלת ערכים, אפשר להשאיר את • ..voidvoidהסוגריים ריקים או לכתוב בתוכם הסוגריים ריקים או לכתוב בתוכם

))intint print_hello) print_hello)voidvoid למשל: למשל: •

בתור בתור voidvoidאם הפונקציה לא מחזירה ערכים, צריך לכתוב אם הפונקציה לא מחזירה ערכים, צריך לכתוב •טיפוס הערך המוחזר )אם לא רושמים שם כלום זה טיפוס הערך המוחזר )אם לא רושמים שם כלום זה

(. (. intintמתפרש כ- מתפרש כ- למשל:למשל:•

voidvoid print_hello) print_hello)voidvoid((

Page 60: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פונקציות – סיום הפונקציהפונקציות – סיום הפונקציה, צריך לסיים אותה , צריך לסיים אותה להחזיר ערךלהחזיר ערךאם הפונקציה אמורה אם הפונקציה אמורה •

, שבה מוחזר ערך מטיפוס מתאים , שבה מוחזר ערך מטיפוס מתאים returnreturnעל-ידי פקודת על-ידי פקודת (.(.returnreturn ע"י פקודת ע"י פקודת נפסקתנפסקת)ריצת הפונקציה )ריצת הפונקציה

יכולות להיות לפונקציה כמה אפשרויות סיום, שהבחירה יכולות להיות לפונקציה כמה אפשרויות סיום, שהבחירה • ביניהן תתבצע לפי תנאים. למשל: ביניהן תתבצע לפי תנאים. למשל:

int greater)int greater)int a, int bint a, int b(({{

if )a>b( if )a>b( return 1return 1;; else else return 0return 0;;}}

עם סיום ריצת הפונקציה, חוזרים למקום שממנו עם סיום ריצת הפונקציה, חוזרים למקום שממנו •כל המשתנים שלה מתבטלים ולא כל המשתנים שלה מתבטלים ולא הפונקציה נקראה. הפונקציה נקראה.

מוגדרים יותר.מוגדרים יותר.

Page 61: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פונקציות - דוגמאפונקציות - דוגמא#include <stdio.h>#include <stdio.h>doubledouble powerpower))double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=powerpower))2,202,20(+(+powerpower))3,153,15(+(+powerpower))5,175,17(;(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

נקראת )מחושבת( כל פעם הפונקציהוהתוצאות ,הערכים המתאימים עבור

מוחזרות

Page 62: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

mainmainפונקצייתפונקציית שבה התוכנית מתחילה.שבה התוכנית מתחילה., , mainmain מכילה פונקציה בשם מכילה פונקציה בשם CCכל תוכנית כל תוכנית •

. אם . אם intint ממנה מועבר למערכת ההפעלה. טיפוסו צריך להיות ממנה מועבר למערכת ההפעלה. טיפוסו צריך להיות הערך שמוחזרהערך שמוחזר• המשמעות היא שהתוכנית הסתיימה באופן תקין. המשמעות היא שהתוכנית הסתיימה באופן תקין. 00ערכו ערכו

ממערכת ההפעלה )ערכים שנכתבים ממערכת ההפעלה )ערכים שנכתבים לקבל משתניםלקבל משתנים יכולה גם יכולה גם mainmainפונקציית פונקציית •בשורת הפקודה כשמריצים את התוכנית(, אבל יכולה לפעול גם בלי לקבל בשורת הפקודה כשמריצים את התוכנית(, אבל יכולה לפעול גם בלי לקבל

משתנים. משתנים.

intint mainmain)()({{

printf)“Hello World!\n”(; printf)“Hello World!\n”(; return 0;return 0;

}}

Page 63: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

סיבות נוספות לשימוש בפונקציותסיבות נוספות לשימוש בפונקציות

אמרנו שהסיבה הנפוצה ביותר לכך היא כשרוצים אמרנו שהסיבה הנפוצה ביותר לכך היא כשרוצים • כמה פעמים בתוכנית )יתכן כמה פעמים בתוכנית )יתכן להשתמש באותו קטע תוכניתלהשתמש באותו קטע תוכנית

שעם נתונים שונים(.שעם נתונים שונים(.

, שכל , שכל סיבה נוספת היא כדי לחלק את התוכנית לחלקיםסיבה נוספת היא כדי לחלק את התוכנית לחלקים• מסוים )פונקציה אחת תטפל מסוים )פונקציה אחת תטפל חלק לוגיחלק לוגיאחד מהם מבצע אחד מהם מבצע

בכל נושא הקלט, פונקציה אחרת תעשה את כל העיבוד, בכל נושא הקלט, פונקציה אחרת תעשה את כל העיבוד, פונקציה שלישית תטפל בפלט, וכד'(.פונקציה שלישית תטפל בפלט, וכד'(.

קשה לכתוב ולתחזק תוכנית אחת ארוכה שהכל נעשה קשה לכתוב ולתחזק תוכנית אחת ארוכה שהכל נעשה • מקובל לחלק לפונקציות בהתאם לחלקים הלוגייםמקובל לחלק לפונקציות בהתאם לחלקים הלוגייםבתוכה. בתוכה.

קצרה שבעיקר קוראת לפונקציות קצרה שבעיקר קוראת לפונקציות mainmainולכתוב פונקציית ולכתוב פונקציית אחרות.אחרות.

Page 64: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

סיבות נוספות לשימוש בפונקציותסיבות נוספות לשימוש בפונקציות

בתוכניות אחרותבתוכניות אחרותכדי להשתמש בחלק מתוכנית שכתבנו כדי להשתמש בחלק מתוכנית שכתבנו •שנכתוב.שנכתוב.

של פונקציות שימושיות שכתבנו ולהשתמש של פונקציות שימושיות שכתבנו ולהשתמש ספריותספריותנוכל להכין נוכל להכין •בהן בתוכניות אחרות שנכתוב.בהן בתוכניות אחרות שנכתוב.

..stdio.hstdio.h, כמו , כמו CC כאלה ב- כאלה ב- ספריות מוכנותספריות מוכנותיש כבר יש כבר •

Page 65: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

המשתנים בפונקציההמשתנים בפונקציהמקומיים מקומיים משתנים שמוגדרים בתוך פונקציה הם משתנים שמוגדרים בתוך פונקציה הם •

רק לפונקציה הזאת. רק לפונקציה הזאת.)לוקאליים()לוקאליים(

בפונקציות אחרות )אפשר להגדיר בפונקציות אחרות )אפשר להגדיר לא מוגדריםלא מוגדריםהם הם •בפונקציות אחרות משתנים אחרים באותו שם(.בפונקציות אחרות משתנים אחרים באותו שם(.

מועברים ערכיםמועברים ערכיםזה כולל גם את המשתנים שאליהם זה כולל גם את המשתנים שאליהם •עבור הפונקציה )גם הם מקומיים(.עבור הפונקציה )גם הם מקומיים(.

חשוב להדגיש: בסיום ריצת פונקציה משתניה לא חשוב להדגיש: בסיום ריצת פונקציה משתניה לא •מוגדרים יותר, וערכיהם לא נשמרים.מוגדרים יותר, וערכיהם לא נשמרים.

Page 66: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

משתנים בפונקציה -דוגמאמשתנים בפונקציה -דוגמא#include <stdio.h>#include <stdio.h>double power)double power)double base, int exponentdouble base, int exponent(({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

int main)(int main)({{ double solution;double solution;

solution=solution=power)power)2,202,20(+power)(+power)3,153,15(+power)(+power)5,175,17(;(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; printf)“2^20 + 3^15 + 5^17= %g”, solution(; return 0;return 0;

}}

base, exponent,base, exponent, i, resulti, resultמוגדרים רק בתוך הפונקציה מוגדרים רק בתוך הפונקציה

powerpower

solutionהמשתנה

main מוגדר רק בתוך הפונקציה

Page 67: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

משתנים בפונקציה - דוגמאמשתנים בפונקציה - דוגמא#include <stdio.h>#include <stdio.h>double power)double base, int exponent(double power)double base, int exponent({{

int int ii;;

double result=1;double result=1;

for)for)ii=1;=1; ii<=exponent;<=exponent; ii++(++(

result=result*base;result=result*base;return result;return result;

}}int main)(int main)({{

double double i;i; i=i=power)2,20(+power)3,15(+power)5,17(; power)2,20(+power)3,15(+power)5,17(;

printf)“2^20 + 3^15 + 5^17= %g”,printf)“2^20 + 3^15 + 5^17= %g”, i i(; (; return 0;return 0;

}}

שונות אפשר להגדיר בפונקציות אינם, והם באותו שםמשתנים

קשורים זה לזה

Page 68: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פונקציות – העברת ערכיםפונקציות – העברת ערכיםבמשתנה במשתנה – לא משתנים. שינויים – לא משתנים. שינויים ערכיםערכיםנשים לב: לפונקציה מועברים נשים לב: לפונקציה מועברים •

..המשתנה המקוריהמשתנה המקורי לא משפיעים על לא משפיעים על שאליו הוכנס הערךשאליו הוכנס הערךלמשל בדוגמא הבאה:למשל בדוגמא הבאה:•

#include<stdio.h>#include<stdio.h>intint square square )int num()int num({{ num=num*num;num=num*num; return num;return num;}}

int main)(int main)({{ int num=16;int num=16; printf)“%d is the square of %d”, printf)“%d is the square of %d”, squaresquare))numnum(, (, numnum(;(; return 0;return 0;}}

:הפלט

256 is the square of 16 256 is the square of 16

Page 69: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

פונקציות – העברת ערכיםפונקציות – העברת ערכים – לא משתנים. שינויים – לא משתנים. שינויים ערכיםערכיםנשים לב: לפונקציה מועברים נשים לב: לפונקציה מועברים •

המשתנה המשתנה לא משפיעים על לא משפיעים על במשתנה שאליו הוכנס הערךבמשתנה שאליו הוכנס הערך..המקוריהמקורי

למשל בדוגמא הבאה:למשל בדוגמא הבאה:•#include<stdio.h>#include<stdio.h>intint square square )int num()int num({{ num=num*num;num=num*num; return num;return num;}}

int main)(int main)({{ int num=16;int num=16; printf)“%d is the square of %d”, printf)“%d is the square of %d”, squaresquare))numnum(, (, numnum(;(; return 0;return 0;}}

:הפלט

256 is the square of 16256 is the square of 16

לא main שב- numהמשתנה מהשינויים במשתנה מושפע

שאליו הועבר ערכו

16הערך כאן מועבר

Page 70: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

משתנים גלובלייםמשתנים גלובליים

להגדיר משתנים בתחילת הקובץ, להגדיר משתנים בתחילת הקובץ, אבל לא מומלץ,אבל לא מומלץ,אפשר, אפשר, •לא בתוך אף פונקציה. במקרה כזה הם יהיו מוגדרים בכל לא בתוך אף פונקציה. במקרה כזה הם יהיו מוגדרים בכל

"משתנים גלובליים"."משתנים גלובליים".הפונקציות שמופיעות בקובץ. זה נקרא הפונקציות שמופיעות בקובץ. זה נקרא

)עושים שינוי )עושים שינוי עלול ליצור באגיםעלול ליצור באגיםזה לא מומלץ כי זה זה לא מומלץ כי זה •בפונקציה אחת ולא שמים לב שזה משפיע על פונקציה בפונקציה אחת ולא שמים לב שזה משפיע על פונקציה

בין הפונקציות. בין הפונקציות.ופוגע בהפרדה הלוגיתופוגע בהפרדה הלוגיתאחרת(, אחרת(,

Page 71: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

קבועיםקבועיםניתן להגדיר משתנה שערכו ישאר קבוע על-ידי תוספת המילה ניתן להגדיר משתנה שערכו ישאר קבוע על-ידי תוספת המילה •

constconst::const double pi=3.1415;const double pi=3.1415;

יתרון כאשר הקבוע צריך להיות בשימוש רק בתוך פונקציה אחתיתרון כאשר הקבוע צריך להיות בשימוש רק בתוך פונקציה אחת•

בשימוש כל חלקי בשימוש כל חלקי שיהיו שיהיו קבועיםקבועיםאם רוצים להגדיר ערכים אם רוצים להגדיר ערכים •, אין צורך במשתנה גלובלי, וניתן להגדיר קבוע על-ידי:, אין צורך במשתנה גלובלי, וניתן להגדיר קבוע על-ידי:התוכניתהתוכנית

#define pi 3.1415#define pi 3.1415 3.14153.1415 במספר במספר pipi שמחליפה את המילה שמחליפה את המילה preprocessorpreprocessorזו פקודה ל- זו פקודה ל- •

בכל התוכנית לפני תחילת התרגום לשפת מכונה.בכל התוכנית לפני תחילת התרגום לשפת מכונה.

Page 72: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הכרזה על פונקציותהכרזה על פונקציות

אמרנו שכדי להשתמש בפונקציה, צריך שהיא תהיה אמרנו שכדי להשתמש בפונקציה, צריך שהיא תהיה •מוגדרת.מוגדרת.

, שבו , שבו mainmainלכן רשמנו תמיד את הפונקציה לפני ה- לכן רשמנו תמיד את הפונקציה לפני ה- •השתמשנו בה.השתמשנו בה.

של של ((declarationdeclarationהכרזה )הכרזה )אופציה נוספת היא לרשום אופציה נוספת היא לרשום •הפונקציה בתחילת הקובץ, ולרשום את המימוש שלה הפונקציה בתחילת הקובץ, ולרשום את המימוש שלה

((definitiondefinition)).בסופו, או בקובץ נפרד. בסופו, או בקובץ נפרד

Page 73: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הכרזה על פונקציותהכרזה על פונקציות::declaration, prototypedeclaration, prototype))דוגמא להכרזה )דוגמא להכרזה )•

double power)double base, int exponent(double power)double base, int exponent(;;

ומותר גם בלי שמות המשתנים:ומותר גם בלי שמות המשתנים:double power)double, int(double power)double, int(;;

(:(:definitiondefinitionכשרק בסוף הקובץ נרשום את ההגדרה המלאה )כשרק בסוף הקובץ נרשום את ההגדרה המלאה )double power)double base, int exponent(double power)double base, int exponent({{

int i; int i; double result=1;double result=1;for)i=1; i<=exponent; i++(for)i=1; i<=exponent; i++( result=result*base;result=result*base;return result;return result;

}}

שימו לב שבהגדרת ; פונקציה אין

בכותרת )רק בהכרזה(

Page 74: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הכרזה על פונקציות – למה זה טובהכרזה על פונקציות – למה זה טוב

לפעמים נוח לראות בתחילת הקובץ את הפונקציות לפעמים נוח לראות בתחילת הקובץ את הפונקציות •העיקריות ולהשאיר את פונקציות העזר בסוף.העיקריות ולהשאיר את פונקציות העזר בסוף.

שאומרים שאומרים מחולקת לכמה קבציםמחולקת לכמה קבציםהרבה פעמים התוכנית הרבה פעמים התוכנית •)המימוש( של )המימוש( של לקומפיילר לצרף יחד, ואז ההגדרהלקומפיילר לצרף יחד, ואז ההגדרה

, ובאחרים , ובאחרים רק באחד מהםרק באחד מהםהפונקציה צריכה להופיע הפונקציה צריכה להופיע מופיעה רק ההכרזה.מופיעה רק ההכרזה.

של של בספריותבספריותבפרט, זה המצב כשאנחנו משתמשים בפרט, זה המצב כשאנחנו משתמשים •..stdio.hstdio.hפונקציות, כמו פונקציות, כמו

Page 75: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

הכרזה על פונקציות – ספריותהכרזה על פונקציות – ספריות

פשוט אומרת לקומפיילר לצרף פשוט אומרת לקומפיילר לצרף >>include<stdio.hinclude<stdio.h##השורה השורה • מתוך קבצי מתוך קבצי stdio.hstdio.hלתחילת הקובץ שלנו את הקובץ לתחילת הקובץ שלנו את הקובץ

..CCההכרזות של ההכרזות של

הקובץ הזה מכיל הכרזות של פונקציות קלט/פלט הקובץ הזה מכיל הכרזות של פונקציות קלט/פלט •(.(.printf,scanfprintf,scanfשימושיות )כמו שימושיות )כמו

כך אנחנו יכולים להשתמש בהן בתוכנית שלנו בלי להכיר כך אנחנו יכולים להשתמש בהן בתוכנית שלנו בלי להכיר • שלהן, ובזמן הקומפילציה הלינקר מצרף את שלהן, ובזמן הקומפילציה הלינקר מצרף את המימושהמימושאת את

..CCהמימוש מתוך הספריות הקיימות של המימוש מתוך הספריות הקיימות של

Page 76: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

ספריות נוספותספריות נוספות

יש ספריות נוספות שנוכל להשתמש בהן. למשל ב- יש ספריות נוספות שנוכל להשתמש בהן. למשל ב- CCב- ב- •math.hmath.h נוכל למצוא פונקציות כמו נוכל למצוא פונקציות כמו

sin,cos,tan,abs,fabs,log,sqrt,powsin,cos,tan,abs,fabs,log,sqrt,pow

יש פונקציות שעוסקות בסוג של תווים, כמו יש פונקציות שעוסקות בסוג של תווים, כמו ctype.hctype.hב- ב- •islower, toupperislower, toupper.ועוד., ועוד ,

תכירו בהמשך ספריות נוספות.תכירו בהמשך ספריות נוספות.•

Page 77: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

העברת מערך לפונקציההעברת מערך לפונקציה

כיצד נכתוב פונקציה שמקבל כערך מערך כיצד נכתוב פונקציה שמקבל כערך מערך •ומבצעת חישוב על איבריו? ומבצעת חישוב על איבריו?

נניח שנרצה לכתוב פונקציה שמקבלת מערך נניח שנרצה לכתוב פונקציה שמקבלת מערך •של מספרים ומחזירה את סכום איברי המערך. של מספרים ומחזירה את סכום איברי המערך.

העברת מערך לפונקציה מתבצעת למעשה ע"י העברת מערך לפונקציה מתבצעת למעשה ע"י •העברת כתובת ההתחלה של המערך. העברת כתובת ההתחלה של המערך.

• int sum)int a[ ], int size(;int sum)int a[ ], int size(; prototype

Page 78: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

העברת מערך לפונקציההעברת מערך לפונקציה

• aa זהו פשוט כתובת ההתחלה של מערך של זהו פשוט כתובת ההתחלה של מערך שלintint . .

הפרמטר השני הוא גודל המערך. הפרמטר השני הוא גודל המערך. •הפרמטר הראשון לפונקציה הוא כתובת הפרמטר הראשון לפונקציה הוא כתובת •

ההתחלה של המערך ואינו נותן מידע לגבי ההתחלה של המערך ואינו נותן מידע לגבי גודל המערך. לכן, נעביר את המידע הזה גודל המערך. לכן, נעביר את המידע הזה

כפרמטר נוסף לפונקציה. כפרמטר נוסף לפונקציה.

Page 79: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

דוגמא: פונקציה שסוכמת מערך של שלמיםדוגמא: פונקציה שסוכמת מערך של שלמים#include <stdio.h>#include <stdio.h>int calc_sum)int arr[ ], int calc_sum)int arr[ ], int sizeint size( ( {{

int i, sum = 0;int i, sum = 0;for)i=0; i<size; i++( for)i=0; i<size; i++(

sum=sum+arr[i];sum=sum+arr[i];return sum;return sum;

}}int main)(int main)({{ int input[10], i;int input[10], i;

for)i=0; i<10; i++( for)i=0; i<10; i++( scanf)"%d", &input[i](;scanf)"%d", &input[i](;

printf)"The sum is %d\n", printf)"The sum is %d\n", calc_sum)input, calc_sum)input, 1010(((;(;return 0;return 0;

}}

קריאה לפונקציה והדפסת התוצאה

פונקציית הסכום

קליטת ערכים למערך

עוברים על תאי המערך בלולאה, סוכמים אותם,

ומחזירים את הסכום.

size)גודל המערך מועבר במשתנה)

Page 80: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

העברת מערך לפונקציההעברת מערך לפונקציה

ההגדרות הבאות שקולות:ההגדרות הבאות שקולות:•• int f)float arr[](;int f)float arr[](;• int f)float arr[5](;int f)float arr[5](;• int f)float arr[100](;int f)float arr[100](;

Page 81: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מחרוזותמחרוזות הן פשוט מערכים שאיבריהם הם הן פשוט מערכים שאיבריהם הם CCמחרוזות ב מחרוזות ב •

תווים. תווים. המוסכמה בנוגע למחרוזות היא שמחרוזות המוסכמה בנוגע למחרוזות היא שמחרוזות •

אשר מסמן את סוף אשר מסמן את סוף תו מיוחדתו מיוחדמסתימות ב מסתימות ב שלו שלו asciiasciiשקוד ה שקוד ה ’’00‘\‘\המחרוזת. תו זה הוא המחרוזת. תו זה הוא

. . 00הוא הוא

Page 82: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מחרוזותמחרוזות

העובדה הזו מאפשרת לנו לכתוב פונקציות העובדה הזו מאפשרת לנו לכתוב פונקציות •עבור מחרוזות אשר מקבלות את כתובת עבור מחרוזות אשר מקבלות את כתובת

ההתחלה של המחרוזת ומטיילות על המערך ההתחלה של המחרוזת ומטיילות על המערך עד שמגיעים לתו הסיום של המחרוזת. עד שמגיעים לתו הסיום של המחרוזת.

כלומר, אין צורך לדעת מראש את גודל כלומר, אין צורך לדעת מראש את גודל •המחרוזת )בניגוד למערכים רגילים(.המחרוזת )בניגוד למערכים רגילים(.

Page 83: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

מחרוזותמחרוזות

int strlen)char s[ ](int strlen)char s[ ]({{

intint cnt=0;cnt=0;while ) s[cnt] != ’\0’ (while ) s[cnt] != ’\0’ (

cnt++;cnt++;

return cnt;return cnt;}}

מה עושה הפונקציה הזו?

איפה משתמשים בעובדה שמחרוזת

מסתיימת בתו מסוים?

Page 84: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

סימון סוף המחרוזת: התו המיוחד סימון סוף המחרוזת: התו המיוחד ''00 \' \'

לשמירת המוסכמה לשמירת המוסכמה דואגות בעצמןדואגות בעצמןכל הפעולות שנכיר על מחרוזות כל הפעולות שנכיר על מחרוזות •הזו של תו הסיום.הזו של תו הסיום.

למשל פעולת האיתחול הזו:למשל פעולת האיתחול הזו:•

char word[ ]=“HELLO”;char word[ ]=“HELLO”;

שקולה לפעולת האיתחול הזו: שקולה לפעולת האיתחול הזו:

char word[ ]={‘H’,’E’,’L’,’L’,’O’,char word[ ]={‘H’,’E’,’L’,’L’,’O’,’\0’\0’};’};

תווים(. תווים(.66 דורשת מערך של דורשת מערך של 55)כלומר מחרוזת באורך )כלומר מחרוזת באורך

word[0]

‘H’ ‘E’ ‘L’ ‘L’ ‘O’ ‘\0’

word[5]

Page 85: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

\' \' 00הוספת תו-הסיום 'הוספת תו-הסיום 'אם ניצור מערך של תווים בלי תו-הסיום, ונירצה להפעיל עליו פעולות על מחרוזות )שנכיר אם ניצור מערך של תווים בלי תו-הסיום, ונירצה להפעיל עליו פעולות על מחרוזות )שנכיר •

אחרי התווים ששמנו בו. אחרי התווים ששמנו בו.\'\'00''בהמשך(, אז נצטרך להוסיף את התו בהמשך(, אז נצטרך להוסיף את התו

למשל אם נירצה להשתמש בפעולות על מחרוזות עבור המערך:למשל אם נירצה להשתמש בפעולות על מחרוזות עבור המערך:•

' על-ידי :' על-ידי :OO אחרי האות ' אחרי האות '\'\'00''אז נצטרך להוסיף את התו אז נצטרך להוסיף את התו •

word[5]=word[5]=‘\0’‘\0’;;word[0]

‘H’ ‘E’ ‘L’ ‘L’ ‘O’

word[6]

word[0]

‘H’ ‘E’ ‘L’ ‘L’ ‘O’

word[6]

‘\0’

Page 86: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

– פונקציות – פונקציות string.hstring.hהספריה הספריה לדוגמאלדוגמא \'(:\'(:00פונקציה למציאת אורך מחרוזת )לפי מקום התו 'פונקציה למציאת אורך מחרוזת )לפי מקום התו '•

int strlen)const char str[ ](;int strlen)const char str[ ](;

\'.\'.00 האורך לא כולל את התו ' האורך לא כולל את התו '; ; )len = strlen)my_string(len = strlen)my_string - השימוש ניראה כך:- השימוש ניראה כך:

((55 יוחזר יוחזר ”;”;char my_string[6]=“Hellochar my_string[6]=“Hello)למשל עבור מחרוזת שהוגדרה )למשל עבור מחרוזת שהוגדרה

פונקציה להשוואה בין מחרוזות:פונקציה להשוואה בין מחרוזות:• int strcmp)const char str1[ ], const char str2[ ](;int strcmp)const char str1[ ], const char str2[ ](;

‘\‘\ אם המחרוזות זהות, כלומר שוות בכל תו עד לתו אם המחרוזות זהות, כלומר שוות בכל תו עד לתו 00מחזירה מחזירה 00’’..

אם המחרוזת הראשונה גדולה אם המחרוזת הראשונה גדולה חיובי חיובי : : 00 אחרת מוחזר מס' שונה מ- אחרת מוחזר מס' שונה מ-)כלומר לפי סדר מילוני, סדר טבלת-האסקי(, )כלומר לפי סדר מילוני, סדר טבלת-האסקי(, לקסיקוגרפית לקסיקוגרפית יותריותר

אם היא קטנה יותר. אם היא קטנה יותר.ושליליושלילי

Page 87: שיעור שישי: מערכים ופונקציות  9012345678 0987654321 מבוא כללי למדעי המחשב

string.hstring.hדוגמאות נוספותדוגמאות נוספות - - תתבצע תתבצע targettarget למחרוזת למחרוזת sourcesourceהעתקת המחרוזת שבמשתנה העתקת המחרוזת שבמשתנה •

על-ידי:על-ידי: strcpy)target, source(;strcpy)target, source(;

(:(:str1str1 לסוף לסוף str2str2שירשור מחרוזות )מעתיק את שירשור מחרוזות )מעתיק את • strcat)str1, str2(;strcat)str1, str2(;

במחרוזת במחרוזת charchar מסוג מסוג ccחיפוש ההופעה הראשונה של התו במשתנה חיפוש ההופעה הראשונה של התו במשתנה •strstr::

strchr)str, c(;strchr)str, c(;

::str1str1 במחרוזת במחרוזת str2str2חיפוש ההופעה הראשונה של מחרוזת חיפוש ההופעה הראשונה של מחרוזת • strstr)str1, str2(;strstr)str1, str2(;

בעתיד נפרט יותר על השימוש בפעולות האלה ועל פעולות נוספות בעתיד נפרט יותר על השימוש בפעולות האלה ועל פעולות נוספות • בספריה הזאת. בספריה הזאת.