بایگانی برچسب: برنامه‌نویسی

اگر gitignore کار نمی‌کنه

برای من چند بار پیش اومده که یک‌سری از فایل‌ها رو کامیت کنم و بعد از اون متوجه اشتباهم بشم و gitignore رو آپدیت کنم تا گیت دیگه به اون فایل‌ها نگاه نکنه. مشکل اینه که گیت برای فایل‌هایی که تا حالا داشته بهشون نگاه می‌کرده دیگه به gitignore توجه نمی‌کنه و اون‌فایل‌ها از سیستم حذف نمی‌شن.
من قبلن این‌جا جواب رو پیدا کرده بودم ولی این دفعه که سرچ کردم، این‌جا پیداش کردم (و لینک استک‌اورفلو رو از توی هیستوری چت‌هام با مهدی پیدا کردم).
برای حل مشکل، اول از همه همه‌ی تغییرات‌تون رو کامیت کنید (و تغییراتی که می‌خواید اعمال نشند رو discard کنید. توجه کنید که با discard کردن اون تغییرات از دست می‌رن). بعد  git shell رو باز کنید و دستورات زیر رو بزنید:


git rm . -r --cached
git add .
git commit -m "fixed untracked files"

آپدیت جدید افزونه‌ی Jadi2 و افزونه‌ی CE93 Oracle Mirror برای دست‌رسی به داکیومنت‌های جاوا بدون نیاز به … که یادم رفته بود دربارش بنویسم

حدود یک ماه پیش با یکی از بچه‌های دانشکده‌ی کامپیوتر، افزونه‌ی CE93-Oracle رو نوشتیم. یکی از دوستان زحمت بخش وب‌ش رو کشید که وقتی به oracle.ce93.ir می‌رید، محتویات docs.oracle.com رو نشون بده و oracle.ce93.ir/a هم محتویات docs.oracle.com/a رو نشون بده.

و من هم اول می‌خواستم از کدهای Jadi2 برای اون استفاده کنم که دیدم یک‌سری مشکل فنی داره و امکان‌پذیر نیست. اگه یادتون باشه گفتم در نسخه‌ی بعدی Jadi2 یه کاری می‌کنم که عکس‌هایی که توی jadi.net هستن رو هم خود کروم از jad2.undo.it لود کنه. برای این کار لازمه هر request رو چک کنیم و اگر مال ما بود، (ینی با jadi.net یا freekeyboard.net شروع می‌شد) رو به jadi2.undo.it ری‌دایرکت کنه.

پس از چند ساعت تلاش شبانه، اون شب تونستم راه خوبش رو پیدا کنم و تا فرداش افزونه‌ی CE93-Oracle آماده شد ولی آپدیت جدید Jadi2 به تعویق افتاد. ۸ روز پیش دوباره تلاشی کردم برای درست کردنش که به دلیل حوصله نداشتن متوقف شد و امروز با وجود این‌که حوصله نداشتم، چون برنامه‌نویسی حس خوبی به آدم می‌ده و پروژه‌ی اصلی‌ای که این روزها دارم روش کار می‌کنم هم به دلیل زیاد روش کار کردن خسته‌کننده شده برای چند ساعت، تصمیم گرفتم که بجای اتلاف وقت، جادی۲ رو درست کنم که حالا آمادست :)

در پایان هم لینک‌های چیزهایی که بالا معرفی کردم:

کد افزونه‌ی CE93 Oracle Mirror

خود افزونه‌ی CE93 Oracle Mirror

کد افزونه‌ی Jadi2

افزونه‌ی Jadi2

پی‌نوشت: این چند روزه، برنامه‌نویسی باعث شده من لذت‌بخش‌ترین روزهای این چند سال رو تجربه کنم. بخش زیادیش رو هم مدیون مایکروسافت هستم با پلت‌فرم معرکه‌ی دات‌نت.

معرفی نرم‌افزار WebMatrix: ویرایش سایت و کار کردن با کلی زبان برنامه‌نویسی

با این‌که خیلی‌ها نظرشون نسبت به مایکروسافت منفیه ولی من از این شرکت خوشم میاد. حداقل در زمینه‌ی برنامه‌نویسی به نظرم بهترین ابزارهای برنامه‌نویسی و بهترین زبان برنامه‌نویسی مال این شرکته.

فکر کنم از سال ۲۰۱۰، مایکروسافت نرم‌افزاری به اسم WebMatrix رو معرفی کرد که برای ویرایش سایت‌ها بود. یعنی شما سایت‌تون رو بهش اضافه می‌کردید (از طریق لوکال، Web Deploy یا چندتا تکنولوژی دیگه) و بعد با استفاده از اون می‌تونستید سایت‌تون رو ویرایش و به‌روز رسانی کنید.

مثلا من با Web Deploy به سرور وصل می‌شم و کدهای دو برنامه‌نویس رو با کمک وب‌ماتریکس ویرایش می‌کنم که خیلی راحت‌تر از ویرایش‌گر وردپرسه!

Screenshot (19)

و چون این نرم‌افزار مال مایکروسافته (!) بعیده که خیلی از آدم‌ها باهاش کار کرده باشن. ولی نرم‌افزار خوبیه و ارزش امتحان کردن رو داره. حداقل یک ویرایش‌گر خوب برای فایل‌های وب‌تون خواهید داشت :)

پی‌نوشت با CTRL+ K و بعد CTRL + D می‌تونید کدتون رو مرتب کنید و این امکان بیش‌تر از چیزی که فکر می‌کنید کاربردیه :)

Channel9: یه سایت خوب برای یادگیری تکنولوژی‌های مایکروسافتی

جدیدا سرویس‌های آموزش ویدیویی آنلاین خوبی راه‌اندازی شدن و دارن کار می‌کنن. سرویس‌هایی مثل Coursera و Khan Academy که کارشون هم خوبه.

مایکروسافت قبلا یه سرویس آموزش آنلاین داشت به اسم Microsoft Virtual Academy مثل بالایی‌ها بود: به دانش‌آموزها امتیاز می‌داد و از این جور کارا.

ولی مایکروسافت یه سرویس جمع‌وجورتر هم داره به اسم Channel9 که کارش صرفا اشتراک ویدیوییه و بخش‌های دیگه مثل آزمون یا انجمن نداره. ولی تا جایی که می‌دونم فیلم‌های ویرچوال آکادمی رو هم توش داره.

خلاصه این‌که اگه دوست دارید چیزهایی مثل سی‌شارپ یا برنامه‌نویسی ویندوزفون یا کلی تکنولوژی دیگه یاد بگیرید و شرکتی که ازش اینترنت می‌گیرید هم مثل مبین‌نت نیست که ساعت نامحدود نداشته باشه و هر گیگ حجم رو به قیمت خون پدربزرگ‌ش بفروشه این سایت خیلی می‌تونه کمک‌تون کنه که توی کدنویسی پیش‌رفت کنید.

پی‌نوشت: دیروز متوجه شدم که کسی که آموزش ویندوزفون رو نوشته کل آموزش رو به صورت یک کتاب هم منتشر کرده. ینی غیر از این‌که بخواید ویدیویی آموزش ببینید می‌تونید از کتاب هم استفاده کنید.

چرا سی‌شارپ رو دوست دارم: چند ساعت موزیک یا ویدیو روی کامپیوترم هست؟

توی دات‌نت یه کتاب‌خونه‌ی خیلی خوب برای متادیتای موسیقی‌ها هست به اسم taglib-sharp که دست‌رسی راحت و تقریبا کامل به متادیتای موسیقی‌ها میده و توی ویندوز فون هم اپلیکیشن‌هایی ازش استفاده کردن (و کارش هم خوبه).

من هم با استفاده از همین کتابخونه تو سی‌شارپ یه برنامه نوشتم که طول همه‌ی آهنگ‌ها رو جمع بزنه نشون بده. برنامه‌ی ساده اینه:

string path = Console.ReadLine();
float all = (float)((new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories)).Count());
TimeSpan lenght = new TimeSpan();
foreach (var item in new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories))
{
    try
    {
        using (TagLib.File f = TagLib.File.Create(item.FullName))
        {
            lenght += f.Properties.Duration;
        }
    }
    catch { }
}
Console.WriteLine(lenght.ToString("c"));

و برای خوشگل‌تر شدن‌ش هم یک‌سری کد دیگه اضافه کردم که توی خط اول درصد پیشرفت، توی خط دوم تعداد فایل‌هایی که بررسی شدن و توی خط سوم تعداد کل فایل‌ها و توی خط چهارم هم مجموع زمان فایل‌هایی که بررسی شدن رو نشون می‌ده:

Console.Title = "FileAide Tests";
string path = Console.ReadLine();
float all = (float)((new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories)).Count());
float i = 0;
TimeSpan lenght = new TimeSpan();
Console.Clear();
foreach (var item in new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories))
{
    i++;
    Console.SetCursorPosition(0, 0);
    Console.Write("{0}%", ((float)(i / all * 100)).ToString("0.00"));
    Console.SetCursorPosition(0, 1);
    Console.Write(i);
    Console.SetCursorPosition(0, 2);
    Console.Write(all);
    Console.SetCursorPosition(0, 3);
    Console.Write(lenght.ToString("c"));

    try
    {
        using (TagLib.File f = TagLib.File.Create(item.FullName))
        {
            lenght += f.Properties.Duration;
        }
    }
    catch { }
}

Console.ReadLine();

حالا اگه خیلی وسواسی هستید می‌تونید کد بالا رو کامپایل کنید وگرنه می‌تونید برنامه‌ی اجرایی رو از این‌جا دانلود کنید. دقت کنید که وقتی برنامه باز می‌شه اول باید آدرس پوشه‌ای که موزیک‌هاتون توی اونه رو بهش بدید.

پی‌نوشت: Taglibsharp با فایل‌های mp4 و mkv هم کار می‌کنه (تا جایی که می‌دونم) ولی مطمئن نیستم که فرمت‌های دیگه‌ی ویدیویی رو هم پشتیبانی کنه. در هر صورت می‌تونید از این برنامه برای ویدیوهاتون هم استفاده کنید.

Jadi2: یه افزونه برای راحت‌تر خوندن وبلاگ جادی

همون‌طور که می‌دونید جادی.نت (بخونید جادی دات نت :) ) و freekeyboard.net فیل*ترن و راه‌حل هم (غیر از استفاده از قندشکن و اینا) اینه که بریم تو جادی۲.آندو.ایت. ولی مشکل اینه که وردپرس حتی وقتی میریم تو جادی۲ بازم یه سری از لینک‌ها رو با جادی.نت می‌ده و این موضوع (حداقل برای من) آزاردهنده‌ست که هر بار بخوام آدرس رو به جادی۲.آندو.ایت تغییر بدم.

برای همین هم یه راه‌حل ساده درست کردم: (بالاخره برنامه‌نویس‌ها، برنامه‌نویس می‌شن که راه‌حل‌های ساده رو پیدا کنن دیگه :) ) نوشتن به افزونه که هربار رفتم توی جادی.نت منو ببره به جادی۲.آندو.ایت.

چون قبلا اکانت دولوپر کروم رو خریده بودم اون رو توی کروم استور هم منتشر کردم. شما هم اگه با کروم وبلاگ جادی رو می‌خونید می‌تونید این افزونه رو از این‌جا نصب کنید. در ضمن کدهای افزونه رو می‌تونید توی گیت‌هاب پیدا کنید.

پی‌نوشت: این افزونه قرار بود به صورت یه افزونه‌ی کلی‌تر منتشر بشه و برای همین هم کدهای افزونه واقعا پیچیده‌تر از اون چیزیه که در حالت ساده و فقط برای وبلاگ جادی باید باشه. ولی چون حوصله‌ی کامل کردن افزونه رو تا چند روز آینده ندارم یه افزونه‌ی جدا برای وبلاگ جادی منتشر می‌کنم. شاید این‌جوری بهتر هم باشه.

پی‌نوشت۲: این نسخه فقط وقتی برید به آدرس جادی.نت شما رو می‌فرسته به جادی۲.آندو.ایت. فعلا (تا آپدیت بعدی اگر آپدیتی وجود داشته باشه!) اگر عکس‌ها و فایل‌ها از جادی.نت بارگذاری بشن (و تو یه tab جدید باز نشن) آدرس‌ها عوض نمی‌شن.

آموزش برنامه‌نویسی – بخش نهم – آرایه‌ها && توابع بازگشتی

توی بخش قبلی در مورد توابع یاد گرفتیم. یادگرفتیم که چه‌جوری توابع رو تعریف کنیم و از اون‌ها استفاده کنیم. امروز علاوه بر این که توی بحث تکنیکی کار جلو می‌ریم روی بحث الگوریتم هم یه ذره کار می‌کنیم و یک مدل الگوریتمی پرکاربرد رو هم یاد می‌گیریم.

ادامه خواندن آموزش برنامه‌نویسی – بخش نهم – آرایه‌ها && توابع بازگشتی

آموزش برنامه‌نویسی – بخش هفتم – پایان حلقه‌های بی‌پایان!

سلام!
بعد از مدت‌ها (و احتمالاً پیش از مدت‌ها!) که نبودم و آموزش برنامه‌نویسی تعطیل شده بود بین درگیری‌های کنکور بالاخره وقتی پیدا شد که آموزش رو ادامه بدم و البته چون درگیری‌های کنکور روز به روز داره زیاد می‌شه معلوم نیست دوباره کی بتونم این کار رو ادامه بدم (امیدوارم که بشه ادامه بدم و اگر هم نشد مطمئناً بعد از کنکور ادامه میدم و برای همین هم توی پرانتز اول گفتم پیش از مدت‌ها!) و البته دیر و زود داره ولی سوخت و سوز نداره!

امروز می‌خواهیم باهم یادگیری حلقه‌ها رو ادامه بدیم.

ادامه خواندن آموزش برنامه‌نویسی – بخش هفتم – پایان حلقه‌های بی‌پایان!

آموزش برنامه‌نویسی – بخش ششم – شرط‌ها و حلقه‌ها

سلام

به بخش ششم آموزش برنامه‌نویس خوش اومدید

توی بخش قبلی یه‌ذره با شرط‌ها آشنا شدیم و حالا می‌خواهیم بیش‌تر باهاشون آشنا بشیم.

ما یاد گرفتیم که شرط‌های ما باید این‌جوری باشن:

if(/*if statement*/)
{
//do something...
}
else
{
//if not do this job...
}

و البته اینکه می‌شه توی ifهامون از ifهای دیگه هم استفاده کنیم و برای این کار هیچ محدودیتی وجود نداره.

همین‌طور فهمیدیم که چیزی که توی پرانتزهای جلوی if می‌نویسیم در‌واقع یک نتیجه‌ی شرطی بر می‌گردونه و براساس اون نتیجه دستور داخل if اجرا می‌شه یا اجرا نمی‌شه.

همون‌طور که متغیرهای عددی‌مون یک‌سری عملیات ریاضی داشتن برای متغیرهای منطقی (یعنی همین درست یا غلط خودمون) هم یک‌سری عملیات وجود داره که اتفاقاً خیلی هم کاربردیه. البته قبلاً هم بدون این که بدونیم از این عملیات ها استفاده کردیم ولی خودمون خبر نداشتیم.

اولین عملگری که بررسی می‌کنیم روی چندتا متغیر منطقی کار نمی‌کنه بلکه فقط روی یکی متغیر منطقی تغییر ایجاد می‌کنه. این عملگر مقدار برعکس متغیر منطقی‌مون رو برمی‌گردونه. یعنی اگر «درست» باشه «غلط» رو بر می‌گرونه و بلعکس. توی سی‌پلاس‌پلاس هم با علامت تعجب «!» نمایش داده می‌شه. مثلاً فرض کنیم می‌خواهیم چک کنیم که فرد مورد نظر ۱۰ سال‌ش نباشه. برنامه‌مون این‌جوری می‌شه:

int main()
{
int age;
cin >> age;
if(!(age==10))
cout << “The Age is not 10!”;
}

و همون‌طور که می‌بینید مثل عبارت‌های ریاضی می‌تونیم به مقدار لازم و دلخواه از پرانتز هم استفاده کنیم تا کدمون خواناتر بشه و البته توی مثال بالا حتماً باید از پرانتز استفاده کنیم وگرنه داریم به کامپیوتر می‌گیم که نقیض متغیر age رو برگردون در صورتی که age متغیر عددیه و نقیض نداره و این باعث می‌شه برنامه‌مون کامپایل ارور بگیره.

عملگر بعدی and هست‌ش. اگر یه ذره انگلیسی بلد باشید حتماً می‌دونید که and حرف اضافه‌ی «و» هست‌ش و توی عملیات منطقی هم زمانی «درست» رو بر می‌گردونه که همه‌ی متغیرهای منطقی‌ای که با and کنار هم می‌ذاریم درست باشن. توی سی‌پلاس‌پلاس برای and از علامت && استفاده می‌شه. دقت کنید که & با && فرق داره!

مثلاً فرض کنید می‌خواهیم چک کنیم که سن یه آقایی (یا خانومی) از ۱۸ بزرگ‌تر و از ۱۰۰ کوچکتر باشه. برنامه‌مون می‌شه این:

int main()
{
int age;
cin >> age;
if(age > 18 && age < 99)
cout << “The Age is correct!”;
}

و خوب چون در منطق روزمره هم از مفهموم «و» استفاده می‌کنیم فکر نمی‌کنم درک‌ش سخت باشه.

عملگر منطقی بعدی که می‌خواهیم در موردش صحبت کنیم or یا «یا» به زبان فارسی هستش و بازهم فکر کنم واضح باشه که چی‌کار می‌کنه. اگر از چندتا عملگری که باهم orشون می‌کنیم فقط یکی‌شون درست باشه نتیجه‌ی نهایی درست خواهد بود. توی سی‌پلاس‌پلاس «یا» رو با || (Shift + پ توی کیبورد غیر استاندارد!) نمایش می‌دیم. باز هم دقت کنید که از دوتا | استفاده می‌کنیم یعنی ||

مثلاً می‌خواهیم بررسی کنیم که عددمون به ۲ یا ۳ بخش‌پذیر باشه. برنامه‌مون این‌جوری می‌شه

int main()
{
int n;
cin >> n;
if((n%2)==0 || (n%3)==0 )
cout << “It's ok!”;
}

عملگرهای دیگه‌ای هم هستند که چون کاربردشون خیلی کم‌تره وقتی لازم‌مون شد باهاشون آشنا می‌شیم.

مبحث پرکاربرد بعدی که امروز در موردش یاد میگیریم مبحث حلقه‌هاست. یکی از اصلی‌ترین کاربرد کامپیوتر برای افراد عادی و برنامه‌نویسا اینه که کارای تکراری‌شون رو بدن به کامپیوتر انجام بده (حالا بگید برنامه‌نویسا تنبل نیستن!) مثلاً بیست‌بار بنویسه سلام یا مثلاً نمره‌ی همه‌ی دانش‌آموزها رو ۲ نمره اضافه کنه و اینا کارهای به غایت دشواریه که برنامه‌نویس‌ها اینا رو به کامپیوتر می‌دن تا براشون انجام بده.

حلقه‌ها هم انواع مختلفی دارند که ما با for شروع می‌کنیم. توی انگلیسی for رو معمولاً به معنی «برای» دیدیم ولی «به مقدار…» هم معنی می‌ده. هر for یک متغیر شمارنده داره که اصولاً کارها رو با اون انجام می‌دیم. برای استفاده از for شما باید متغیر شمارنده‌ش رو به برنامه معرفی کنید و برای اتمام for یه شرط تعیین کنید و بگید که هربار که کاری رو که باید انجام بده انجام داد چه بلایی سر متغیر شمارنده بیاد. (عمرا اگه فهمیده باشید با طرز بیان رویایی من!)

مثل if مواد لازم برای for رو هم توی یه پرانتز روبروی اون بهش می‌دیم. چون این‌جا سه‌تا چیز رو باید به for بدیم لازمه که اونا رو از هم جدا کنیم. به کمک ; (نقطه‌ویرگول) این سه‌تا رو از هم جدا می‌کنیم.

اولین چیزی که باید به for بدیم متغیر شمارنده‌ی for هستش که لازم نیست قبل از for تعریف بشه. بلکه می‌تونیم موقع تحویل بسازیم‌ش. و البته متغیر شمارنده‌مون باید یه مقدار هم داشته باشه (معمولاً مقدارش صفره).

بخش تعیین متغیر شمارنده (که اولین بخشه) فقط یک‌بار و اون‌هم قبل از شروع for اجرا می‌شه و برنامه دیگه به اون بخش کاری نخواهد داشت.

چیز بعدی‌ای که باید به for بدیم شرط اجراشدن دستورات for هست‌ش. یعنی مثل if این‌جا هم یک مقدار منطقی می‌گیره که اگر «درست» باشه دستورات‌ش رو اجرا می‌کنه و اگر «غلط» بود کارش رو تموم‌شده فرض می‌کنه و از for میاد بیرون.

و بخش آخر هم بخشیه که اون‌جا دستوری رو می‌نویسیم که هروقت یک حلقه‌ی for تموم شد اون دستور اجرا می‌شه.

به‌صورت خلاصه و مرحله به مرحله وقتی برنامه به for می‌رسه برای اولین بار، اول بخش اول رو اجرا می‌کنه (متغیر شمارنده رو تعریف و مقداردهی می‌کنه) و بعد شرط بخش دوم رو چک می‌کنه و اگر شرط درست بود دستورات for رو اجرا می‌کنه و بعد بخش سوم رو اجرا می‌کنه (یه بلایی سر متغیر شمارنده میاره) و شرط بخش دوم رو چک می‌کنه و اگر درست بود دوباره دستورات رو اجرا می‌کنه و دوباره بخش سوم رو اجرا می‌کنه و این کارها رو (بخش سوم -> بخش دوم -> دستورات) تا زمانی که شرط بخش دوم درست باشه انجام می‌ده و زمانی که بخش دوم غلط شد از for بیرون میاد و دستورات بعد از for رو اجرا می‌کنه. (دستورات بعد از for یعنی دستورات بعد از for و بلاک‌کد بعد از for!)

برای مثال بیاد اعداد ۱ تا ۱۰ رو چاپ کنیم:

for (int i=1;i<11;i++)
{
cout << i;
}

اگر یادم رفته قبلاً بهتون بگم الان می‌گم که ++ یعنی این که به متغیر ما یک عدد اضافه کن و – هم یعنی از متغیر یک‌دونه کم کن. شما می‌تونید ++ رو قبل یا بعد از اسم متغیر به‌کار ببرید. اگر ++ قبل از متغیر باشه قبل از این که مقدار متغیر بازگردانی بشه مقدار اون یکی اضافه می‌شه و بعد خروجی داده می‌شه. ولی اگر بعد از اسم متغیر ++ بذاریم اول مقدار متغیر خروجی داده می‌شه و بعد مقدار اون یکی اضافه می‌شه. البته اگر داشته باشیم: C++; با ++C; (برای متغیر فرضی C) فرقی نخواهد داشت (چون مقداری خروجی نمی‌گیریم) ولی cout >> C++;  با cout >> ++C;  فرق دارن و اولی مقدار اولیه‌ی C رو چاپ می‌کنه ولی دومی مقدار اولیه‌ی C رو با یک جمع می‌کنه و بعد چاپ می‌کنه و البته در هر دو دستور مقدار نهایی C برابر جمع مقدار اولیه‌ی C با یک هست‌ش و مقدار C در این عملیات تغییر می‌کنه.

توی مثال بالا بخش تعریف‌کردن متغیر بخش int i=1  هست‌ش؛ بخش شرط‌مون i<11  هست‌ش و بخش سوم (که یه بلایی سر متغیر حلقه میاریمi++  هست‌ش که همون‌طور که توضیح دادم مقدار i رو یکی اضافه می‌کنه.

خوب بیاید مثال رو یه‌ذره پیچیده‌ترش کنیم و عددهایی که مضرب ۳ هستن رو از ۱ تا ۱۰۰ چاپ کنیم. برنامه‌مون این‌جوری می‌شه:

for (int i=1;i<101;i++)
{
if(i%3==0)
cout << i;
}

خوب تو این‌جا توی بلاک کد for از یه if استفاده کردیم. تا اگر عددمون که این‌جا i باشه بر ۳ بخش‌پذیر بود اون رو چاپ کنیم.

همون‌طور که می‌دونید از تودرتو بودن بلاک‌های کد هیچ محدودیتی وجود نداره واین‌جا هم ما برای استفاده از for توی یه for دیگه هیچ مشکلی نداریم. یک مثال خوب این قضیه هم چاپ‌کردن جدول ضربه که این‌جوری می‌شه:

for(int i=1;i<11;i++)
{
for(int j=1;j<11;j++)
{
cout << i*j << "t";
}
cout << endl;
}

و برنامه‌تون همون جدول ضربی که توی ابتدایی یاد گرفتیم رو برامون چاپ می‌کنه.

یا مثال دیگه می‌تونه چاپ‌کردن یه مربع باشه که بازهم مثل جدول ضرب خواهد بود:

for(int i=1;i<11;i++)
{
for(int j=1;j<11;j++)
{
cout << "*";
}
cout << endl;
}

و یا حتی می‌تونی متغیر for داخلی رو وابسته به for خارجی قرار بدیم تا باهاش یه مثلث چاپ کنیم:

for(int i=1;i<11;i++)
{
for(int j=i;j<11;j++)
{
cout << "*";
}
cout << endl;
}

که تنها کاری که کردیم این بود که توی for دوم به‌جای int j=0 قرار دادیم int j=i و نتیجه‌ش هم شکلی مثل این شد:

**********
*********
********
*******
******
*****
****
***
**
*

برای تمرین

۱. ب.ب.ک شکل روبرو رو چاپ کنه و بعدش برنامه‌تون رو جوری تغییر بدید که تعداد خط‌های مثلث رو از کاربر بگیره.

*
**
***
****
*****
******
*******
********
*********

۲. ب.ب.ک یک مثلث متساوی‌الساقین چاپ کنه.

۳. ب.ب.ک یک لوزی چاپ کنه.

آموزش برنامه‌نویسی – بخش پنجم – چرا هر آموزشی باید عنوان داشته باشد؟

سلام. با بخش پنج آموزش برنامه‌نویسی در خدمت‌تون هستیم.

توی بخش قبل ما یاد گرفتیم این‌جوری چندتا متغیر بسازیم و درجا مقداردهی‌شون هم بکنیم:

int ali = 1, reza = 3, hadi = 3;

و این‌جوری هم مقدار متغیر رو از کاربر بگیریم:

cin >> ali >> hadi >> reza;

و اینی که می‌بینید توی آمورش قبلی ۲۰۰۰کلمه از من تایپیدن گرفت!

دفعه‌ی قبل بعد از خلاصه‌ای که اول آموزش گفتیم یه بخش مفهومی هم داشتیم تا ببینیم پشت اون کدهایی که می‌نویسیم واقعا چی می‌گذره ولی امروز چون درس‌مون به‌جایی نرسیده که چیز خاصی رو بتونم توضیح بدم (یا به ذهنم نمی‌رسه که چیزی رو توضیح بدم) امروز از این خبرا نیست.

توی جلسه‌ی قبل یادمون رفت که بگیم چجوری یه متغیر رو چاپ کنید و البته فکر کنم خودتون حدس زدید که چجوریه ولی چون من باید به رسالت آموزشی خودم (!!!) عمل کنم پس بهتون می‌گم چجوری. واضحه که برای چاپ متغیر باید از cout  استفاده کنیم و بعد از >>  بدون این‌که علامت دیگه‌ای بزاریم اسم متغیر رو می‌نویسیم. یعنی این‌جوری:

cout << reza << ali << hadi << endl;

پس همین‌جا می‌تونیم نتیجه بگیریم که endl  هم خودش یه متغیر از یه نوعیه که نمی‌شناسیم‌ش که باعث می‌شه “n”  منتشر بشه.

فعلا بهش نمی‌پردازیم باشه بعدا.

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

محتویات پرانتزها

ضرب و تقسیم

جمع و تفریق

و یه عملگر دیگه هم داریم به اسم عملگر باقیمانده که اولیت‌ش آخر از همه‌ست.

عملگر باقیمانده با %  نمایش داده می‌شه و واضحه که باقیمانده‌ی عدد سمت چپ‌ش بر عدد سمت راست‌ش رو خروجی می‌ده و اون عدد سمت راست یا چپ می‌تونه متغیر هم باشه.

مثلا

6 % 3

خروجی‌ش 0  خواهد بود و

6 % 4

هم 2  رو خروجی می‌ده و توی کد زیر:

int ali=100, reza= 80;
cout << ali % reza;

عدد 20 رو خروجی می‌گیریم و البته اگر عدد سمت راست از عدد سمت چپ بزرگ‌تر باشه خروجی همون عدد سمت چپ می‌شه. (بدیهی‌نامه!)

خوب ما الان متغیرمون رو هم داریم ولی بازم به دردمون نمی‌خوره چون تهِ‌تهِ‌ش کار خاصی نمی‌تونیم با متغیرمون بکنیم.

برای این‌که برنامه‌مون یه‌ذره پویاتر باشه باید اطلاعاتی که از کاربرامون می‌گیریم رو به روش‌های مختلف پردازش کنیم. اولین و تقریبا پرکاربردترین روش پردازش این اطلاعات استفاده از شرط‌هاست. یادتونه توی اولین آموزش‌مون وقتی روبات‌مون یه‌ذره خنگ‌تر بود و شرایط رو نرمال در نظر گرفته بودیم، توی الگوریتم بهش می‌گفتیم «اگه یه چیز جامد سفید دیدی اون رو بریز توی لیوان»؟ این از اولین شرط‌هایی بود که باهم باهاشون آشنا شدیم و البته شرط‌هایی که من یادم نمیاد ولی فکر کنم بودن!

مطمئن باشید که توی سی‌پلاس‌پلاس هم ما از این شرط‌ها داریم وگرنه که نمی‌شه اسم‌ش رو زبان برنامه‌نویسی گذاشت

توی سی‌پلاس‌پلاس شرط‌ها با if  مشخص می‌شن که توی انگلیسی هم «اگر» معنی می‌ده (برا همین می‌گن سی‌پلاس‌پلاس به زبان انسان‌ها نزدیکه! البته زبان کفار بی‌ناموس خدانشناس عرق‌خور مالِ‌مردم‌خور شیطان‌پرست فراماسون دجال‌پرست تئوری توطئه‌ی انگلیسی زبان!) و عبارت شرطی رو بعد از if توی یه پرانتز می‌نویسیم و اگر چندتا شرط داشته‌باشیم هم اونا رو توی پرانتزهای جداگانه می‌نویسیم وبزارید اینا رو بعدا توضیح بدم.

اول این‌که توی پرانتزی که جلوی if  می‌ذاریم باید عبارت شرطی‌مون رو بنویسیم. فعلا عبارت‌های شرطی‌مون عبارت‌های مقایسه‌ای هستن. یعنی باید دوتا مقدار رو باهم مقایسه کنیم و البته در نهایت شرط‌های پیچیده‌تر یا شرط‌هایی که مقایسه‌ای نیستن هم توی برنامه‌نویسی به شرط‌های مقایسه‌ای بر می‌گردن (یعنی در نهایت چه بخواهید چه نخواهید شرط‌ها مقایسه‌ای هستن. مثلا «اگر آمریکا حمله کنه» که در جواب شرط‌ش برنامه‌مون جواب دندان‌شکنی به آمریکا می‌ده شرطیه که از مقایسه‌ی یک وضعیت منطقه قبل از برخورد بمب‌های آمریکا‌ی کافرِ مسلمون‌کشِ بی‌دینِ «خون جوانان ما می‌چکد از چنگ تو»ِ «مرگ به نیرنگ تو»ِ استعمار جهانی و وضعیت همون منطقه بعد از برخورد بمب‌های همون آمریکایی که گفتم، بدست آورد.)

عبارت شرطی شامل دوتا مقدار هم‌نوع و یک عملگر (operator) شرطی‌ه و بعدا عبارت‌های شرطی‌ای که در ظاهر مقایسه‌ای نیستن ولی در پشت‌پرده از کلی شرط مقایسه‌ای تشکیل شدن رو هم بررسی می‌کنیم.

اون دوتا مقدار هم‌نوع معمولا متغیر هستن (یا حداقل یکی‌شون متغیره) و ما فعلا فقط int رو بلدیم و عملگرهای مقایسه‌ای هم عملگرهای مقایسه‌ای‌ای هستن که توی دوم دبستان یاد گرفتیم (و البته چندتا دیگه که تو دوم دبستان یاد نگرفتیم!) یعنی بزرگتر و کوچکتر >  <  و تساوی که برای این‌که با عملگر مقداردهی متغیر قاطی نشه از دوتا تساوی پشت‌سرهم استفاده می‌کنیم == و عملگر بزرگتر مساوی و کوچکتر مساوی <=  و «>= » و نامساوی <>. یادتون نره که توی عبارت‌های شرطی نمی‌تونیم از یک علامت تساوی استفاده کنیم.

و البته عبارت‌های شرطی هم خودشون خروجی‌ای از نوع یه متغیر دیگه به اسم bool که از کلمه‌ی boolean گرفته‌شده می‌دن و if  هم در واقع به اون خروجی نگاه می‌کنه. پس می‌شه به‌جای عبارت‌های شرطی از متغیرهایی از نوع bool استفاده کرد و البته این متغیرها رو هم می‌شه با عبارت‌های شرطی مقداردهی کرد.

در نهایت بعد از پرانتزی که توش عبارت‌های شرطی‌مون یا متغیر boolمون رو قرار دادیم باید دستوری رو بنویسیم که اگر محتویات پرانتز درست بود اون دستور اجرا بشه. اگر بخواهیم بیش از یک دستور را اجرا کنیم باید به یک‌طوری به کامپایلر بفهمونیم که قراره چه دستوراتی در صورت درست‌بودن شرط اجرا بشه و ما به کمک علامت‌های } و { این کار رو انجام می‌دهیم. به‌طور کلی هم این علامت‌ها برای دسته‌بندی (بسته‌بندی!) کدها مورد استفاده قرار می‌گیرن و البته ما تاحالا این علامت‌ها رو توی قالب کدنویسی‌مون دیدیم:

int main()
{
}

در آینده هم بیش‌تر باهم آشنا می‌شیم!

خوب حالا برای این‌که بیش‌تر متوجه بشیم بیاید باهم یه مثال حل کنیم. فرض کنیم می‌خوایم سن علی و رضا رو از کاربر بگیریم و اون‌ها رو باهم مقایسه کنیم و بگیم که سن اینا نسبت به هم چه وضعیتی داره. پس برنامه‌مون یه‌چیزی مثل این می‌شه:

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali==reza)
cout << "They are in the same age!";
if (ali > reza)
cout << "Ali is older than Reza!";
if (ali < reza)
cout << "Reza is older that Ali!";
}

و البته می‌شه این رو به شکل‌های دیگه هم پیاده کرد.

اگر دقت کنید می‌بینید که توی مثال بالا شرط سوم ما برعکس شرط دوم ماست و البته شرط دوم و سوم هم برعکس شرط اول هستن. یکی از راه‌هایی که به کامپایلر بگیم که در صورت درست‌نبودن شرط چه کاری انجام بده اینه که از کلیدواژه‌ی else استفاده کنیم و اتفاقا این خیلی هم معمول و معقوله!

ما می‌تونیم برای این‌که برنامه‌مون کارایی بیش‌تری داشته باشه از else استفاده کنیم. چرا؟ برای این‌که فرض کنید عبارت‌های شرطی اول و دوم و سوم نیاز به پردازش بسیار زیادی داشته باشند. در برنامه‌ی بالا بدون توجه به این‌که کدوم شرط درسته هر سه عبارت شرطی ما پردازش می‌شن و این ممکنه توی برنامه‌های بزرگ فاجعه به بار بیاره و البته این فاجعه هم چیزی نیست جز یکی از کابوس‌های برنامه‌نویس‌ها، کمبود منابع! و البته شما الان دارید (احتمالا) به این قضیه می‌خندید ولی وقتی مثل آهو تو عسل گیر کردید این برنامه‌تونه که به شما می‌خنده (و البته اون شکلک معروف ترول رو می‌تونید به‌جای قیافه‌ی برنامه‌تون تصور کنید! و بدانید و آگاه باشید که به همه‌ی اون شکلک‌ها نمی‌گن ترول بلکه اسم‌شون ……….. هستش و جادی هم نوشته‌ی خوبی در توضیح این قضیه داره.)

و البته یه قضیه‌ی دیگه هم اینه که شما می‌تونید هر تعدادی که دوست دارید توی ifهاتون یه if دیگه استفاده کنید و اصطلاحا بهش if تو در تو (یا 2×2!) می‌گن!

حالا بیاید مثال قبلی‌مون رو بازنویسی کنیم

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali==reza)
cout << "They are in the same age!";
else
{
if (ali > reza)
cout << "Ali is older than Reza!";
else
cout << "Reza is older that Ali!";
}
}

خوب حالا بیاید بررسی کنیم که چرا استفاده از else باعث می‌شه برنامه‌مون بهینه‌تر بشه: ببینید وقتی که برنامه اجرا می‌شه در حالت قبلی همون‌طور که گفتم همه‌ی عبارت‌های شرطی اجرا می‌شه ولی این‌جا در بهترین حالت ali == reza درسته و برنامه دیگه سراغ پردازش محتویات else بعد از شرط اول نمی‌ره و اگر هم این نباشه ali > reza پردازش می‌شه و اگر هم این درست نباشه چون شرط سوم رو حذف کردیم و جاش else گذاشتیم بازهم برنامه‌مون از حالت قبل سریع‌تر کارش رو انجام می‌ده.

برای همین هم پیشنهاد می‌کنم تو همچین عبارت‌های شرطی‌تون رو براساس احتمال درست‌بودن از بزرگ به کوچیک تو برنامه قرار بدید تا برنامه‌تون از این نظر در بهترین حالت خودش باشه. البته ما هم این قضیه رو توی مثال‌مون رعایت نکردیم که اگر بخواهیم رعایت کنیم برنامه‌مون می‌شه این:

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali<reza)
cout << "Ali is older than Reza!";
else
{
if (ali > reza)
cout << "Reza is older that Ali!";
else
cout << "They are in the same age!";
}
}

خوب فکر کنم برای این بخش کافی باشه. پیشنهاد می‌کنم برای این‌که بهتر یاد بگیرید این مبحث رو برای جلسه‌ی بعدی:

یه ماشین‌حساب ساده بنویسید که اول دوتا عدد از کاربر بگیره و بعدش به کاربر بگید که اگر می‌خواد اینا رو باهم جمع کنه عدد ۱ اگر می‌خواد تفریق کنه ۲ و تقسیم ۳ و ضرب ۴ رو وارد کنه و برنامه‌ی شما هم خروجی رو حساب کنه و به کاربر بگه. (پیشنهاد می‌کنم اولیت شرط‌هاتون این‌جوری باشه جمع، ضرب، تفریق و تقسیم)

یه برنامه بنویسید که سن سه نفر رو بگیره و اسم‌شون رو بر اساس ترتیب سن‌شون از بزرگ به کوچیک چاپ کنه.

یه برنامه بنویسید که توش سن دو نفر رو بگیره و بررسی کنه ببینه که آیا اختلاف سنی‌شون اون‌قدر کم هست که بتونن باهم دوست‌های صمیمی بشن یا نه (و خوب خودتون خلاقیت به‌خرج بدید در مورد حدود اختلاف‌سنی مناسب!)

تا جلسه‌ی بعدی خدانگهدار…