خیلی خوب، رسیدیم به درس پنجم: انواع حلقهها در سیشارپ.
یک پروژه جدید بسازید (dotnet new console) و کدها را همراه من بنویسید و اجرا کنید.
---
📘 درس پنجم – انواع حلقهها (Loops)
🎯 سرفصلها:
1. حلقه for (وقتی تعداد دفعات مشخص است)
2. حلقه while (وقتی شرط مشخص است)
3. حلقه do-while (حداقل یک بار اجرا میشود)
4. حلقه foreach (برای آرایه و لیست)
5. دستورات break و continue
6. حلقههای تو در تو
7. تمرین جامع
---
⏱️ قسمت 1: حلقه for (تعداد دفعات مشخص)
ساختار:
csharp
for (شروع; شرط; گام)
{
// کد تکراری
}
مثال ساده – چاپ اعداد 1 تا 5:
csharp
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
خروجی:
1
2
3
4
5
📌 توضیح:
· int i = 1 → شروع (یک بار اجرا میشود)
· i <= 5 → شرط (اگر true باشد، حلقه ادامه مییابد)
· i++ → گام (بعد هر بار اجرا، i را یک واحد زیاد کن)
مثالهای بیشتر:
csharp
// چاپ اعداد زوج 2 تا 10
for (int i = 2; i <= 10; i += 2)
{
Console.Write(i + " ");
}
// خروجی: 2 4 6 8 10
// شمارش معکوس 10 تا 1
for (int i = 10; i >= 1; i--)
{
Console.Write(i + " ");
}
// خروجی: 10 9 8 7 6 5 4 3 2 1
---
⏱️ قسمت 2: حلقه while (وقتی شرط مشخص است)
تا زمانی که شرط true است، اجرا میشود. ممکن است هیچ بار اجرا نشود.
ساختار:
csharp
while (شرط)
{
// کد تکراری
}
مثال – چاپ اعداد 1 تا 5 با while:
csharp
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
مثال – تا زمانی که کاربر عدد منفی نزند:
csharp
int number = 0;
while (number >= 0)
{
Console.Write("Enter a number (negative to exit): ");
number = int.Parse(Console.ReadLine());
Console.WriteLine($"You entered: {number}");
}
Console.WriteLine("Program ended");
---
⏱️ قسمت 3: حلقه do-while (حداقل یک بار اجرا میشود)
مثل while است، اما شرط بعد از اجرا چک میشود. پس حتماً یک بار اجرا میشود.
ساختار:
csharp
do
{
// کد تکراری
}
while (شرط);
مثال:
csharp
int number;
do
{
Console.Write("Enter a positive number: ");
number = int.Parse(Console.ReadLine());
}
while (number <= 0);
Console.WriteLine($"Good! You entered {number}");
تفاوت while و do-while:
csharp
// while: ممکن است اجرا نشود
int x = 10;
while (x < 5)
{
Console.WriteLine("This won't print");
}
// do-while: حتماً یک بار اجرا میشود
int y = 10;
do
{
Console.WriteLine("This will print once");
}
while (y < 5);
---
⏱️ قسمت 4: حلقه foreach (برای آرایه و لیست)
وقتی میخواهیم همه اعضای یک مجموعه را یکی یکی بگردیم.
ساختار:
csharp
foreach (نوع متغیر in مجموعه)
{
// کد
}
مثال:
csharp
string[] names = { "Ali", "Reza", "Sara", "Neda" };
foreach (string name in names)
{
Console.WriteLine("Hello " + name);
}
خروجی:
Hello Ali
Hello Reza
Hello Sara
Hello Neda
مثال با اعداد:
csharp
int[] scores = { 18, 20, 15, 19, 17 };
int sum = 0;
foreach (int score in scores)
{
sum += score;
}
Console.WriteLine($"Average: {(double)sum / scores.Length}");
---
⏱️ قسمت 5: دستورات break و continue
break – خارج شدن از حلقه (پرش بیرون)
csharp
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break; // وقتی i=5 شد، حلقه متوقف میشود
}
Console.WriteLine(i);
}
// خروجی: 1 2 3 4
continue – رفتن به دور بعدی (پرش به ادامه)
csharp
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue; // اعداد زوج را نادیده میگیرد
}
Console.WriteLine(i);
}
// خروجی: 1 3 5 7 9 (فقط فردها)
---
⏱️ قسمت 6: حلقههای تو در تو (Nested Loops)
حلقه داخل حلقه.
مثال – جدول ضرب:
csharp
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
{
Console.Write($"{i * j}\t"); // \t = تب
}
Console.WriteLine(); // خط جدید بعد هر سطر
}
خروجی:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
مثال – چاپ مثلث ستارهای:
csharp
int rows = 5;
for (int i = 1; i <= rows; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
خروجی:
*
**
***
****
*****
---
✅ تمرین نهایی درس پنجم
برنامهای بنویسید که:
1. با حلقه while، از کاربر عدد بگیرد تا عدد منفی وارد کند
2. مجموع اعداد مثبت را محاسبه کند
3. با حلقه for، اعداد 1 تا 20 را چاپ کند اما اعداد بخشپذیر بر 3 را با continue نادیده بگیرد
4. با حلقه do-while، یک منوی ساده بسازد (1. سلام 2. خداحافظ 0. خروج)
csharp
// قسمت 1: جمع اعداد مثبت با while
int sum = 0;
int input;
Console.WriteLine("Enter numbers (negative to stop):");
while (true)
{
Console.Write("Number: ");
input = int.Parse(Console.ReadLine());
if (input < 0)
break;
sum += input;
}
Console.WriteLine($"Sum of positive numbers: {sum}");
// قسمت 2: اعداد 1 تا 20 به جز بخشپذیر بر 3
Console.WriteLine("\nNumbers 1-20 except multiples of 3:");
for (int i = 1; i <= 20; i++)
{
if (i % 3 == 0)
continue;
Console.Write(i + " ");
}
// قسمت 3: منو با do-while
Console.WriteLine("\n\n=== Menu ===");
int choice;
do
{
Console.WriteLine("1. Say Hello");
Console.WriteLine("2. Say Goodbye");
Console.WriteLine("0. Exit");
Console.Write("Choose: ");
choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
Console.WriteLine("Hello dear user!");
break;
case 2:
Console.WriteLine("Goodbye! See you later.");
break;
case 0:
Console.WriteLine("Exiting...");
break;
default:
Console.WriteLine("Invalid choice!");
break;
}
}
while (choice != 0);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
---
📌 جمعبندی حلقهها
حلقه زمان استفاده حداقل اجرا
for تعداد دفعات مشخص 0 بار
while شرط مشخص، شاید اجرا نشود 0 بار
do-while حتماً یک بار اجرا شود 1 بار
foreach پیمایش آرایه/لیست 0 بار
دستورات کمکی:
· break → خروج کامل از حلقه
· continue → رفتن به دور بعدی
---
🧪 تمرین برای شما
1. با حلقه for، فاکتوریل عدد 5 را محاسبه کنید (5! = 5×4×3×2×1 = 120)
2. با حلقه while، دنباله فیبوناچی (0,1,1,2,3,5,8,13,...) تا عدد 100 را چاپ کنید
3. با حلقههای تو در تو، شکل زیر را چاپ کنید:
11111
22222
33333
44444
55555
---
اگر این درس را کامل فهمیدید، بگویید تا درس ششم (آرایهها و لیستها) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس ششم: آرایهها (Array) و لیستها (List).
یک پروژه جدید بسازید (dotnet new console) و کدها را همراه من بنویسید و اجرا کنید.
---
📘 درس ششم – آرایهها و لیستها
🎯 سرفصلها:
1. آرایه چیست و چرا نیاز داریم؟
2. تعریف و مقداردهی آرایه
3. دسترسی به اعضای آرایه (index)
4. حلقه زدن روی آرایه
5. متدهای مفید آرایه
6. List<T> چیست و چه فرقی با آرایه دارد؟
7. متدهای اصلی List (Add, Remove, Contains, Count)
8. تمرین جامع
---
⏱️ قسمت 1: آرایه چیست؟
آرایه = چند تا متغیر از یک نوع، کنار هم با یک اسم
بدون آرایه (کد بد):
csharp
int score1 = 18;
int score2 = 17;
int score3 = 20;
int score4 = 15;
int score5 = 19;
// برای 100 تا عدد چه کنیم؟؟
با آرایه (کد خوب):
csharp
int[] scores = { 18, 17, 20, 15, 19 };
---
⏱️ قسمت 2: تعریف و مقداردهی آرایه
روشهای مختلف ساخت آرایه:
csharp
// روش 1: مقداردهی مستقیم
int[] numbers1 = { 10, 20, 30, 40 };
// روش 2: تعیین اندازه و بعداً مقداردهی
int[] numbers2 = new int[3]; // 3 خانه خالی (0, 0, 0)
numbers2[0] = 100;
numbers2[1] = 200;
numbers2[2] = 300;
// روش 3: با new و مقداردهی همزمان
int[] numbers3 = new int[] { 5, 10, 15 };
// روش 4: آرایه از نوع string
string[] names = { "Ali", "Reza", "Sara" };
// روش 5: آرایه از نوع double
double[] prices = { 12.5, 9.99, 45.0 };
---
⏱️ قسمت 3: دسترسی به اعضای آرایه (Index)
ایندکس (اندیس) = شماره خانه از 0 شروع میشود
csharp
int[] numbers = { 100, 200, 300, 400, 500 };
Console.WriteLine(numbers[0]); // 100 (اولین)
Console.WriteLine(numbers[1]); // 200 (دومین)
Console.WriteLine(numbers[2]); // 300 (سومین)
Console.WriteLine(numbers[3]); // 400
Console.WriteLine(numbers[4]); // 500
// تغییر مقدار
numbers[2] = 999;
Console.WriteLine(numbers[2]); // 999
📌 نکته مهم: اگر ایندکس خارج از محدوده باشد → خطای IndexOutOfRangeException
csharp
// این کد خطا میدهد:
int[] arr = { 1, 2, 3 };
Console.WriteLine(arr[3]); // خطا! آخرین ایندکس 2 است
---
⏱️ قسمت 4: حلقه زدن روی آرایه
با حلقه for:
csharp
int[] scores = { 18, 20, 15, 19, 17 };
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine($"Index {i}: {scores[i]}");
}
با حلقه foreach (سادهتر):
csharp
int[] scores = { 18, 20, 15, 19, 17 };
foreach (int score in scores)
{
Console.WriteLine(score);
}
محاسبه مجموع اعداد آرایه:
csharp
int[] numbers = { 10, 20, 30, 40, 50 };
int sum = 0;
foreach (int num in numbers)
{
sum += num;
}
Console.WriteLine($"Sum: {sum}"); // 150
Console.WriteLine($"Average: {sum / numbers.Length}"); // 30
---
⏱️ قسمت 5: متدهای مفید آرایه
csharp
int[] numbers = { 30, 10, 50, 20, 40 };
Console.WriteLine($"Length: {numbers.Length}"); // 5
Console.WriteLine($"First: {numbers[0]}"); // 30
Console.WriteLine($"Last: {numbers[numbers.Length - 1]}"); // 40
Array.Sort(numbers); // مرتبسازی صعودی
Console.WriteLine("After sort: " + string.Join(", ", numbers)); // 10, 20, 30, 40, 50
Array.Reverse(numbers); // برعکس کردن
Console.WriteLine("After reverse: " + string.Join(", ", numbers)); // 50, 40, 30, 20, 10
Array.Clear(numbers, 0, 2); // پاک کردن 2 خانه اول (میشوند 0)
Console.WriteLine("After clear: " + string.Join(", ", numbers)); // 0, 0, 30, 20, 10
---
⏱️ قسمت 6: List<T> چیست و فرق آن با آرایه
List یک آرایه داینامیک است که میتواند بزرگ و کوچک شود.
ویژگی آرایه (Array) لیست (List)
اندازه ثابت قابل تغییر
افزودن عضو ❌ نداریم ✅ Add()
حذف عضو ❌ نداریم ✅ Remove()
سرعت کمی سریعتر کمی کندتر
استفاده از List (نیاز به using):
csharp
using System.Collections.Generic; // باید اضافه شود
List<int> numbers = new List<int>();
// افزودن عضو
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);
Console.WriteLine(string.Join(", ", numbers)); // 10, 20, 30
// دسترسی با ایندکس
Console.WriteLine(numbers[1]); // 20
// تعداد اعضا
Console.WriteLine(numbers.Count); // 3
---
⏱️ قسمت 7: متدهای اصلی List
`csharp List<string> names = new List<string>(); // افزودن names.Add("Ali"); names.Add("Reza"); names.Add("Sara"); names.Add("Ali"); // میشود تکراری داشت
// نمایش
Console.WriteLine("All names: " + string.Join(", ", names)); // Ali, Reza, Sara, Ali
// حذف (اولین مورد)
names.Remove("Ali"); // حذف اولین "Ali"
Console.WriteLine("After remove: " + string.Join(", ", names)); // Reza, Sara, Ali
// حذف با ایندکس
names.RemoveAt(1); // حذف ایندکس 1 (Sara)
Console.WriteLine("After remove at 1: " + string.Join(", ", names)); // Reza, Ali
// بررسی وجود
bool hasReza = names.Contains("Reza");
Console.WriteLine($"Contains Reza? {hasReza}"); // True
// تعداد اعضا
Console.WriteLine($"Count: {names.Count}"); // 2
// پاک کردن همه
names.Clear();
Console.WriteLine($"After clear: {names.Count}"); // 0
حلقه زدن روی List:
csharp
List<int> scores = new List<int> { 18, 20, 15, 19, 17 };
// با foreach
foreach (int s in scores)
{
Console.WriteLine(s);
}
// با for
for (int i = 0; i < scores.Count; i++)
{
Console.WriteLine($"Index {i}: {scores[i]}");
}
---
⏱️ قسمت 8: آرایه دوبعدی (مقدماتی)
csharp
// آرایه 3x4 (3 سطر، 4 ستون)
int[,] matrix = new int[3, 4];
// مقداردهی
matrix[0, 0] = 1;
matrix[0, 1] = 2;
matrix[0, 2] = 3;
matrix[0, 3] = 4;
matrix[1, 0] = 5;
matrix[1, 1] = 6;
matrix[1, 2] = 7;
matrix[1, 3] = 8;
// مقداردهی مستقیم
int[,] numbers = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
// حلقه زدن روی آرایه دوبعدی
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(numbers[i, j] + " ");
}
Console.WriteLine();
}
---
✅ تمرین نهایی درس ششم
برنامهای بنویسید که:
1. یک آرایه از 5 نمره دانشجو بسازد
2. با حلقه، مجموع و میانگین را محاسبه کند
3. یک List از نام دانشجوها بسازد
4. از کاربر نام بگیرد و به لیست اضافه کند
5. امکان جستجو در لیست را با Contains بدهد
6. بالاترین نمره را از آرایه پیدا کند
csharp
using System;
using System.Collections.Generic;
// قسمت 1: آرایه نمرات
int[] scores = { 18, 20, 15, 19, 17 };
// محاسبه مجموع و میانگین
int sum = 0;
foreach (int score in scores)
{
sum += score;
}
double average = (double)sum / scores.Length;
Console.WriteLine($"Sum: {sum}, Average: {average:F2}");
// پیدا کردن بالاترین نمره
int max = scores[0];
foreach (int score in scores)
{
if (score > max)
max = score;
}
Console.WriteLine($"Highest score: {max}");
// قسمت 2: لیست نام دانشجوها
List<string> students = new List<string> { "Ali", "Reza", "Sara" };
Console.WriteLine("\nCurrent students: " + string.Join(", ", students));
// افزودن دانشجو جدید
Console.Write("Enter new student name: ");
string newStudent = Console.ReadLine();
students.Add(newStudent);
Console.WriteLine("After adding: " + string.Join(", ", students));
// جستجو در لیست
Console.Write("\nSearch for a name: ");
string search = Console.ReadLine();
if (students.Contains(search))
{
Console.WriteLine($"Yes, {search} is in the list!");
}
else
{
Console.WriteLine($"No, {search} is not in the list.");
}
Console.WriteLine("\nPress Enter to exit...");
Console.ReadLine();
`--- 📌 جمعبندی درس ششم مفهوم آرایه (Array) لیست (List) تعریف int[] arr = new int[5]; List<int> list = new List<int>(); اندازه arr.Length list.Count افزودن ❌ list.Add(item) حذف ❌ list.Remove(item) دسترسی arr[index] list[index] نکات کلیدی: · ایندکس همیشه از 0 شروع میشود · آرایه اندازه ثابت دارد · لیست اندازه متغیر دارد · برای استفاده از List نیاز به using System.Collections.Generic; --- 🧪 تمرین برای شما 1. آرایهای از 7 عدد بسازید و بگویید چند عدد زوج وجود دارد 2. List ای از 5 اسم بسازید و اسمی که کاربر میگوید را حذف کنید 3. برنامهای بنویسید که 5 عدد از کاربر بگیرد، در لیست ذخیره کند و بعد میانگین را چاپ کند --- اگر این درس را کامل فهمیدید، بگویید تا درس هفتم (متدها و توابع) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس هفتم: متدها (Method) یا توابع در سیشارپ.
این یکی از مهمترین درسهای برنامهنویسی است. متدها به شما اجازه میدهند کدتان را مرتب، قابل استفاده مجدد و خواناتر کنید.
یک پروژه جدید بسازید (dotnet new console) و کدها را همراه من بنویسید و اجرا کنید.
---
📘 درس هفتم – متدها (Methods)
🎯 سرفصلها:
1. متد چیست و چرا نیاز داریم؟
2. ساختار یک متد
3. متد بدون پارامتر و بدون خروجی
4. متد با پارامتر
5. متد با خروجی (return)
6. متد با چند پارامتر
7. متد با پارامتر پیشفرض
8. فراخوانی متد در متد دیگر
9. تمرین جامع
---
⏱️ قسمت 1: متد چیست؟
متد = یک تکه کد که نام دارد و میتوانیم چند بار صدا بزنیم.
بدون متد (کد بد - تکرار):
csharp
Console.WriteLine("Welcome to our program!");
Console.WriteLine("Please enter your name...");
// همین پیام را 10 بار دیگر باید بنویسیم!
با متد (کد خوب):
csharp
ShowWelcomeMessage();
ShowWelcomeMessage();
ShowWelcomeMessage(); // هر چند بار که بخواهیم
void ShowWelcomeMessage()
{
Console.WriteLine("Welcome to our program!");
Console.WriteLine("Please enter your name...");
}
---
⏱️ قسمت 2: ساختار یک متد
csharp
[نوع_خروجی] [نام_متد]([پارامترها])
{
// بدنه متد
return مقدار; // اگر نوع خروجی void نباشد
}
سادهترین متد (بدون ورودی و بدون خروجی):
csharp
void SayHello()
{
Console.WriteLine("Hello World!");
}
// فراخوانی:
SayHello();
---
⏱️ قسمت 3: متد بدون پارامتر و بدون خروجی (void)
csharp
void ShowMenu()
{
Console.WriteLine("=== Main Menu ===");
Console.WriteLine("1. Add");
Console.WriteLine("2. Subtract");
Console.WriteLine("3. Multiply");
Console.WriteLine("4. Divide");
Console.WriteLine("=================");
}
// استفاده
ShowMenu();
ShowMenu(); // میتوانیم چند بار صدا بزنیم
---
⏱️ قسمت 4: متد با پارامتر (ورودی)
پارامترها را داخل () مینویسیم.
csharp
void Greet(string name)
{
Console.WriteLine($"Hello {name}! Welcome!");
}
// فراخوانی
Greet("Ali");
Greet("Sara");
Greet("Reza");
متد با چند پارامتر:
csharp
void PrintFullName(string firstName, string lastName)
{
Console.WriteLine($"Full name: {firstName} {lastName}");
}
// فراخوانی
PrintFullName("Mohammad", "Rezaei");
PrintFullName("Sara", "Ahmadi");
---
⏱️ قسمت 5: متد با خروجی (return)
اگر متد یک نتیجه برمیگرداند، نوع خروجی را مشخص میکنیم.
csharp
int Add(int a, int b)
{
int result = a + b;
return result; // برگرداندن نتیجه
}
// استفاده
int sum = Add(5, 3);
Console.WriteLine(sum); // 8
// یا مستقیم چاپ کنیم
Console.WriteLine(Add(10, 20)); // 30
مثالهای بیشتر:
csharp
// جمع دو عدد اعشاری
double Multiply(double x, double y)
{
return x * y;
}
// بررسی زوج بودن
bool IsEven(int number)
{
return number % 2 == 0;
}
// استفاده
double product = Multiply(3.5, 2);
Console.WriteLine(product); // 7
if (IsEven(7))
{
Console.WriteLine("Even");
}
else
{
Console.WriteLine("Odd");
}
---
⏱️ قسمت 6: انواع خروجی در متدها
نوع خروجی معنی مثال return
void هیچ چیزی برنمیگرداند return; (اختیاری)
int عدد صحیح return 5;
double عدد اعشاری return 3.14;
string متن return "hi";
bool true/false return true;
int[] آرایه return new int[]{1,2,3};
csharp
string GetGreeting(string name)
{
return $"Good morning, {name}!";
}
int[] GetNumbers()
{
return new int[] { 10, 20, 30 };
}
// استفاده
string msg = GetGreeting("Ali");
Console.WriteLine(msg);
int[] arr = GetNumbers();
foreach (int n in arr)
{
Console.WriteLine(n);
}
---
⏱️ قسمت 7: متد با پارامتر پیشفرض (Default Parameter)
میتوانیم برای پارامترها مقدار پیشفرض تعیین کنیم.
csharp
void Greet(string name, string title = "Dear")
{
Console.WriteLine($"Hello {title} {name}");
}
// دو روش فراخوانی
Greet("Ali", "Mr."); // Hello Mr. Ali
Greet("Sara"); // Hello Dear Sara (از پیشفرض استفاده میکند)
مثال دیگر:
csharp
double CalculatePrice(double basePrice, double tax = 0.09)
{
return basePrice + (basePrice * tax);
}
Console.WriteLine(CalculatePrice(100)); // 109 (مالیات 9%)
Console.WriteLine(CalculatePrice(100, 0.15)); // 115 (مالیات 15%)
---
⏱️ قسمت 8: فراخوانی متد در متد دیگر
csharp
int Add(int a, int b)
{
return a + b;
}
int Multiply(int a, int b)
{
return a * b;
}
int Calculate(int x, int y)
{
int sum = Add(x, y);
int product = Multiply(x, y);
return sum + product;
}
// استفاده
int result = Calculate(3, 4); // Add(3,4)=7, Multiply(3,4)=12 → 7+12=19
Console.WriteLine(result); // 19
---
⏱️ قسمت 9: متدهای محاسباتی کامل
csharp
// محاسبه توان
int Power(int baseNumber, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result *= baseNumber;
}
return result;
}
// فاکتوریل
int Factorial(int n)
{
int result = 1;
for (int i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
// استفاده
Console.WriteLine(Power(2, 5)); // 32
Console.WriteLine(Factorial(5)); // 120
---
⏱️ قسمت 10: متد برای کار با آرایه
csharp
// پیدا کردن بزرگترین عدد در آرایه
int FindMax(int[] numbers)
{
int max = numbers[0];
foreach (int num in numbers)
{
if (num > max)
max = num;
}
return max;
}
// محاسبه میانگین
double CalculateAverage(int[] numbers)
{
int sum = 0;
foreach (int num in numbers)
{
sum += num;
}
return (double)sum / numbers.Length;
}
// استفاده
int[] scores = { 18, 20, 15, 19, 17 };
Console.WriteLine($"Max: {FindMax(scores)}");
Console.WriteLine($"Average: {CalculateAverage(scores):F2}");
---
✅ تمرین نهایی درس هفتم
برنامهای بنویسید که متدهای زیر را داشته باشد:
1. ShowMenu() – نمایش منوی اصلی
2. Add(a, b) – جمع دو عدد
3. Subtract(a, b) – تفریق دو عدد
4. Multiply(a, b) – ضرب دو عدد
5. Divide(a, b) – تقسیم دو عدد (با مدیریت تقسیم بر صفر)
6. IsValidNumber(input) – بررسی اینکه کاربر عدد وارد کرده باشد
csharp
using System;
void ShowMenu()
{
Console.Clear();
Console.WriteLine("=== Calculator ===");
Console.WriteLine("1. Add");
Console.WriteLine("2. Subtract");
Console.WriteLine("3. Multiply");
Console.WriteLine("4. Divide");
Console.WriteLine("5. Exit");
Console.WriteLine("=================");
}
int Add(int a, int b)
{
return a + b;
}
int Subtract(int a, int b)
{
return a - b;
}
int Multiply(int a, int b)
{
return a * b;
}
double Divide(int a, int b)
{
if (b == 0)
{
Console.WriteLine("Error: Cannot divide by zero!");
return 0;
}
return (double)a / b;
}
int GetNumber(string prompt)
{
int number;
while (true)
{
Console.Write(prompt);
string input = Console.ReadLine();
if (int.TryParse(input, out number))
{
return number;
}
Console.WriteLine("Invalid input! Please enter a number.");
}
}
// برنامه اصلی
int choice;
do
{
ShowMenu();
Console.Write("Choose an option: ");
string input = Console.ReadLine();
if (!int.TryParse(input, out choice))
{
Console.WriteLine("Invalid choice! Press Enter to continue...");
Console.ReadLine();
continue;
}
if (choice >= 1 && choice <= 4)
{
int num1 = GetNumber("Enter first number: ");
int num2 = GetNumber("Enter second number: ");
switch (choice)
{
case 1:
Console.WriteLine($"Result: {Add(num1, num2)}");
break;
case 2:
Console.WriteLine($"Result: {Subtract(num1, num2)}");
break;
case 3:
Console.WriteLine($"Result: {Multiply(num1, num2)}");
break;
case 4:
Console.WriteLine($"Result: {Divide(num1, num2):F2}");
break;
}
Console.WriteLine("Press Enter to continue...");
Console.ReadLine();
}
else if (choice != 5)
{
Console.WriteLine("Invalid option! Press Enter to continue...");
Console.ReadLine();
}
}
while (choice != 5);
Console.WriteLine("Goodbye!");
Console.ReadLine();
---
📌 جمعبندی درس هفتم
بخش مثال
تعریف متد void SayHello() { ... }
فراخوانی متد SayHello();
پارامتر void Greet(string name) { ... }
خروجی (return) int Add(int a, int b) { return a + b; }
پارامتر پیشفرض void Log(string msg, int level = 1) { ... }
قوانین مهم:
· نام متد باید معنیدار باشد (Verb یا فعل)
· هر متد یک کار مشخص انجام دهد
· از تکرار کد با متد جلوگیری کنید
· متدها را قبل از استفاده تعریف کنید (یا بعد از Main)
---
🧪 تمرین برای شما
1. متدی بنویسید که یک آرایه بگیرد و مجموع آن را برگرداند
2. متدی بنویسید که یک string بگیرد و تعداد حروف بزرگ آن را برگرداند
3. متدی بنویسید که دو عدد بگیرد و هر سه عمل جمع، تفریق و ضرب را در یک متد برگرداند (با چند خروجی) – راهنمایی: میتوانید از out parameter استفاده کنید
---
اگر این درس را کامل فهمیدید، بگویید تا درس هشتم (کلاسها و شیءگرایی) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس هشتم: کلاسها (Class) و شیءگرایی (Object-Oriented Programming).
این درس یکی از مهمترین مباحث سیشارپ است. کلاسها به شما اجازه میدهند داده و رفتار را در یک واحد سازماندهی کنید.
---
📘 درس هشتم – کلاسها و شیءگرایی
🎯 سرفصلها:
1. شیءگرایی چیست؟
2. کلاس و شیء (Class و Object)
3. فیلدها (متغیرهای کلاس)
4. متدهای کلاس
5. سازنده (Constructor)
6. ویژگیها (Property) – get و set
7. سطح دسترسی (public, private)
8. تمرین جامع
---
⏱️ قسمت 1: شیءگرایی چیست؟
شیءگرایی = مدلسازی اشیای دنیای واقعی در برنامه
مثال: یک ماشین را در نظر بگیرید:
· ویژگیها (فیلدها): رنگ، مدل، سرعت
· کارها (متدها): استارت زدن، ترمز کردن، گاز دادن
---
⏱️ قسمت 2: کلاس و شیء
کلاس = نقشه یا قالبی برای ساختن اشیاء
شیء = نمونهای از آن کلاس (ساخته شده از روی نقشه)
csharp
// تعریف کلاس (نقشه)
class Car
{
public string color;
public string model;
public void Start()
{
Console.WriteLine("Car is starting...");
}
}
// استفاده در Main
class Program
{
static void Main()
{
// ساختن شیء (نمونه) از کلاس Car
Car myCar = new Car();
myCar.color = "Red";
myCar.model = "BMW";
myCar.Start();
Console.WriteLine($"My car is {myCar.color} {myCar.model}");
}
}
---
⏱️ قسمت 3: فیلدها (متغیرهای کلاس)
فیلدها همان متغیرهایی هستند که به کلاس تعلق دارند.
csharp
class Student
{
// فیلدها
public string name;
public int age;
public double score;
}
// استفاده
Student s1 = new Student();
s1.name = "Ali";
s1.age = 20;
s1.score = 18.5;
Student s2 = new Student();
s2.name = "Sara";
s2.age = 19;
s2.score = 19.5;
Console.WriteLine($"{s1.name}: {s1.score}");
Console.WriteLine($"{s2.name}: {s2.score}");
---
⏱️ قسمت 4: متدهای کلاس
متدها کارهایی هستند که شیء میتواند انجام دهد.
csharp
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
public void ShowInfo()
{
Console.WriteLine("This is a calculator class");
}
}
// استفاده
Calculator calc = new Calculator();
int result = calc.Add(10, 5);
Console.WriteLine(result); // 15
calc.ShowInfo();
---
⏱️ قسمت 5: سازنده (Constructor)
سازنده = متدی که هنگام ساخته شدن شیء اجرا میشود
نام سازنده دقیقاً مثل نام کلاس است و void ندارد.
csharp
class Person
{
public string name;
public int age;
// سازنده (بدون پارامتر)
public Person()
{
Console.WriteLine("A person object is created!");
name = "Unknown";
age = 0;
}
// سازنده با پارامتر (Overloading)
public Person(string personName, int personAge)
{
Console.WriteLine($"Creating person: {personName}");
name = personName;
age = personAge;
}
public void Introduce()
{
Console.WriteLine($"Hi, I'm {name} and I'm {age} years old");
}
}
// استفاده
Person p1 = new Person(); // سازنده اول
Person p2 = new Person("Ali", 25); // سازنده دوم
p1.Introduce(); // Hi, I'm Unknown and I'm 0 years old
p2.Introduce(); // Hi, I'm Ali and I'm 25 years old
---
⏱️ قسمت 6: ویژگیها (Property) – get و set
Property راهی برای کنترل دسترسی به فیلدها است.
بدون Property (فیلد عمومی - خطرناک):
csharp
class BankAccount
{
public double balance; // هر کسی میتواند مستقیم تغییر دهد!
}
// مشکل: کسی میتواند موجودی را منفی کند
BankAccount acc = new BankAccount();
acc.balance = -1000; // خطای منطقی!
با Property (کنترل شده):
`csharp class BankAccount { private double balance; // فیلد خصوصی (دسترسی مستقیم نداریم) // Property public double Balance { get { return balance; } // خواندن مقدار set { if (value >= 0) // value = مقداری که کاربر میدهد balance = value; else Console.WriteLine("Balance cannot be negative!"); } } }
// استفاده
BankAccount acc = new BankAccount();
acc.Balance = 1000; // set اجرا میشود
Console.WriteLine(acc.Balance); // get اجرا میشود (1000)
acc.Balance = -500; // خطا میدهد و مقدار قبلی باقی میماند
Property ساده (Auto-Implemented Property):
csharp
class Product
{
public string Name { get; set; } // خودکار
public double Price { get; set; } // خودکار
public int Stock { get; set; }
}
// استفاده
Product p = new Product();
p.Name = "Laptop";
p.Price = 15000000;
p.Stock = 10;
---
⏱️ قسمت 7: سطح دسترسی (Access Modifiers)
سطح دسترسی معنی
public همه جا قابل دسترس است
private فقط داخل همان کلاس قابل دسترس است
protected داخل کلاس و کلاسهای فرزند
internal داخل همان پروژه
csharp
class Example
{
public int publicField = 1; // همه میبینند
private int privateField = 2; // فقط داخل Example
protected int protectedField = 3; // Example و کلاسهای ارثبر
internal int internalField = 4; // داخل همین پروژه
public void ShowPrivate()
{
Console.WriteLine(privateField); // ✅ داخل کلاس میشود
}
}
// در Main:
Example ex = new Example();
ex.publicField = 10; // ✅
// ex.privateField = 20; // ❌ خطا
ex.ShowPrivate(); // ✅ از طریق متد عمومی
---
⏱️ قسمت 8: مثال کامل – کلاس Student
csharp
class Student
{
// فیلدهای خصوصی
private string name;
private int age;
private double[] scores;
// سازنده
public Student(string studentName, int studentAge)
{
name = studentName;
age = studentAge;
scores = new double[0];
Console.WriteLine($"Student {name} created");
}
// Property
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0 && value <= 120)
age = value;
else
Console.WriteLine("Invalid age!");
}
}
// متدها
public void AddScore(double score)
{
double[] newScores = new double[scores.Length + 1];
for (int i = 0; i < scores.Length; i++)
{
newScores[i] = scores[i];
}
newScores[scores.Length] = score;
scores = newScores;
}
public double GetAverage()
{
if (scores.Length == 0)
return 0;
double sum = 0;
foreach (double s in scores)
{
sum += s;
}
return sum / scores.Length;
}
public void ShowInfo()
{
Console.WriteLine($"Student: {name}, Age: {age}");
Console.WriteLine($"Average score: {GetAverage():F2}");
}
}
// استفاده در Main
Student s = new Student("Mohammad", 20);
s.AddScore(18);
s.AddScore(19);
s.AddScore(17.5);
s.ShowInfo();
---
✅ تمرین نهایی درس هشتم
برنامهای بنویسید که یک کلاس BankAccount بسازد با مشخصات زیر:
· فیلدهای خصوصی: accountNumber، balance، ownerName
· سازنده برای مقداردهی اولیه
· Property برای خواندن شماره حساب و موجودی (بدون set)
· Property برای نام صاحب حساب (get و set)
· متد Deposit(double amount) – افزایش موجودی
· متد Withdraw(double amount) – کاهش موجودی (اگر موجودی کافی نباشد خطا بدهد)
· متد ShowInfo() – نمایش اطلاعات
csharp
class BankAccount
{
private string accountNumber;
private double balance;
private string ownerName;
public BankAccount(string number, string owner, double initialBalance)
{
accountNumber = number;
ownerName = owner;
balance = (initialBalance >= 0) ? initialBalance : 0;
}
public string AccountNumber
{
get { return accountNumber; }
}
public double Balance
{
get { return balance; }
}
public string OwnerName
{
get { return ownerName; }
set { ownerName = value; }
}
public void Deposit(double amount)
{
if (amount > 0)
{
balance += amount;
Console.WriteLine($"Deposited: {amount:C}");
}
else
{
Console.WriteLine("Invalid deposit amount!");
}
}
public void Withdraw(double amount)
{
if (amount > 0 && amount <= balance)
{
balance -= amount;
Console.WriteLine($"Withdrawn: {amount:C}");
}
else if (amount > balance)
{
Console.WriteLine("Insufficient balance!");
}
else
{
Console.WriteLine("Invalid withdraw amount!");
}
}
public void ShowInfo()
{
Console.WriteLine($"Account: {accountNumber}");
Console.WriteLine($"Owner: {ownerName}");
Console.WriteLine($"Balance: {balance:C}");
}
}
// برنامه اصلی
class Program
{
static void Main()
{
BankAccount myAccount = new BankAccount("IR123456789", "Ali Rezaei", 1000000);
myAccount.ShowInfo();
Console.WriteLine();
myAccount.Deposit(500000);
myAccount.Withdraw(300000);
myAccount.Withdraw(2000000); // موجودی کافی نیست
Console.WriteLine();
myAccount.ShowInfo();
Console.WriteLine("\nPress Enter to exit...");
Console.ReadLine();
}
}
`--- 📌 جمعبندی درس هشتم مفهوم مثال تعریف کلاس class Car { ... } ساختن شیء Car myCar = new Car(); فیلد public string color; متد public void Start() { ... } سازنده public Car() { ... } Property public string Color { get; set; } public همه جا قابل دسترس private فقط داخل همان کلاس --- 🧪 تمرین برای شما 1. یک کلاس Book بسازید با: عنوان، نویسنده، قیمت، تعداد صفحات 2. یک کلاس Rectangle بسازید با: طول، عرض، و متدهای مساحت و محیط 3. یک کلاس Clock بسازید که زمان را نگه دارد و متد Tick() هر بار یک ثانیه اضافه کند --- اگر این درس را کامل فهمیدید، بگویید تا درس نهم (ارثبری و polymorphism) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس نهم: ارثبری (Inheritance) و چندریختی (Polymorphism).
این درس شما را وارد دنیای حرفهای شیءگرایی میکند.
یک پروژه جدید بسازید (dotnet new console) و کدها را همراه من بنویسید و اجرا کنید.
---
📘 درس نهم – ارثبری و چندریختی
🎯 سرفصلها:
1. ارثبری چیست؟ (پدر و فرزند)
2. کلمه کلیدی : و base
3. بازنویسی متدها با virtual و override
4. کلاسهای مشتق شده (Derived Classes)
5. چندریختی (Polymorphism)
6. کلاس abstract (چکیده)
7. کلمه کلیدی sealed
8. تمرین جامع
---
⏱️ قسمت 1: ارثبری چیست؟
ارثبری = یک کلاس میتواند ویژگیها و رفتارهای کلاس دیگر را به ارث ببرد.
کلاس پدر (Base Class) → کلاس فرزند (Derived Class)
مثال ساده:
csharp
// کلاس پدر (Base Class)
class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating...");
}
}
// کلاس فرزند (Derived Class) - از Animal ارث میبرد
class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} is barking: Woof! Woof!");
}
}
// استفاده
Dog myDog = new Dog();
myDog.Name = "Rex"; // از کلاس Animal
myDog.Eat(); // از کلاس Animal
myDog.Bark(); // از خودش
📌 نکته: فرزند همه چیز پدر را دارد (به جز سازندههای خصوصی).
---
⏱️ قسمت 2: کلمه کلیدی base
از base برای دسترسی به اعضای کلاس پدر استفاده میشود.
csharp
class Vehicle
{
public string Brand { get; set; }
public Vehicle(string brand)
{
Brand = brand;
Console.WriteLine("Vehicle constructor called");
}
public void Start()
{
Console.WriteLine("Vehicle is starting...");
}
}
class Car : Vehicle
{
public string Model { get; set; }
// فراخوانی سازنده پدر با base
public Car(string brand, string model) : base(brand)
{
Model = model;
Console.WriteLine("Car constructor called");
}
public void ShowInfo()
{
base.Start(); // فراخوانی متد پدر
Console.WriteLine($"Brand: {Brand}, Model: {Model}");
}
}
// استفاده
Car myCar = new Car("BMW", "X5");
myCar.ShowInfo();
خروجی:
Vehicle constructor called
Car constructor called
Vehicle is starting...
Brand: BMW, Model: X5
---
⏱️ قسمت 3: بازنویسی متدها (virtual و override)
گاهی فرزند میخواهد رفتار پدر را تغییر دهد.
کلیدواژه کاربرد
virtual متدی که میتوان در فرزند بازنویسی شود
override بازنویسی متد مجازی در فرزند
csharp
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks: Woof! Woof!");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Cat meows: Meow! Meow!");
}
}
// استفاده
Animal a1 = new Animal();
Animal a2 = new Dog();
Animal a3 = new Cat();
a1.MakeSound(); // Animal makes a sound
a2.MakeSound(); // Dog barks: Woof! Woof!
a3.MakeSound(); // Cat meows: Meow! Meow!
---
⏱️ قسمت 4: چندریختی (Polymorphism)
چندریختی = یک اسم (نوع پدر)، چند شکل (رفتار فرزند)
`csharp class Shape { public virtual double GetArea() { return 0; } public virtual void Draw() { Console.WriteLine("Drawing a shape"); } } class Circle : Shape { public double Radius { get; set; } public Circle(double radius) { Radius = radius; } public override double GetArea() { return Math.PI * Radius * Radius; } public override void Draw() { Console.WriteLine($"Drawing a circle with radius {Radius}"); } } class Rectangle : Shape { public double Width { get; set; } public double Height { get; set; } public Rectangle(double width, double height) { Width = width; Height = height; } public override double GetArea() { return Width * Height; } public override void Draw() { Console.WriteLine($"Drawing a rectangle {Width}x{Height}"); } }
// چندریختی در عمل
Shape[] shapes = new Shape[3];
shapes[0] = new Circle(5);
shapes[1] = new Rectangle(4, 6);
shapes[2] = new Circle(3);
foreach (Shape shape in shapes)
{
shape.Draw();
Console.WriteLine($"Area: {shape.GetArea():F2}");
Console.WriteLine();
}
---
⏱️ قسمت 5: کلاس abstract (چکیده)
کلاس abstract = کلاسی که نمیتوان از آن شیء ساخت، فقط برای ارثبری است.
csharp
// کلاس abstract
abstract class Employee
{
public string Name { get; set; }
public int Id { get; set; }
public Employee(string name, int id)
{
Name = name;
Id = id;
}
// متد abstract - بدون بدنه، فرزند حتماً باید پیادهسازی کند
public abstract double CalculateSalary();
// متد معمولی
public void ShowInfo()
{
Console.WriteLine($"Employee: {Name} (ID: {Id})");
}
}
class FullTimeEmployee : Employee
{
public double MonthlySalary { get; set; }
public FullTimeEmployee(string name, int id, double salary) : base(name, id)
{
MonthlySalary = salary;
}
public override double CalculateSalary()
{
return MonthlySalary;
}
}
class PartTimeEmployee : Employee
{
public double HourlyRate { get; set; }
public int HoursWorked { get; set; }
public PartTimeEmployee(string name, int id, double rate, int hours) : base(name, id)
{
HourlyRate = rate;
HoursWorked = hours;
}
public override double CalculateSalary()
{
return HourlyRate * HoursWorked;
}
}
// استفاده
// Employee e = new Employee(); // ❌ خطا - نمیتوان از کلاس abstract شیء ساخت
FullTimeEmployee fte = new FullTimeEmployee("Ali", 101, 5000000);
PartTimeEmployee pte = new PartTimeEmployee("Sara", 102, 50000, 80);
fte.ShowInfo();
Console.WriteLine($"Salary: {fte.CalculateSalary()}");
pte.ShowInfo();
Console.WriteLine($"Salary: {pte.CalculateSalary()}");
---
⏱️ قسمت 6: کلاس sealed (مهر و موم شده)
کلاس sealed = کلاسی که نمیتوان از آن ارثبری کرد.
csharp
sealed class FinalClass
{
public void DoSomething()
{
Console.WriteLine("This class cannot be inherited");
}
}
// class Child : FinalClass { } // ❌ خطا - نمیتوان از sealed ارث برد
متد sealed: در کلاس فرزند، نمیتوان بیشتر از این بازنویسی کرد.
csharp
class Parent
{
public virtual void MyMethod()
{
Console.WriteLine("Parent");
}
}
class Child : Parent
{
public sealed override void MyMethod() // sealed در این سطح
{
Console.WriteLine("Child");
}
}
// class GrandChild : Child
// {
// public override void MyMethod() { } // ❌ خطا - متد sealed است
// }
---
⏱️ قسمت 7: مثال کامل – سیستم حیوانات
csharp
using System;
// کلاس abstract
abstract class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public Animal(string name, int age)
{
Name = name;
Age = age;
}
public abstract void MakeSound();
public virtual void Move()
{
Console.WriteLine($"{Name} is moving");
}
public void ShowInfo()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
MakeSound();
Move();
}
}
class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, int age, string breed) : base(name, age)
{
Breed = breed;
}
public override void MakeSound()
{
Console.WriteLine($"{Name} barks: Woof! Woof!");
}
public override void Move()
{
Console.WriteLine($"{Name} runs happily");
}
}
class Bird : Animal
{
public double WingSpan { get; set; }
public Bird(string name, int age, double wingSpan) : base(name, age)
{
WingSpan = wingSpan;
}
public override void MakeSound()
{
Console.WriteLine($"{Name} chirps: Tweet! Tweet!");
}
public override void Move()
{
Console.WriteLine($"{Name} flies with {WingSpan}m wingspan");
}
}