برای روشن کردن ترمینال، کلیک کن یا هر کلیدی را بزن

پرش به محتوای اصلی
>_

// ~/cheatsheet --all-groups

برگهٔ تقلب

مرجعِ «همیشه‌بازِ کنارِ دست»: ۴۳ الگوی کلیدی از اسکلت برنامه تا توابع بازگشتی، گزینش‌شده از متن خود درس‌ها. هر الگو به درسی که آن را معرفی کرده لینک است — دقیقاً همان‌جا که توضیح کامل و تمرین‌ها هستند. پایین صفحه هم ۵ پروژهٔ پایانی منتظر توست که هر دسته را یک‌جا به محک می‌گذارد. برای چاپ هم آماده است: هر دسته یک برگهٔ تمیز.

Ctrl+Pهر دسته روی برگهٔ جدا چاپ می‌شود.

./basics

مبانی و مقدمات

۱۰ الگو

اسکلت برنامه، ورودی/خروجی، متغیر‌ها، عملگر‌ها و تصمیم‌ها — همهٔ چیزهایی که هر برنامهٔ ++C از آن‌ها ساخته می‌شود.

اسکلت برنامه

درس ۳
1#include <iostream>
2using namespace std;
3
4int main() {
5 // برنامه اینجا نوشته می‌شود
6 return 0;
7}

هر برنامه با include شروع می‌شود، بدنه در main می‌نشیند و return 0 یعنی «موفقیت».

خروجی با cout

درس ۳
1cout << "Hello World!" << endl;
2cout << "مقدار: " << x << "\n";

endl علاوه بر خط جدید بافر را خالی می‌کند؛ "\n" فقط خط می‌شکند و سریع‌تر است.

ورودی با cin

درس ۳
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 = int
3cout << (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++) اول مقدار فعلی را تحویل می‌دهد.

کاراکتر‌ها و کدهای ASCII

درس ۶
1char ch = 'A'; // کد 65
2cout << (char)(ch + 32); // 'a' ← حرف کوچک
3cout << (int)ch; // 65
4char d = '7';
5cout << (d - '0') + 1; // 8 ← رقم → عدد

سه کد را به خاطر بسپار: 'A'=65، 'a'=97، '0'=48 — بقیه از همین‌ها حساب می‌شود.

تصمیم با if / else

درس ۷
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 ادامه می‌دهد — از همین برای محافظت از تقسیم بر صفر استفاده کن.

انتخاب چندحالته با switch

درس ۹
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

حلقه‌ها و کنترل جریان

۹ الگو

الگوهای تکرار: انباشت، بیشینه، ارقام، الگوریتم‌های کلاسیک و حلقه‌های تودرتو — قلب حل مسئله.

حلقه for و انباشت (Accumulator)

درس ۱۱
1int sum = 0;
2for (int i = 1; i <= n; i++) {
3 sum += i;
4}
5cout << sum; // مجموع 1 تا n

الگوی انباشت: متغیر جمع را قبل از حلقه صفر کن و داخل حلقه += بزن.

حلقه while و کار با ارقام

درس ۱۱
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 else
6 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 (اندیس صفر-مبنا).

مرتب‌سازی حبابی (Bubble)

درس ۲۱
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 است تا بخش مرتب دوباره سروکلگی نزند.

مرتب‌سازی انتخابی (Selection)

درس ۲۱
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}

به جای هر مقایسه یک جابه‌جایی، فقط جای کوچک‌ترین عنصرِ باقی‌مانده با سرِ لیست عوض می‌شود.

رشتهٔ string و getline

درس ۱۹
1string s;
2cin >> s; // تا اولین فاصله
3cin.ignore();
4getline(cin, s); // کل خط، با فاصله‌ها
5cout << s.length();

cin >> در بافر Enter را جا می‌گذارد؛ قبل از getline با cin.ignore() بافر را پاک کن.

توابع رشتهٔ C (string.h)

درس ۲۲
1char s1[50] = "Hello", s2[50];
2strlen(s1); // طول: 5
3strcpy(s2, s1); // کپی — مقصد اول!
4strcat(s1, " World"); // چسباندن
5strcmp(s1, s2); // 0 یعنی برابر

ترتیب آرگومان‌های strcpy حیاتی است: (مقصد، منبع) — برعکس زدن یعنی خرابی حافظه.

./graphics

گرافیک و ماتریس

۷ الگو

کتابخانهٔ graphics.h و عملیات ماتریسی — رسم اشکال، مختصات صفحه و الگوهای محاسباتی.

راه‌اندازی graphics.h

درس ۲۳
1#include <graphics.h>
2
3int 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}
4
5int main() {
6 cout << add(3, 4); // 7
7}

نوع بازگشتی + نام + پارامترها = امضای تابع؛ تابع بالا main باید قبل از فراخوانی تعریف/اعلان شود.

تابع بدون خروجی (void)

درس ۲۶
1void printLine(int n) {
2 for (int i = 0; i < n; i++)
3 cout << "-";
4 cout << "\n";
5}

void یعنی «چیزی برنمی‌گرداند» — فقط برای انجام کار، نه محاسبه.

ارجاع و تابع swap

درس ۲۷
1void mySwap(int &a, int &b) {
2 int t = a; a = b; b = t;
3}
4
5mySwap(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}
6
7cout << sumOf(arr, 5);

آرایه همیشه به‌صورت ارجاع می‌رود (کپی نمی‌شود) — تعداد عناصر را جدا بفرست.

اشاره‌گر

درس ۲۸
1int x = 42;
2int *p = &x; // p آدرس x را نگه می‌دارد
3
4cout << 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];
4
5delete[] arr; // آزادسازی

هر new یک delete دارد — فراموش‌کردنش نشتی حافظه (memory leak) است.

struct — گروه‌بندی داده

درس ۲۹
1struct Student {
2 string name;
3 int grade;
4};
5
6Student s = {"Sara", 19};
7cout << s.name << " " << s.grade;
8
9Student cls[100]; // آرایه‌ای از structها
10cls[0].grade = 18;

دسترسی به فیلد‌ها با نقطه؛ struct داده‌های مرتبط را زیر یک نام جمع می‌کند.

بازگشت (Recursion)

درس ۳۰
1int fact(int n) {
2 if (n <= 1) return 1; // شرط پایه
3 return n * fact(n - 1); // گام بازگشتی
4}
5
6cout << fact(5); // 120

هر تابع بازگشتی دو جزء دارد: شرط پایه (توقف) و گام بازگشتی (کوچک‌شدن مسئله) — پایه را فراموش کنی، پشته سرریز می‌شود.

./project --all-groups

پروژه‌های پایانی

۵ پروژه

هر دسته با یک پروژهٔ واقعی بسته می‌شود — هر نیازمندیِ پروژه به یکی از درس‌های همان دسته لینک است. کد را در ویرایشگر سایت بنویس و تست کن، بعد با کامپایلر واقعی اجرا کن.

./project-basicsدستیار نمرهٔ کلاس

⏱ ۴۵ تا ۶۰ دقیقه

ورودی/خروجی، شرط‌ها و switch در یک برنامهٔ واقعی

برنامه‌ای بنویس که نمرهٔ سه درس یک دانش‌آموز را بخواند، میانگین را با دو رقم اعشار چاپ کند، وضعیت قبولی/مردودی را تعیین کند و با switch حرف نمره را نشان دهد. اگر هر نمره خارج از بازهٔ صفر تا بیست بود، برنامه پیام خطا چاپ کند و با return 1 تمام شود.

الزامات پروژه

  • خواندن سه نمره با پیام فارسی مناسبدرس ۴
  • میانگین با تبدیل نوع به double (نمایش دو رقم اعشار)درس ۵
  • وضعیت: میانگین ۱۰ یا بیشتر = قبول، کمتر = مردوددرس ۷
  • حرف نمره با switch: A (۱۷+)، B (۱۴+)، C (۱۲+)، D (۱۰+)، F (زیر ۱۰)درس ۹
  • اعتبارسنجی بازهٔ ۰ تا ۲۰ و خروج با return 1درس ۳
  • استفاده از const برای نمرهٔ قبولیدرس ۵

کد شروع (اسکلت) — جاهای خالی را خودت پر کن

1#include <iostream>
2using namespace std;
3
4int main() {
5 const double PASS = 10.0;
6 double a, b, c;
7
8 cout << "Nomre 3 dars ra vared konid: ";
9 cin >> a >> b >> c;
10
11 // 1) etebar-sanji: har nomre bayad 0..20 bashad
12 // ...
13
14 // 2) miangin ba 2 ragham ashar
15 // ...
16
17 // 3) vaziat + harf nomre ba switch
18 // ...
19
20 return 0;
21}

نمونهٔ اجرا — ورودی که کاربر می‌نویسد و خروجی که باید ببینی

Nomre 3 dars ra vared konid: 18.5 14 12.25
Miangin = 14.92
Vaziat: Ghabul
Harf nomre: B

راهنماها

  • برای دو رقم اعشار از setprecision(2) در <iomanip> استفاده کن؛ یا میانگین را در ۱۰۰ ضرب و گرد کن.
  • switch روی int کار می‌کند؛ برای بازه‌ها می‌توانی میانگین را با تقسیم صحیح به «شاخه» تبدیل کنی یا از زنجیرهٔ if/else استفاده کنی.
  • اول ورودی نامعتبر را چک کن و قبل از هر محاسبه‌ای return 1 بگیر.

./project-loopsتحلیل‌گر عدد

⏱ ۶۰ تا ۹۰ دقیقه

تسلط بر حلقه‌ها، ارقام، اعداد اول و حلقه‌های تودرتو

برنامه‌ای بنویس که یک عدد صحیح مثبت n را بخواند و بعد در یک منو (با do-while) این امکانات را بدهد: ۱) جدول ضرب n، ۲) جمع ارقام و معکوس n، ۳) بررسی اول بودن n، ۴) نمایش n جملهٔ اول فیبوناچی، ۰) خروج. منو تا انتخاب صفر تکرار شود و انتخاب نامعتبر پیام بدهد.

الزامات پروژه

  • منوی تکرارشونده با do-while و خروج با گزینهٔ صفردرس ۱۲
  • گزینهٔ ۱: جدول ضرب n×n با حلقهٔ تودرتودرس ۱۶
  • گزینهٔ ۲: جمع ارقام و معکوس با % و /درس ۱۳
  • گزینهٔ ۳: بررسی اول بودن با حلقه تا ریشهٔ دوم nدرس ۱۴
  • گزینهٔ ۴: n جملهٔ اول فیبوناچی با دو متغیر جاریدرس ۱۵
  • اعتبارسنجی انتخاب منو با defaultدرس ۹

کد شروع (اسکلت) — جاهای خالی را خودت پر کن

1#include <iostream>
2using namespace std;
3
4int main() {
5 int n, choice;
6 cout << "Yek adad mosbat vared konid: ";
7 cin >> n;
8
9 do {
10 cout << "\n1) Jadval zarb 2) Ragam & makous"
11 << " 3) Aval? 4) Fibonacci 0) Khorooj\n";
12 cout << "Entekhab: ";
13 cin >> choice;
14
15 switch (choice) {
16 case 1:
17 // jadval zarb n x n
18 break;
19 case 2:
20 // jam ragam + makous
21 break;
22 case 3:
23 // barrasi aval boodan
24 break;
25 case 4:
26 // n jomle fibonacci
27 break;
28 case 0:
29 cout << "Khodahafez!\n";
30 break;
31 default:
32 cout << "Entekhab namotabar!\n";
33 }
34 } while (choice != 0);
35
36 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!

راهنماها

  • جمع ارقام و معکوس را در یک حلقهٔ while مشترک می‌توانی انجام دهی: یکان را بگیر، حذف کن، به معکوس بچسبان.
  • برای اول بودن یک پرچم bool بساز و با break زودتر خارج شو.
  • ترازبندی جدول ضرب با tab ساده‌تر از setw است.

./project-arraysآمارگیر کلاس

⏱ ۹۰ دقیقه تا ۲ ساعت

کار کامل با آرایه، مرتب‌سازی، جستجو و هیستوگرام

برنامه‌ای بنویس که نمرهٔ n دانش‌آموز (حداکثر ۱۰۰ نفر) را در آرایه بخواند و گزارش کامل بدهد: بیشینه، کمینه، میانگین، نمرات مرتب‌شده، رتبهٔ یک نمرهٔ مشخص (جستجو) و هیستوگرام توزیع نمرات به‌ازای هر بازهٔ دو نمره‌ای (۰-۱، ۲-۳، …).

الزامات پروژه

  • خواندن n سپس n نمره با اعتبارسنجی بازهٔ ۰ تا ۲۰درس ۱۷
  • بیشینه، کمینه و میانگین با یک پیمایشدرس ۱۸
  • مرتب‌سازی حبابی صعودی + چاپ آرایهٔ مرتب‌شدهدرس ۲۰
  • جستجوی خطی برای رتبهٔ یک نمرهٔ مشخصدرس ۱۹
  • هیستوگرام با آرایهٔ فراوانی ۱۰ خانه‌ای و چاپ ستارهدرس ۱۸
  • هر بخش در یک تابع جداگانه (پیش‌اعلان بالای main)درس ۲۶

کد شروع (اسکلت) — جاهای خالی را خودت پر کن

1#include <iostream>
2using namespace std;
3
4void 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);
9
10int 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: **

راهنماها

  • اندیس بازهٔ هیستوگرام = نمره تقسیم بر ۲ (با تبدیل به int).
  • برای رتبه، اول مرتب کن و بعد بشمار چند نفر بالاترند.
  • const برای پارامتر آرایه در توابعِ فقط-خواندنی عادت حرفه‌ای خوبی است.

./project-graphicsآزمایشگاه ماتریس و شانس

⏱ ۷۵ تا ۹۰ دقیقه

اعمال ماتریسی و اعداد تصادفی در یک برنامهٔ ترکیبی

برنامه‌ای بنویس که دو ماتریس مربعی n×n را بخواند، حاصل جمع و ضرب آن‌ها را چاپ کند، بررسی کند آیا حاصل ضرب ماتریس مثلثی پایین است یا نه، و در پایان یک «ماتریس شانس» تصادفی ۰/۱ با احتمال ۵۰٪ تولید کند و تعداد یک‌هایش را به‌عنوان «امتیاز» بشمارد.

الزامات پروژه

  • خواندن n و دو ماتریس با حلقهٔ تودرتودرس ۲۵
  • جمع ماتریس‌ها و چاپ تمیز (ستون‌تراز)درس ۲۵
  • ضرب ماتریس با سه حلقهٔ تودرتودرس ۲۵
  • بررسی مثلثی پایین بودن حاصل ضربدرس ۲۵
  • ماتریس تصادفی ۰/۱ با rand() % 2 پس از srand(time(0))درس ۲۴
  • شمارش یک‌ها به‌عنوان امتیازدرس ۱۸

کد شروع (اسکلت) — جاهای خالی را خودت پر کن

1#include <iostream>
2#include <cstdlib>
3#include <ctime>
4using namespace std;
5
6int 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;
12
13 // 1) khandan A va B
14 // 2) C = A + B va chap
15 // 3) C = A * B va chap
16 // 4) barrasi mosalasi payeen boodane C
17
18 srand(time(0));
19 // 5) matrise shans 0/1 + shomaresh yekha
20 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

راهنماها

  • در ضرب ماتریس، C[i][j] را قبل از حلقهٔ داخلی صفر کن.
  • برای مثلثی پایین فقط خانه‌های j > i را بررسی کن.
  • rand() % 2 فقط ۰ یا ۱ می‌دهد — دقیقاً همان سکهٔ دو رو.

./project-functionsمدیر دانشجویان

⏱ ۲ تا ۳ ساعت

جامع‌ترین پروژهٔ دوره: struct + تابع + اشاره‌گر + حافظهٔ پویا + بازگشت

سیستم کوچکی بساز که n دانشجو را با struct (نام، شماره، معدل) در حافظهٔ پویا نگه دارد. منویی با do-while بدهد: ثبت، حذف، فهرست مرتب بر اساس معدل، بهترین دانشجو (با اشاره‌گر)، و میانگین کل با یک تابع بازگشتی روی آرایه. پیش از خروج، حافظه کاملاً آزاد شود.

الزامات پروژه

  • struct Student با سه فیلد + پیش‌اعلان توابع بالای mainدرس ۲۶
  • آرایهٔ پویا با new/delete[] و مدیریت اندازهٔ فعلیدرس ۲۹
  • ثبت و حذف (حذف با جابه‌جایی آخرین عنصر)درس ۲۹
  • مرتب‌سازی حبابی بر اساس معدل با تعویض کل structدرس ۲۰
  • تابعی که با اشاره‌گر آدرس بهترین دانشجو را برگردانددرس ۲۸
  • تابع بازگشتی مجموع معدل‌ها برای میانگین کلدرس ۳۰

کد شروع (اسکلت) — جاهای خالی را خودت پر کن

1#include <iostream>
2#include <string>
3using namespace std;
4
5struct Student {
6 string name;
7 int id;
8 double avg;
9};
10
11void 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); // bazgashti
16
17int main() {
18 int capacity;
19 cout << "Zarfiat: ";
20 cin >> capacity;
21 Student *list = new Student[capacity];
22 int count = 0;
23
24 // do-while menu: 1)sabt 2)hazf 3)list 4)behtarin 5)miangin 0)khorooj
25
26 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

راهنماها

  • برای مجموع بازگشتی: اگر count صفر است ۰، وگرنه آخرین عنصر + مجموع بقیه.
  • bestStudent اندیس/آدرس را نگه دارد و count صفر را جدا مدیریت کن.
  • حذف با جابه‌جایی: عنصر i را با آخرین جایگزین کن و count را کم کن — حافظه هدر نمی‌رود.
این برگه‌ها از متن درس‌ها استخراج شده‌اند؛ اگر جایی مبهم بود، لینک «درس N» بالای هر الگو تو را به همان بخش از دوره می‌برد — و دکمهٔ «اینجا گیج شدم» آنجا همیشه کار می‌کند. برای واژه‌های انگلیسی هم واژه‌نامهٔ دوزبانه کنار دست است.

جستجوی سریع در درس‌ها

نام درس، موضوع یا کلمه کلیدی را بنویسید و با Enter به آن بروید