اسکلت برنامه
درس ۳1#include <iostream>2using namespace std;34int main() {5 // برنامه اینجا نوشته میشود6 return 0;7}هر برنامه با include شروع میشود، بدنه در main مینشیند و return 0 یعنی «موفقیت».
// ~/cheatsheet --all-groups
مرجعِ «همیشهبازِ کنارِ دست»: ۴۳ الگوی کلیدی از اسکلت برنامه تا توابع بازگشتی، گزینششده از متن خود درسها. هر الگو به درسی که آن را معرفی کرده لینک است — دقیقاً همانجا که توضیح کامل و تمرینها هستند. پایین صفحه هم ۵ پروژهٔ پایانی منتظر توست که هر دسته را یکجا به محک میگذارد. برای چاپ هم آماده است: هر دسته یک برگهٔ تمیز.
Ctrl+Pهر دسته روی برگهٔ جدا چاپ میشود.
./basics
اسکلت برنامه، ورودی/خروجی، متغیرها، عملگرها و تصمیمها — همهٔ چیزهایی که هر برنامهٔ ++C از آنها ساخته میشود.
1#include <iostream>2using namespace std;34int main() {5 // برنامه اینجا نوشته میشود6 return 0;7}هر برنامه با include شروع میشود، بدنه در main مینشیند و return 0 یعنی «موفقیت».
1cout << "Hello World!" << endl;2cout << "مقدار: " << x << "\n";endl علاوه بر خط جدید بافر را خالی میکند؛ "\n" فقط خط میشکند و سریعتر است.
1int a, b;2cout << "دو عدد وارد کن: ";3cin >> a >> b;>> فاصله و Enter را نادیده میگیرد و برای خواندن چند عدد پشتسرهم ایدهآل است.
1int age = 20; // عدد صحیح2double gpa = 19.75; // اعشاری دقیق3char grade = 'A'; // یک کاراکتر4bool passed = true; // درست/غلطمتغیر بدون مقداردهی اولیه، مقدار تصادفی دارد — همیشه همان لحظهٔ تعریف مقدار بده.
1int a = 7, b = 2;2cout << a / b; // 3 ← int/int = int3cout << (double)a / b; // 3.5 ← تبدیل نوع4cout << a % b; // 1 ← باقیماندهقانون طلایی: تقسیم دو int نتیجهٔ int میدهد؛ یک طرف را cast کن تا اعشاری شود.
1int a = 5;2cout << a++; // 5 را چاپ میکند، بعد یک اضافه میکند3cout << ++a; // اول یک اضافه میکند، بعد 7 را چاپ میکند4a += 3; a -= 2; a *= 4; a /= 2; a %= 10;prefix (++a) اول تغییر میدهد؛ postfix (a++) اول مقدار فعلی را تحویل میدهد.
1char ch = 'A'; // کد 652cout << (char)(ch + 32); // 'a' ← حرف کوچک3cout << (int)ch; // 654char d = '7';5cout << (d - '0') + 1; // 8 ← رقم → عددسه کد را به خاطر بسپار: 'A'=65، 'a'=97، '0'=48 — بقیه از همینها حساب میشود.
1if (score >= 10) {2 cout << "قبول";3} else if (score >= 7) {4 cout << "جبرانی";5} else {6 cout << "مردود";7}باگ شمارهٔ یک مبتدیها: = انتساب است و == مقایسه — داخل شرط همیشه ==.
1if (x > 0 && x < 100) // و2if (n % 3 == 0 || n % 5 == 0) // یا3if (!found) // نقیض4if (b != 0 && a / b > 2) // اتصال کوتاه: تقسیم امنارزیابی اتصال کوتاه: && تا اولین false و || تا اولین true ادامه میدهد — از همین برای محافظت از تقسیم بر صفر استفاده کن.
1switch (choice) {2 case 1: cout << "جمع"; break;3 case 2: cout << "تفریق"; break;4 case 3: cout << "ضرب"; break;5 default: cout << "نامعتبر";6}فراموشکردن break یعنی اجرای case بعدی (fall-through) — شایعترین باگ switch.
./loops
الگوهای تکرار: انباشت، بیشینه، ارقام، الگوریتمهای کلاسیک و حلقههای تودرتو — قلب حل مسئله.
1int sum = 0;2for (int i = 1; i <= n; i++) {3 sum += i;4}5cout << sum; // مجموع 1 تا nالگوی انباشت: متغیر جمع را قبل از حلقه صفر کن و داخل حلقه += بزن.
1int cnt = 0;2while (n > 0) {3 cout << n % 10 << " "; // رقم یکان4 n /= 10; // حذف یکان5 cnt++;6}جفت طلایی ارقام: n % 10 رقم را میدهد و n / 10 آن را میبُرد.
1cin >> n >> max; // اولین عدد = مقدار اولیه2for (int i = 2; i <= n; i++) {3 cin >> x;4 if (x > max) max = x;5}6cout << max;بهترین مقدار اولیه برای max، خودِ اولین ورودی است — نه صفر (اعداد منفی!).
1long long f = 1;2for (int i = 2; i <= n; i++)3 f *= i;4cout << f; // n!فاکتوریل زود سرریز میکند: 13! از int بیرون میزند — برای n بزرگ long long انتخاب کن.
1int k = 0;2for (int i = 1; i <= n; i++)3 if (n % i == 0) k++;4cout << (k == 2 ? "اول" : "مرکب");روش درس: شمارش مقسومعلیهها — دقیقاً 2 یعنی اول. بهینهتر: فقط تا sqrt(n) بشمار.
1int a = 0, b = 1;2for (int i = 1; i <= n; i++) {3 cout << a << " ";4 int c = a + b;5 a = b;6 b = c;7}الگوی Shift: برای جلوگیری از باگ، مجموع را اول در متغیر کمکی c بگذار، بعد جابهجا کن.
1int rev = 0, m = n;2while (m > 0) {3 rev = rev * 10 + m % 10;4 m /= 10;5}6cout << (rev == n ? "پالیندروم" : "عدد معمولی");ساخت عدد معکوس: rev*10 + رقمِ تازه — بعد کافی است با عدد اصلی مقایسه کنی.
1while (b != 0) {2 int r = a % b;3 a = b;4 b = r;5}6cout << a; // ب.م.مکوچکترین و سریعترین الگوریتم دوران مقدماتی: باقیمانده بماند، مقسومعلیه جابهجا شود.
1for (int i = 1; i <= n; i++) {2 for (int j = 1; j <= n; j++) {3 if (i == 1 || i == n || j == 1 || j == n)4 cout << "*"; // مربع توخالی5 else6 cout << " ";7 }8 cout << "\n";9}دو شرط طلایی مختصات: i==j قطر اصلی و i+j==n+1 قطر فرعی — همهٔ لوزی و ضربدریها از همین دو ساخته میشوند.
./arrays
دستهٔ دادهها: آرایههای یکبعدی و دوبعدی، مرتبسازی، رشتهها و توابع کتابخانهای آنها.
1int a[5] = {10, 20, 30, 40, 50};2for (int i = 0; i < 5; i++)3 cout << a[i] << " ";اندیس از صفر شروع میشود؛ دسترسی به a[5] خطای Out of Bounds است که کامپایلر اخطار نمیدهد.
1int maxIdx = 0;2for (int i = 1; i < n; i++)3 if (a[i] > a[maxIdx]) maxIdx = i;4cout << a[maxIdx] << " در " << maxIdx;به جای مقدار، اندیس را نگه دار — هم مقدار در دسترس است هم جای آن.
1int cnt = 0, sum = 0;2for (int i = 0; i < n; i++)3 if (a[i] % 2 == 0) { cnt++; sum += a[i]; }4cout << (double)sum / cnt; // میانگین زوجهامیانگینگیری همیشه با cast به double — و cnt صفر را قبل از تقسیم بررسی کن.
1int m[3][4] = {{1, 2, 3, 4},2 {5, 6, 7, 8},3 {9, 10, 11, 12}};4for (int i = 0; i < 3; i++) {5 for (int j = 0; j < 4; j++)6 cout << m[i][j] << " ";7 cout << "\n";8}پیمایش ماتریس همیشه دو حلقهٔ تودرتو: i سطر و j ستون — شمارندهها را جابهجا نکن.
1int sumMain = 0, sumSec = 0;2for (int i = 0; i < n; i++) {3 sumMain += m[i][i]; // قطر اصلی4 sumSec += m[i][n - 1 - i]; // قطر فرعی5}در ماتریس n×n: قطر اصلی i==j و قطر فرعی i+j==n-1 (اندیس صفر-مبنا).
1for (int i = 0; i < n - 1; i++)2 for (int j = 0; j < n - 1 - i; j++)3 if (a[j] > a[j + 1]) {4 int t = a[j];5 a[j] = a[j + 1];6 a[j + 1] = t;7 }هر دور، بزرگترین عنصر به انتها «حباب» میکند؛ سقف حلقهٔ داخلی n-1-i است تا بخش مرتب دوباره سروکلگی نزند.
1for (int i = 0; i < n - 1; i++) {2 int mn = i;3 for (int j = i + 1; j < n; j++)4 if (a[j] < a[mn]) mn = j;5 int t = a[i]; a[i] = a[mn]; a[mn] = t;6}به جای هر مقایسه یک جابهجایی، فقط جای کوچکترین عنصرِ باقیمانده با سرِ لیست عوض میشود.
1string s;2cin >> s; // تا اولین فاصله3cin.ignore();4getline(cin, s); // کل خط، با فاصلهها5cout << s.length();cin >> در بافر Enter را جا میگذارد؛ قبل از getline با cin.ignore() بافر را پاک کن.
1char s1[50] = "Hello", s2[50];2strlen(s1); // طول: 53strcpy(s2, s1); // کپی — مقصد اول!4strcat(s1, " World"); // چسباندن5strcmp(s1, s2); // 0 یعنی برابرترتیب آرگومانهای strcpy حیاتی است: (مقصد، منبع) — برعکس زدن یعنی خرابی حافظه.
./graphics
کتابخانهٔ graphics.h و عملیات ماتریسی — رسم اشکال، مختصات صفحه و الگوهای محاسباتی.
1#include <graphics.h>23int main() {4 initwindow(640, 480, "My Window");5 // رسمها اینجا6 getch();7 closegraph();8 return 0;9}graphics.h استاندارد نیست و فقط روی ویندوز (مثل Dev-C++ با WinBGIm) اجرا میشود.
1putpixel(100, 50, RED); // نقطه در (x=100, y=50)2setcolor(YELLOW);3putpixel(100, 51, YELLOW);مبدأ گوشهٔ بالا-چپ است و y به پایین بزرگ میشود — برعکسِ ریاضیات مدرسه.
1setcolor(GREEN);2line(10, 10, 200, 150); // از نقطه به نقطه3circle(320, 240, 100); // مرکز + شعاعدایره از روی قطر: مرکز = میانگین دو سر قطر و شعاع = نصف فاصلهٔ آنها.
1int cx = 320, cy = 240, r = 120;2int x1 = cx + r, y1 = cy;3for (int k = 1; k <= n; k++) {4 double ang = k * 2 * M_PI / n;5 int x2 = cx + r * cos(ang);6 int y2 = cy + r * sin(ang);7 line(x1, y1, x2, y2);8 x1 = x2; y1 = y2;9}n ضلع روی دایره: زاویهها k×(360/n) درجه — رأسها را پشتسرهم با خط وصل کن.
1// c[m][p] = a[m][n] × b[n][p]2for (int i = 0; i < m; i++)3 for (int j = 0; j < p; j++) {4 c[i][j] = 0;5 for (int k = 0; k < n; k++)6 c[i][j] += a[i][k] * b[k][j];7 }شرط ابعاد: ستونِ اول باید بر سطرِ دوم باشد — وگرنه ضرب تعریفنشده است.
1for (int i = 0; i < n; i++) {2 int mx = m[i][0];3 for (int j = 1; j < n; j++)4 if (m[i][j] > mx) mx = m[i][j];5 cout << "سطر " << i << ": " << mx << "\n";6}الگوی «بیشینهٔ محلی»: مقدار اولیه از خودِ سطر بردار، نه از کل ماتریس.
1// مثلثی پایین: فقط روی و زیر قطر اصلی2for (int i = 0; i < n; i++) {3 for (int j = 0; j < n; j++)4 cout << (j <= i ? '*' : ' ') << " ";5 cout << "\n";6}مثلثی پایین j<=i، مثلثی بالا j>=i — روی قطر اصلی هر دو میمانند.
./functions
ماژولار کردن برنامه: تعریف تابع، ارجاع، اشارهگر، حافظهٔ پویا، struct و بازگشت.
1int add(int a, int b) {2 return a + b;3}45int main() {6 cout << add(3, 4); // 77}نوع بازگشتی + نام + پارامترها = امضای تابع؛ تابع بالا main باید قبل از فراخوانی تعریف/اعلان شود.
1void printLine(int n) {2 for (int i = 0; i < n; i++)3 cout << "-";4 cout << "\n";5}void یعنی «چیزی برنمیگرداند» — فقط برای انجام کار، نه محاسبه.
1void mySwap(int &a, int &b) {2 int t = a; a = b; b = t;3}45mySwap(x, y); // خودِ x و y عوض میشوند& در پارامتر یعنی ارجاع: تابع روی خودِ متغیر کار میکند، نه روی کپی آن (call by reference).
1int sumOf(int a[], int n) {2 int s = 0;3 for (int i = 0; i < n; i++) s += a[i];4 return s;5}67cout << sumOf(arr, 5);آرایه همیشه بهصورت ارجاع میرود (کپی نمیشود) — تعداد عناصر را جدا بفرست.
1int x = 42;2int *p = &x; // p آدرس x را نگه میدارد34cout << p; // آدرس5cout << *p; // 42 ← مقدار در آن آدرس6*p = 100; // x حالا 100 است& آدرس میدهد و * به محتوای آدرس دسترسی میدهد — دو روی یک سکه.
1int *arr = new int[n]; // تخصیص در زمان اجرا2for (int i = 0; i < n; i++)3 cin >> arr[i];45delete[] arr; // آزادسازیهر new یک delete دارد — فراموشکردنش نشتی حافظه (memory leak) است.
1struct Student {2 string name;3 int grade;4};56Student s = {"Sara", 19};7cout << s.name << " " << s.grade;89Student cls[100]; // آرایهای از structها10cls[0].grade = 18;دسترسی به فیلدها با نقطه؛ struct دادههای مرتبط را زیر یک نام جمع میکند.
1int fact(int n) {2 if (n <= 1) return 1; // شرط پایه3 return n * fact(n - 1); // گام بازگشتی4}56cout << fact(5); // 120هر تابع بازگشتی دو جزء دارد: شرط پایه (توقف) و گام بازگشتی (کوچکشدن مسئله) — پایه را فراموش کنی، پشته سرریز میشود.
./project --all-groups
هر دسته با یک پروژهٔ واقعی بسته میشود — هر نیازمندیِ پروژه به یکی از درسهای همان دسته لینک است. کد را در ویرایشگر سایت بنویس و تست کن، بعد با کامپایلر واقعی اجرا کن.
ورودی/خروجی، شرطها و switch در یک برنامهٔ واقعی
برنامهای بنویس که نمرهٔ سه درس یک دانشآموز را بخواند، میانگین را با دو رقم اعشار چاپ کند، وضعیت قبولی/مردودی را تعیین کند و با switch حرف نمره را نشان دهد. اگر هر نمره خارج از بازهٔ صفر تا بیست بود، برنامه پیام خطا چاپ کند و با return 1 تمام شود.
1#include <iostream>2using namespace std;34int main() {5 const double PASS = 10.0;6 double a, b, c;78 cout << "Nomre 3 dars ra vared konid: ";9 cin >> a >> b >> c;1011 // 1) etebar-sanji: har nomre bayad 0..20 bashad12 // ...1314 // 2) miangin ba 2 ragham ashar15 // ...1617 // 3) vaziat + harf nomre ba switch18 // ...1920 return 0;21}Nomre 3 dars ra vared konid: 18.5 14 12.25 Miangin = 14.92 Vaziat: Ghabul Harf nomre: B
تسلط بر حلقهها، ارقام، اعداد اول و حلقههای تودرتو
برنامهای بنویس که یک عدد صحیح مثبت n را بخواند و بعد در یک منو (با do-while) این امکانات را بدهد: ۱) جدول ضرب n، ۲) جمع ارقام و معکوس n، ۳) بررسی اول بودن n، ۴) نمایش n جملهٔ اول فیبوناچی، ۰) خروج. منو تا انتخاب صفر تکرار شود و انتخاب نامعتبر پیام بدهد.
1#include <iostream>2using namespace std;34int main() {5 int n, choice;6 cout << "Yek adad mosbat vared konid: ";7 cin >> n;89 do {10 cout << "\n1) Jadval zarb 2) Ragam & makous"11 << " 3) Aval? 4) Fibonacci 0) Khorooj\n";12 cout << "Entekhab: ";13 cin >> choice;1415 switch (choice) {16 case 1:17 // jadval zarb n x n18 break;19 case 2:20 // jam ragam + makous21 break;22 case 3:23 // barrasi aval boodan24 break;25 case 4:26 // n jomle fibonacci27 break;28 case 0:29 cout << "Khodahafez!\n";30 break;31 default:32 cout << "Entekhab namotabar!\n";33 }34 } while (choice != 0);3536 return 0;37}Yek adad mosbat vared konid: 7 1) Jadval zarb 2) Ragam & makous 3) Aval? 4) Fibonacci 0) Khorooj Entekhab: 3 7 aval ast. Entekhab: 0 Khodahafez!
کار کامل با آرایه، مرتبسازی، جستجو و هیستوگرام
برنامهای بنویس که نمرهٔ n دانشآموز (حداکثر ۱۰۰ نفر) را در آرایه بخواند و گزارش کامل بدهد: بیشینه، کمینه، میانگین، نمرات مرتبشده، رتبهٔ یک نمرهٔ مشخص (جستجو) و هیستوگرام توزیع نمرات بهازای هر بازهٔ دو نمرهای (۰-۱، ۲-۳، …).
1#include <iostream>2using namespace std;34void readScores(double a[], int n);5void report(const double a[], int n);6void bubbleSort(double a[], int n);7int findRank(const double a[], int n, double key);8void histogram(const double a[], int n);910int main() {11 double scores[100];12 int n;13 cout << "Tedad daneshamooz: ";14 cin >> n;15 readScores(scores, n);16 report(scores, n);17 histogram(scores, n);18 return 0;19}Tedad daneshamooz: 5 18 7.25 14 19.5 10 Max = 19.5 Min = 7.25 Avg = 13.75 Sorted: 7.25 10 14 18 19.5 Nomre morede nazr: 14 Rank: 3 Histogram: 0-1 : 2-3 : ... 10-11: ** 12-13: ** 18-19: **
اعمال ماتریسی و اعداد تصادفی در یک برنامهٔ ترکیبی
برنامهای بنویس که دو ماتریس مربعی n×n را بخواند، حاصل جمع و ضرب آنها را چاپ کند، بررسی کند آیا حاصل ضرب ماتریس مثلثی پایین است یا نه، و در پایان یک «ماتریس شانس» تصادفی ۰/۱ با احتمال ۵۰٪ تولید کند و تعداد یکهایش را بهعنوان «امتیاز» بشمارد.
1#include <iostream>2#include <cstdlib>3#include <ctime>4using namespace std;56int main() {7 const int MAXN = 10;8 int A[MAXN][MAXN], B[MAXN][MAXN], C[MAXN][MAXN];9 int n;10 cout << "Andaze (n): ";11 cin >> n;1213 // 1) khandan A va B14 // 2) C = A + B va chap15 // 3) C = A * B va chap16 // 4) barrasi mosalasi payeen boodane C1718 srand(time(0));19 // 5) matrise shans 0/1 + shomaresh yekha20 return 0;21}Andaze (n): 2 A: 1 2 0 3 B: 2 0 1 1 A+B = 3 2 1 4 A*B = 4 2 3 3 Mosalasi payeen? Na Matise shans: 1 0 0 1 Emtiaz: 2
جامعترین پروژهٔ دوره: struct + تابع + اشارهگر + حافظهٔ پویا + بازگشت
سیستم کوچکی بساز که n دانشجو را با struct (نام، شماره، معدل) در حافظهٔ پویا نگه دارد. منویی با do-while بدهد: ثبت، حذف، فهرست مرتب بر اساس معدل، بهترین دانشجو (با اشارهگر)، و میانگین کل با یک تابع بازگشتی روی آرایه. پیش از خروج، حافظه کاملاً آزاد شود.
1#include <iostream>2#include <string>3using namespace std;45struct Student {6 string name;7 int id;8 double avg;9};1011void addStudent(Student *arr, int &count, int capacity);12void removeStudent(Student *arr, int &count, int id);13void sortByAvg(Student *arr, int count);14Student* bestStudent(Student *arr, int count);15double sumAvg(const Student *arr, int count); // bazgashti1617int main() {18 int capacity;19 cout << "Zarfiat: ";20 cin >> capacity;21 Student *list = new Student[capacity];22 int count = 0;2324 // do-while menu: 1)sabt 2)hazf 3)list 4)behtarin 5)miangin 0)khorooj2526 delete[] list;27 return 0;28}Zarfiat: 3 1)Sabt 2)Hazf 3)List 4)Behtarin 5)Miangin 0)Khorooj Entekhab: 1 Nam/Shomare/Moadel: Ali 101 18.5 Entekhab: 1 Nam/Shomare/Moadel: Sara 102 19.25 Entekhab: 4 Behtarin: Sara (19.25) Entekhab: 5 Miangin: 18.87 Entekhab: 0
نام درس، موضوع یا کلمه کلیدی را بنویسید و با Enter به آن بروید