Transcript
Page 1: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

C מבוא לשפת

ומשפטי 4תרגול לוגיים ביטויים :תנאי

מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן אביאור וסאהר אסמיר עבור הקורס "מבוא למדעי

המחשב"

י טל כהן, עודכן ע"י יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי "נכתב עלישראל

Page 2: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 2

תוכנייה

חזרה קצרצרה על התרגול הקודם•ביטויים לוגיים•ifמשפטי •

Page 3: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 3

טיפוסי משתנים

בשבוע שעבר פגשנו מבחר טיפוסים שונים למשתנים:•

מקצה עבור משתנים מסוג זה. מהדרים שונים יכולים Turbo C* זהו הגודל ש- בתים.4 הוא בן intלהקצות גדלים שונים! למשל, במהדרים רבים

קלט/פלט ע"י *sizeof סוג המידע הנשמר

שם הטיפוס

%d או %c 1 מספרים שלמים char

%d 2 מספרים שלמים int

%ld 4 מספרים שלמים long int

%f 4 מספרים עם שברים

float

%lf 8 מספרים עם שברים

double

Page 4: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 4

char?מספר או תו :

(כמו כל משתנה אחר)אוסף של סיביות הינו char:ערך משתנה תזכורת•

.127 ל-128-אפשר לפרש אותו כמספר בין •

.ASCII תווי 256אפשר גם לפרש אותו כאחד מ-•

, תוכן המשתנה מתורגם לתו.c% עם charכאשר מדפיסים משתנה •

קולטת תו אחד, מתרגמת c, scanf% עם charכאשר קולטים משתנה • ושומרת את התוצאה בתוך המשתנה.ASCIIאותו לסיביות לפי טבלת

וכו'( d%עבור כל פעולה אחרת )+, -, *,/ ,%, הדפסה/קלט עם • כאל מספר!charמתייחסים למשתנה

Page 5: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 5

שימוש בתווים בתוכנית

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

char ch = 'B'; להיות "תו", אלא ch באמת קובעת את לאפעולה זאת •

.B של ASCIIערכו נקבע להיות שווה לערך

על המסך:B באמת נקבל c% עם chכעת אם נדפיס את •printf("Numeric value is %d, character is %c", ch, ch);

ידפיס:Numeric value is 66, character is B

גרש ולא מרכאות !

Page 6: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 6

סדר פעולות ואופרטורים

מוגדר "סדר פעולות".Cראינו שבשפת •למשל, כפל קודם לחיבור.–

הכרנו כמה אופרטורים מיוחדים:• - מודולו, שארית חלוקה )רק למספרים שלמים!(.%–

- קידום משתנה )לפני או אחרי שם המשתנה, עם ++–השפעות שונות(

- נסיגה של משתנה )כנ"ל(--–

, וכו'-=, +=השמה מקוצרת: אופרטור נוח נוסף הינו •, וכו'x=x+y הינה ;;x+=yמשמעותו של –

Page 7: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 7

המרת טיפוסים

פגשנו שני סוגי המרות:•– מתבצעת עבורנו מבלי שנבקשהמרה אוטומטית –– מתבצעת על-פי בקשה מפורשתהמרה מכוונת –

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

.type-cast או castנקראת לעיתים המרה מכוונת •משתמשים בה כאשר תוצאה המתקבלת ע"י המרה •

אוטומטית היא לא התוצאה רצויה.למשל בשביל לקבל תוצאה עם שארית בחלוקה של שלמים–type(expression(אופן הכתיבה: –

Page 8: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 8

המרת טיפוסים - דוגמה

מה בעצם מתרחש בדוגמה הבאה?•int a = 1,b = 2;

double result = )double( a / b;

יש קדימות על פעולת החלוקה, לכן קודם כל castלפעולת 1. int מ-a של ערך המשתנה המרה מכוונתמתבצעת

.doubleל-

על מנת לבצע חלוקה, ערכים משני הצדדים חייבים להיות 2. של ערך המרה אוטומטיתמאותו טיפוס. לכן מתבצעת

.double ל-int מ-bהמשתנה

.0.5=1.0/2.0: חלוקהמתבצעת 3.

. לכן אין צורך double הינה doubleתוצאת החלוקה של שני 4..השמהבהמרה נוספת ומתבצעת

Page 9: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 9

BUGמצא את ה-

מצא שלוש שגיאות בתוכנית הבאה:•#include <stdio.h>

int main)void(

{

char c="Y";

int price = 1999999;

double half_price = )double()price/2(;

printf)"UPPER CASE: %c, lower case: %c\n", c, c-’A’+’a’(;

printf)"Half price of 1,999,999 is %.2lf\n", half_price(;

return 0;

}

אילו מהשגיאות תתגלו בשלב הקומפילציה?•

מה עושה החישוב הזה?

yuri
Bugs:1. "Y" instead of 'Y'2. 1999999 isn't in a range of integer. Use long int.3. half_price is calculated as integer. Divide by 2.0 or use casting before the division and not after it.Only 1. is a compilation error.
Page 10: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

ביטויים לוגיים

Page 11: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 11

מהם ביטויים לוגיים?

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

, הדפס 'הצלחת', אחרת הדפס x>54אם למשל, "•"'נכשלת'.

החלטות יכולות להתקבל על-סמך ביטויים לוגיים, שהם:•"(100 שווה בדיוק ל-xהשוואה בין מספרים )למשל, "אם –

"(x>54השוואה יחסית בין מספרים )למשל, "אם –

x>54צירוף בין כמה ביטויים פשוטים יותר )למשל, "אם –"(homework>60 וגם

Page 12: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 12

ייצוג ערכי אמת

.ערך אמתלכל ביטוי לוגי יש • )"נכון" או "שגוי"(.false או trueערך האמת הוא •, 54 גדול מ-x אם true יש ערך אמת ”x>54“למשל, לביטוי •

אחרת.falseוערך אמת , נהוג לומר שהביטוי trueאם לביטוי יש ערך אמת •

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

.false מייצג 0ערך מספרי –.true) מייצג 1 (ובפרט, הערך 0ערך מספרי שונה מ-–

Page 13: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 13

פעולות השוואה כאופרטורים

כעת אפשר לראות כיצד פעולות השוואה בין ערכים פועלות:•(.true )כלומר, 1אם ההשוואה מצליחה, לביטוי יש ערך •(.false )כלומר, 0אחרת, לביטוי יש ערך •

למשל, מה תדפיס התוכנית הבאה?•

int x = 79;

int passing = )x > 54(;

printf)“Passing status: %d\n”, passing(;

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

בהצגת קטע הקוד המהווה את "לב" התוכנית במקום להציג את התוכנית

כולה.

Page 14: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 14

אפשר להשוות כל מיני דברים...

ההשוואות שהצגנו עד כה היו השוואות בין משתנים •(.54 ל-xלקבועים )למשל, בין

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

• x + 5 > 3 * y• 35 > 42• x < x + 1

וכן הלאה...• האם תוכלו לדעת מה ערכו של כל ביטוי?•

שימו לב לחשיבות סדר הפעולות בחישוב ביטוי זה!

Page 15: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 15

אופרטורים להשוואה

, להשוואה מסוג > ו-<ראינו את האופרטורים •"גדול מ-" או "קטן מ-".

אופרטורים נוספים:•

(x≥y )בכתיבה מתמטית, x >= yגדול-או-שווה: •(x≤y )בכתיבה מתמטית, x <= yקטן-או-שווה: •.x == yשווה בדיוק: •

(.xy )בכתיבה מתמטית, x != yשונה: •

Page 16: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 16

זהירות! ההבדל בין השמה להשוואה

. כפולשימו לב: בהשוואה משתמשים בסימן "שווה" •שימוש בסימן שווה יחיד פירושו השמה ולא השוואה!

x = 3; ← Set the value of x to 3

x == 3 ← Logical expression, equals “1” if x is

exactly 3, “0” otherwise.קל להתבלבל בין השניים; שימוש שגוי יוביל לתוצאות לא •

צפויות...

Page 17: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 17

שילוב בין כמה השוואות

נמצא tempנניח שאנו רוצים לבדוק אם ערך המשתנה •.100 ל-0בין

מייצג את טמפרטורת המים, נדע שהם temp)אם למשל –במצב נוזלי(.

האם התוכנית הבאה תעבוד?•double temp;int is_liquid;printf)“Enter temprature: ”(;scanf)“%lf”, &temp(;is_liquid = (0 < temp < 100);printf)“Is liquid )1=yes, 0=no(: %d\n”, is_liquid(;

Page 18: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 18

והתוצאה...

מצויין.•

מה קורה פה!?•

Page 19: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 19

הסבר

כזכור, פעולת השוואה מניבה ערך מספרי:• אם ההשוואה "הצליחה",1– אם ההשוואה "נכשלה".0–

חושב temp=249.12עבור temp < 100 < 0לכן, הביטוי •כך:

0 > 249.12 > 100

. temp < 0ראשית, מחשבים את ההשוואה מתקיימת, כלומר התוצאה היא

1.... והתוצאה 100 < 1כעת, מחשבים את

!1היא כמובן שוב

Page 20: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 20

אלגברה בוליאנית

כיצד ניתן לבצע כמה אם השיטה הקודמת נכשלה, •?השוואות

.אלגברה בוליאניתהתשובה: •אופרטורים באלגברה בוליאנית מאפשרים "להשוות" בין •

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

"temp>0 וגם temp<100"האופרטור "וגם" הוא אופרטור בוליאני ה"מקשר" בין שני •

ביטויים לוגיים.&& , אופרטור זה נכתב:Cבשפת •

Page 21: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 21

התוכנית המתוקנת

double temp;

int is_liquid;

printf)“Enter temprature: ”(;

scanf)“%lf”, &temp(;

is_liquid = (0 < temp) && (temp < 100);

printf)“Is liquid )1=yes, 0=no(: %d\n”, is_liquid(;

Page 22: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 22

אופרטורים בוליאניים

וגם x, מתקיים רק אם גם x && yאופרטור "וגם", •y הם true.)כלומר, שונים מאפס(

, מתקיים אם לפחות אחד x || yאופרטור "או", • )כלומר, שונה true הוא y ו-xמשני הביטויים

מאפס(..true, או שניהם y, או x כלומר או – x y x && y x || y

0 0 0 0

0 0לא 0 1

0לא 0 0 1

0לא 0לא 1 1טבלה זאת

טבלת נקראת אמת

Page 23: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 23

עוד אופרטור בוליאני

"(.not )"!האופרטור הבוליאני האחרון הוא •אופרטור זה "הופך" את ערך האמת של ביטוי.•

כמו סימן מינוס במתמטיקה, שהופך חיובי לשלילי ולהיפך.–

.1, התוצאה היא 0אם האופרטור פועל על •.0, התוצאה היא 0אם האופרטור פועל על ערך שונה מ-•למשל:•

int test = 85;

int homework = 65;

int passing = !(test < 55 || homework < 80);

Page 24: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

if משפטי

Page 25: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 25

: מוטיבציהifמשפטי

עד כה, השתמשנו בתוצאות של ביטויים לוגיים • או false עבור 1 או 0פשוט כדי להדפיס ערכים )

true.)בהתאמה ,

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

, הדפס 'הצלחת', אחרת x>54אם למשל, "•"הדפס 'נכשלת'.

.ifמשפטי בעזרת Cניתן לבצע זאת בשפת •נקראים לעיתים "משפטי תנאי".–

Page 26: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 26

ifמשפטי

הוא פשוט:ifמבנה משפט •

if (expression) statement;•expression...הוא ביטוי כלשהו

.ifהסוגריים חייבים להופיע סביב הביטוי, הם חלק ממבנה פקודת –

.statementאם הביטוי שונה מאפס, תתבצע הפקודה • לא תתבצע statementאם הביטוי שווה לאפס, הפקודה •

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

למשל:•

if )x < 55( printf)“You have failed!”(;

. 0 או 1חשוב לזכור שזהו ביטוי המחושב ל- כל ערך או ביטוי ifבאופן כללי ניתן לשים ב-מספרי!

Page 27: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 27

עוד דוגמא

double temp;

int is_liquid;

printf)“Enter temprature: ”(;

scanf)“%lf”, &temp(;

is_liquid = )0 < temp( && )temp < 100(;

if (is_liquid) printf(“In liquid state.”);

if (temp < 0) printf(“Frozen.”);

if (temp > 100) printf(“Boiled.”);

Page 28: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 28

עוד דוגמא

int grade;

printf)“Enter test grade: ”(;

scanf)“%d”, &grade(;

if (grade < 55) printf(“Failed.”);

if (grade >= 55) printf(“Passed.”);

( משלימות 55 לקבוע gradeשתי הבדיקות )השוואות של •זו את זו: אם אחת מתקיימת, השניה בהכרח נכשלת,

ולהיפך.מצבים כאלה )אם... אחרת...( הם מאוד נפוצים.•

Page 29: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 29

אם... אחרת...

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

נפרדות.המבנה הוא:•

if (expression) statement1; else statement2;

.statement1 מתקיים, תבוצע הפקודה expressionאם •

.statement2אחרת, תבוצע הפקודה •

משתי בכל מקרה תבוצע רק אחת )ובדיוק אחת(•האפשרויות!

Page 30: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 30

למשל...

int grade;

printf)“Enter test grade: ”(;

scanf)“%d”, &grade(;

if (grade < 55) printf(“Failed.”); else printf(“Passed.”);

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

הבדיקה מתבצעת רק פעם אחת!•

Page 31: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 31

שבירת שורות ארוכות

בפרט, עשויים ליצור שורות if…else בכלל, ומשפטי ifמשפטי •ארוכות בתוכנית.

מומלץ לפרק שורות כאלה לחלקים, למשל כך:•

if (grade < 55)

printf(“Failed.”);

else

printf(“Passed.”);(.indentation )הזחה נקרה statementהרווח משמאל שורות ה-•הוא מקל על הבנת התוכנית: במקרה זה, פקודה מוזחת היא •

פקודה שלא בהכרח תתבצע; היא לא חלק מחויב מרצף פעולת התוכנית.

Page 32: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 32

עוד על הזחה

חשוב להדגיש שמבחינת המהדר,•לא חשוב היכן "תשברו שורה",–

אין כל משמעות מעשית להזחה.–

ההזחה נועדה לעזור לנו, בני-האדם, הקוראים את •הקוד.

היא הופכת את הקוד לקל יותר להבנה.•

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

וקשה מאוד לתת להן ציונים גבוהים...–

Page 33: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 33

יותר מפעולה אחת

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

למשל, מה תדפיס התוכנית הבאה?•

int grade = 25;

printf)“The grade is %d\n”, grade(;

if (grade > 54) printf(“Passed.\n”); printf(“Very good!\n”);

מה קורה פה!?•

Page 34: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 34

הסבר פשוט...

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

עם הזחה נכונה, התוכנית הקודמת נראית בעצם כך:•

int grade = 25;

printf)“The grade is %d\n”, grade(;

if (grade > 54)

printf(“Passed.\n”);

printf(“Very good!\n”); האחרון מתבצע בכל מקרה – printfכעת קל לראות שה-•

!ifהוא כלל לא קשור ל-

Page 35: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 35

בכל זאת, יותר מפעולה אחת

?ifאז איך אפשר לבצע יותר מפעולה אחת בעזרת פקודת •התשובה: שימוש בסוגריים מסולסלים.• כך statementsבעזרת סוגריים מסולסלים, ניתן "לקבץ" כמה •

.ifשיתבצעו יחדיו, בהתאם לתנאי של ה-למשל:•

int grade = 25;printf)“The grade is %d\n”, grade(;if (grade > 54){

printf(“Passed.\n”);printf(“Very good!\n”);

}

Page 36: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 36

...elseאפשר גם ב-

if )grade > 54(

{

printf)“Passed.\n”(;

printf)“Very good!\n”(;

}

else

{

printf)“Failed.\n”(;

printf)“What a pity!\n”(;

}

קבוצת פקודות בתוך סוגריים ".בלוקמסולסלים נקראת לעיתים "

Page 37: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 37

אפשר גם עבור פקודה בודדת...

אפשר להשתמש בסוגריים מסולסלים גם כדי להקיף פקודה בודדת.•

לדעת רבים, התוצאה ברורה וקריאה יותר.•

למשל:•

if )grade < 55(

{

printf)“Failed.”(;

}

else

{

printf)“Passed.”(;

}

Page 38: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 38

סגנונות כתיבה

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

if )grade < 55( {

printf)“Failed.”(;

}

else {

printf)“Passed.”(;

}

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

למהדר זה לא משנה כלום!•

Page 39: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 39

הזחה שגויה

?grade=40מה תבצע התוכנית הבאה עבור •

if )grade < 55(

if )grade > 52(

grade = 55; /* factor */

else

printf)“Passed without factor.”(;•else-שייך ל if!האחרון – לא מה שציפינו..”Passed without factor“לכן התוכנית תדפיס •

תוצאה של הזחה שגויה יכולה להיות תוכנית שגויה.•יש להקפיד על הזחה נכונה!•

כותבים הערות – Cכך ב-טקסט שעוזר לנו להבין את התוכנית ושהמהדר מתעלם

ממנו

Page 40: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 40

תיקון

האחרון?if להיות שייך לא ל-elseאיך אפשר לגרום ל-•ע"י סוגריים מסולסלים:•

if )grade < 55( {

if )grade >= 53(

grade = 55;

}

else

printf)“Passed without factor.”(;

רק כאשר .”Passed without factor“עכשיו התוכנית תדפיס •grade>=55.

Page 41: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 41

חידה

קטע הקוד הבא מגיע מתוכנת בקרה של מטוס קל.• קמ"ש, 100 רגל, והמהירות קטנה מ-10,000אם הגובה הוא מעל •

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

if )altitude > 10000({

if )airspeed < 100({

printf)“Warning! Crash danger!”(;}

}

שימו לב להזחה הכפולה!

yuri
A simplier way:if (altitude > 10000 && airspeed < 100) { ...}
Page 42: מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן

תרגול 4 © מבוא למדעי המחשב. כל הזכויות שמורות 42

עוד חידה

מציין את מידת visibilityבאותה תוכנת בקרה למטוס, המשתנה •הראות.

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

if )visibility == 0(

{

turn_on_red_light)(;

}

yuri
Alternative and preferable code (because it better fits the human logic):if (!visibility){ ...}

Recommended