شروع شدن

با مثال بیاموزید

یکی از بهترین راه‌ها برای یادگیری برنامه‌نویسی به زبان جدید، مشاهده تعداد زیادی برنامه‌های نمونه است. بهترین کار این است که هر برنامه زیر را در یک فایل متنی کپی و پیست کرده و آن را کامپایل کنید. سپس، آزمایش ها را امتحان کنید. با گسترش این برنامه‌های نمونه، با جنبه‌های مختلف C++ آشنا می‌شوید و زمانی که زمان نوشتن برنامه‌ها از ابتدا فرا می‌رسد، احساس اطمینان بیشتری خواهید داشت.

مثال 1: کامپایلر خود را فعال کنید!

اگر قبلاً این کار را نکرده اید، برنامه کلاسیک زیر را کپی و در یک فایل متنی پیست کرده و آن را کامپایل کنید. دستورالعمل های مربوط به کامپایل در اینجا موجود است.

به احتمال زیاد شما با جزئیات این برنامه در آموزش کار کرده اید، بنابراین ما در اینجا توضیح خط به خط ارائه نمی دهیم. با این حال، در مورد خوانایی باید به چند نکته توجه کرد. این به نظرات و قالب‌بندی‌هایی اشاره دارد که به خواندن، درک و نگهداری برنامه‌ها کمک می‌کنند.

  • هر برنامه ای که می نویسیم با یک نظر هدر شروع می شود که نام نویسنده، اطلاعات تماس آنها، توضیحات کوتاه و استفاده (در صورت لزوم) ارائه می شود. هر تابع با یک نظر در مورد عملکرد و استفاده شروع می شود.
  • ما نظرات توضیحی را با استفاده از جملات کامل اضافه می کنیم، زمانی که کد خود را مستند نمی کند، به عنوان مثال، اگر پردازش مشکل، غیر واضح، جالب یا مهم باشد.
  • همیشه از نام های توصیفی استفاده کنید: متغیرها کلمات کوچکی هستند که با _ از هم جدا می شوند، مانند my_variable. نام توابع از حروف بزرگ برای علامت گذاری کلمات استفاده می کند، مانند MyExcitingFunction(). ثابت ها با یک "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 فاصله چاپ می شود. برای این کار از حلقه های for استفاده کنید. برای آشنایی با قالب بندی خروجی با cout اینجا را کلیک کنید. برای مشاهده راه حل اینجا کلیک کنید.
  • با استفاده از برنامه ای که به تازگی تکمیل کردید، نحوه چاپ "Hello World!" تراز چپ در فیلدهای 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().

برنامه ای بنویسید که با استفاده از این دو مرحله از ورودی بد بازیابی شود. از گوگل برای جستجوی نحوه عملکرد این روش ها استفاده کنید. راه حل ما اینجاست .

مثال 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. تا زمانی که بازیکن عدد را حدس بزند، آنچه را که باید برای حدس زدن های متعدد اجازه دهیم اضافه کنید.

این فرآیند توسعه تجزیه نامیده می شود که به معنای تقسیم یک کار به وظایف فرعی است که انجام هر یک از آنها آسان است.

با شروع مرحله 1، جستجوی گوگل را انجام دهید تا ببینید چگونه با استفاده از C++ یک عدد تصادفی تولید کنید. جستجو در "rand C++" را امتحان کنید. راه حل ما اینجاست .

برای مرحله 2، باید یک ورودی عدد صحیح از پخش کننده دریافت کنیم (با بررسی خطای مناسب در cin)، و آن را با شماره مخفی بررسی کنیم. سعی کنید قبل از بررسی راه حل ما این قسمت از بازی را خودتان بنویسید.

در نهایت، باید یک حلقه اضافه کنیم که حدس‌ها را از بازیکن جمع‌آوری می‌کند تا اینکه در نهایت عدد مخفی را حدس بزند. پس از تکمیل این بخش از برنامه، می توانید راه حل ما را بررسی کنید.

تجزیه یکی از مهم ترین مهارت هایی است که یک برنامه نویس باید یاد بگیرد. اینکه بتوانید یک کار را به قطعات قابل مدیریت تقسیم کنید، و سپس یکی یکی را تکمیل کنید، مهم نیست که پروژه چقدر بزرگ یا کوچک باشد. در اینجا چند فرصت دیگر برای تمرین تجزیه وجود دارد.

  • بسیاری از کارهای روزمره فرصت هایی را برای ایجاد مهارت در تجزیه فراهم می کنند. ممکن است شما را شگفت زده کند که متوجه شوید ذهن شما فقط به این شکل کار می کند!

    به عنوان مثال، اگر مجبور باشم یک آشپزخانه واقعاً درهم و برهم را تمیز کنم (شاید برخی از دختران کوچک کیک پخته باشند)، من وظایف را برای ارائه یک برنامه و برای اطمینان از اینکه مجبور نیستم بعداً کار را دوباره انجام دهم، تجزیه می کنم. من نمی‌خواهم ابتدا زمین را بشوییم اگر همه چیز روی پیشخوان برای تمیز کردن وجود دارد - احتمالاً بعداً باید دوباره کف را انجام دهم. بنابراین، شاید ابتدا همه مواد را کنار بگذارم. تمام ظروف را به سینک منتقل کنید. پیشخوان ها را تمیز کنید. ظرف ها را بشور؛ و در نهایت، کف را تمیز کنید. راه‌های دیگری برای انجام این کار وجود دارد، اما با فکر کردن در ابتدا، به من کمک می‌کند تا طرحی را تعریف کنم که نیازی به کار مجدد نداشته باشد.

    از کارهای روزمره به عنوان مثال برای توسعه مهارت های تجزیه خود استفاده کنید. چه کسی می داند - حتی ممکن است شما را در خانه کارآمدتر کند!

  • بزرگترین مقسوم علیه مشترک دو عدد صحیح بزرگترین عددی است که هر دو را به طور مساوی تقسیم می کند. به عنوان مثال، gcd(12, 18) = 6، gcd(-4، 14) = 2. کارآمدترین راه برای محاسبه gcd با الگوریتم اقلیدسی است. برنامه ای بنویسید با تابعی برای محاسبه gcd برای دو عدد صحیح. سعی کنید ابتدا تابع را بدون بازگشت انجام دهید - به شما کمک می کند تا نحوه عملکرد الگوریتم را درک کنید.

    وظایف فرعی خود را به صراحت تعریف کنید، به عنوان مثال، کد الگوریتم اقلیدسی را پیدا کنید. ایجاد یک تابع غیر بازگشتی برای الگوریتم؛ راه حل ما اینجاست .

مثال 5: معماهای ریاضی

یکی از قدرت‌های محاسبات این است که می‌تواند یک جستجوی بی‌نظیر برای یافتن راه‌حلی برای یک مشکل انجام دهد. آزمون و خطا برای برخی از مشکلات به خوبی کار می کند. در واقع، کامپیوترها می توانند به ویژه در چنین مشکلاتی خوب باشند. این را در نظر بگیرید:

قیمت اسب 10 دلار، خوک 3 دلار و خرگوش فقط 0.50 دلار است. یک کشاورز 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. حقوق مستقیم 600 دلار در هفته؛
  2. حقوق 7.00 دلار در ساعت به اضافه 10% کمیسیون در فروش؛
  3. بدون حقوق، اما 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 انجام می شود. برای ذخیره در یک فایل، جریان جریان را اعلام می کنیم و آن را با استفاده از حالت "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 در این وب سایت بخوانید.

تمرین ها و پروژه ها

تمرینات زیر به شما تمرین بیشتری را با 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
    
    و غیره

    به عنوان یک تجزیه کننده مشکل خوب، احتمالاً متوجه شده اید که به جای قرار دادن همه Cout ها در عملکرد اصلی، قرار دادن آنها در توابع بسیار کارآمدتر است. بنابراین ما می توانیم یک تابع "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 هستند. برنامه ای بنویسید که این الگوریتم را پیاده سازی کند.

کاربرد: تجسم موسیقی با انیمیشن

مهندسان نرم افزار طیف گسترده ای از برنامه های کاربردی اغلب جالب و نوآورانه را ایجاد می کنند. در هر ماژول از این دوره، ما یک برنامه کاربردی متفاوت را ارائه می دهیم که مهندسان طراحی و پیاده سازی کرده اند تا به شما در درک تمام زمینه های مختلف که مهندسان در آن کار می کنند کمک کند.

در اینجا یک برنامه جالب است که برای تجسم موسیقی ساخته شده است.