c New Www.underwar.co.Il

52
אדר ניר[email protected] UnderWarrior Project http://underwar.livedns.co.il - 1 - C Language The Basics By Nir Adar

Transcript of c New Www.underwar.co.Il

Page 1: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -1-

   

 

C Language  

The Basics  

By Nir Adar  

Page 2: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -2-

18.4.2003 -מהדורה שניה 16.7.1998 -מהדורה ראשונה

יסודות - Cשפת

. il.co.livedns.underwar://httpמסמך זה הורד מהאתר .מאת המחברללא אישור מפורש , אין להפיץ מסמך זה במדיה כלשהיוכן , שיגרם עקב השימוש במידע המופיע במסמך, ישיר או עקיף, מחבר המסמך איננו אחראי לכל נזק

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

ניר אדרכל הזכויות שמורות ל

 Nir Adar Email: [email protected]  Home Page: http://underwar.livedns.co.il    

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

Page 3: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -3-

הקדמה למהדורה השניה

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

. ומאז קיבלתי הערות וביקורות רבות מגולשים שנעזרו במסמך, 1998-המהדורה הראשונה נכתבה ב חדשה זו אנסה להעביר לכם ובמהדורה, Cמאז כתיבת המסמך ההוא העברתי מאות שיעורים בנושא שפת

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

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

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

.כולי תקווה שהמסמך יהיה לכם לעזר

ניר אדר 2003ל אפרי

Page 4: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -4-

תוכן עניינים

4.....................................................................................................תוכן עניינים 5......................................................................................מבוא ותוכנית ראשונה

8....................................................................................ב ומשתניםזיכרון המחש 10.........................................................................................פלט/פונקציות קלט

14.........................................................................................................משתנים C................................................................................................22מרכיבי שפת 28....................................................................................................הסתעפויות

35........................................................................................פונקציות מתמטיות 36.......................................................................................שלבים להתרת בעיה

42....................................................................................קבועים ושמות נרדפים 44..........................................................................................................לולאות 52..............................................................................................................סיום

Page 5: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -5-

מבוא ותוכנית ראשונה

מבוא

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

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

סדר פעולות אפשרי בשבילנו הוא . כתיבת מסמך- למשל -נניח שנרצה לבצע פעולה מסוימת על המחשב .הקלדת המסמך הרצוי ואז שמירתו לדיסק, Wordפתיחת תוכנת

ויותר ? על המחשב עובדותכיצד תוכנות אחרות ? עובדתWordכיצד התוכנה : נשאל עכשיו את השאלה ? איך נוכל ליצור תוכניות חדשות שיתאימו למטרות ולצרכים שלנו-חשוב מכך שפות מוגדרות היטב המאפשרות לנו לומר למחשב מה -תוכנות נכתבות בעזרת שפות תכנות : התשובה

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

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

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

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

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

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

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

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

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

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

שהופכת את Linker בתוכנית נוספת הנקראת ים משתמשנוא, כתבנולאחר שהמהדר הידר את התוכנית ש . שניתן להריצוEXEהתוכנית לקובץ

בפועל כלי העבודה המצויים כיום מאפשרים לבצע את תהליך יצירת . לכאורה תהליך זה ארוך ומסורבל .++Microsoft Visual C- ו++Borland Cשתי סביבות עבודה טובות הינן . קלותהתוכנה ב

. הנוחה יותר לעבודה עם תוכניות קטנות, ++Borland Cהמלצתנו למתכנת המתחיל היא לעבוד עם Microsoft Visual C++נוחה יותר עבור פרויקטים גדולים .

והן מאפשרות לבצע תהליך זה , ועוד) Linker(מקשר , מהדר, סביבות עבודה אלו כוללות בתוכן עורך .במהירות על ידי תפריטים

Algorithm C ProgramEditor MachineCode

Compiler OutputExecute

Page 6: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -6-

C-תוכנית ראשונה ב

 .על המסך" Hello, World"התוכנית מדפיסה את המילים . Cנציג כעת תוכנית ראשונה בשפת 1) #include <stdio.h> 2) int main() 3) { 4) printf("Hello, World!\n"); 5) return 0; 6) }

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

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

. stdio.h בשם )Header(הוראה למהדר להכניס לפני התוכנית את קובץ הכותרת  .1 בה אנו ()printfבין היתר של הפקודה , C-קובץ זה מכיל הגדרות של פקודות שונות ב

.Cשל שפת פלט /קלטהפקודות קובץ זה מכיל הרבה מ. משתמשים בתוכנית זוושיכול , היא קטע של הוראות שניתן להריצוC-פונקציה ב. mainהגדרת פונקציה בשם  .2

כאשר התוכנית רצה main תמיד הפונקציה C-ב. המסמל משהו, להחזיר ערך בסיום . מתחילה

אנו . ()mainכרגע די לנו בעובדה שריצת התוכנית מתחילה בבלוק זה המוגדר בעזרת  . בהרחבהCעוד נעסוק בנושא הפונקציות בשפת

מציין את סוף { הסימן . mainמציין את התחלת הבלוק בו יהיו ההוראות של } הסימן  .3 ומסתיים } מתחיל בסימן Cכל בלוק בשפת , ככלל. mainבלוק הפקודות של הפונקציה

.{-ב4. printf מחרוזת (. המרכאותהמחרוזת המצויה בין משמשת להדפסת היא פונקציה ה-

.שמשמעותו מעבר לשורה הבאה, C הוא סימן מיוחד בשפת n\הסימן ). רצף אותיות5. return 0 כלומר לסיים את התוכנית , 0 אומר לתוכנית להחזיר למערכת ההפעלה

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

. יודפס על המסך"Hello, World"הטקסט , כאשר נריץ תוכנית זו

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

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

 .לכך 

. המרכיבות את התוכנית שלנו בשם קוד התוכניתCנהוג לכנות את הפקודות בשפת : מינוח

Page 7: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -7-

תרגיל

(*).כשהוא מוקף במלבן הבנוי מכוכביות , על המסך"I Love C"כתוב תוכנית שתדפיס את הטקסט

פתרון

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

:פתרון התרגיל

#include <stdio.h> int main() { printf("************\n"); printf("* I love C *\n"); printf("************\n"); return 0; }

 

Page 8: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -8-

 ומשתניםהמחשב כרון יז 

זיכרון המחשב

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

 :ת את זיכרון המחשבנתאר קצ

לקבל רק שני היכולהיא יחידה הביט ). Bit(היחידה הבסיסית ששומרת במחשב מידע מכונת ביט נעיר כי במחשבים מודרניים ().Byte( ביטים נקראת בית 8קבוצה של . דלוק או מכובה, 1 או 0 :ערכים

). ביטים8 אולם לצורך ההסבר נניח שבית הוא בן, ביטים8-בית הוא לרוב יותר מ

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

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

. טוט הבאנביט למשל בשר

1007 1006 1005 1004 1003 1002 1001 10101101 11100111 10000111 10101011 00101110 10101010 01001110

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

.בתאים

'?אותיות וכו, מספרים-למשל , כיצד נשמור בזיכרון נתונים אחרים פרט לאפסים ואחדותופיענוח של האפסים , בעזרת ייצוג של מספרים ואותיות כרצפים מוסכמים של אפסים ואחדות: התשובה

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

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

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

הוא זה שימיר אותם בשבילנו לאפסים ואחדות Cוהמהדר של , יכולים להשתמש בהם בתוכניות שלנו .שישמרו בזיכרון המחשב

Page 9: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -9-

משתנים

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

משתנים המיועדים , משתנים שמיועדים לשמור מספרים שלמים: ישנם סוגים שונים של משתניםCבשפת . ומשתנים המיועדים לשמור מספרים רציונליים, )אותיות(לשמור תווים

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

:ההצהרה על משתנה נראית כך, מבחינה תחבירית <Variable type> <Variable name>;

  :Cסוגי המשתנים העיקריים של שפת

).int(משתנים המכילים מספרים שלמים . א ).char(משתנים המכילים אותיות . ב ).double(מכילים מספרים רציונליים משתנים ה. ג :דוגמאל

int x;

. xוקראנו לו , שזהו מספר שלם, intהגדרנו משתנה מסוג בהצהרה זו

:כך , ניתן להציב לתוך המשתנה ערכים

x = 4;

.4את המספר , xאנו מכניסים לתוך התא בזיכרון שמכונה בתוכנית שלנו

:כך, זמניתניתן להכריז על יותר ממשתנה אחד בו int x, y;

.שניהם מסוג מספרים שלמים, y- וx, משתנים2הגדרנו

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

.הרצוי לנו :למשל

char ch = 'A';

.A ושמנו בתוכו את האות chיצרנו משתנה בשם

ואילו ללא הגרשיים היה זה שם , הגרשיים מציינות שמדובר בתו. Aנה מהמשתנה שו'A'נשים לב כי התו .משתנה או קבוע

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

.לאחר מכן נמשיך בהצגת והרחבת נושא המשתנים

Page 10: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -10-

פלט/פונקציות קלט

.כניות שנכתוב יתקשרו עם העולםבעזרת פונקציות קלט ופלט התו .וכן פונקציות המשמשות לקלט מהמקלדת, נציג פונקציות המשמשות להדפסת נתונים על המסך, בתוכניתstdio.hאנו צריכים לכלול את הקובץ , פלט/על מנת להשתמש בתוכנית שלנו בפונקציות קלט

:בעזרת הפקודה

#include <stdio.h>

stdio זהו קיצור של standard input/output . זוהי ספרית פקודות של שפתC , המכילה את פקודות

.הקלט פלט השימושיות ביותר של השפה

scanf/printfהפונקציות

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

printf("מחרוזת");

.המחרוזת שהקלדנו הודפסה על המסך, בצורה כזוprintf-כאשר השתמשנו ב

הואprintfהמבנה של הפונקציה , באופן כללי

printf("מחרוזת בקרה", arg1, arg, ..., argX);

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

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

:לדוגמא

printf("hello %d\n", 2);

%d מציין מספר שלםהוא סימן בקרה ה.

:הפלט על המסך שיווצר כאשר הפקודה הבאה תתבצע הינו

hello 2

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

int x = 10; printf("%d\n", x);

.10על המסך יודפס המסר

Page 11: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -11-

נשתמש charועבור משתנים מסוג , lf% נשתמש בסימן הבקרה doubleעל מנת להדפיס משתנים מסוג :למשל, c%-ב

double d = 10.7; printf("%lf", d);

:ותנביט בשתי השורות הבא

printf("from sea"); printf(" to C");

איננו עוברים לשורה הבאה , בסוף השורהn\אם לא נשים את הסימן . התוצאה תהיה שורה אחת של פלט

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

:המבנה הכללי של הפונקציה הוא

scanf(" זת בקרהמחרו ", &a, &b, &..., &x);

, ומחרוזת הבקרה היא רצף סימני בקרה, הינם משתנים לתוכם אנו רוצים לקרוא נתונים... ,a, bכאשר

.שאומרים מהו הסוג של כל אחד מהמשתנים שיקראו

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

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

:דוגמא לשימוש בפונקציה

int i; scanf("%d", &i);

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

#include <stdio.h> int main(void) { int i; printf("Please put a number: "); scanf("%d", &i); printf("You entered %d!\n", i); return 0; }

 

:הפלט של התוכנית

Please put a number :

Page 12: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -12-

 :על המסך יופיע. Enter ונלחץ 10 את המספר נכתוב למשל.מספרשנקליד חכה תהתוכנית You entered 10!

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

  

printfעיצוב הטקסט בעזרת

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

#include <stdio.h> int main() { double d; printf("Please enter a number: "); scanf("%lf", &d); printf("The number is %.2lf\n", d); return 0; }

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

. בלבד62.54על המסך יודפס , 62.54453תמש הקליד את המספר נניח כי המש, למשלולאחר מכן ציון מספר , %-השליטה על כמות הספרות שיוצגו נעשית על ידי הוספת הנקודה אחרי ה

.הספרות המבוקש

:נביט בתוכנית הבאה, למשל, עימוד הפלט, אמצעי עיצוב נוסף הוא קביעת רוחב מינימלי לפלט #include <stdio.h> int main() { printf("%6d%6d%6d\n", 1, 20, 300); return 0; }

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

, 20ולאחריהם המספר , רווחים4לאחר מכן יהיו עוד . 1לאחריהם המספר , רווחים5: התוצאה תהיה .300ואחריהם המספר , רווחיםולסיום יהיו שלושה

1 20 300 

 

Page 13: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -13-

:לדוגמא. נוכל לקבוע יישור לשמאל, )מינוס (-בעזרת הסימן . היישור שקיבלנו הוא יישור לימין #include <stdio.h> int main() { printf("%-6d%-6d%-6d\n", 1, 20, 300); return 0; }

  :כעת הפלט יהיה

. רווחים3 ולאחריו 300, רווחים4 ולאחריו 20, חים רוו5 ולאחריו 1 1 20 300

  :ניתן לשלב בין שני העיצובים שראינו

#include <stdio.h> int main() { double d; printf("Please enter a number: "); scanf("%lf", &d); printf("The number is %6.2lf\n", d); return 0; }

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

 

putchar/getcharהפונקציות

:דוגמאל. מהמשתמשבודד קליטת תו משמשת לgetcharהפונקציה

char ch; ch = getchar( );

  :דוגמאל, משמשת להדפסת תו בודד על המסךputcharהפוקנציה

putchar(‘g’);

נעדיף , אולם אם נרצה להדפיס רק תו בודד, ולא בפונקציות אלוprintf/scanf-ניתן להשתמש תמיד ב .putchar/getchar-לעיתים להשתמש ב

Page 14: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -14-

משתנים

סוגי משתנים

: הינםCהמשתנים השונים הקיימים בשפת

unsigned char signed char char long int short

unsigned long unsigned int unsigned short long double double float

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

,: נציין כי ניתן להפעיל על כל המשתנים את פעולות החשבון הבסיסיות. כל אחד מהם ,*, /+ − .

)int(מספרים שלמים

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

#include <stdio.h> int main() { int i = 5, j = 5.7; printf("%d %d\n", i, j); return 0; }

.5 5הפונקציה תדפיס : התשובה? printfמה תדפיס הפונקציה : נשאל

וזאת מכיוון , מספר רציונליjלמרות שלכאורה השמנו לתוך , 5- שווה לj וגם הערך של iגם הערך של . מכילים רק מספרים שלמיםintשמשתנים מסוג

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

 :נחשב את סכומם ונדפיס על המסך את התוצאה, מהמשתמש

#include <stdio.h> int main() { int i, j, sum; printf("Please enter two numbers: "); scanf("%d%d", &i, &j); sum = i + j; printf("%d + %d = %d\n", i, j, sum); return 0; }

Page 15: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -15-

)double(ציונליים משתנים ר

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

#include <stdio.h> int main() { double d1, d2, d2, avg; printf("Please enter 3 numbers: "); scanf("%lf%lf%lf", &d1, &d2, &d3); avg = ( d1 + d2 + d3 ) / 3; printf("The average is %lf\n", avg); return 0; }

  )char(תווים

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

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

, ASCII נשמרים לפי סטנדרט בשם charהמספרים המתאימות לאותיות שאנו שומרים במשתנים מסוג .המתאים לכל אות מספר המתאים לה

.תלויה בנו, בתור אות או בתור מספר- charההתיחסות למשתנה מסוג :ונביט בדוגמא הבאה, 97 הוא 'a' של האות ASCII-נציין כהערה כי ערך ה

#include <stdio.h> int main() { char c = 'a'; printf("%d %c\n", c, c); return 0; }

. a ולאחריו תודפס האות 97על המסך יודפס

אמרנו לה d% עם סימן הבקרה printf-ו לכאשר קראנ. 97 נשמר למעשה המספר cבמשתנה : הסיבהואז , אמרנו לה להתייחס אליו כאל אותc%-וכאשר השתמשנו ב, להתייחס אל המשתנה כאל מספר

. של האות שאנו רוצים להדפיסASCII- למעשה ייצג את ערך ה97המספר

מעבר לשורה שמשמעותו 'n\'למשל התו , את חלקם כבר ראינו. ישנם מספר תווים מיוחדיםCבשפת . C-ישנה דרך מיוחדת לכתוב אותו בובנוסף , לכל תו כזה יש ערך מספרי, בדומה לתווים האחרים. חדשה

Page 16: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -16-

:נציג את התווים המיוחדים בטבלה

int value Write in C Name of character 7 \a alret

92 \b backslesh  8 \r backspace

13 \î carriage return 34 \î double quote 12 \f form feed 9 t\ horizontal tab

10 \n new line 0 0\ null character

39 \í single quate 11 \v vertical tab

)long(מספרים שלמים גדולים

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

.longוהוא , מוגדר סוג משתנה נוסף עבור משתנים שלמיםC-ב, עם זאתlongובנוסף לכך , כאמור הוא משתנה השומר משתנים שלמיםC מבטיחה לנו שגודלו יהיה גדול או לכל

.intהפחות זהה לגודלו של משתנה מסוג

המרות

.ונשאל את עצמנו מה יהיה הפלט שלה, נביט בתוכנית הבאה, ל מנת להציג את נושא ההמרותע #include <stdio.h> int main() { int i = 12 / 5; double d = 12 / 5; printf("%d %lf\n", i, d); return 0; }

2 2.000: הפלט של התוכנית יהיה

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

.2 מכיל iולכן , התוצאה לתוך המשתנההיינו אמורים לקבל , ולכן לכאורה כאשר ביצענו חלוקה, double הוא משתנה מסוג d :dעבור המשתנה .2.000 המספר אולם קיבלנו בתוכו את, 2.4 את המספר dבתוך המשתנה

Page 17: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -17-

, כמספרים שלמים5 ב 12 ביצעה את החלוקה של Cשפת . הם מספרים שלמים5- ו12: הסיבה לכך ושמרה אותו doubleואז המירה את התוצאה למשתנה מסוג , 2, כלומר שמרה רק את החלק השלם

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

.מספרים שלמים ומספרים לא שלמים: המשתנים מתחלקים לשתי קבוצותCבשפת . מאותו סוג .int- וunsigned long ,unsigned ,longניתן למצוא את הטיפוסים , בקבוצת המספרים השלמים

.float- וlong double ,doubleניתן למצוא את הטיפוסים , בקבוצת המספרים הלא שלמים .התוצאה תהיה מספר שלם, כאשר אנו מבצעים פעולות המערבות מספרים שלמים בלבד

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

תוצאת , למשל. הגדול יותרהתוצאה תהיה מסוג המשתנה , אם הפעולה מערבבת משתנים מגדלים שונים .long תהיה מסוג long למשתנה מסוג intפעולה בין משתנה מסוג

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

l=long u=unsigned i=int s=short c=char 

ביטוי סוג מוחזרint c-s / i double u * 2.0 - i int l+3 double l+3.0 double d+s long 2 * l unsigned u * 7 - i float f * 7 - i unsigned long 7 * s * ul unsigned long u - ul 

 u-l תלוי במחשב-אין תשובה חד משמעית

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

:השינוי הבא לתוכנית יבצע את הנדרש. כראוי #include <stdio.h> int main() { int i = 12 / 5; double d = 12.0 / 5; printf("%d %lf\n", i, d); return 0; }

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

Page 18: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -18-

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

:כזו

)טיפוס(ביטוי  

.7 הינו 7.2(int)הביטוי ערכו של , למשל

.castingהמרה בדרך זו נקראת

.casting בעזרת dוהפעם נפתור את חוסר נכונות התוכן של המשתנה , נכתוב שוב את התוכנית #include <stdio.h> int main() { int i = 12 / 5; double d = (double)12 / 5; printf("%d %lf\n", i, d); return 0; }

.כעת התוכנית תוציא פלט כמצופה

Page 19: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -19-

תרגילים

1תרגיל

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

 

2תרגיל

: מה תדפיס התוכנית הבאה #include <stdio.h> int main() { int i; double d; i = d = 3.2; printf("%d %lf\n", i, d); d = i = 3.2; printf("%d %lf\n", i, d); return 0; }

3תרגיל

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

Page 20: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -20-

פתרונות

1פתרון  

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

#include <stdio.h> int main() { int x, y; printf("Please enter 2 numbers: "); scanf("%d%d", &x, &y); printf("Sum = %d\nSub = %d\nMul = %d\n", x+y, x-y, x*y); return 0; }

:טעויות נפוצות בפתרון תרגיל זה .אי השמת נקודה פסיק בסוף כל ביטוי • .scanf ציהבפונק& התעלמות מהצורך להשתמש באופרטור  •

2פתרון

. מבצעתC-מטרת התרגיל הינה להדגיש את המרות הסוגים ש

:בביטוי הבא

i = d = 3.2;

:בביטוי הבא, לעומת זאת. 3 יוצב i-וב, d 3.2-יוצב ב

d = i = 3.2;

.3.0 יוצב d-ואילו ב, i-שיוצב בעל מנת 3שלם יהפוך ל3.2מספר ה

Page 21: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -21-

3פתרון

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

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

:ון אפשרי לשאלהפתר

  #include <stdio.h> int main() { int i1, i2, i2; double avg; printf("Please enter 3 numbers: "); scanf("%d%d%d", &i1, &i2, &i3); avg = ( (double)i1 + i2 + i3 ) / 3; printf("The average is %lf\n", avg); return 0; }

Page 22: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -22-

C שפת מרכיבי קירה קצרה של מרכיבי השפהס

)Key words(מילות מפתח

למשל , סוגי המשתנים השונים. והן למעשה אבני הבניין הבסיסיות של השפה, Cמילים השייכות לשפת int, long ,גם פקודות עבור לולאות והסתעפויות אותן נציג בהמשך הן מילים . הינם מילים שמורות ,auto, break, case, car, const, do, double, else, enum: שמורותדוגמאות נוספות למילים . שמורות

for, int, longוהרשימה עוד ארוכה .

)identifiers(מזהים

האות הראשונה שלהם היא אות אנגלית או : מזהים הם רצף של מספרים ואותיות המקיימים את הכלל הבא .פרים או קו תחתוןמס, וכל האותיות הבאות הינן אותיות, )קו תחתון(_

.שמות של פונקציות ושמות של קבועים, משמשים כשמות של משתניםC-מזהים ב

)Constants(קבועים

קבועי מספרים וקבועי מחרוזת-Cבשפת סוגי קבועים ישנם שני 'a, '666, -27, 12.39, 7.5, 4, 6: קבועי מספרים "A" ,"%d" ,"blah" ,"TIME_TO_GO: "קבועי מחרוזת

הערות

ולכן , המהדר מתעלם לחלוטין מתוכן הערות. /* */ הן קטעים הנמצאים בין C-הערות ב על מנת להוסיף הסברים כיצד Cנהוג להשתמש בהערות של . נוכל לכתוב בהערות באנגלית למשל

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

)Operators(אופרטורים

.ועוד++ ,- ,%, >, =+,/ , =, *, -, : +Cאופרטור בשפת : למספר קבוצותC-ניתן לחלק את האופרטורים ב

-, /, *, +, : ()מתמטיקה של אופרטורים פשוטים . 1 =*, -= , =+, : =אופרטורים של השמה . 2 >, >, <=<, =, : ==אופרטורים של השוואה . 3 || ,&& ,!: אופרטורים לוגיים. 45++ . ,-- 

Page 23: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -23-

ביטויים

. שניתן להשתמש בויש ערך C-בלכל ביטוי . צירוף של מספרים ואותיות שביניהם יש אופרטור :דוגמא. משתנים שהוגדרו קודם לכן בתוכניתa,bכאשר , a+b: דוגמא לביטוי

:ים הבאיםנגדיר את המשתנ int a=1, b=2, c=3, d=4;

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

 expression  equal expression  value a*b/c  (a*b)/c  0 a*b%c+1  ((a*b)%c)+1  3 ++a*b-c--  ((++a)*b)-(c--)  1 7- -b*++d  7-((-b)*(++d))  12 

   

טוריםאופר

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

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

  =. עד כה ראינו אופרטור השמה אחד בלבד והוא האופטור

. לצורך קיצור ונוחות, פים של השמה מאפשרת לנו אופרטורים נוסCשפת :נביט בקוד הבא. =+נראה למשל את האופרטור

x += 7;

:השורה הבאה זהה בפעולתה לקודמת. 7 את המספר xהוסף לתוכן של : המשמעות של הפקודה

x = x + 7;

. משמעותו לחסר מהמשתנה את הביטוי שבצד ימין של האופרטור=-האופרטור , באופן דומה

  --++/האופרטורים

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

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

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

int a=2, b=2, c, d; c = a++; d = ++b;

Page 24: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -24-

:קטע הקוד לעיל זהה לקטע הקוד הבא מבחינת פעולתו int a=2, b=2, c, d; c = a; a = a + 1; b = b + 1; d = b;

  

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

:כאשר מוגדר, ניתן להתייחס אל כל ביטוי כאל ביטוי לוגי. רך יש עCלכל ביטוי בשפת , כאמור ).FALSE(אזי הערך הלוגי המתאים לו הוא שקר , 0אם ערך הביטוי הוא

).TRUE(הערך הלוגי המתאים לו הוא אמת , 0-עבור כל ביטוי השונה מ אזי ערכו של ,0ונשים בו , x בשם intאם נגדיר משתנה מסוג . הוא אמת5ערכו של הביטוי , למשל

. הוא שקרxהביטוי .הכוללים אופרטורים אלו, ניתן ליצור ביטויים לוגיים. מכילה מגוון של אופרטורים של השוואהCשפת הוא שקר (3=<2)בעוד שערכו של הביטוי , )1-שווה ל( הוא אמת (3>2)ערכו של הביטוי : למשל

).0-שווה ל(

:נביט בקטע הקוד הבא, לדוגמא int x = 3 > 2; printf("%d\n", x);

.1על המסך יודפס המספר

, כאשר בשפה אנו משתמשים בביטוי לוגי, הוא אמת0-נשים לב כי למרות שאמרנו כי כל מספר שונה מ . אם הוא שקר0- אם הוא אמת ו1ערכו

:Cאופרטורים של השוואה בשפת

משמעות אופרטור

קטן > גדול < קטן שווה >= שווהגדול <=

שווה == לא שווה =!

 

Page 25: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -25-

:נביט בתוכנית הבאה==. לאופרטור ההשוואה = טעות נפוצה היא להתבלבל בין אופרטור ההשמה #include <stdio.h> int main() { int x1, y1 = 7, z1 = 8; int x2, y2 = 7, z2 = 8; x1 = y1 = z1; x2 = y2 == z2; printf("%d %d\n", x1, x2); return 0; }

.0ולאחריו את המספר , 8התוכנית תדפיס את המספר ? מה תדפיס התוכנית

ולאחר מכן , y1 בתוך המשתנה 8תחילה הוצב הערך : התבצעו הפעולות הבאות, בשורה הצבועה בכחול . x1-ערך זה הושם ב

מכיוון שערכם . z2 לערך של y2התבצעה השוואה בין הערך של , בשורה הצבועה בירוק, לעומת זאת .0 הוצב הערך x2-ולכן ב, הוא שקר-" z2- שווה לy2 == z2 -" y2ערך הביטוי , שונה

אופרטורים לוגיים

 משמעות אופרטור! NOT ) אופרטור אונרי(

&& AND ריאאופרטור בינ( לוגי( || OR ריאאופרטור בינ( לוגי(

 אופרטור שפועל בין שני הוא רי אאופרטור בינ .חד אופרטור שפועל על ביטוי אהואופרטור אונרי א

.ביטויים

. הוא שקר0- מתפרשת כאמת ו0- כל תוצאה שהיא שונה מCבשפת , כאמור .0- מציין בטבלה זו כל אחד השונה מ1, בטבלה הבאה

!x x 1 0 0 1

:דוגמאות

ביטוי ערך0 0.001! 1 'A'!! 0 )'A' > 'Z'!(

Page 26: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -26-

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

x || y x && y y x

0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1

sizeofהאופרטור

.טיפוס או משתנה הנמצא מימינו, אופרטור זה מחזיר את מספר הבתים של הביטוי :אופן השימוש באופרטור

sizeof(expression) sizeof(type)

:לדוגמא

#include <stdio.h> int main() { double j = 5.5; printf("In my computer: \n"); printf("The size of char variable is %d\n", sizeof(char)); printf("The size of int variable is %d\n", sizeof(int)); printf("The size of j is %d\n", sizeof(j)); return 0; }

גודל קבוע של בתים עבור כל סוג C-מכיוון שלא מוגדר ב, ו משתנה ממחשב למחשבהפלט של תוכנית ז

:פלט אפשרי של התוכנית יכול להיות. משתנה In my computer: The size of char variable is 1 The size of int variable is 2 The size of j is 8

Page 27: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -27-

.מערכת הפעלה אחת לשניה ובין קומפליר לקומפילרשונה בין sizeofעל ידי האופרטור הערך המוחזר : מבטיחה לנו את קיום התנאים הבאיםCשפת , עם זאת

 sizeof(short) sizeof(int) sizeof(long)sizeof(float) sizeof(double) sizeof(long double)sizeof(signed) sizeof(unsigned) sizeof(int)

≤ ≤≤ ≤≤ ≤

 

אופרטור הפסיק

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

:1דוגמא

x = 1, y = 7 + 3, ++z;

:2דוגמא   #include <stdio.h> int main() { int x, y, z; x = (y = 4, z = 5); printf("%d\n", x); return 0; }

.5על המסך יודפס המספר . מאוד לא נפוץיש לציין כי השימוש באופרטור זה

Page 28: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -28-

הסתעפויות

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

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

. המיועדת להסתעפויות מותנות- ifנשתמש במילה השמורה , זותשיג פונקציונאליועל מנת לה

:שימוש בסיסי בפקודה יעשה בצורה הבאה if (ביטוי) פקודה;  

: לדוגמא.אז הפקודה שלאחר הביטוי מתבצעת, 0-כלומר שונה מ, הוא אמתשל הביטוי הערך אם

 if (2 < 3) printf("hello!\n");

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

. ולכתוב בו מספר פקודות, מסולסלות :נביט בתוכנית הבאה, לדוגמא

#include <stdio.h> int main() { int x; printf("Please enter your exam grade: "); scanf("%d", &x); if (x < 55) printf("You're a l-o-o-o-s-e-r :-)\n"); if (55 <= x && x < 85) printf("Not bad!\n"); if (x >= 85 && x <= 100) { printf("Excellent!!!\n"); printf("Your grade is %d.\n", x); } return 0; }

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

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

Page 29: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -29-

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

:דוגמא ראשונה #include <stdio.h> int main() { int x, y; scanf("%d%d", &x, &y); if (x = y) printf("The 2 numbers are equal\n"); return 0; }

, אי לכך==. ולא באופרטור ההשוואה , = השתמשנו באופרטור ההשמה if-בתנאי ה: הבעיה בקטע קוד זה. ללא קשר האם הם זהים או לא, יודפס על המסך ששני המספרים זהים, 0- שונה מyבכל מקרה שבו

.y יידרס ויוחלף בערכו של xערכו של , בנוסף לכך

:דוגמא שנייה #include <stdio.h> int main() { int x, y; scanf("%d%d", &x, &y); if (x == y) printf("The 2 numbers are equal.\n"); printf("x equals to y.\n"); return 0; }

  

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

". .x equals to y"המסך המחרוזת

Page 30: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -30-

 :שמבהירה את הבעיה, ניתן לרשום את קטע קוד זה בצורה הבאה #include <stdio.h> int main() { int x, y; scanf("%d%d", &x, &y); if (x == y) printf("The 2 numbers are equal.\n"); printf("x equals to y.\n"); return 0; }

  

.if- הראשון שייך לפקודת הprintf-אולם כעת אנו יכולים לראות שרק ה, קטע קוד זה זהה לקודם

:בצורה הבאה, פתרון לבעיה זו הינו חסימת הקטע בסוגריים מסולסלות #include <stdio.h> int main() { int x, y; scanf("%d%d", &x, &y); if (x == y) { printf("The 2 numbers are equal.\n"); printf("x equals to y.\n"); } return 0; }

 

Page 31: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -31-

:דוגמא שלישית #include <stdio.h> int main() { int x, y; scanf("%d%d", &x, &y); if (x == y); { printf("The 2 numbers are equal.\n"); printf("x equals to y.\n"); } return 0; }

 ללא קשר להתקיימות , יתבצעו בכל מקרהprintf-שתי פקודות ה. if- לאחר פקודת ה;במקרה זה שמנו ." אל תבצע כלום, y- שווה לxאם : "זה, למעשה מה שאמרנו על ידי הנקודה פסיק. if-הביטוי שבתוך ה

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

:המבנה הכללי של הפקודה הוא כלהלן. מבנה כללי יותר מזה שהצגנוifלפקודת if (expression) { ... } [else { ... }]

. איננו נכוןif-מאפשרת לנו לקבוע פעולה שתתבצע במידה וביטוי ה elseהמילה השמורה

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

:ifדוגמא לשימוש במבנה הכללי של if (i > 10) { printf("i is bigger than 10\n"); } else { printf("i is smaller than 10\n"); }

Page 32: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -32-

?:אופרטור ההתניה

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

:תחביר השימוש באופרטור (expression) ? expression1 : expression2;

במידה והביטוי . expression1יבוצע , במידה והוא אמת. ייבדקexpressionהביטוי : משמעות האופרטור

.expression2יבוצע , הוא שקר

:דוגמאx, y, zהם משתנים שהוגדרו קודם לכן בתוכנית .

z = x > y ? x : y;

z מקבל את הערך של הגדול מבין xו -y.

switchמשפט

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

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

switch (expression) { case VALUE1: ... break; case VALUE2: ... break; ... case VALUEn: ... break; default: break; }

 expression הוא ביטוי שערכו חייב להיות int או charבלבד .

VALUE1, VALUE2, ..., VALUEn הם ערכים שהביטוי expressionיכול להחזיר . -ה וערך ה הוא קטע המתבצע במידdefault. ביצוע התוכנית קופץ אל הקטע המייצג את ערכו של הביטוי

expression איננו אף אחד מבין VALUE1, VALUE2, ..., VALUEn. . מציינת את סיומוbreakהפקודה , לאחר שקפצנו אל קטע לביצוע

Page 33: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -33-

:דוגמא #include <stdio.h> int main() { int i; printf("Please enter number between 1 to 3: "); scanf("%d", &i); switch(i) { case 1: printf("You entered 1.\n"); break; case 2: case 3: printf("You entered 2 or 3.\n"); break; default: printf("ERROR: Illegal input.\n"); } return 0; }

  

.היא תחכה לקלט מהמשתמש, כאשר נריץ את התוכניתבמידה והמשתמש יקליד את המספרים ". You entered 1"יודפס , 1מספר במידה והמשתמש יקליד את ה

.אם המשתמש יקליד מספר אחר תודפס הודעת שגיאה". You entered 2 or 3"יודפס , 3 או 2ולכן הביצוע במקרה שהמשתמש , breakלא השתמשנו במילה השמורה " :case 2"נשים לב שאחרי

. הנמצאת שםbreak רק כאשר מגיעים אל הפקודה ונעצר, ":case 3"ממשיך אל , 2מקיש

Page 34: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -34-

תרגילים

1תרגיל

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

2תרגיל

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

פתרונות

1פתרון

.ifפקודה מטרת תרגיל זה היא לתרגל שימוש ב #include <stdio.h> int main() { int x, y, z; int max_num; printf("Please enter 3 numbers: "); scanf("%d%d%d", &x, &y, &z); if (x >= y && x >= z) max_num = x; else if (y >= x && y >= z) max_num = y; else if (z >= x && z >= y) max_num = z; printf("The biggest number is %d\n", max_num); return 0; }

2פתרון

.: ?אנו נציג פתרון המשתמש באופרטור . ifניתן לפתור גם תרגיל זה בעזרת תנאי

#include <stdio.h> int main() { int num; printf("Please enter a number: "); scanf("%d", &num); num = (num > 0) ? num : -num; printf("abs(num) = %d\n", num); return 0; }

Page 35: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -35-

פונקציות מתמטיות

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

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

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

:ההצהרה #include <math.h>  

 .ספריה זו מכילה פונקציות מתמטיות רבות

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

C-פונקציה ב פעולה מתמטית טיפוס מוחזרdouble x sqrt(x) double yx pow(x, y) double xe exp(x) double ln x log(x) double log x log10(x) double xsin sin(x) double xcos cos(x) double xtan tan(x) int X abs(x) 

float X fabs(x) 

 :דוגמא

#include <stdio.h> #include <math.h> int main() { int i; printf("Please enter a number: "); scanf("%d", &i); printf("Absolute value of %d is %d\n", i, abs(i)); return 0; }

Page 36: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -36-

בעיהשלבים להתרת

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

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

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

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

1דוגמא

2כתוב תוכנית הפותרת משוואות ריבועיות מהצורה 0ax bx c+ + =. ).'פתרון קומפלקסי וכו, פתרון יחיד, שני פתרונות(יש להתחשב בכל המקרים האפשריים

:הגדרת הבעיה

.a, b, c -מים שלושה מספרים של: קלט .אין פתרון/או הודעה מיוחדת במקרה שקיים פתרון יחיד, פתרון המשוואה: פלט  .כאשר אנו מסיימים לפתור את המשוואה: סיום הפעולה

:פיתוח האלגוריתם

:ניזכר ראשית במתמטיקה הקשורה לבעיה ,למשוואה זו אין פתרון אם 0a b 0c וגם = 0a ויש לה אינסוף פתרונות אם ≠ b c= = =.

: פתרון משוואה ריבועית ניתן על ידי הנוסחה 2 42

b b acxa

− ± −=.

2הביטוי 4b ac− דלתא (∆ יסומן על ידי האות היוונית.( ∆0-במידה ו ∆0-במידה ו. קיימים שני פתרונות למשוואה< . קיים למשוואה פתרון יחיד=∆0-במידה ו . למשוואה פתרונות מרוכבים>

:משתנים :מספרים שלמים a, b, c -מקדמי המשוואה אותה אנו פותרים . delta -תנה שישמור את תוצאת חישוב ה מש-∆.

:האלגוריתם

 .a, b, c: קלוט שלושה מספרים .1,אם  .2 0a b 0c וגם =  .וסיים" אין פתרון" הדפס ≠0aאם  .3 b c= =  .וסיים" אינסוף פתרונות" הדפס =0aאם  .4  . פתור את המשוואה כמשוואה ממעלה ראשונה וסיים= .∆חשב את  .5∆0אם  .6  .הצג אותם וסיים, חשב את שני הפתרונות של המשוואה<∆0אם  .7  .הצג אותו וסיים, חשב את הפתרון היחיד =∆0אם  .8 .הצג אותם וסיים, חשב את שני הפתרונות המרוכבים של המשוואה>

Page 37: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -37-

:שלב הקידוד

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

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

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

 :1שלב

#include <stdio.h> #include <math.h> int main() { int a, b, c; int delta; printf("Please enter a, b, c: "); scanf("%d%d%d", &a, &b, &c); /* Check if there are solutions */ /* Infinite number of solutions */ /* One-degree equation? */ /* Calculate delta */ /* If delta is positive - there are 2 solutions */ /* If delta is zero - there is one solution */ /* If delta is negative - the solutions belongs to complex domain */ return 0; }

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

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

Page 38: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -38-

:2שלב #include <stdio.h> #include <math.h> int main() { int a, b, c; int delta; double real, img; printf("Please enter a, b, c: "); scanf("%d%d%d", &a, &b, &c); /* Check if there are solutions */ if (a == 0 && b == 0 && c != 0) { printf("No solution.\n"); return 0; } /* Infinite number of solutions */ else if (a == 0 && b == 0 && c == 0) { printf("Infinite number of solutions.\n"); return 0; } /* One-degree equation? */ else if (a == 0) { printf("X = %.2lf\n", (double)-c / b); return 0; } /* Calculate delta */ delta = b*b - 4*a*c; /* If delta is positive - there are 2 solutions */ if (delta > 0) { printf("X1 = %.2lf\n", (-b + sqrt(delta))/(2*a)); printf("X2 = %.2lf\n", (-b - sqrt(delta))/(2*a)); return 0; } /* If delta is zero - there is one solution */ else if (delta == 0) { printf("X = %.2lf\n", (double)-b/(2*a)); return 0; } /* If delta is negative - the solutions belongs to

Page 39: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -39-

complex domain */ else { real = (double)(-b)/(2*a); img = (double)sqrt(-delta)/(2*a); /* x1 */ printf("X1 = "); if (real != 0) { printf("%.2lf", real); if (img > 0) printf(" + "); else if (img < 0) printf(" - "); if (img == 1 || img == -1) printf("i\n"); else printf("%.2lfi\n", img); return 0; } else { if (img == 1) printf("i\n"); else if (img == -1) printf("-i\n"); else printf("%.2lfi\n", img); } /* x2 */ img = -img; printf("X2 = "); if (real != 0) { printf("%.2lf", real); if (img > 0) printf(" + "); else if (img < 0) printf(" - "); if (img == 1 || img == -1) printf("i\n"); else printf("%.2lfi\n", img); return 0; } else { if (img == 1) printf("i\n"); else if (img == -1) printf("-i\n"); else printf("%.2lfi\n", img); return 0; } } return 0; }

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

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

.'וכו, 1-המדומה של המספר שווה ל

Page 40: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -40-

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

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

. אחרואינם תלויים במימוש זה או

 2דוגמא

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

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

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

:הגדרת הבעיה

.סדרת מספרים שלמים: קלט .הסכומים המצטברים: פלט .1000-כאשר הסכום גדול מ: סיום

:פיתוח האלגוריתם

: משתנים :שלמים' מס X -המספר הבא Sum -הסכום המצטבר

:האלגוריתם

 .Sumאפס את  .1 :עשה .2 .Xאת המספר הבא לתוך קרא  .3 .Sum - לXאת הוסף  .4 Sumהדפס את  .5Sumכל עוד  .6 1000≤

. אינו מתקיים6 מתבצעות כל עוד התנאי שבשורה 3-5השורות

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

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

Page 41: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -41-

: שיפתור את הבעיהאלגוריתם משופרנציג  .Sumאפס את  .1 :עשה .2 .Xאת המספר הבא לתוך קרא  .3 .Sum - לXאת הוסף  .4 Sumהדפס את  .5Sumכל עוד  .6 1000≤  ."לך הביתה"הדפס  .7 

:שלב הקידוד

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

#include <stdio.h> int main() { int x, sum; /* x - input var., sum - total numbers */ sum = 0; do { scanf("%d", &x); sum += x; printf("%d\n", sum); } while (sum <= 1000); printf("Go Home!!!\n"); return 0; }

 

Page 42: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -42-

קבועים ושמות נרדפים

קבועים

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

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

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

הוא הרבה יותר ברור MAX_USERS_ALLOWEDשימוש בשם קבוע כגון , מעלית . בכל אותם מקומות7במספר , למשל, משימוש

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

נניח כי ערך . מציין את המשקל אותו המעלית מסוגלת לסחוב1000י הערך כ, לדוגמא, נניח בדור החדש של 1200-במקרה והמשקל ייגדל ל. פעמים בתוכנית שלנו20זה מופיע , נשתמש בקבוע אחד, אם לעומת זאת. מקומות20-נאלץ לשנות את הקוד שלנו ב, המעליות

עלינו לעשות הוא לשנות את ערכו של כל שיהיה, המקומות נרשום את שם הקבוע20ובכל .והתוכנית תעבוד כשורה, הקבוע

 

ובעזרת המילה השמורה define#בעזרת ההוראה : מאפשרת לנו להגדיר קבועים בשני דרכיםCשפת const.

:define#המבנה התחבירי של ההוראה

#define CONST_NAME Expression

  הוא הביטוי המתאים Expression-ו, אנו רוצים להגדיר הוא שם הקבוע אותו CONST_NAMEכאשר

.לקבוע זה :למשל

#define PI 3.142

 כדי לקבוע את ערכו = כמו כן לא השתמשנו באופרטור . איננה מסתיימת בנקודה פסיקdefine#הוראת

. ייצגPI-אלא כתבנו מייד לאחריו את הביטוי שאנו רוצים ש, PIשל  

בכל מקום -תתבצע פעולת החלפה פשוטה . PIאינו יוצר משתנה בשם define#השימוש בפקודה .3.142היא תוחלף על ידי המספר , PIבתוכנית בו תופיעה המילה

Page 43: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -43-

:+18קטע הקוד הבא מאפשר למשתמש להמשיך רק אם הוא בן . נביט בדוגמא #include <stdio.h> #define MIN_AGE 18 int main() { int iAge; printf("Please enter your age: "); scanf("%d", &iAge); if (iAge < MIN_AGE) { printf("You are too young. Sorry...\n"); return 1; } printf("Welcome, you can use the program.\n"); return 0; }

 

-ורכבים מאותיות גדולות הגדרנו עד כה את כל הקבועים בעזרת שמות המ, כפי שניתן לראותUppercase .מקובל כשמתכנתים ב, למרות שניתן לתת לקבועים שמות המורכבים מאותיות קטנות-C

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

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

const <type> <name> = <value>;  

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

:דוגמא לשימוש

const int PI = 3.142;

Page 44: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -44-

לולאות

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

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

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

.עדיף על הסוגים האחרים באותו מקרה

forלולאת

:forהתחביר של לולאת

for ([<initialize>]; [<condition>]; [<step>]) { /* do something */ }

initialize, conditionו -stepהם שלושה ביטויים . לאחר מכן נבדק ערכו של הביטוי . initializeראשית מתבצע הביטוי , forכאשר אנו משתמשים בפקודת

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

.condition ובדיקת ערכו של stepביצוע הביטוי , שבין הסוגריים המסולסלות .forתבוצע הפקודה שאחרי , for-אם לא קיימים סוגריים מסולסלות אחרי ה

:נביט דוגמא, על מנת לפשט את ההסבר

#include <stdio.h> int main() { int i; for (i = 1; i <= 10; i++) { printf("%d\n", i); } return 0; }

  :נקרא אותה בצורה הבאה, כדי להבין מה היא מבצעת. for-נביט בלולאה ה

.בצע את הקטע שבין הסוגריים המסולסלות, 10- קטן או שווה לiכל עוד . 1 להיות iאתחל את .1- בiקדם את , גריים המסולסלותלאחר שביצעת את הקטע שבין הסו, כל פעם

Page 45: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -45-

.כל אחד בשורה נפרדת, 10- ל1ניתן לראות כי הלולאה תדפיס את כל המספרים בין

ללא 7- או ב3-המתחלקים ב, 100- ל1התוכנית הבאה מדפיסה את כל המספרים בין : דוגמא נוספת .שארית

#include <stdio.h> int main() { int i; for (i = 1; i <= 100; i++) { if (i % 3 == 0 || i % 7 == 0) printf("%d\t", i); } putchar('\n'); return 0; }

 

. כאשר אנו רוצים שקטע קוד מסוים ירוץ מספר קבוע של פעמיםforנרצה להשתמש בלולאת . פעמים100ובדוגמא השנייה קטע הקוד רץ , פעמים10קטע הקוד רץ , בדוגמא הראשונה: לדוגמא

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

?מה עושה התוכנית הבאה

#include <stdio.h> int main() { int i; for (i = 1; i <= 10; i++); { printf("%d\n", i); } return 0; }

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

זה , ifבדומה למה שראינו לגבי . for-המופיעים אחרי ביטוי ה) נקודה פסיק (;-אולם נשים לב ל. 10-ל :כאילו אמרנו

for (i = 1; i <= 10; i++) /* do nothing */; 

.iאולם היא איננה מבצעת דבר מלבד שינוי ערכו של , פעמים10ן מתבצעת הלולאה אכ-כלומר

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

Page 46: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -46-

.י הוא אופציונאלforכל אחד מהפרמטרים של לולאת

): אותחל כבר קודםiלדוגמא אם המשתנה (ניתן למשל לא לכתוב תנאי אתחול

for (; i < 10; ++i) { /* do something */ }

:נקבל לולאה שתרוץ לנצח. for-ניתן לא לרשום אף ביטוי בלולאת ה

for (;;) { /* do something */ }

whileלולאת

:whileהתחביר של לולאת

while (condition) { }

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

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

".סוגריים המסולסלותבצע את הביטוי שבין ה, מתקייםconditionכל עוד "משמעות לולאה זו היא בעצם

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

".נתח אותו, כל עוד קיים קלט: "למשל

Page 47: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -47-

פעולה כזו מתאימה , רנוכמו שאמ. 10- ל1 היא הצגת המספרים בין whileהדוגמא הראשונה שנביא עבור נציג דוגמא זו על מנת שיהיה ניתן . whileאולם ניתן לבצע אותה גם בעזרת לולאת , forיותר ללולאת

.while למימוש משימה זו בעזרת forלראות את ההבדלים בין מימוש משימה זו בעזרת

#include <stdio.h> int main() { int i; i = 1; while (i <= 10) { printf("%d\n", i); i++; } return 0; }

.for מסורבל יותר ממימוש משימה זו בעזרת whileניתן לראות שמימוש משימה זו בעזרת , iשורה לאתחול ערכו של : יש לנו כאן שלוש שורות, for-במקום שורה אחת עבור הלולאה שהופיעה ב

ועוד שורה לקידום ערכו , לה את התנאי להמשך הלולאה המכיconditionשורת , הנמצאת מחוץ ללולאה .iשל

: שלא הוצגה עד כהscanfנציג תכונה של הפונקציה , while-על מנת להציג דוגמאות נוספות הקשורות ל . בהצלחהscanfהערך שהיא מחזירה מציין כמה משתנים קראה . מחזירה ערךscanfהפונקציה

:נביט בקוד הבא

int x, y, i1, i2, i3; x = scanf("%d%d", &i1, &i2); y = scanf("%d", &i3);

  2 יהיה שווה xערכו של , אזי בסיום קטע קוד זה, בהצלחהscanfאם כל המשתנים יקראו על ידי

קראה ערך אחד scanfהפקודה (1 יהיה yואילו ערכו של ) קראה שני ערכים בהצלחהscanfהפקודה ( ).בהצלחה ).EOF) -1 מחזירה scanf, אם הגענו אל סוף הקלט. 0 מחזירה scanf, ראו שדותאם לא נק

Page 48: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -48-

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

int num; while (scanf("%d", &num) > 0) { /* do something */ }

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

דוגמא

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

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

maxלערכו של מספר זה .

#include <stdio.h> int main() { int max, sum, current; /* read first number */ if (scanf("%d", &current) < 1) { printf("ERROR: no input\n"); return 0; } /* initialize values */ max = sum = current; /* all the rest */ while (scanf("%d", &current) > 0) { max = (max > current) ? max : current; sum += current; } printf("Maximum is %d\nTotal sum is %d\n", max, sum); return 0; }

Page 49: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -49-

דוגמא

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

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

פלט קלט7200 2:0:0

65 2:1:5 65 2:2:10

:קיימות שתי שיטות לפתרון

להגדיל את הדקות כל עוד מספר השניות גדול , שיטה אחת היא להוסיף את המספר לשניות .1לאחר מכן להגדיל את השעות כל עוד מספר הדקות . תוך כדי הורדה של מספר השניות, 60-מ

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

.זו השיטה בה נשתמש. של השעה הנוכחיתוהשעות %60(TotalSeconds/60): מספר הדקות, TotalSeconds%60 : יחושבמספר השניות

.TotalSeconds/3600: מספר השעותו

: הדרושים לפתרון הבעיהמשתנים TotalSeconds - סכום כולל

 hours - שעה minutes - דקה

seconds - שניות

:שלב הקידוד

#include <stdio.h> int main() { int hours = 0, minutes, seconds; int TotalSeconds = 0; int next; while (hours < 12) { scanf("%d", &next); TotalSeconds += next; hours = TotalSeconds / 3600; minutes = (TotalSeconds / 60) % 60; seconds = TotalSeconds % 60; printf("The time is %d:%d:%d\n", hours, minutes, seconds); } return 0; }

Page 50: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -50-

while...doלולאת

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

.מתקיים או לא .לולאה כזו תרוץ תמיד פעם אחת לכל הפחות

:do...whileהתחביר של לולאת

do { } while (condition);

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

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

.נשתמש לעיתים גם בלולאה זו, אם זאת. ללולאה

.do... whileהפעם בעזרת , על המסך10 עד 1נדגים שוב את הדפסת המספרים

#include <stdio.h> int main() { int i; i = 1; do { printf("%d\n", i); i++; } while (i <= 10); return 0; }

Page 51: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -51-

break, continue

break, continueהמאפשרות שליטה על ביצוע הלולאה, הן שתי מילים שמורות. נקרא , מתחילת סוגריים מסולסלות עד סופן-מעבר אחד על גוף הלולאה : ראשית נציין מינוח מקובל

.איטרציה

לסיים את Cאומרת לשפת , כאשר אנו משתמשים בה בתוך לולאה, continue המילה השמורה :כעת .ולעבור אל האיטרציה הבאה, האיטרציה הנוכחית של הלולאה

:נביט לדוגמא בקוד הבא

#include <stdio.h> int main() { int i; for (i = 1; i <= 10; i++) { if (i == 7) continue; printf("%d\n", i); } return 0; }

  . עליו תדלג7מלבד המספר , 10- ל1תוכנית זו תדפיס את כל המספרים בין

 ולעבור לקוד שאחרי , לסיים את הלולאה הנוכחית באופן מיידיC- אומרת לbreakהמילה השמורה

:לדוגמא. הלולאה

#include <stdio.h> int main() { int i; for (i = 1; i <= 10; i++) { if (i == 7) break; printf("%d\n", i); } return 0; }

  .ותעצור, 6 עד 1תוכנית זו תדפיס את המספרים

Page 52: c New Www.underwar.co.Il

[email protected] ניר אדר

UnderWarrior Project http://underwar.livedns.co.il  -52-

סיום

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

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

EOF