You are on page 1of 82

‫קורס יסודות התכנות בשפת ‪C‬‬

‫פרק ‪6‬‬
‫פונקציות ‪Functions‬‬

‫ד"ר שייקה בילו‬


‫יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע‬
‫מומחה למערכות מידע חינוכיות‪ ,‬אקדמיות ומנהליות‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪1‬‬ ‫‪Shayke Bilu PhD‬‬


‫ חזרה‬- ‫לולאות‬
2

10 ‫ עד‬1 ‫הדפסת המספרים‬


#include <stdio.h>
void main()
{
int num=1;
while (num <= 10)
{
printf(“num = %d\n”, num);
num=num+1;
}
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫לולאות – חזרה‬
‫‪3‬‬

‫‪ ‬מהן לולאות ולשם מה אנו זקוקים להן‬


‫‪ ‬סוגי לולאות‪:‬‬
‫‪while‬‬
‫‪for‬‬
‫‪do-while‬‬
‫‪ ‬השפעה על בקרת זרימת הלולאה‪:‬‬
‫– ‪Break‬‬ ‫גורם לסיום הלולאה אוטומטית וללא דחיות‬
‫מחזיר אותנו לתחילת הלולאה לסיבוב הבא – ‪Continue‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


while ‫ בדיקת ראשוניות‬:‫דוגמא‬
4
#include <stdio.h>
void main()
{ mis == num
int num, mis=2; ‫כאשר‬
printf(“Enter int number\n”); ‫הלולאה תסתיים‬
scanf(“%d”, &num);
while (num % mis != 0)
mis=mis+1; num ‫מחפשים את המחלק של המספר‬
if (mis != num)
printf(“num %d is divided by mis %d”,num,mis);
else
printf(“num %d is prime”,num);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
for ‫ לולאת‬:‫דוגמא נוספת‬
5

#include <stdio.h> 20 ‫ בחזקת‬2 ‫התוכנית מחשבת את‬


void main()
{
int i,result=1;
‫ פעמים‬20 ‫הלולאה תתבצע‬
for(i=1; i<=20; i++)
result=result*2;
printf(“2^20 = %d”, result);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
for, while ‫ בעזרת‬10! ‫ חישוב‬:‫דוגמא‬
6
for loop: while loop:
#include <stdio.h> #include <stdio.h>
void main() void main()
{ {
int i=2, result=1;
int i,result=1; while(i<11)
for(i=2; i<11; i++) {
result=result*i; result=result*i;
i++;
printf(“10!=%d”, result);
}
} printf(“10!=%d”, result);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫לולאות מקוננות‬
‫‪7‬‬

‫‪ ‬אפשר לבצע ב‪ C -‬לולאה בתוך לולאה (נכון לגבי כל סוגי הלולאות)‪.‬‬


‫)‪for(i=1; i<=10; i++‬‬
‫{‬ ‫לולאה חיצונית‬
‫)‪for(j=1; j<=10; j++‬‬
‫לולאה פנימית‬
‫;)”*“(‪printf‬‬
‫;)”‪printf(“\n‬‬
‫}‬
‫‪ ‬בדוגמא הנ"ל‪ :‬בכל מחזור של הלולאה החיצונית‪ ,‬מתבצעת הלולאה‬
‫הפנימית ‪ 10‬פעמים‪.‬‬
‫‪ ‬בפועל נקבל ‪ 100‬סיבובים ‪ 10‬חיצוניים כשבכל אחד מהם ‪ 10‬פנימיים‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
do-while ‫לולאת‬
8
‫ שימושי כשרוצים לקלוט מספר מהמשתמש עד שמוכנס ערך חוקי‬
‫י‬

#include <stdio.h>
void main()
{
int grade;
Do
{
printf(“Enter your grade (0-100) \n”);
scanf(“%d”, &grade);
}while((grade<0)||(grade> 100));
printf(“You entered legal grade!!!”);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
?‫מה עושה התוכנית הבאה‬
9

#include <stdio.h> 25 ‫ עד‬1-‫הדפסת לוח הכפל מ‬


void main()
{
int i,j;
for(i=1; i<=5; i++)
{
for(j=1; j<=5; j++)
printf(“%4d”, i*j );
printf(“\n”);
}
}
‫פתרון להדפסת המספרים בריווח קבוע‬
SCE-Chapter-6-Functions Shayke Bilu PhD
?‫מה עושה התוכנית הבאה‬
10
#include <stdio.h>
void main() 25 ‫ עד‬1-‫הדפסת לוח הכפל מ‬
{
int i=1,j=1; while ‫באמצעות לולאת‬
while(i<=5)
{
while(j<=5)
{
printf(“%4d”, i*j );
j++;
}
j=1;
printf(“\n”);
i++;
}}
SCE-Chapter-6-Functions Shayke Bilu PhD
?‫מה עושה התוכנית הבאה‬
11
#include <stdio.h>
void main() 25 ‫ עד‬1-‫הדפסת לוח הכפל מ‬
{ do while ‫באמצעות לולאת‬
int i=1,j=1;
do{
do{
printf(“%4d”, i*j );
j++;
} while(j<=5);
j=1;
printf(“\n”);
i++;
} while(i<=5);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
12

?‫שאלות על השעור הקודם‬

SCE-Chapter-6-Functions Shayke Bilu PhD


‫שאלה‬
‫‪13‬‬

‫‪ ‬כיצד נוכל לחשב את הסכום של התרגיל הבא‪:‬‬


‫‪?=42 + 33 + 25‬‬
‫‪ ‬הצעה לפתרון‪:‬‬
‫יש לחשב כל תת‪-‬תרגיל בנפרד ובסיום לחבר את תוצאת שלושת‬
‫התת‪-‬תרגילים כדי לקבל את התוצאה הסופית של התרגיל‪.‬‬
‫‪ ‬הצעה נוספת לפתרון‪:‬‬
‫יש לחשב כל תת תרגיל בנפרד ולהכניס את התוצאה למשתנה אחר‬
‫ולבסוף לחבר את שלושת המשתנים‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פתרון אפשרי‬
14
#include <stdio.h>
void main() ‫חישוב התרגיל‬
{
int i;
42 + 33 + 25
double sum=0, result=1;
for(i=1; i<=2; i++) 42 ‫חישוב‬
result=result*4;
sum +=result;
result=1;
for(i=1; i<=3; i++) 33 ‫חישוב‬
result=result*3;
sum +=result;
result=1; 2 5 ‫חישוב‬
for(i=1; i<=5; i++)
result=result*2;
sum +=result;
printf(“4^2 + 3^3 + 2^5= %.2lf”, sum);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫מה הבעיות ומה היינו רוצים?‬
‫‪15‬‬

‫‪ ‬בעיות‪:‬‬
‫‪ ‬חזרה על קטע קוד כמעט זהה ‪ 3‬פעמים‪.‬‬
‫‪ ‬אם היו יותר מחוברים היה צריך לחזור עליו יותר פעמים‪.‬‬
‫‪ ‬התכנית מתארכת ונהיית מסורבלת‪.‬‬
‫‪ ‬מקור לבאגים וטעויות ‪.copy / paste‬‬
‫‪ ‬מה היינו רוצים?‬
‫‪ ‬לכתוב פעם אחת בלבד את הקוד שחוזר על עצמו‪.‬‬
‫‪ ‬להשתמש בקוד מספר פעמים אבל בעזרת נתונים שונים כל פעם‪.‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫פתרון אחר לחישוב‬
16
#include <stdio.h>
double power(double base, int exponent) 42 + 33 + 25 ‫חישוב‬
{
int i;
double result=1; power ‫הגדרת פונקציה בשם‬
baseexponent ‫המחשבת את‬
for(i=1; i<=exponent; i++)
result=result*base;
return result;
}
‫התוכנית מתחילה לרוץ מכאן‬
int main()
{
double solution;
solution=power(4,2)+power(3,3)+power(2,5);

printf(“4^2 + 3^3 + 2^5= %.2lf”, solution); ‫ קריאות לפונקציה‬3


return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫הפתרון‪ :‬פונקציות‬
‫‪17‬‬

‫‪ ‬פונקציה‪:‬‬
‫‪ ‬קטע קוד שיש לו שם‪.‬‬
‫‪ ‬יכולה לקבל ערכי קלט לתוך משתנים‪.‬‬
‫‪ ‬יכולה להחזיר ערך פלט יחיד‪.‬‬
‫‪ ‬יכולה להכיל כל פקודה כמו בתוכנית ראשית‬

‫‪ ‬יתרונות‪:‬‬
‫‪ ‬אפשר להשתמש הרבה פעמים עם קלטים שונים‬
‫‪‬לדוגמא‪.printf(), scanf() :‬‬
‫‪ ‬מקצרת תוכניות – הופך אותן ליותר קריאות‬
‫‪ ‬חוסכת טיפול בבאגים ‪ -‬כותבים פעם אחת‪ ,‬בודקים פעם אחת ‪...‬‬
‫משתמשים הרבה פעמים‪.‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫ הדוגמא הקודמת‬- ‫פונקציות‬
18
#include <stdio.h>
double power(double base, int exponent)
{
int i; ‫(מחושבת) כל פעם‬ ‫הפונקציה נקראת‬
double result=1;
‫ היא‬,‫עבור הערכים המתאימים‬
for(i=1; i<=exponent; i++) ‫מחשבת את התוצאה והתוצאה‬
result=result*base;
return result; ‫מוחזרת לתוכנית הראשית‬
}
‫התוכנית מתחילה לרוץ מכאן‬
int main()
{
double solution;
solution=power(4,2)+power(3,3)+power(2,5);

printf(“4^2 + 3^3 + 2^5= %.2lf”, solution);


return 0; ‫ קריאות לפונקציה‬3
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫הדגמת הריצה בשימוש פונקציה‬
19
#include <stdio.h>
double power(double base, int exponent) base ‫זבל‬
{
int i;
double result=1; exponent ‫זבל‬
for(i=1; i<=exponent; i++)
result=result*base; i ‫זבל‬
return result;
}
int main() result 1
{
double solution;
solution=power(2,10); solution ‫זבל‬
printf(“2^10 = %.2lf”, solution);
return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫הדגמת הריצה בשימוש פונקציה‬
20
#include <stdio.h>
double power(double base, int exponent) base 2
{
int i;
double result=1; exponent 10
for(i=1; i<=exponent; i++)
result=result*base; i 1
return result;
}
int main() result 2
{
double solution;
solution=power(2,10); solution ‫זבל‬
printf(“2^10 = %.2lf”, solution);
return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫הדגמת הריצה בשימוש פונקציה‬
21
#include <stdio.h>
double power(double base, int exponent) base 2
{
int i;
double result=1; exponent 10
for(i=1; i<=exponent; i++)
result=result*base; i 11
return result;
}
int main() result 1024
{
double solution;
solution=power(2,10); solution 1024
printf(“2^10 = %.2lf”, solution);
return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫פונקציות – נושאים‬
‫‪22‬‬

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

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫סיבות לשימוש בפונקציות‬
‫‪23‬‬

‫חלוקת התכנית לחלקים לוגים שונים‬ ‫•‬


‫כל חלק מבצע פעולה בסיסית אחרת‬ ‫•‬

‫• קריאת נתונים‪ ,‬עיבוד נתונים‪ ,‬הדפסה ‪...‬‬


‫פירוק בעיה מסובכת לתת בעיות פשוטות יותר‪.‬‬ ‫•‬

‫שימוש חוזר באותו קטע קוד מספר פעמים בתוכנית‪.‬‬ ‫•‬


‫שימוש חוזר באותו קטע קוד בתכניות שונות‪.‬‬ ‫•‬
‫נוכל להכין ספריות של פונקציות שימושיות ולהשתמש בהן‬ ‫•‬

‫בתוכניות אחרות‬
‫יש כבר ספריות מוכנות כאלה ב‪ ,C -‬כמו ‪.stdio.h‬‬ ‫•‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫הגדרת פונקציות‬
24

:‫ הגדרת פונקציה מבוצעת באופן הבא‬


‫(הגדרת משתנים לערכים שמועברים לפונקציה) שם הפונקציה טיפוס הערך המוחזר‬
{
‫;פקודות הפונקציה‬
return ‫;הערך המוחזר‬
{
:‫ למשל‬
double power(double base, int exponent)
{
int i;
double result=1;
for(i=1; i<=exponent; i++)
result=result*base;
return result;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫מימוש בגוף הפונקציה‬
‫‪25‬‬

‫‪ ‬בתוך פונקציה אפשר להגדיר‪ ,‬לכתוב‪ ,‬לבצע ולעשות‬


‫בפועל כל מה שניתן לעשות ב‪:main -‬‬
‫‪ ‬להגדיר משתנים ולבצע פקודות‪.‬‬
‫‪ ‬להפעיל בקרת זרימה‪ ,‬לולאות‪ ,‬השמות והפעלת פונקציות‬
‫אחרות‪.‬‬
‫‪ ‬לקרוא לתוכניות אחרות בפרויקט‪.‬‬
‫‪ ‬לפתוח קבצים ולטפל בהם‪.‬‬
‫‪ ‬להפעיל א התוכנית הראשית שוב‪.‬‬
‫‪ ‬לקרוא לפונקציה שוב (רקורסיה)‪.‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫שם הפונקציה‬
‫‪26‬‬

‫‪ ‬שם הפונקציה‪:‬‬
‫‪ ‬אותם כללים כמו בחירת שם של משתנה‪.‬‬
‫‪ ‬לא יכול להכיל סימנים כמו ‪... %$*-+‬‬
‫‪ ‬חייב להתחיל באות ולא במספר‪.‬‬
‫‪ ‬אסור להשתמש במילים שמורות של השפה‪.‬‬
‫‪ ‬מומלץ ששם הפונקציה יהיה תמיד שם בעל משמעות‪:‬‬
‫‪max ‬‬
‫‪sort ‬‬
‫‪getNumbers ‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪26‬‬ ‫‪Shayke Bilu PhD‬‬
‫משתני קלט‬
‫‪27‬‬

‫‪ ‬משתני הקלט‪:‬‬
‫‪ ‬מוגדרים בהגדרת הפונקציה‪.‬‬
‫‪ ‬יש להם שם וטיפוס (כמו משתנים רגילים)‪.‬‬
‫‪ ‬מוכרים אך ורק על ידי הפונקציה‪.‬‬
‫) ‪int max( int val1, int val2‬‬

‫) ‪double squareRoot( double number‬‬

‫‪ ‬אם הפונקציה לא מקבלת ערכים‪:‬‬


‫‪ ‬אפשר להשאיר את הסוגריים ריקים‪.‬‬
‫)(‪int isPacManIsAlive‬‬
‫‪ ‬או לכתוב בתוכם את המילה ‪.void‬‬
‫) ‪int getNumGhosts( void‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪27‬‬ ‫‪Shayke Bilu PhD‬‬
28

?‫שאלות‬

Shayke Bilu PhD


SCE-Chapter-6-Functions
‫קריאה לפונקציה‬
‫‪29‬‬

‫קריאות לפונקציה‬
‫)(‪int main‬‬
‫{‬
‫;)‪double solution=power(4,2)+power(3,3)+ power(2,5‬‬
‫;)‪printf(“4^2 + 3^3 + 2^5 = %.2lf", solution‬‬
‫;‪return 0‬‬
‫}‬ ‫‪ ‬קריאה לפונקציה‪:‬‬
‫‪ ‬פקודה המתבצעת ברצף הפקודות של התוכנית‪.‬‬
‫‪ ‬ניתן לקרוא לפונקציה גם מתוך פונקציה אחרת‪.‬‬
‫‪ ‬חייבים להעביר לפונקציה ערכים בהתאם להגדרת הפונקציה‪.‬‬
‫‪ ‬בסיום ריצת הפונקציה‪ ,‬חוזרים למקום שממנו היא הופעלה‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪29‬‬ ‫‪Shayke Bilu PhD‬‬
‫קריאה לפונקציה‬
‫‪30‬‬

‫קריאות לפונקציה‬
‫)(‪int main‬‬
‫{‬
‫;)‪double solution=power(4,2)+power(3,3)+ power(2,5‬‬
‫;)‪printf(“4^2 + 3^3 + 2^5 = %.2lf", solution‬‬
‫;‪return 0‬‬
‫}‬
‫‪ ‬מהלך הביצוע של הפונקציה‪:‬‬
‫‪ .1‬מבוצע החישוב הראשון ומחוזרת התוצאה‪42 = 16 :‬‬
‫‪33 = 27‬‬ ‫‪ .2‬מבוצע החישוב השני ומוחזרת התוצאה‪:‬‬
‫‪ .3‬מבוצע החישוב השלישי ומוחזרת התוצאה‪25 = 32 :‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪30‬‬ ‫‪Shayke Bilu PhD‬‬
‫הערך המוחזר‬
‫‪31‬‬
‫‪ ‬טיפוס הערך המוחזר‪:‬‬
‫אם הפונקציה לא מחזירה ערכים‪ ,‬אז הטיפוס הוא ‪.void‬‬ ‫‪‬‬

‫)(‪void print_help‬‬
‫‪ ‬כאשר הפונקציה מחזירה ערך שונה מ‪:void-‬‬
‫צריכה להתבצע פקודת ‪ return‬שבה יוחזר ערך מהטיפוס המתאים‪.‬‬ ‫‪‬‬

‫‪ return ‬היא הפקודה האחרונה המבוצעת בפונקציה‪.‬‬


‫‪ ‬גם אם מופיעות אחריה פקודות נוספות‪.‬‬
‫‪ ‬הפונקציה הקוראת יכולה לעשות שימוש בערך המוחזר‬
‫;‪int mis1=0, mis2=2‬‬
‫;)‪mis1 = 32 *(power(mis2,5)+17‬‬
‫;)‪mis1 = sqrt(mis1‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪31‬‬ ‫‪Shayke Bilu PhD‬‬
‫דוגמא‬
32

int greater(int mis1, int mis2)


{
‫יכולה להופיע יותר מפקודת‬
if ( mis1 > mis2 )
return
return 1;
‫אחת בפונקציה‬
else
‫אולם רק אחת תתבצע‬
return 0;

printf("Will this be printed?\n");


}

‫פקודה זו לא תתבצע לעולם‬


SCE-Chapter-6-Functions 32 Shayke Bilu PhD
‫דוגמא‬
33
#include <stdio.h>

double power(double base, int exponent)


{
int i=0;
double result=1;
‫ אחד‬,‫ משתנים‬2 ‫פונקציה המקבלת‬
for (i=1; i<=exponent; i++) int ‫ והשני מסוג‬double ‫מסוג‬
result=result*base; double ‫מחזירה משתנה מסוג‬
return result;
} ‫ היא פונקציה ראשית‬main
int main()
{
double solution = power(4,2) + power(3,3) + power(2,5);
printf(“4^2 + 3^3 + 2^5= %.2lf”, solution);
return 0;
}
SCE-Chapter-6-Functions 33 Shayke Bilu PhD
‫פונקצית ‪main‬‬
‫‪34‬‬

‫‪ ‬פונקציית ‪:main‬‬
‫‪ ‬כל תוכנית בשפת ‪ C‬מכילה פונקציה בשם ‪.main‬‬
‫‪ ‬זו הפונקציה הראשית שבה התוכנית מתחילה‪.‬‬
‫‪ ‬הפונקציה (התוכנית) מופעלת ע"י מערכת ההפעלה‪.‬‬
‫‪ ‬הערך המוחזר של ‪:main‬‬
‫‪ ‬מועבר למערכת ההפעלה‪.‬‬
‫‪ ‬טיפוסו צריך להיות ‪( int‬או ‪.)void‬‬
‫‪ ‬אם ערכו ‪ 0‬המשמעות היא שהתוכנית הסתיימה באופן תקין‪.‬‬
‫‪ main ‬יכולה גם לקבל ערכים ממערכת ההפעלה‬
‫ולהפעיל פונקציות בתוך התוכנית או בתוך הפרויקט‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪34‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקציות – סיכום ביניים‬
‫‪35‬‬

‫הגדרת פונקציה‬ ‫•‬


‫• הגדרת משתנים לפונקציה‬
‫סיום הריצה של פונקציה‬ ‫•‬
‫קריאה לפונקציה‬ ‫•‬
‫• החזרת ערכים מהפונקציה לתוכנית‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


36

?‫שאלות‬

SCE-Chapter-6-Functions Shayke Bilu PhD


‫משתנים בפונקציה‬
‫‪37‬‬

‫‪ ‬משתנים בפונקציה‪:‬‬
‫‪ ‬מוכרים אך ורק בפונקציה הזאת (ב‪ scope-‬שלה)‪.‬‬
‫‪ ‬לא מוכרים בפונקציות אחרות (גם לא ב‪.)main-‬‬
‫‪ ‬כולל גם את משתני הקלט‪.‬‬

‫‪ ‬בסיום ריצת פונקציה‪:‬‬


‫‪ ‬המשתנים לא מוגדרים יותר וערכם נמחק‪.‬‬
‫‪ ‬ערכי המשתנים לא נשמרים מקריאה אחת לשנייה‪.‬‬
‫‪ ‬רק הערך שהוחזר מהפונקציה מעיד על קיומה בעבר‪.‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪37‬‬ ‫‪Shayke Bilu PhD‬‬


‫דוגמא‬- ‫משתנים בפונקציה‬
38
#include <stdio.h>

double power(double base, int exponent)


{
int i=0;
double result=1;
base, exponent, i, result :‫המשתנים‬
power :‫מוגדרים אך ורק בתוך הפונקציה‬
for (i=1; i<=exponent; i++)
result=result*base;

return result; solution :‫המשתנה‬


} main :‫מוגדר רק בתוך הפונקציה‬
int main()
{
double solution = power(4,2) + power(3,3) + power(2,5);
printf(“4^2 + 3^3 + 2^5= %.2lf”, solution);
return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫ דוגמא‬- ‫משתנים בפונקציה‬
39

#include <stdio.h>
double power(double base, int exponent)
{
int sum; ‫אפשר להגדיר בפונקציות‬
double result=1; ‫שונות משתנים באותו שם‬
for(sum=1; sum<=exponent; sum++)
result=result*base;
return result;
} ‫למרות ששני המשתנים זהים בשמם‬
int main()
{ !‫אין כל קשר בין המשתנים‬
double sum=power(4,2)+power(3,3)+power(2,5);
printf(“4^2 + 3^3 + 2^5= %.2lf”, );i
return 0;
}

SCE-Chapter-6-Functions Shayke Bilu PhD


‫פונקציות – העברת ערכים‬
40
#include <stdio.h>
int square (int num) ‫אל פונקציה מועברים ערכים‬
{ ‫(השמה) ולא משתנים‬
num=num*num;
return num;
} ‫שינוי ערך המשתנה בפונקציה לא משפיע על‬
‫המשתנה המקורי‬
int main()
{
int num=16;
printf(“%d is the square of %d”,square(num),num);
return 0;
} 256 is the square of 16 :‫פלט‬

SCE-Chapter-6-Functions Shayke Bilu PhD


‫פונקציות – העברת ערכים‬
‫פונקציית סיכום ערכי ספרות המספר‬
‫‪41‬‬

‫>‪#include <stdio.h‬‬ ‫אל פונקציה מועבר ערך (השמה) ולא משתנים‬


‫)‪int sumdig(int number‬‬
‫{‬
‫שינוי ערך המשתנה בפונקציה לא‬
‫;‪int sum=0‬‬ ‫משפיע על המשתנה המקורי‬
‫)‪while(number‬‬
‫{‬
‫לתוך המשתנה המקומי ‪sum‬‬
‫;‪sum+=number%10‬‬ ‫מכניסים את הספרה הימנית ביותר‬
‫;‪number/=10‬‬ ‫של המספר‬
‫}‬ ‫מצמצמים את המספר פי ‪10‬‬
‫;‪return sum‬‬
‫{‬ ‫הערך המוחזר ע"י החזרת ‪ sum‬הוא סכום כל ספרות המספר ‪number‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקציות – העברת ערכים‬
‫פונקציית סיכום כמות ספרות במספר‬
‫‪42‬‬

‫)‪int count(int number‬‬


‫{‬ ‫אל פונקציה מועבר ערך‬
‫(השמה) ולא משתנים‬
‫;‪int cnt=0‬‬
‫)‪while(number‬‬ ‫שינוי ערך המשתנה בפונקציה לא‬
‫משפיע על המשתנה המקורי‬
‫{‬
‫;‪number/=10‬‬
‫;‪cnt++‬‬
‫לתוך המשתנה המקומי ‪ c‬מכניסים את מספר‬
‫}‬ ‫הספרה לאחר קיצוץ של המספר פי ‪10‬‬
‫;‪return cnt‬‬
‫}‬
‫הערך המוחזר ע"י החזרת ‪ cnt‬הוא כמות הספרות של ‪number‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקציות – העברת ערכים‬
‫תוכנית ראשית‬
43

int main()
‫זו התוכנית הראשית המפעילה את שתי הפונקציות‬
}
int number;
printf("Enter number\n");
scanf("%d",&number);
printf(“Sum digits is %d\n",sumdig(number));
printf(“Digits count is %d\n",count(number));
return 0;
{
SCE-Chapter-6-Functions Shayke Bilu PhD
‫משתנים גלובליים‬
‫‪44‬‬

‫‪ ‬משתנים גלובליים‪:‬‬
‫‪ ‬אפשר להגדיר משתנים בתחילת הקובץ‪ ,‬ללא שייכות לפונקציה‬
‫מסוימת‬
‫‪ ‬הם יהיו מוגדרים‪ ,‬מוכרים ופעילים בכל הפונקציות שמופיעות‬
‫בקובץ התוכנית‪.‬‬
‫‪ ‬לא תמיד מומלץ !!!‬
‫‪ ‬עלול ליצור באגים (שינויים בפונקציה אחת משפיעים בטעות‬
‫על פונקציה אחרת)‬
‫‪ ‬פוגע בהפרדה הלוגית בין הפונקציות‪.‬‬
‫‪ ‬מתכון לטעויות מתמשכות שקשות לאיתור‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
45

?‫שאלות‬

Shayke Bilu PhD


SCE-Chapter-6-Functions
‫קבועים‬
‫‪46‬‬

‫‪ ‬ניתן להגדיר משתנה שערכו יישאר קבוע על‪-‬ידי תוספת המילה‬


‫‪ const‬לפני הטיפוס שלו‪:‬‬
‫‪const double pai = 3.141592‬‬
‫עדיף לראות בתוכנית שמות משמעותיים של קבועים ולא מספרים‬
‫‪ ‬משתנה יוגדר כך רק בתוך פונקציה מסוימת שבתוכה הוגדר כקבוע‪.‬‬

‫‪ ‬ניתן להגדיר קבוע שיהיה בשימוש בכל חלקי התוכנית‪ ,‬על‪-‬ידי‪:‬‬


‫‪#define pai 3.141592‬‬
‫‪ ‬זו פקודה ל‪( preprocessor -‬הקדם מעבד)‬
‫‪ ‬מחליפה את המילה ‪ pai‬במספר ‪ 3.141592‬בכל התוכנית לפני תחילת‬
‫התרגום לשפת מכונה‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקציות – העברת ערכים‬
'‫פונקציית המרת מעלות טמפ' מצלס' לפרנ‬
47

#include <stdio.h> :‫הגדרת שני קבועים‬


TOP_F
#define TOP_C 40
TOP_C
#define TOP_F 104
void celsius_to_fahrenheit() ‫אל פונקציה לא מועבר כל ערך‬
} ‫ זהו הקבוע‬TOP_C
double fahrenheit; int celsius;
for (celsius = -20; celsius <= TOP_C; celsius += 2)
{
fahrenheit =(1.8 * celsius) + 32;
printf("%d\t in Celsius is %.2lf in
Fahrenheit\n", celsius, fahrenheit);
{
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫פונקציות – העברת ערכים‬
'‫פונקציית המרת מעלות טמפ' מצלס' לפרנ‬
48
void fahrenheit_to_celsius() ‫אל פונקציה לא מועבר כל ערך‬
{
double fahrenheit;
‫ זהו הקבוע‬TOP_F
double celsius;
for (fahrenheit = 30; fahrenheit <= TOP_F;
fahrenheit += 2)
{
celsius = 0.56 * (fahrenheit - 32);
printf("%.2lf\t in Fahrenheit is %.2lf in
Celsius \n", fahrenheit,celsius);
}
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫פונקציות – העברת ערכים‬
‫תוכנית ראשית‬
49
int main()
‫זו התוכנית הראשית המפעילה את שתי הפונקציות על פי‬
{
‫בחירת המפעיל ללא העברת פרמטרים לפונקציות‬
int ch;
printf("\nEnter your choice 1 for C to F 2 for F to
C:\n");
scanf("%d",&ch);
switch(ch)
{
case 1: celsius_to_fahrenheit();
break;
case 2: fahrenheit_to_celsius();
break;
}
return 0;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫סיכום ביניים ‪ -‬פונקציות‬
‫‪50‬‬

‫משתנים מקומיים (לוקאליים)‬ ‫•‬


‫העברת ערכים לפונקציה‬ ‫•‬
‫משתנים גלובליים ומשתנים סטטיים‬ ‫•‬
‫קבועים (משתנים גלובליים)‬ ‫•‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫הכרזה על פונקציות‬
‫‪51‬‬

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


‫‪ ‬לכן רשמנו תמיד את הפונקציה לפני ה‪ ,main -‬שם‬
‫קראנו לה וכך התוכנית הראשית הכירה אותה‪.‬‬
‫‪ ‬אופציה נוספת מאפשרת כתיבת הפונקציה אחרי‬
‫התוכנית הראשית‪:‬‬
‫‪ ‬יש לרשום הכרזה‪/‬הצהרה (‪ )declaration‬של הפונקציה‬
‫בתחילת הקובץ מיד מתחת להגדרת הספריות והקבועים‪.‬‬
‫‪ ‬יש לרשום את המימוש שלה )‪ (definition‬בסופו של‬
‫הקובץ או בקובץ נפרד אך באותו פרויקט‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
?‫הכרזה – איך זה נראה‬
52

:(declaration, prototype( ‫ דוגמא להכרזה‬


double power(double base, int exponent);
:‫ מותר גם בלי שמות המשתנים‬
double power(double, int);
:)definition( ‫ רק בסוף הקובץ נרשום את ההגדרה המלאה‬
double power(double base, int exponent)
{
int i; double result=1;
for(i=1; i<=exponent; i++)
result=result*base;
return result;
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫הכרזה על פונקציות – למה זה טוב‬
‫‪53‬‬

‫‪ ‬לפעמים נוח לראות בתחילת הקובץ את כל הפונקציות‬


‫הבאות לידי מימוש בקובץ התוכנית‪.‬‬
‫‪ ‬במידה ויש לפתור מספר רב של תת בעיות ניתן להתאים‬
‫לכל תת בעיה פונקציה אישית‪.‬‬
‫‪ ‬אם התכנית מורכבת ממספר רב של קבצים אז‬
‫‪ ‬המימוש של הפונקציות צריך להופיע רק באחד הקבצים‬
‫‪ ‬בכל שאר הקבצים תופיע רק ההכרזה‬
‫‪ ‬למשל‪ ,‬שימוש בספריות של פונקציות‪ ,‬כמו ‪.stdio.h‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫הכרזה על פונקציות – ספריות‬
‫‪54‬‬

‫>‪#Include <filename. extension‬‬


‫‪ ‬הקומפיילר מצרף לקובץ שלנו את הקובץ ‪.filename‬‬
‫‪ filename ‬הוא אחד מקבצי ההכרזות של ‪.C‬‬
‫‪ ‬הקובץ‪ ,‬הספרייה‪ ,‬מכיל הכרזות של פונקציות שימושיות‪.‬‬
‫‪ ‬לדוגמא ‪ stdio.h‬מכיל פונקציות קלט ‪ /‬פלט (‪.)printf, scanf‬‬
‫‪ ‬לדוגמא ‪ math.h‬מכיל פונקציות מתמטיות (‪.)pow,sqrt,sin,cos‬‬
‫‪ ‬כך אנחנו יכולים להשתמש בפונקציות בלי להכיר את המימוש‬
‫שלהן‪.‬‬
‫‪ ‬בזמן הקומפילציה ה‪ linker -‬מצרף את המימוש שלהן (מתוך‬
‫הספריות של ‪ )C‬לתוכנית שלנו‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקציות – הכרזה לפני תוכנית ראשית‬
‫‪55‬‬

‫>‪#include <stdio.h‬‬
‫הפונקציה מוכרזת מיד‬
‫;)(‪void get_digit‬‬ ‫לאחר הגדרת הספריות‬
‫)(‪int main‬‬
‫}‬ ‫התוכנית הראשית קוראת לפונקציה לביצוע‪:‬‬
‫;)(‪get_digit‬‬
‫;‪return 0‬‬
‫{‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫פונקציות – הפעלה אחרי התוכנית הראשית‬
56

void get_digit() ‫הפונקציה כוללת את כל הפעילות הנדרשת בתוכנית‬


}
int counter,digit,i;
unsigned long mis;
printf("Enter unsigned long number and other
number for\n");
scanf("%ld %d",&mis, &i);
for (counter = 1; counter < i; counter++)
mis /= 10;
digit = mis % 10;
printf("in place %d the digit is %d.\n",i,digit);
{
SCE-Chapter-6-Functions Shayke Bilu PhD
‫ספריות נוספות‬
‫‪57‬‬

‫‪ ‬ב‪ C -‬יש ספריות נוספות שנוכל להשתמש בהן‪.‬‬


‫‪ ‬ב‪ math.h -‬נוכל למצוא פונקציות כמו‪:‬‬
‫‪sin‬‬
‫‪cos‬‬
‫‪abs‬‬
‫‪log‬‬
‫‪sqrt‬‬
‫‪...‬‬
‫‪ ‬ב‪ ctype.h -‬נוכל למצוא פונקציות שעוסקות בתווים כמו‪:‬‬
‫‪toupper‬‬
‫‪islower‬‬
‫‪...‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫סיכום‬
‫‪58‬‬

‫דיברנו היום על‪:‬‬


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

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


59

?‫שאלות‬

SCE-Chapter-6-Functions Shayke Bilu PhD


‫פונקציית הוצאת שורש ‪sqrt -‬‬
‫‪60‬‬

‫‪ ‬האפשרות להוציא שורש ניתנת למימוש ע"י פונקציה הנקראת‬


‫)(‪ sqrt‬הפונקציה נמצאת בספריה ‪math.h‬‬
‫‪‬יש להוסיף את הספרייה לפני תחילת התוכנית מיד אחרי‬
‫ה‪#include <stdio.h> -‬‬
‫‪ ‬דוגמה לשימוש בפונקציה‪:‬‬
‫;)‪shoresh = sqrt(mispar‬‬
‫‪ ‬תוצאת החישוב של השורש הריבועי של המשתנה ‪mispar‬‬
‫תועבר למשתנה ‪.shoresh‬‬
‫‪ ‬יש להגדיר את משתנה המספר ואת משתנה התשובה כ‪double -‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
sqrt - ‫תוכנית המדגימה שימוש ב‬
61

#include <stdio.h>
#include <math.h>
void main ()
}
double shoresh, mispar;
printf(“Enter number:\n”);
scanf(“%lf”,&mispar);
shoresh=sqrt(mispar);
printf("The square root of %.2lf is:
%.2lf\n",mispar,shoresh);
{

SCE-Chapter-6-Functions Shayke Bilu PhD


‫פונקציית העלאה בחזקה ‪pow -‬‬
‫‪62‬‬

‫האפשרות להעלות בחזקה ניתנת למימוש ע"י פונקציה הנקראת‬


‫)‪ pow(,‬הפונקציה נמצאת בספריה ‪math.h‬‬
‫יש להוסיף את הספרייה לפני תחילת התוכנית מיד אחרי ה‪-‬‬
‫>‪#include <stdio.h‬‬
‫‪ ‬דוגמה לשימוש בפונקציה‪:‬‬
‫;)‪ribua= pow(mispar,2‬‬
‫‪ ‬תוצאת החישוב של החזקה של המשתנה ‪ mispar‬תועבר‬
‫למשתנה ‪ ,ribua‬המעלה ניתנת לשינוי על פי הצורך‪.‬‬
‫‪ ‬יש להגדיר את משתנה המספר ואת משתנה התשובה כ‪double -‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


pow - ‫תוכנית המדגימה שימוש ב‬
63

#include <stdio.h>
#include <math.h>
void main()
}
double mispar, power;
printf(“Enter number:\n”);
scanf(“%lf”,&mispar);
power=pow(mispar,2);
printf(“The power of %.2lf is: %.2lf\n“
,mispar,power);
{
SCE-Chapter-6-Functions Shayke Bilu PhD
‫יצירת מספרים אקראיים ע"י )(‪rand‬‬
‫‪64‬‬

‫‪ ‬הפקודה ‪:rand‬‬
‫‪ ‬מבצעת שליפה של מספר אקראי בכל פעם שהיא מופעלת‪.‬‬
‫‪ ‬צורת הכתיבה‪rand()%number :‬‬
‫‪ ‬הפקודה תציג את המספר האקראי בין ‪ 0‬למספר הנמצא אחרי‬
‫סימן ה‪ .% -‬זהו לא באמת מספר אקראי כי הוא מבוסס שעון‪.‬‬
‫‪ ‬דוגמאות‪ ran=rand()%10; :‬המספרים האקראיים בין ‪0‬‬
‫ל‪ 10 -‬יכנסו למשתנה ‪ ran‬בכל הפעלה של הפקודה‬
‫‪ ran=rand()%500; ‬המספרים האקראיים בין ‪ 0‬ל‪500 -‬‬
‫יכנסו למשתנה ‪ ran‬בכל הפעלה של הפקודה‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫יצירת מספרים אקראיים ‪ -‬אתחול‬
‫‪65‬‬

‫‪ ‬אנו מעוניינים שבכל ריצה של התוכנית תיווצר סדרה שונה של‬


‫מספרים אקראיים‪ .‬את נקודת ההתחלה‪ ,‬ה‪ ,seed-‬ניתן לקבוע‬
‫ע"י הפונקציה הבאה המוגדרת ב‪:stdlib.h-‬‬
‫;)‪void srand(unsigned int seed‬‬
‫‪ ‬כדי שה‪ seed-‬יהיה שונה בכל ריצה‪ ,‬יש לכתוב בתחילת‬
‫התוכנית את הפקודה הבאה‪:‬‬
‫;))‪srand(time(NULL‬‬
‫‪ ‬כאשר הפונקציה )(‪ time‬מוגדרת ב‪time.h-‬‬
‫‪ ‬את הספרייה ‪ time.h‬יש להוסיף לפני התוכנית הראשית‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פונקצית מספר אקראי – )(‪rand‬‬
‫‪66‬‬

‫‪ ‬האפשרות להציג מספר אקראי ניתנת למימוש ע"י פונקציה‬


‫הנקראת )(‪ rand‬הפונקציה נמצאת בספריה ‪ .stdlib.h‬יש‬
‫להוסיף את הספריות כך‪:‬‬
‫>‪#include <stdio.h‬‬
‫>‪#include <stdlib.h‬‬
‫>‪#include <time.h‬‬
‫‪ ‬דוגמה לשימוש בפונקציה‪:‬‬
‫;‪randum_mis= rand()%100‬‬
‫‪ ‬המספר האקראי בין ‪ 0‬ל‪ 100 -‬יוצב בתוך המשתנה‬
‫‪ , randum_mis ‬ברירת מחדל היא מספר שלם‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫דוגמאות לשימוש בפונקציה )(‪rand‬‬
‫‪67‬‬

‫‪ ‬יצירת מספר אקראי שלם בין ‪ 0‬ל‪( 19-‬כולל)‪:‬‬


‫‪rand() % 20‬‬
‫‪ ‬יצירת מספר אקראי שלם בין ‪ 10‬ל‪( 20-‬כולל)‪:‬‬
‫‪rand() % 11 + 10‬‬
‫‪ ‬יצירת מספר אקראי ממשי בתחום ]‪:[0,1‬‬
‫‪(double) rand() / RAND_MAX‬‬

‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬


‫תוכנית המדגימה שימוש בפונקציה‬
68

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main ()
}
int i;
//100 -‫ ל‬0 ‫ מספרים אקראיים בין‬10 ‫דוגמה להדפסת‬
srand(time(NULL));
for(i=0;i<10;i++)
printf("%d\n",rand()%100);
{

SCE-Chapter-6-Functions Shayke Bilu PhD


‫תרגיל‬
‫‪69‬‬

‫כתוב תוכנית המדפיסה ‪ 5‬מספרים אקראיים שלמים בתחום ‪ 5‬עד ‪50‬‬


‫(כולל)‪ ,‬ואח"כ מדפיסה ‪ 5‬מספרים אקראיים ממשיים בתחום ]‪.[0,1‬‬
‫דוגמה לפלט‪:‬‬
‫‪26‬‬
‫‪38‬‬
‫‪21‬‬
‫‪33‬‬
‫‪39‬‬
‫‪0.650‬‬
‫‪0.314‬‬
‫‪0.806‬‬
‫‪0.029‬‬
‫‪0.305‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫פתרון‬
70

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int k;
srand(time(NULL));
for (k=0; k<5; k++ )
printf("%d\n",rand() % 46 + 5);
for (k=0; k<5; k++ )
printf("%.3lf\n",
(double) rand() / RAND_MAX);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫פונקציית ניקוי המסך – )”‪system(“cls‬‬
‫‪71‬‬

‫‪ ‬האפשרות להציג מסך חדש בכל פעם שיש צורך ניתנת למימוש ע"י‬
‫פונקציה הנקראת ;)”‪ system(“cls‬הפונקציה נמצאת בספריה‬
‫‪ . stdlib.h‬יש להוסיף את הספרייה לפני תחילת התוכנית מיד אחרי ה‪-‬‬
‫>‪#include <stdio.h‬‬
‫‪ ‬לדוגמה‪:‬‬
‫>‪#include <stdio.h‬‬
‫>‪#include <stdlib.h‬‬
‫‪ ‬דוגמה לשימוש בפונקציה‪:‬‬
‫;)”‪system(“cls‬‬
‫‪ ‬המסך ינוקה לאחר הפעלת הפונקציה‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תוכנית המדגימה שימוש בניקוי מסך‬
72
#include <stdio.h>
#include <stdlib.h>
void main()
{
int mark=0,i=0,sum=0; double average;
printf("Enter mark, for exit enter negative:\n");
scanf("%d",&mark);
while(mark>=0)
{
sum+=mark; printf("Enter mark:\n");
scanf("%d",&mark); i++;
system("CLS");
}
average=sum * 1.0 / i * 1.0;
printf(“Average is: %.2lf sum=%d i=%d\n",average, sum, i);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
‫תרגילי כיתה‬
‫‪73‬‬

‫‪ .1‬כתוב תוכנית הקולטת מהמשתמש מספר שלם בן שלוש ספרות‬


‫ובחירה האם להדפיס את המספרים המתחלקים ב‪ 2-‬וב‪ 3 -‬ללא‬
‫שארית‪ ,‬או המתחלקים ללא שארית‪ ,‬ב‪ 5 -‬וב‪ 7 -‬עד אותו מספר‪.‬‬
‫אם ייקלט ‪ ,1‬התוכנית תדפיס את המספרים המתחלקים ב‪ 2-‬וב‪-‬‬
‫‪ 3‬עד המספר‪ ,‬אם ייקלט ‪ 2‬התוכנית תדפיס את המספרים‬
‫המתחלקים ב‪ 5 -‬וב‪ 7 -‬עד אותו מספר‪ ,‬אם ייקלט ‪ 0‬יש לסיים‬
‫את התוכנית‪.‬‬
‫יש לפתור את התוכנית באמצעות פונקציה עבור אפשרות‬
‫ראשונה ופונקציה עבור אפשרות שנייה‪ ,‬שתי הפונקציות‬
‫המבצעות את בקשת המשתמש‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪74‬‬

‫‪ .2‬כתוב תוכנית המבצעת המרת מידות ממטרים לסנטימטרים‬


‫ומדקות לשניות‪ .‬התוכנית תקלוט מהמשתמש את בחירתו ואת‬
‫המספר המקסימלי ‪ num‬להמרה ואח"כ תבצע את ההמרה ‪.‬‬
‫הנחיות עבודה‪:‬‬
‫אם ייקלט ‪ 1‬תבוצע המרה ממטרים לסנטימטרים מ‪ 1 -‬עד ‪.num‬‬
‫אם ייקלט ‪ 2‬תבוצע המרה מדקות לשניות‪ ,‬מ‪ 1-‬עד ‪.num‬‬
‫אם ייקלט ‪ 0‬תתבצע יציאה מהתוכנית‪.‬‬
‫יש לבצע את התוכנית באמצעות פונקציות בלבד‪.‬‬
‫בסיום הפונקציה תסכם את כל ההמרות תחזיר את הסיכום שיודפס‬
‫בתוכנית הראשית‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪75‬‬
‫‪ .3‬כתוב תוכנית המדגימה שימוש במחשבון‪.‬‬
‫התוכנית תקלוט אין סוף זוגות מספרים ובחירת המשתמש לפעולה אריתמטית‪:‬‬
‫• ‪ +‬תבוצע פעולת חיבור בין שני המספרים‪.‬‬
‫• ‪ -‬תבוצע פעולת חיסור של המספר השני מהראשון‪.‬‬
‫• * תבוצע פעולת כפל בין שני המספרים‪.‬‬
‫• ‪ /‬תבוצע פעולת חילוק של המספר הראשון בשני‪.‬‬
‫• ‪ %‬תבוצע פעולת מודולו בין שני המספרים‪.‬‬
‫• ^ תבוצע העלאה בחזקה של המספר הראשון בשני‬
‫• יש לכתוב לכל פעולה אריתמטית פונקציה מתאימה המקבלת מהתוכנית‬
‫הראשית את שני ערכי המספרים‪ ,‬מחשבת את התרגיל הרצוי ומחזירה את‬
‫התוצאה המתבקשת‪.‬‬
‫• התוכנית תסתיים כאשר יוקלדו המספרים ‪.-999 -999‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪76‬‬

‫‪ .4‬כתוב תוכנית המבצעת המרת מידות מרחקים מ‪ 1 -‬עד ‪10‬‬


‫מקילומטרים למיילים ולהיפך‪ .‬התוכנית תקלוט את בחירת‬
‫המשתמש ותבצע את ההמרה הנדרשת‪.‬‬
‫• במידה וייקלט ‪ 1‬תבוצע המרה של מיילים לקילומטרים כאשר‬
‫כל מייל הוא ‪ 1.609344‬קילומטר‪.‬‬
‫• במידה וייקלט ‪ 2‬תבוצע המרה של קילומטרים למיילים כאשר‬
‫כל קילומטר הוא ‪ 0.621371‬מייל‪(1/1.609344=0.621371( .‬‬

‫• כל המרה והדפסת כל הערכים תבוצע ע"י פונקציה ייחודית‬


‫לביצוע אותה המרה‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪77‬‬

‫‪ .5‬כתוב תוכנית הקולטת מהמשתמש גובה של משולש ומציגה בפניו‬


‫שתי אפשרויות בחירה של ציור משולש ישר זווית‪:‬‬
‫• אפשרות מספר ‪ 1‬תצייר משולש כוכביות * ישר זווית ישר והפוך‪.‬‬
‫• אפשרות מספר ‪ 2‬תצייר משולש כרוכיות @ ישר זווית ישר והפוך‪.‬‬
‫• אפשרות מספר ‪ 0‬תצא מהתוכנית‪.‬‬
‫יש להשתמש עבור כל אפשרות בפונקציה ייחודית לאותה משימה‪.‬‬
‫דוגמא‪ :‬במידה וייקלט גובה ‪ 3‬ובחירה ‪ 1‬נקבל –‬
‫*‬
‫**‬
‫***‬
‫**‬
‫*‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪78‬‬

‫‪ .6‬כתוב פונקציה המקבלת מספר שלם ארוך וחיובי ומחזירה את‬


‫הכמות הספרות שיש במספר‪.‬‬
‫עליך לכתוב תוכנית הקולטת מהמשתמש מספר שלם ארוך וחיובי‪.‬‬
‫במידה והקלט חוקי התוכנית מפעילה את הפונקציה הנ"ל ומדפיסה‬
‫את תוצאתה בצורה הבאה‪:‬‬
‫אם הכמות הספרות הוא זוגי התוכנית תדפיס "זוגי" אחרת היא‬
‫תדפיס "אי זוגי" ‪.‬‬
‫במידה והקלט לא חוקי על התוכנית להדפיס הודעה מתאימה‪.‬‬
‫למשל‪:‬‬
‫"‪CountDigits (123) => "odd‬‬
‫"‪CountDigits (1234) => "even‬‬
‫"‪CountDigits (-123) => "Invalidate input‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪79‬‬

‫‪ .7‬כתוב פונקציה המקבלת ‪ 10‬מספרים שלמים וחיוביים‪ ,‬בני ‪7‬‬


‫ספרות כל אחד‪ ,‬ומחזירה תשובה לגבי כל אחד האם הוא הוא‬
‫פלינדרום או לא‪.‬‬
‫פלינדרום הוא מספר אשר ניתן להיקרא מההתחלה לסוף ולהיפך‬
‫והוא אותו מספר לדוגמה‪1739371 ,1285821 ,1237321 :‬‬
‫עליך לכתוב תוכנית המפעילה לולאה לקליטת ‪ 10‬מספרים‪ ,‬התוכנית‬
‫תבדוק האם המספר הנקלט הוא בן ‪ 7‬ספרות אם לא‪ ,‬תציג הודעה‬
‫ותקלוט מספר חדש במקומו‪.‬‬
‫כל מספר‪ ,‬לאחר בדיקת תקינותו‪ ,‬ישלח לפונקציה לצורך בדיקה‬
‫והפונקציה תחזיר תשובה פלינדרום או לא (‪ 0‬או ‪.)1‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪80‬‬

‫‪ .8‬כתוב פונקציה המקבלת ‪ 2‬מספרים שלמים וחיוביים‪ ,‬ומחזירה‬


‫תשובה האם המספרים הם "נאהבים"‪ .‬זוג מספרים נאהבים" הם‬
‫מספרים שסכום המחלקים של האחד הם המספר האחר‪.‬‬
‫לדוגמה‪ :‬הזוג הקטן ביותר של מספרים ידידים הוא (‪:)220,284‬‬
‫מחלקי המספר ‪ 220‬הם ‪ 55 ,44 ,22 ,20 ,11 ,10 ,5 ,4 ,2 ,1‬ו‪,110-‬‬
‫וסכומם הוא ‪ .284‬מחלקי המספר ‪ 284‬הם ‪ 71 ,4 ,2 ,1‬ו‪ ,142-‬וסכומם‬
‫הוא ‪.220‬‬
‫שני זוגות מספרים אחרים הם‪ 17296,18416 :‬ו‪.6232,6368-‬‬
‫עליך לכתוב תוכנית הקולטת ‪ 5‬זוגות של מספרים‪ ,‬שולחת אותם‬
‫לפונקציה ותציג הודעה מתאימה האם הם זוג מספרים "נאהבים"‪.‬‬
‫הפונקציה תחזיר תשובה "נאהבים" או לא (‪ 0‬או ‪.)1‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪81‬‬

‫‪ .9‬כתוב פונקציה ראשונה המקבלת מספר חד ספרתי ומחשבת ומחזירה את‬


‫העצרת של המספר שלו‪ .‬כתוב פונקציה שנייה המקבלת מספר שלם וחיובי‪,‬‬
‫ומחזירה תשובה האם המספר הוא "מספרי בראון"‪.‬‬
‫"מספרי בראון" הם מספרים שהעצרת של הראשון ‪ 1 +‬שווה למספר השני‬
‫בריבוע‪.‬‬
‫‪52 = 25‬‬ ‫לדוגמה‪ 4! +1 = 52 :‬להלן ההסבר‪4! = 24 +1 = 25 :‬‬
‫‪112 = 121‬‬ ‫לדוגמה‪ 5! +1 = 112 :‬להלן ההסבר‪5! = 120 +1 = 121 :‬‬
‫לדוגמה‪ 7! +1 = 712 :‬להלן ההסבר‪712 = 5041 7! = 5040 +1 =5041 :‬‬
‫עליך לכתוב תוכנית הקולטת מספר חד ספרתי‪ ,‬שולחת אותו לפונקציה הראשונה‬
‫לחישוב העצרת שלו ואחר כך שולחת את המספר השני להעלאה בחזקה שנייה‪.‬‬
‫בסיום בודקים את תשובות שתי הפונקציות‪ ,‬אם המספרים זהים אז ניתן להכריז‬
‫כל המספרים הם מספרי בראון אחרת לא‪.‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬
‫תרגילי כיתה‬
‫‪82‬‬

‫‪ .10‬כתוב פונקציה ראשונה המקבלת מספר בודקת אם המספר הוא‬


‫מספר "מספר ארשאד"‪.‬‬
‫"מספר ארשאד" הוא מספר המתחלק ללא שארית בסכום ספרותיו‪.‬‬
‫לדוגמה‪ 81 :‬אשר מתחלק ללא שארית בסכום ספרותיו ‪.9‬‬
‫לדוגמה‪ 48 :‬אשר מתחלק ללא שארית בסכום ספרותיו ‪.12‬‬
‫עליך לכתוב תוכנית המוצאת ומדפיסה את את כל מספרי ארשאד מ‪-‬‬
‫‪ 10‬ועד ‪ 100‬באמצעות הפונקציה‪.‬‬
‫כמו כן חשב והדפס כמה מספרים כאלה קיימים בתחום ‪ 10‬עד ‪.100‬‬
‫‪SCE-Chapter-6-Functions‬‬ ‫‪Shayke Bilu PhD‬‬

You might also like