دوره‌ها / آموزش برنامه‌نویسی C++ / C++ User Input

C++ User Input

30 دقیقه Article

ورودی کاربر: تعامل با دنیایِ بیرون 📥⌨️

برنامه‌هایِ واقعی بدونِ ورودی از طرفِ کاربر بی‌معنی هستند. در C++ شیءِ cin (Character Input) ابزارِ اصلیِ ما برایِ دریافتِ داده‌ها از کیبورد است.

۱. استفاده از عملگرِ استخراج (Extraction Operator - >>)

برخلافِ cout، فلش‌هایِ cin به سمتِ متغیر هستند، چون داده از کیبورد به سمتِ متغیر سرازیر می‌شود:

{code_block('int age;\ncin >> age;')}

۲. مشکلِ فضاهایِ خالی (Whitespace):

شیءِ cin به محضِ رسیدن به یک فاصله (Space)، تب (Tab) یا خطِ جدید، متوقف می‌شود. اگر بخواهید یک نام و نام‌خانوادگی را با هم بگیرید، cin فقط قسمتِ اول را می‌خواند.

راهِ حل حرفه‌ای: برایِ خواندنِ یک خطِ کامل شاملِ فاصله‌ها، از تابعِ getline() استفاده می‌کنیم: {code_block('string fullName;\ngetline(cin, fullName);')}
ترکیبِ cin و getline: اگر اول از cin >> استفاده کنید و بلافاصله getline بزنید، getline کار نمی‌کند! چون cin یک کاراکترِ "اینتر" در بافر باقی می‌گذارد. همیشه بعد از cin از cin.ignore() استفاده کنید.

گرفتنِ چند ورودی:

{code_block('int x, y;\ncin >> x >> y; // کاربر دو عدد را با فاصله وارد می‌کند')}
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسیِ داده‌ها و مدیریت حافظه 🧱⚙️⚡

در C++، متغیرها فقط ظرفی برای داده نیستند؛ آن‌ها مدیریت‌کننده‌یِ منابع سیستم هستند. درکِ نحوه‌یِ ذخیره‌سازیِ این داده‌ها، تفاوتِ یک کدنویسِ عادی و یک معمارِ سیستم است.

۱. مقداردهیِ سراسری (Universal Initialization)

از استاندارد C++11 به بعد، روشِ جدیدی برای مقداردهی معرفی شد که از آکولاد {} استفاده می‌کند. این روش دو مزیت بزرگ دارد: اول اینکه از Narrowing Conversion جلوگیری می‌کند (مثلاً نمی‌گذارد یک double را در int بریزید و داده گم شود)؛ و دوم اینکه مشکلِ "Most Vexing Parse" را حل می‌کند که باعث می‌شد کامپایلر فکر کند شما در حالِ اعلانِ یک تابع هستید نه متغیر.

۲. معماریِ شئ String (SSO)

در C++، کلاسِ std::string بسیار هوشمند است. اکثرِ پیاده‌سازی‌هایِ مدرن از تکنیکی به نام Small String Optimization استفاده می‌کنند. اگر رشته‌یِ شما کوتاه باشد (مثلاً کمتر از ۱۵ یا ۲۳ کاراکتر)، آن را مستقیماً داخلِ خودِ شئ (روی Stack) ذخیره می‌کند تا از فراخوانیِ سنگینِ سیستم‌عامل برایِ دریافتِ حافظه از Heap جلوگیری شود. این یعنی سرعتِ فوق‌العاده در پردازشِ متن‌هایِ کوتاه.

۳. دقتِ محاسباتِ اعشاری (IEEE 754)

دنیایِ کامپیوتر باینری است و نمی‌تواند تمامِ اعدادِ اعشاریِ دهدهی را با دقتِ ۱۰۰٪ ذخیره کند. مثلاً عدد 0.1 در باینری یک عددِ متناوب است. به همین دلیل در سیستم‌های مالیِ حساس، هرگز نباید از float یا double برایِ مبالغِ دقیق استفاده کرد؛ مهندسان در این مواقع از متغیرهایِ صحیح (Integer) بر حسبِ "کوچکترین واحد" (مثل ریال یا سنت) استفاده می‌کنند.

نکته مهندسی: استفاده از کلمه‌یِ کلیدی auto به جایِ نوعِ داده، به کامپایلر اجازه می‌دهد خودش نوعِ متغیر را حدس بزند. این کار در کدهایِ پیچیده باعث می‌شود کدِ شما در برابرِ تغییراتِ آینده (Refactoring) مقاوم‌تر باشد.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

دریافت عدد از کاربر Easy
سوال تمرین

برنامه‌ای بنویسید که یک عدد از کاربر بگیرد، آن را در 2 ضرب کند و نتیجه را چاپ کند.

پاسخ تمرین
CPP
#include <iostream>
using namespace std;

int main() {
  int x;
  cin >> x;
  cout << x * 2;
  return 0;
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.