📘 درس دوم – متغیرها، انواع داده و تبدیلات (نسخه کامل)
🎯 سرفصلها:
1. انواع داده اصلی (int, double, decimal, string, bool, char)
2. تفاوت decimal و double
3. تعریف متغیر و مقداردهی
4. تبدیل انواع: int.Parse و ToString
5. کار با DateTime
6. تمرین جامع
---
⏱️ قسمت 1: انواع داده (6 نوع مهم)
نوع معنی مثال توضیح
int عدد صحیح int x = 10; بدون اعشار
double عدد اعشاری (15 رقم دقت) double pi = 3.1415926535; برای محاسبات علمی
decimal عدد اعشاری دقیق (28 رقم دقت) decimal price = 99.99m; برای پول و قیمت
string متن string s = "Hi"; داخل کوتیشن
bool درست/نادرست bool isOk = true; true یا false
char یک کاراکتر char c = 'A'; داخل 'تکی'
---
⭐ تفاوت مهم decimal و double
csharp
double d = 0.1 + 0.2;
decimal m = 0.1m + 0.2m;
Console.WriteLine("double: " + d); // 0.30000000000000004 (تقریبی!)
Console.WriteLine("decimal: " + m); // 0.3 (دقیق!)
📌 قاعده طلایی:
· پول، قیمت، موجودی حساب → از decimal استفاده کنید
· محاسبات علمی، مختصات → از double استفاده کنید
📌 نکته: برای decimal حتماً بعد عدد m بگذارید (مثل 10.5m)
---
⏱️ قسمت 2: تعریف متغیر و مقداردهی
csharp
int age = 25;
double height = 1.75;
decimal salary = 4500000.50m;
string name = "Mohammad";
bool isMarried = false;
char grade = 'A';
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
Console.WriteLine("Height: " + height);
Console.WriteLine("Salary: " + salary);
Console.WriteLine("Married: " + isMarried);
Console.WriteLine("Grade: " + grade);
---
⏱️ قسمت 3: تبدیل انواع (خیلی مهم)
روش اول: int.Parse() – تبدیل متن به عدد صحیح
csharp
string input = "100";
int number = int.Parse(input); // تبدیل "100" به 100
Console.WriteLine(number + 5); // نتیجه: 105
روش دوم: Convert.ToInt32() – همان کار را میکند
csharp
string ageText = "30";
int age = Convert.ToInt32(ageText);
📌 فرق آنها:
· int.Parse() فقط برای متن استفاده میشود
· Convert.ToInt32() عدد هم قبول میکند (Convert.ToInt32(3.7) → 4)
تبدیل متن به decimal:
csharp
string priceText = "12500.99";
decimal price = decimal.Parse(priceText);
Console.WriteLine(price);
---
⏱️ قسمت 4: ToString() – تبدیل هر چیزی به متن
csharp
int age = 25;
string ageText = age.ToString(); // "25"
decimal money = 1250000.5m;
string moneyText = money.ToString(); // "1250000.5"
double pi = 3.14;
string piText = pi.ToString(); // "3.14"
Console.WriteLine("Age as text: " + ageText);
استفاده از فرمت در ToString:
csharp
decimal salary = 12500000.75m;
Console.WriteLine(salary.ToString("N0")); // 12,500,001
Console.WriteLine(salary.ToString("C")); // $12,500,000.75 (پول)
Console.WriteLine(salary.ToString("F2")); // 12500000.75 (2 رقم اعشار)
---
⏱️ قسمت 5: مثال عملی – گرفتن ورودی از کاربر با Parse
csharp
Console.Write("Enter your age: ");
string ageInput = Console.ReadLine();
int age = int.Parse(ageInput); // تبدیل متن به عدد
Console.Write("Enter your salary: ");
string salaryInput = Console.ReadLine();
decimal salary = decimal.Parse(salaryInput); // تبدیل به decimal
Console.Write("Enter your height: ");
string heightInput = Console.ReadLine();
double height = double.Parse(heightInput); // تبدیل به double
Console.WriteLine($"Age: {age}, Salary: {salary:C}, Height: {height}");
📌 نکته: اگر کاربر به جای عدد حرف بزند، برنامه خطا میدهد. بعداً یاد میگیریم چطور از خطا جلوگیری کنیم.
---
⏱️ قسمت 6: DateTime – تاریخ و زمان
csharp
DateTime now = DateTime.Now;
Console.WriteLine("Full date: " + now);
Console.WriteLine("Year: " + now.Year);
Console.WriteLine("Month: " + now.Month);
Console.WriteLine("Day: " + now.Day);
Console.WriteLine("Day of week: " + now.DayOfWeek);
// تبدیل DateTime به متن با فرمتهای مختلف
Console.WriteLine(now.ToString("yyyy-MM-dd")); // 2026-05-19
Console.WriteLine(now.ToString("dd/MM/yyyy")); // 19/05/2026
Console.WriteLine(now.ToString("HH:mm:ss")); // 14:25:30
// تبدیل متن به DateTime
string dateText = "2025-12-25";
DateTime christmas = DateTime.Parse(dateText);
Console.WriteLine(christmas.ToString("dddd")); // Thursday
---
✅ تمرین نهایی درس دوم (جامع)
برنامهای بنویسید که:
1. اسم کاربر را بگیرد (string)
2. حقوق ماهانه را بگیرد (decimal)
3. سن را بگیرد (int)
4. سال تولد را محاسبه کند (سال جاری - سن)
5. بگوید حقوق سالانه چقدر است (حقوق ماهانه × 12)
6. تاریخ امروز را با فرمت 1405/02/29 (شمسی تقریبی) نشان دهد
csharp
using System.Text;
Console.OutputEncoding = Encoding.UTF8;
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.Write("Enter your monthly salary: ");
string salaryInput = Console.ReadLine();
decimal monthlySalary = decimal.Parse(salaryInput);
Console.Write("Enter your age: ");
string ageInput = Console.ReadLine();
int age = int.Parse(ageInput);
int currentYear = DateTime.Now.Year;
int birthYear = currentYear - age;
decimal yearlySalary = monthlySalary * 12;
Console.WriteLine("\n=== Your Info ===");
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
Console.WriteLine("Birth year: " + birthYear);
Console.WriteLine("Monthly salary: " + monthlySalary.ToString("N0") + " Tomans");
Console.WriteLine("Yearly salary: " + yearlySalary.ToString("N0") + " Tomans");
Console.WriteLine("Today: " + DateTime.Now.ToString("yyyy/MM/dd"));
Console.WriteLine("\nPress Enter to exit...");
Console.ReadLine();
---
📌 جمعبندی درس دوم
مفهوم مثال
عدد صحیح int x = 5;
عدد اعشاری معمولی double d = 3.14;
عدد اعشاری دقیق (پول) decimal m = 99.99m;
متن string s = "hi";
تبدیل متن به int int.Parse("10")
تبدیل متن به decimal decimal.Parse("10.5")
تبدیل هر چیزی به متن variable.ToString()
تاریخ و زمان DateTime.Now
---
اگر این درس را کامل فهمیدید، بگویید تا درس سوم (شرط if-else) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس سوم: دستورات شرطی (if, else if, else) و Switch Case.
یک پروژه جدید بسازید (dotnet new console) و کدها را همراه من بنویسید و اجرا کنید.
---
📘 درس سوم – شرطها و تصمیمگیری در برنامه
🎯 سرفصلها:
1. شرط if (اگر)
2. شرط if-else (اگر-وگرنه)
3. شرط else if (چند شرط)
4. عملگرهای مقایسه و منطقی
5. دستور switch-case
6. تمرین جامع
---
⏱️ قسمت 1: عملگرهای مقایسه (مهم)
قبل از شرطها، باید عملگرهای مقایسه را بلد باشید:
عملگر معنی مثال درست
== مساوی 5 == 5 ✅
!= نامساوی 5 != 3 ✅
> بزرگتر 10 > 5 ✅
< کوچکتر 3 < 8 ✅
>= بزرگتر یا مساوی 5 >= 5 ✅
<= کوچکتر یا مساوی 4 <= 5 ✅
---
⏱️ قسمت 2: شرط if (اگر)
csharp
int age = 18;
if (age >= 18)
{
Console.WriteLine("You are an adult");
Console.WriteLine("You can vote");
}
📌 نکات:
· شرط داخل () نوشته میشود
· اگر شرط درست بود، کد داخل {} اجرا میشود
· اگر فقط یک خط دارید، میتوانید {} را حذف کنید (ولی بهتر نگذارید)
---
⏱️ قسمت 3: شرط if-else (اگر-وگرنه)
csharp
int age = 15;
if (age >= 18)
{
Console.WriteLine("You are an adult");
}
else
{
Console.WriteLine("You are a minor");
}
خروجی: You are a minor
📌 منطق: اگر شرط if درست بود، if اجرا میشود و else نادیده گرفته میشود. اگر if غلط بود، else اجرا میشود.
---
⏱️ قسمت 4: شرط else if (چند شرط)
csharp
int score = 85;
if (score >= 90)
{
Console.WriteLine("Grade: A");
}
else if (score >= 80)
{
Console.WriteLine("Grade: B");
}
else if (score >= 70)
{
Console.WriteLine("Grade: C");
}
else if (score >= 60)
{
Console.WriteLine("Grade: D");
}
else
{
Console.WriteLine("Grade: F");
}
خروجی: Grade: B
📌 نکته: شرطها از بالا به پایین بررسی میشوند. به محض اینکه یکی درست شد، بقیه نادیده گرفته میشوند.
---
⏱️ قسمت 5: عملگرهای منطقی (و، یا، نه)
عملگر معنی مثال
&& و (هر دو شرط باید درست باشد) age > 18 && hasLicense == true
! نه (برعکس میکند) !isRaining مثال: csharp int age = 20; bool hasLicense = true; if (age >= 18 && hasLicense == true) { Console.WriteLine("You can drive"); } else { Console.WriteLine("You cannot drive"); } csharp string day = "Friday"; if (day == "Friday" || day == "Thursday") { Console.WriteLine("It's weekend in Iran!"); } --- ⏱️ قسمت 6: Switch Case (انتخابگر) وقتی یک متغیر را با چند مقدار مختلف مقایسه میکنیم، switch خواناتر از if-else است. ساختار کلی: csharp switch (متغیر) { case مقدار1: // کد break; case مقدار2: // کد break; default: // اگر هیچکدام نبود break; } مثال واقعی: csharp Console.Write("Enter day number (1-7): "); int dayNumber = int.Parse(Console.ReadLine()); switch (dayNumber) { case 1: Console.WriteLine("Saturday"); break; case 2: Console.WriteLine("Sunday"); break; case 3: Console.WriteLine("Monday"); break; case 4: Console.WriteLine("Tuesday"); break; case 5: Console.WriteLine("Wednesday"); break; case 6: Console.WriteLine("Thursday"); break; case 7: Console.WriteLine("Friday"); break; default: Console.WriteLine("Invalid day number!"); break; } مثال با string: csharp Console.Write("Enter your favorite color: "); string color = Console.ReadLine(); switch (color.ToLower()) // ToLower: همه را کوچک میکند { case "red": Console.WriteLine("You chose passion"); break; case "blue": Console.WriteLine("You chose calm"); break; case "green": Console.WriteLine("You chose nature"); break; default: Console.WriteLine("Nice color!"); break; } 📌 نکات switch: · هر case باید با break تمام شود · default اختیاری است (مثل else) · میتوان چند case را بدون break پشت سر هم نوشت (fall-through) چند مقدار در یک case:
`csharp char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("You passed!");
break;
case 'D':
case 'F':
Console.WriteLine("You failed!");
break;
default:
Console.WriteLine("Invalid grade");
break;
}
---
✅ تمرین نهایی درس سوم
برنامهای بنویسید که:
1. از کاربر یک عدد بین 1 تا 12 بگیرد (ماه میلادی)
2. با switch نام ماه را چاپ کند
3. تعداد روزهای آن ماه را با if-else تعیین کند
4. بگوید فصل آن ماه چیست (بهار، تابستان، پاییز، زمستان)
csharp
Console.Write("Enter month number (1-12): ");
int month = int.Parse(Console.ReadLine());
// قسمت 1: نام ماه با switch
string monthName;
switch (month)
{
case 1: monthName = "January"; break;
case 2: monthName = "February"; break;
case 3: monthName = "March"; break;
case 4: monthName = "April"; break;
case 5: monthName = "May"; break;
case 6: monthName = "June"; break;
case 7: monthName = "July"; break;
case 8: monthName = "August"; break;
case 9: monthName = "September"; break;
case 10: monthName = "October"; break;
case 11: monthName = "November"; break;
case 12: monthName = "December"; break;
default: monthName = "Invalid"; break;
}
// قسمت 2: تعداد روزها با if-else
int days;
if (month == 2)
{
days = 28; // کبیسه را فعلاً نادیده میگیریم
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
days = 30;
}
else
{
days = 31;
}
// قسمت 3: تشخیص فصل
string season;
if (month >= 3 && month <= 5)
{
season = "Spring";
}
else if (month >= 6 && month <= 8)
{
season = "Summer";
}
else if (month >= 9 && month <= 11)
{
season = "Autumn";
}
else
{
season = "Winter";
}
Console.WriteLine($"Month: {monthName}");
Console.WriteLine($"Days: {days}");
Console.WriteLine($"Season: {season}");
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
`--- 📌 جمعبندی درس سوم مفهوم مثال if ساده if (x > 5) { ... } if-else if (x > 5) { ... } else { ... } else if if (x > 90) { ... } else if (x > 80) { ... } switch switch(day) { case 1: ... break; } عملگرهای مقایسه ==, !=, >, <, >=, <= عملگرهای منطقی && (و), ` --- 🧪 تمرین کوچک برای شما برنامهای بنویسید که یک عدد از کاربر بگیرد و بگوید: · عدد مثبت است، منفی است یا صفر · زوج است یا فرد (از عملگر % استفاده کنید: number % 2 == 0) اگر انجام دادید و جواب گرفتید، بگویید تا درس چهارم (حلقهها) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، رسیدیم به درس چهارم: انواع عملگرها در سیشارپ.
این درس مکمل درس سوم است. عملگرها همان ابزارهایی هستند که با متغیرها کار میکنند (محاسبه، مقایسه، شرط و...).
یک پروژه جدید بسازید و کدها را اجرا کنید.
---
📘 درس چهارم – انواع عملگرها (Operators)
🎯 سرفصلها:
1. عملگرهای حسابی (ریاضی)
2. عملگرهای افزایش و کاهش (++ و --)
3. عملگرهای مقایسهای
4. عملگرهای منطقی
5. عملگرهای شرطی (ternary - ? :)
6. عملگرهای انتساب ترکیبی (+=, -=, *=, /=)
7. اولویت عملگرها
---
⏱️ قسمت 1: عملگرهای حسابی (Arithmetic)
عملگر معنی مثال نتیجه
+ جمع 5 + 3 8
- تفریق 5 - 3 2
* ضرب 5 * 3 15
/ تقسیم 5 / 2 2 (با int)
% باقیمانده 5 % 2 1
csharp
int a = 17;
int b = 5;
Console.WriteLine(a + b); // 22
Console.WriteLine(a - b); // 12
Console.WriteLine(a * b); // 85
Console.WriteLine(a / b); // 3 (چون int است)
Console.WriteLine(a % b); // 2 (باقیمانده 17 تقسیم بر 5)
تقسیم اعشاری دقیق:
csharp
double x = 17;
double y = 5;
Console.WriteLine(x / y); // 3.4
---
⏱️ قسمت 2: عملگرهای افزایش و کاهش (Increment & Decrement)
عملگر معنی مثال معادل
++ افزایش یک واحد x++ یا ++x x = x + 1
-- کاهش یک واحد x-- یا --x x = x - 1
تفاوت پیشوند و پسوند (مهم):
csharp
int x = 5;
Console.WriteLine(x++); // اول چاپ میکند (5)، بعد زیاد میکند
Console.WriteLine(x); // حالا شده 6
int y = 5;
Console.WriteLine(++y); // اول زیاد میکند (6)، بعد چاپ میکند
📌 نکته:
· x++ = بعد از استفاده، زیاد کن
· ++x = اول زیاد کن، بعد استفاده کن
csharp
int counter = 0;
counter++; // یک واحد زیاد شد
counter--; // یک واحد کم شد
---
⏱️ قسمت 3: عملگرهای مقایسهای (Comparison)
نتیجه این عملگرها همیشه bool است (true یا false).
عملگر معنی
== مساوی
!= نامساوی
> بزرگتر
< کوچکتر
>= بزرگتر یا مساوی
<= کوچکتر یا مساوی
csharp
int age = 20;
Console.WriteLine(age == 18); // False
Console.WriteLine(age != 18); // True
Console.WriteLine(age > 18); // True
Console.WriteLine(age < 18); // False
Console.WriteLine(age >= 20); // True
Console.WriteLine(age <= 20); // True
---
⏱️ قسمت 4: عملگرهای منطقی (Logical)
برای ترکیب چند شرط استفاده میشوند.
عملگر معنی توضیح
&& AND (و) هر دو طرف درست باشند → true
! NOT (نقیض) true را false و false را true میکند جدول درستی: | A | B | A && B | A || B | !A | |---|---|--------|----------|----| | true | true | true | true | false | | true | false | false | true | false | | false | true | false | true | true | | false | false | false | false | true | مثال عملی: csharp int score = 85; bool hasHomework = true; // هر دو شرط باید درست باشد if (score >= 70 && hasHomework == true) { Console.WriteLine("Passed"); } // حداقل یکی درست باشد if (score >= 90 || hasHomework == true) { Console.WriteLine("Good or did homework"); } // برعکس کردن bool isRaining = false; if (!isRaining) { Console.WriteLine("Go outside"); } --- ⏱️ قسمت 5: عملگر شرطی (Ternary) - ? : یک if-else کوتاه و یک خطی. ساختار: csharp شرط ? مقدار_اگر_درست : مقدار_اگر_غلط مثال: csharp int age = 20; string result = (age >= 18) ? "Adult" : "Minor"; Console.WriteLine(result); // Adult مقایسه با if-else عادی: csharp // روش عادی (if-else) int score = 75; string grade; if (score >= 60) { grade = "Pass"; } else { grade = "Fail"; } // روش Ternary string grade2 = (score >= 60) ? "Pass" : "Fail"; مثال دیگر: csharp int number = 7; string evenOdd = (number % 2 == 0) ? "Even" : "Odd"; Console.WriteLine(evenOdd); // Odd --- ⏱️ قسمت 6: عملگرهای انتساب ترکیبی (Compound Assignment) این عملگرها کار با متغیر را کوتاهتر میکنند. عملگر معنی معادل += جمع و نسبت x = x + 5 -= تفریق و نسبت x = x - 5 *= ضرب و نسبت x = x * 5 /= تقسیم و نسبت x = x / 5 %= باقیمانده و نسبت x = x % 5 csharp int x = 10; x += 5; // x = 15 x -= 3; // x = 12 x *= 2; // x = 24 x /= 4; // x = 6 x %= 5; // x = 1 Console.WriteLine(x); // 1 --- ⏱️ قسمت 7: اولویت عملگرها (Precedence) ترتیب محاسبه در ریاضیات: 1. () پرانتز (بالاترین اولویت) 2. ++ -- (پیشوند) 3. * / % 4. + - 5. < > <= >= 6. == != 7. && 8. || (پایینترین اولویت) مثال:
csharp
int result = 5 + 3 * 2; // 11 (اول ضرب: 3*2=6، بعد جمع)
int result2 = (5 + 3) * 2; // 16 (اول پرانتز: 5+3=8، بعد ضرب)
bool r = 5 > 3 && 2 < 4; // true (اول مقایسهها، بعد &&)
---
✅ تمرین نهایی درس چهارم
برنامهای بنویسید که:
1. دو عدد از کاربر بگیرد
2. تمام عملگرهای حسابی را روی آنها انجام دهد (جمع، تفریق، ضرب، تقسیم، باقیمانده)
3. بگوید آیا مجموع آنها زوج است یا فرد (با ternary)
4. یک شمارنده داشته باشد که هر بار عدد اول را ۱ واحد افزایش دهد
csharp
Console.Write("Enter first number: ");
int num1 = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
int num2 = int.Parse(Console.ReadLine());
// عملگرهای حسابی
Console.WriteLine($"\n{num1} + {num2} = {num1 + num2}");
Console.WriteLine($"{num1} - {num2} = {num1 - num2}");
Console.WriteLine($"{num1} * {num2} = {num1 * num2}");
Console.WriteLine($"{num1} / {num2} = {num1 / num2} (integer division)");
Console.WriteLine($"{num1} % {num2} = {num1 % num2} (remainder)");
// عملگر ternary برای زوج یا فرد بودن مجموع
int sum = num1 + num2;
string parity = (sum % 2 == 0) ? "Even" : "Odd";
Console.WriteLine($"Sum ({sum}) is {parity}");
// عملگرهای افزایش و انتساب ترکیبی
int counter = num1;
Console.WriteLine($"\nCounter starts at: {counter}");
Console.WriteLine($"Counter++ (post): {counter++}"); // اول چاپ، بعد زیاد
Console.WriteLine($"After post-increment: {counter}");
Console.WriteLine($"++Counter (pre): {++counter}"); // اول زیاد، بعد چاپ
counter += 10;
Console.WriteLine($"After += 10: {counter}");
Console.WriteLine("\nPress Enter to exit...");
Console.ReadLine();
---
📌 جمعبندی درس چهارم
دسته عملگرها
حسابی +, -, *, /, %
افزایش/کاهش ++, --
مقایسهای ==, !=, >, <, >=, <=
منطقی &&,
شرطی (ternary) ? : انتساب ترکیبی +=, -=, *=, /=, %= --- 🧪 تمرین برای شما بدون اجرا، بگویید خروجی این کد چیست؟ ``csharp int a = 10; int b = 3; bool c = (a++ > 10) && (b-- < 5); Console.WriteLine($"a={a}, b={b}, c={c}");
`(جواب: a=11, b=2, c=False زیرا a++ > 10 ابتدا a=10 را مقایسه میکند که false است، پس عملگر && بقیه را چک نمیکند و b-- اجرا نمیشود) --- اگر این درس را کامل فهمیدید، بگویید تا درس پنجم (حلقهها) را شروع کنیم. سوالی بود بپرسید.
خیلی خوب، میخواهید try-catch (مدیریت خطا) را یاد بگیرید. این یک مبحث بسیار مهم است.
فعلاً "Try cash" را به عنوان try-catch در نظر میگیرم. اگر چیز دیگری مد نظرتان بود، بگویید.
---
📘 درس پنجم – مدیریت خطا با try-catch
🎯 سرفصلها:
1. خطا چیست و چرا برنامه کرش میکند؟
2. ساختار try-catch
3. گرفتن خطای خاص (مثلاً FormatException)
4. finally (همیشه اجرا میشود)
5. تمرین عملی
---
⏱️ قسمت 1: مشکل بدون try-catch
کد زیر را اجرا کنید و به جای عدد، یک متن وارد کنید:
csharp
Console.Write("Enter a number: ");
int number = int.Parse(Console.ReadLine()); // اگر کاربر "abc" وارد کند → خطا!
Console.WriteLine("You entered: " + number);
خروجی خطا:
Unhandled exception. System.FormatException: Input string was not in a correct format.
برنامه کرش میکند و میپرد.
---
⏱️ قسمت 2: راه حل با try-catch
csharp
try
{
Console.Write("Enter a number: ");
int number = int.Parse(Console.ReadLine());
Console.WriteLine("You entered: " + number);
}
catch
{
Console.WriteLine("Error! Please enter a valid number.");
}
Console.WriteLine("Program continues...");
📌 نحوه کار:
· try = کدی که ممکن است خطا دهد را اینجا میگذاریم
· catch = اگر خطایی رخ داد، این قسمت اجرا میشود
· برنامه کرش نمیکند و ادامه میدهد
---
⏱️ قسمت 3: گرفتن خطای خاص (Type-Specific Catch)
میتوانیم نوع خطا را مشخص کنیم و پیام مناسب بدهیم:
csharp
try
{
Console.Write("Enter your age: ");
int age = int.Parse(Console.ReadLine());
if (age < 0 || age > 150)
{
Console.WriteLine("Invalid age range!");
}
else
{
Console.WriteLine($"Your age is: {age}");
}
}
catch (FormatException)
{
Console.WriteLine("Error: Please enter a number, not text!");
}
catch (OverflowException)
{
Console.WriteLine("Error: Number is too large or too small!");
}
catch (Exception ex)
{
Console.WriteLine($"General error: {ex.Message}");
}
📌 انواع خطاهای رایج:
نوع خطا زمان رخ دادن
FormatException کاربر به جای عدد، متن وارد کرده
OverflowException عدد از محدوده int خارج است
DivideByZeroException تقسیم بر صفر
Exception هر خطای دیگری (پدر همه خطاها)
---
⏱️ قسمت 4: try-catch برای تقسیم بر صفر
csharp
try
{
Console.Write("Enter first number: ");
int a = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
int b = int.Parse(Console.ReadLine());
int result = a / b;
Console.WriteLine($"{a} / {b} = {result}");
}
catch (DivideByZeroException)
{
Console.WriteLine("Error: Cannot divide by zero!");
}
catch (FormatException)
{
Console.WriteLine("Error: Please enter valid numbers!");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
---
⏱️ قسمت 5: finally (همیشه اجرا میشود)
finally چه خطایی رخ بدهد و چه ندهد، حتماً اجرا میشود.
csharp
try
{
Console.Write("Enter a number: ");
int number = int.Parse(Console.ReadLine());
Console.WriteLine($"You entered: {number}");
}
catch (FormatException)
{
Console.WriteLine("Invalid input!");
}
finally
{
Console.WriteLine("This always runs (like closing files or database connections)");
}
Console.WriteLine("Program ends");
---
⏱️ قسمت 6: مثال کامل و کاربردی
برنامهای که سن کاربر را بگیرد و خطاها را مدیریت کند:
`csharp using System.Text; Console.OutputEncoding = Encoding.UTF8; bool validInput = false; while (!validInput) { try { Console.Write("Enter your birth year: "); string input = Console.ReadLine(); int birthYear = int.Parse(input); int currentYear = DateTime.Now.Year; if (birthYear < 1900 || birthYear > currentYear) { Console.WriteLine("Please enter a valid year (1900 to " + currentYear + ")"); continue; } int age = currentYear - birthYear;
Console.WriteLine($"Your age is: {age}");
validInput = true;
}
catch (FormatException)
{
Console.WriteLine("Error: Please enter numbers only (not letters)!");
}
catch (OverflowException)
{
Console.WriteLine("Error: Number is too large!");
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
}
}
Console.WriteLine("Thank you!");
Console.ReadLine();
---
✅ تمرین نهایی درس پنجم
برنامهای بنویسید که:
1. دو عدد از کاربر بگیرد
2. عمل تقسیم را انجام دهد
3. با try-catch این خطاها را مدیریت کند:
· وارد کردن متن به جای عدد
· تقسیم بر صفر
4. در finally بنویسد "Operation completed"
csharp
// تمرین - خودتان کامل کنید
try
{
Console.Write("Enter first number: ");
int num1 = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
int num2 = int.Parse(Console.ReadLine());
int result = num1 / num2;
Console.WriteLine($"Result: {result}");
}
// catch ها را خودتان اضافه کنید
catch (FormatException)
{
// پیام مناسب
}
catch (DivideByZeroException)
{
// پیام مناسب
}
finally
{
Console.WriteLine("Operation completed");
}
---
📌 جمعبندی try-catch
کلیدواژه کاربرد
try کدی که ممکن است خطا دهد را اینجا میگذاریم
catch اگر خطا رخ داد، این قسمت اجرا میشود
finally همیشه اجرا میشود (اختیاری)
throw ایجاد خطای جدید (پیشرفته)
فرمت کلی:
csharp
try
{
// کد پرخطر
}
catch (نوع_خطا)
{
// مدیریت خطا
}
finally
{
// پاکسازی (اختیاری)
}
`--- اگر این درس را کامل فهمیدید، بگویید. هر سوالی دارید بپرسید.
خیلی خوب، رسیدیم به درس پنجم: انواع حلقهها در سیشارپ.
یک پروژه جدید بسازید (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 عدد از کاربر بگیرد، در لیست ذخیره کند و بعد میانگین را چاپ کند --- اگر این درس را کامل فهمیدید، بگویید تا درس هفتم (متدها و توابع) را شروع کنیم. سوالی بود بپرسید.