למידה על סמך דוגמה
אחת הדרכים הטובות ביותר ללמוד איך לתכנת בשפה חדשה היא המון תוכנות לדוגמה. מומלץ להעתיק ולהדביק כל אחת מהתוכנות הבאות לקובץ טקסט ולהרכיב אותו. לאחר מכן, מנסים את הניסויים. הרחבת התוכניות לדוגמה האלה תכירו היבטים שונים של C++, ותרגישו בטוחים יותר כשיגיע הזמן לכתוב תוכניות מאפס.
דוגמה 1: הפעילו את המהדר (compiler)!
אם עדיין לא עשית זאת, יש להעתיק ולהדביק את התוכנה הקלאסית הבאה לקובץ טקסט ולהרכיב אותו. זמינות הוראות להידור כאן.
סביר להניח שעבדתם על הפרטים של התוכנית במדריך הזה. לכן לא נציג כאן תיאור מפורט. יש כמה דברים לתשומת ליבכם, לגבי הקריאות. מתייחס לתגובות ובפורמט שמסייעים לקריאה, להבנה ולתחזוקה של תוכניות.
- כל תוכנית שאנחנו כותבים מתחילה בתגובת כותרת, הכוללת את השם של המחבר, פרטי הקשר שלו, תיאור קצר ושימוש (אם רלוונטי). כל פונקציה מתחילה בהערה לגבי פעולה ושימוש.
- אנחנו מוסיפים הערות הסברים שמבוססות על משפטים מלאים, בכל פעם שהקוד לא לתעד את עצמו. לדוגמה, אם העיבוד מסובך, לא מובן מעניין או חשוב.
- צריך להשתמש תמיד בשמות תיאוריים: המשתנים הם מילים שמופרדות באותיות קטנות ב-_, כמו ב-my_variable. שמות הפונקציות משתמשים באותיות רישיות כדי לסמן מילים, כמו ב-MyExciteFunction(). קבועים מתחילים באות k ולהשתמש אותיות רישיות לסימון מילים, למשל kDaysIn Week.
- כניסת פיסקה היא בכפולות של שתיים. הרמה הראשונה היא שני רווחים; במקרה של יש צורך בכניסת פסקה, יש לנו ארבעה רווחים, שישה רווחים וכו'.
// 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, והתוכנה מפסיקה. חשוב מאוד להישמר מפני שגיאות כאלו
כפי שעשינו בתוכנית שלמעלה. אבל מה אם אנחנו רוצים להתאושש מהשגיאה,
במקום להפסיק את התוכנית? יש שני שלבים כדי להתאושש
שגיאה:
- ניקוי השגיאה באמצעות cin.clear().
- צריך להסיר את התווים השגויים מהשידור. אחת הדרכים לעשות זאת היא באמצעות 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. השחקן צריך לנחש את המספר הסודי. התוכנית מספקת רמזים כמו "זה גבוה מדי". או 'זאת נמוך מדי" עד שהשחקן מנחש בסוף את המספר הסודי.
נעבוד על המשחק הזה בשלושה שלבים.
- הבנת האופן שבו ניתן ליצור מספר אקראי בתוך טווח ערכים נתון.
- ליצור פונקציה ראשית שמעבדת ניחוש אחד מהנגן, רמזים.
- מוסיפים את מה שאנחנו צריכים כדי לאפשר מספר ניחושים עד שהשחקן מנחש את המספר.
תהליך ההתפתחות הזה נקרא פירוק, כלומר, לשבור משימה לתוך תתי-משימות, שקל לבצע כל אחת מהן.
בשלב הראשון, מבצעים חיפוש ב-Google כדי לראות איך יוצרים מספר אקראי באמצעות C++. אפשר לחפש ב-"rand C++ ". כאן את הפתרון שלנו.
עבור שלב 2, עלינו לקבל מהנגן קלט מספר שלם (עם בדיקת שגיאות ב-cin), ולבדוק את המספר הסודי. ניסיון וכתיבה בחלק הזה של המשחק לפני שאתם בודקים את פתרון.
לבסוף, עלינו להוסיף לולאה שממשיכה לאסוף ניחושים מהנגן עד שהם מנחשים בסוף את המספר הסודי. אחרי שתשלימו את החלק הזה אפשר לבדוק את הפתרון שלנו.
פירוק הוא אחת המיומנויות החשובות ביותר שהמתכנת צריך ללמוד. היכולת לחלק משימה לחלקים שניתנים לניהול ולאחר מכן להשלים משימה בכל שלב, לא משנה אם הפרויקט שלכם גדול או קטן. הנה כמה דוגמאות הזדמנויות אחרות לתרגול של פירוק כימי.
- משימות יומיומיות רבות מספקות הזדמנויות לפתח מיומנויות של פירוק.
זה עשוי להפתיע אותך לגלות שהמוח שלך פשוט עובד ככה!
לדוגמה, אם אני צריכה לנקות מטבח מאוד מבולגן (אולי בנות קטנות בדיוק אפו עוגה), אני מפרקת את המשימות כדי להכין תוכנית, כדי לוודא שלא אצטרך לבצע את העבודה מחדש מאוחר יותר. אני לא רוצה לנקות את אם יש כל מיני דברים על הדלפקים שצריך לנקות, כנראה שתצטרכו לעשות את הרצפה שוב מאוחר יותר. אז אולי השתמשתי בכל הרכיבים קודם, להעביר את כל המנות לכיור, לנקות את הדלפקים; שטיפה המנות. ולבסוף, מנקים את הרצפה. יש דרכים נוספות לבצע אבל אחרי שחושבים על זה קודם, זה עוזר לי להגדיר תוכנית לא תחייב עבודה חוזרת.
השתמשו במשימות יומיומיות כדוגמאות לפיתוח כישורי פירוק. מי יודע - זה יכול לעזור אפילו יותר לייעל את העבודה שלך בבית!
- המחלק המשותף הגדול ביותר של שני מספרים שלמים הוא המספר הגדול ביותר
מחלק את שניהם באופן שווה. לדוגמה, gcd(12, 18) = 6, gcd(–4, 14) = 2.
הדרך היעילה ביותר לחשב את ה-gcd היא באמצעות האלגוריתם האאוקלידיאני. כתיבה
תוכנית עם פונקציה כדי לחשב את gcd לשני מספרים שלמים. כדאי לנסות
של פונקציה ללא רקורסיה – היא תעזור לכם להבין איך האלגוריתם
עובדת.
מגדירים באופן מפורש את תתי-המשימות. לדוגמה, מוצאים את הקוד של אירוע 'אוקלידיאן'. אלגוריתם; ליצור פונקציה לא רקורסיבית עבור האלגוריתם; וכו'. כאן את הפתרון שלנו.
דוגמה 5: חשיבה מתמטית
אחת מיכולות המחשוב היא היכולת לבצע חיפוש בכוח של עצמו פתרון לבעיה. ניסוי וטעייה מתאימים בדיוק לבעיות מסוימות. למעשה, מחשבים יכולים להיות טובים במיוחד בבעיות כאלה. מה כדאי לעשות?
סוסים עולים 40 ש"ח, חזירים עולים 12 ש"ח וארנבים עולה רק 2 ש"ח. חקלאי קונה 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 $לזוג. הבוס נתן לך שלוש אפשרויות פיצוי, שחובה לבחור לפני שמתחילים day:
- שכר ישיר של 600 $לשבוע;
- שכר של 7.00 $לשעה ועוד 10% עמלה על מכירות.
- ללא שכר, אבל 20% עמלות ו-20 $על כל זוג נעליים שנמכר
כמתכנת מומחה 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. כדי לשמור בקובץ: להכריז על סרטון In-stream, ולפתוח אותו באמצעות המילה '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++ הבסיסי. אנחנו לא מספקים פתרונות לתרגילים האלה ופרויקטים, כי נשמח אם תעבוד עם תלמידים אחרים כמובן.
- הקריקט בשדה הנפוץ מצפצף ביחס ישיר לטמפרטורה הנוכחית.
הוספת 40 למספר הפעמים שקריקט מצפצף בדקה, ואז מחלקת
שהערך שערך ב-4 נותן לנו את הטמפרטורה. כתבו תוכנה שמקבלת כקלט
את מספר הפעמונים בדקה ומדפיסים את הטמפרטורה הנוכחית. עבור
דוגמה,
Number of chirps: 120 The temperature is: 40.0 degrees.
- כתיבת תוכנית שתחשב את הציון הסופי בקורס במסגרת תכנות
שאתם לוקחים. כך מערכת למתן ציונים:
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. ואז מחברים את כל התוצאות של ההכפלות האלה.
להשתמש בפונקציות בכל מקום בתוכנית הזו. אפשר ליצור פונקציה לקבל את הקלט על-ידי העברת המחרוזת שיש להציג כפרמטר. תוך כדי הסבר. הנה דוגמה להרצה:
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
- ככל ששעוני עצר אלקטרוניים זולים יותר ומדויקים יותר,
להיות מוצלח יותר באמצעות מדידות של זמן שהן לא תמיד מדויקות. כתיבת תוכנית
שלוקחת כקלט פרק זמן נתון בשניות, ומפיקה את הפלט של המספר
של השעות, הדקות והשניות שהוא מייצג. לדוגמה,
Number of seconds: 3662 Hours: 1 Minutes: 1 Seconds: 2
- נניח שרצינו להדפיס באנר עבור המודעה הבאה:
"בריזה קפואה הופכת שלושה עץ קפוא"
אנחנו רוצים שהאותיות יהיו די גדולות, מאחר שמדובר בבאנר:
וכו'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
- הנה "מספר קסם" בעיה: בקשו ממשתמש להזין קוד
מספר שהספרה הראשונה שלו גדולה מהספרה האחרונה. התוכנית תבוטל
את המספר, ומחסירים את ההיפוך מהמספר המקורי. לבסוף,
להפוך את המספר שמתקבל, ולהוסיף אותו לצורתו ללא היפוך. פלט את
התוצאה הסופית. המספר המקורי שהמשתמש מזין צריך להיות מספר שלם
(ללא שלושה תווים). נסו לחשוב איך לכתוב פונקציה שלוקחת
במספר שלם בתור קלט, ומחזירה את הערך ההפוך למספר הזה. דוגמה:
input number: 901 reverse it: 109 subtract: 901 - 109 = 792 reverse it: 297 add: 297 + 792 = 1089
- לפי החוק, יצרנים של מוצרי מזון נדרשים להגדיר תאריכי תפוגה למוצרים
במוצרים שלהם, אבל יש פרצת חוק: לא נדרשת
תאריך התפוגה חייב להיות בפורמט מסוים. אז אפשר לכתוב את זה
סווהילי ועדיין להיות חוקי.
נדין, בת דודה השלישית של ראלף נאדר, היא מרגלת איכות המזון. היא גילתה שהרבה יצרנים של מוצרי מזון התחילו לתכנת את תאריכי התפוגה של המוצרים כדי למנוע מהלקוחות לדעת מהו תאריך התפוגה של המוצרים. לדברים אחרים.
אבל הקידוד מאפשר לחנויות של מכולת להבין את תאריכי התפוגה אם מסיבה כלשהי הם רוצים.
אחת משיטות הקידוד הנפוצות היא:
- מקודדים את החודשים מינואר עד דצמבר כ-'A'. עד L
- מקודדים כל ספרה בתאריך כ-'Q' עד 'Z'
- לקודד את השנה כ-'A' עד 'Z' כלומר 1 עד 26, כלומר שנוספו ל-1995.
טלי מצאה כיכר לחם מפוקפקת במיוחד בתאריך הזה: ARZM. כותבים תוכנית כדי לקבוע את התאריך.
- זו אנלוגיה של מספרים לתעלול קלפים מפורסם. בקש מהמשתמש להזין מספר בן שלוש ספרות. המספר הוא ABC (כאשר A, B, C 360 ספרות). עכשיו אפשר למצוא את שאריות המספרים שנוצרו לפי ABC, BCA ו-CAB כשמחלקים ב-11. נקרא לשאריות X, Y, ג. אפשר להוסיף אותם כ-X+Y, Y+Z, Z+X. אם אחד מהסכומים הוא אי-זוגי, יש להגדיל או יש להקטין אותו ב-11 (כל פעולה מובילה למספר חיובי נמוך יותר מ-20; חשוב לשים לב אם הסכום הוא 9, פשוט לדווח על כך ולהפסיק את התהליך). לבסוף, מחלקים כל אחד מהסכומים בחצי. הספרות שיתקבלו הן A, B, C. כתיבה תוכנית שמממשת את האלגוריתם הזה.
בשלב הבא, צריך לפרק את הנתונים לפני שכותבים את התוכנית. השתמשו בפונקציות ככל האפשר כדי ליצור תוכנות עם מבנה נכון.
אפליקציה: המחשת מוזיקה עם אנימציה
מהנדסי תוכנה יוצרים מגוון רחב של אפליקציות מעניינות וחדשניות לעיתים קרובות. בכל מודול בקורס הזה נציג אפליקציה שונה שמהנדסי התוכנה שנועד לעזור לכם להבין את כל התחומים השונים שבהם מהנדסי תוכנה.
כאן יש נושא מעניין אפליקציה שפותחה כדי להמחיש מוזיקה.