תחילת העבודה

למידה לפי דוגמה

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

דוגמה 1: הפעלת המהדר

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

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

  • כל תוכנית שאנחנו כותבים מתחילה בהערת כותרת, הכוללת את שם המחבר, פרטים ליצירת קשר, תיאור קצר ושימוש (אם רלוונטי). כל פונקציה מתחילה בהערה על פעולה ושימוש.
  • אנחנו מוסיפים הסברים באמצעות משפטים שלמים, בכל פעם שהקוד לא מתעד את עצמו, לדוגמה במקרים שבהם העיבוד מסורבל, לא ברור, מעניין או חשוב.
  • יש להשתמש תמיד בשמות תיאוריים: משתנים הם מילים באותיות קטנות שמופרדות על ידי _, כמו ב-my_variable. שמות הפונקציות משתמשים באותיות רישיות כדי לסמן מילים, כמו ב-MyExciteFunction(). קבועים מתחילים באות "k" ומשתמשים באותיות רישיות כדי לסמן מילים, כמו ב-kDaysInWeek.
  • כניסת הפיסקה מופיעה בכפולות של שתיים. הרמה הראשונה כוללת שני רווחים. אם יש צורך בכניסת פיסקה נוספת, אנחנו משתמשים בארבעה רווחים, בשישה רווחים וכו'.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

כמה ניסויים שכדאי לנסות:

  • הדבר החשוב ביותר הוא לוודא שאתה יכול להדר ולהפעיל את התוכנית הזו.
  • משנים את התוכנית שלמעלה כדי להדפיס את "Hello World!" 4 פעמים בשורה במשך 6 שורות, וכל אחת מהן מודפסת בשדה של 17 רווחים. לשם כך, צריך להשתמש בלולאות. כאן אפשר לקרוא מידע נוסף על עיצוב הפלט בעזרת cout. אפשר ללחוץ כאן כדי לראות את הפתרון.
  • בעזרת התוכנית שהשלמת עכשיו, להבין איך להדפיס את "שלום עולם!" ביישור לשמאל בשדות של 17 רווחים (ברירת המחדל בדרך כלל היא מיושרת לימין). כאן אפשר לראות את הפתרון.

דוגמה 2: מקבלים קצת משוב

קל לקבל קלט מהמקלדת ב-C++ באמצעות cin. לדוגמה:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

ניסוי:

  • כאשר מתרחשת שגיאת קלט, הזרם 'נשבר', cin מחזיר את הערך false והתוכנית מפסיקה. חשוב מאוד להתגונן מפני שגיאות כאלה כפי שעשינו בתוכנית שלמעלה. אבל מה קורה אם אנחנו רוצים להתאושש מהשגיאה, במקום שהתוכנית תעצור? יש שני שלבים להתאוששות משגיאה:
    1. מנקים את השגיאה באמצעות cin.clear().
    2. להסיר את התווים השגויים מהזרם. אחת הדרכים לעשות זאת היא באמצעות cin.ignore().

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

דוגמה 3: מה הפלט של התוכנית הזו?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

דוגמה 4: פירוק הופך את הכול לקל יותר...

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

נעבוד על המשחק הזה בשלושה שלבים. 

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

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

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

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

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

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

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

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

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

  • המחלק המשותף הגדול ביותר של שני מספרים שלמים הוא המספר הגדול ביותר שמחלק את שניהם באופן שווה. לדוגמה, gcd(12, 18) = 6, gcd(–4, 14) = 2. הדרך היעילה ביותר לחשב את ה-gcd היא באמצעות אלגוריתם אוקלידיאני. כותבים תוכנית עם פונקציה כדי לחשב את ה-gcd לשני מספרים שלמים. כדאי לנסות קודם לבצע את הפונקציה ללא חזרה – זה יעזור להבין איך האלגוריתם פועל.

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

דוגמה 5: חידות מתמטיות

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

סוסים עולים 40 ש"ח, חזירים עולים 12 ש"ח וארנבים עולים רק 2.00 ש"ח. חוואי קונה 100 בעלי חיים ב-100$. כמה מכל חיה הוא קנה? 

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

הנה עוד מדריך שכדאי לנסות:
בכמה דרכים אפשר לסדר 6 ספרים שונים משמאל לימין על מדף?

הפעם ניתן לכם את הפתרון, ותוכלו לכתוב את התוכנה: 720.

דוגמה 6: מחרוזות השיקולים לבחירתכם

מה מתקבל הפלט של התוכנית הבאה?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

לחצו כאן כדי לקבל עזרה.

דוגמה 7: השלבים הבאים עם פירוק - היום הראשון שלך בעבודה

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

  1. שכר ישיר של 2,400 ש"ח לשבוע;
  2. שכר של 7.00 $לשעה ועוד עמלה של 10% על מכירות.
  3. אין שכר, אבל 20% עמלות ו-80 ש"ח על כל זוג נעליים שנמכר

בתור מתכנת מומחה ב-C++ , יש לך אפשרות לכתוב תוכנית שתעזור לך להחליט מהו התגמול הטוב ביותר.

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

הנה האישור הראשון בתוכנית הראשית:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

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

דוגמה 8: איפה זמין?

מה הפלט של התוכנה הבאה?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

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

דוגמה 9: עיבוד קבצים

עיבוד קבצים ב-C++ מתבצע באמצעות fstream. כדי לשמור בקובץ, אנחנו מצהירים על קובץ Outstream ופותחים אותו במצב 'out'. תוכלו לראות את זה בדוגמה הבאה.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • נסו להבין איך לפתוח את הקובץ שנוצר כרגע ולהציג את הנתונים.כאן זה הפתרון שלנו.
  • עכשיו צריך לבדוק אם ניתן לשנות את התוכנית הזו כדי לאפשר למשתמש להזין רשומות רבות של נתונים באמצעות לולאה. אנחנו רוצים גם לקרוא את כל הנתונים, רשומה אחת בכל פעם.כאן זה הפתרון שלנו.

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

איך זה להיות מהנדס תוכנה ב-Google

אפשר לקרוא באתר הזה על חוויית העבודה ב-Google.

תרגילים ופרויקטים

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

  1. קריקט השדה המשותף מצפצף ביחס ישר לטמפרטורה הנוכחית. מחברים 40 למספר הפעמים שבהן קריקט מצפצף בדקה, ואז לחלק את הערך ב-4 כדי לחשב את הטמפרטורה. כותבים תוכנית שמקבלת כקלט את מספר הצפצופים בדקה ומדפיסה את הטמפרטורה הנוכחית. לדוגמה,
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. צריך לכתוב תוכנית שתחשב את הציון הסופי של קורס תכנות שלומדים. זאת שיטת מתן הציונים:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    בתוכנית שלך צריך לבקש מהמשתמש את ארבעת הציונים במטלה: מבחני אמצע המחצית, סוף שנה וציון בחלקים. לאחר מכן מחשבים ומדפיסים את הציון הסופי. כדי לחשב את החישובים, מחשבים את הממוצע של ארבעת הציונים במטלה, ולאחר מכן מכפילים אותו ב-0.4 (40%). אחר כך מכפילים את ציון אמצע המחצית ב-0.15, את הציון הסופי ב-0.35 ואת ציון ההשתתפות ב-0.1. ואז מחברים את כל תוצאות המכפלות.

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

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. ככל ששעוני העצר האלקטרוניים הופכים להיות זולים יותר ומדויקים יותר, אין לנו ספק שבעולם הזה נוכל למדוד זמן באופן בלתי סביר. כותבים תוכנית שמקבלת כקלט פרק זמן הנתון בשניות, ומפיקה את מספר השעות, הדקות והשניות שהיא מייצגת. לדוגמה,
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. בפעולות הבאות, בצעו פירוק לפני שתכתבו את התוכנית. כדאי להשתמש בפונקציות ככל האפשר כדי ליצור תוכניות במבנה טוב.

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

    "בריז לפריז הופכת שלושה עצים להקפאה"

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

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    וכו'.

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

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

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. כאן מופיעה בעיה של "מספר קסם": צריך לבקש ממשתמש להזין מספר בן שלוש ספרות שהספרה הראשונה שלו גדולה מהספרה האחרונה. התוכנית תהפוך את המספר ותוריד את ההיפוך מהמספר המקורי. לבסוף, הופכים את המספר שמתקבל ומוסיפים אותו לצורתו הלא הפוכה. יוצרים פלט של התוצאה הסופית. המספר המקורי שהמשתמש מזין חייב להיות מסוג מספר שלם (לא שלושה תווים). חשוב איך לכתוב פונקציה שמקבלת מספר שלם כקלט ומחזירה את הערך ההפוך של המספר הזה. לדוגמה:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. לפי החוק, יצרנים של מוצרי מזון מציינים תאריכי תפוגה למוצרים שלהם, אבל יש פרצה בחוק: אסור לציין את תאריך התפוגה בצורה מסוימת. אפשר לכתוב אותה בסוואהילית, ועדיין להיות חוקית.

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

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

    אחת משיטות הקידוד הפופולריות:

    • מקודדים את החודשים מינואר עד דצמבר כ-'A' עד 'L'
    • לקודד כל ספרה של התאריך כ-'Q' עד 'Z'
    • לקודד את השנה כ-A עד Z, כלומר עד 1 עד 26, ואז מתווסף לשנת 1995.

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

  8. זוהי אנלוגיה למספרים לטריק של קלפים מפורסם. מבקשים מהמשתמש להזין מספר בן שלוש ספרות. אפשר לחשוב על המספר כ-ABC (כאשר A, B, C הן שלוש הספרות של המספר). עכשיו צריך למצוא את שאר המספרים שנוצרו על ידי ABC , BCA ו-CAB כשמחלקים ב-11. אנחנו נקרא לשארים X, Y ו-Z. חבר אותם בפורמט X+Y, Y+Z, Z+X. אם הסכום הכולל הוא אי-זוגי, צריך להגדיל או להקטין אותו ב-11 (כל פעולה שמסתיימת במספר חיובי קטן מ-20. שימו לב שאם הסכום הוא 9, יש רק לדווח על כך ולהפסיק את התהליך). לבסוף, מחלקים כל אחד מהסכומים לחצי. הספרות שיתקבלו הן A, B, C. כותבים תוכנית שמטמיעה את האלגוריתם הזה.

אפליקציה: הדמיית מוזיקה באמצעות אנימציה

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

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