زنگ سی شارپ – قسمت بیست و هشتم

حل تمرین شماره ۱۴


مسعود درویشیان ۳۴ دیدگاه سی شارپ یکشنبه, ۱۸ام فروردین , ۱۳۹۲ 26747 بازدید

حل تمرین شماره ۱۴

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

زنگ سی‌شارپ - قسمت بیستم و هفتم

برای نوشتن هر برنامه‌ای، ابتدا می‌بایست آن را برای خودتان (تا آنجا که می‌توانید) تجزیه و تحلیل کنید و مستقیماً Code Editor را باز نکرده و شروع به برنامه‌نویسی نکنید! مسلماً اگر تازه‌کار باشید و برای نوشتن برنامه، بدون تحلیل اولیه مستقیماً سراغ کدنویسی بروید، احتمالاً بیشتر دچار مشکل می‌شوید بنابراین سعی کنید همیشه تحلیل اولیه را انجام دهید، هرچند که تحلیل کاملی نباشد!

لازم به ذکر است که حل این تمرین بر اساس مباحثی است که تاکنون مطرح شده‌اند و این تمرین می‌تواند از راه‌های بهتر و کدنویسی بسیار تمیزتری حل شود. بنابراین ما این تمرین را بر اساس مباحثی که تا قسمت ۲۷ گفته شده‌اند انجام می‌دهیم.

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

class Tune
{
    private string TuneName;
    private string Composer;
    private string Songwriter;
    private string Arrangement;
    private string TuneOwner;
    private string TuneGenre;
    private ushort TuneYear;
}

فعلاً از نوشتن متد و constructor ها صرف‌نظر می‌کنیم و در جای خود به آن‌ها می‌پردازیم.

در مرحله‌ی بعد می‌بایست یک تعریف برای خواننده (Artist) داشته باشیم. از این‌رو یک کلاس برای Artist تعریف می‌کنیم. فکر می‌کنید یک هنرمند (خواننده) برای اینکه در برنامه ما باشد به چه چیزهایی نیاز دارد؟ مسلماً هر خواننده اسم، فامیل، تعدادی آلبوم و تعدادی تک‌آهنگ دارد. بنابراین به فیلدهایی برای نام و نام خانوادگی و آرایه‌ای برای ذخیره آلبوم‌ها و آرایه‌ای برای ذخیره‌ی تک‌آهنگ‌ها نیاز داریم. همچنین باید بتوانیم برای این خواننده آلبوم و تک آهنگ اضافه کنیم پس متدهایی برای این منظور در نظر می‌گیریم:

class Artist
{
    private string ArtistName;
    private string ArtistFamily;
    private Album[] Albums;
    private Tune[] SingleTunes;

    public void AddAlbum()
    {
        // ...
    }
    public void RemoveAlbum()
    {
        // ...
    }
    public void AddSingleTune()
    {
        // ...
    }
    public void RemoveSingleTune()
    {
        // ...
    }
}

متدها و constructor اجرایی مربوط به این کلاس را بعداً تکمیل خواهیم کرد. در مرحله‌ی بعد باید بدانیم یک آلبوم چه ویژگی‌هایی می‌تواند داشته باشد. آلبوم نیز شامل اسم آلبوم، صاحب اثر، سبک آلبوم، سال انتشار آلبوم و تعدادی آهنگ است. همچنین به متدهایی برای اضافه و حذف کردن آهنگ‌های آلبوم نیاز داریم:

class Album
{
    private string AlbumName;
    private string AlbumOwner;
    private string AlbumGenre;
    private ushort AlbumYear;
    private Tune[] Tunes;

    public void AddTune()
    {
        // ...
    }
    public void RemoveTune()
    {
        //...
    }
}

تا اینجا کلاس‌هایی که یک جعبه‌ی موسیقی می‌تواند داشته باشد را مشخص کردیم. این کلاس‌ها باید به طریقی به هم مرتبط شوند تا داده‌ها بتوانند بین اشیایی که از کلاس‌ها ساخته می‌شوند، انتقال یابند. برای همین منظور به‌جای اینکه همه‌ی کدها و ارتباط بین کلاس‌ها را در متد ()Main بنویسیم، کلاسی به اسم UI تعریف می‌کنیم و ارتباط لازم را در آن کلاس برقرار می‌سازیم و در نهایت در متد ()Main کلاس UI را به اجرا در می‌آوریم تا برنامه اجرا شود. برای این منظور کلاس UI را (به‌طور خلاصه) به شکل زیر تعریف می‌کنیم:

class UI
{
    public string ShowMenu()
    {
        Console.Clear();
        Console.WriteLine();
        Console.WriteLine("╔═════════ Music Box ═════════╗");
        Console.WriteLine("║                             ║");
        Console.WriteLine("║ ۱٫ Add Artist               ║");
        Console.WriteLine("║ ۲٫ Show Artists             ║");
        Console.WriteLine("║ ۳٫ Exit                     ║");
        Console.WriteLine("║                             ║");
        Console.WriteLine("╚═════════════════════════════╝");
        Console.WriteLine();
        Console.WriteLine("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒");
        Console.WriteLine();
        Console.Write("Pick out a number: ");
        return Console.ReadLine();
    }

    public void Proccess(string choice)
    {
        switch (choice)
        {
            case "1":
                // Add Artist
                break;
            case "2":
                // show Artists
                break;
            case "3":
                // Exit
                break;
            default:
                Console.WriteLine("Invalid Choice!");
                break;
        }
    }
}

کلاس UI کلاسی شلوغ و پر از کد است چراکه همه‌ی کارها به‌طور عمده در همین‌جا انجام می‌شود. البته تا حد ممکن از متد و شی‌گرایی استفاده خواهد شد اما همان‌طور که ذکر کردیم حل این تمرین با توجه با مباحثی که تا اینجا مطرح شده انجام می‌شود و بهتر است بدانید این روشی که با آن، تمرین را انجام می‌دهیم تا حد زیادی غیر استاندارد است و در دنیای برنامه‌نویسی حرفه‌ای جایی ندارد. اما دلیلی برای نگرانی نیست چراکه شما باید پله پله مراحل برنامه‌نویسی حرفه‌ای را طی کنید و مطمئن باشید نمی‌توانید یک شبه ره صد ساله را بروید.

در متد ()Main برنامه به‌طور کامل به‌هم مرتبط و قابل اجرا می‌شود:

class Program
{
    static void Main()
    {
        UI engine = new UI();
        while (true)
        {
            engine.Proccess(engine.ShowMenu());
            Console.ReadLine();
        }
    }
}

برنامه ما به این ترتیب قابل اجرا خواهد بود. هنگامی‌که برنامه را اجرا می‌کنید می‌توانید از بین سه گزینه‌ی انتخابی یکی را انتخاب کرده تا کدهای مربوط به هر قسمت اجرا شود اما همان‌طور که می‌بینید، متد ()Proccess که عملیات مربوط به هر قسمت را انجام می‌دهد، خالی و تنها شامل یک دستور switch است.

در مرحله‌ی بعد، برای این‌که بتوانیم از کلاس‌هایی که تعریف کرده بهتر استفاده کنیم، برای هر کدام constructor تعریف خواهیم کرد. با کلاس MusicBox شروع می‌کنیم. همان‌طور که پیش‌تر بیان شد، MusicBox شامل آرایه‌ای از خواننده‌ها است. این کلاس نیز می‌تواند متدهایی به‌منظور کم و زیاد کردن و نمایش خواننده‌ها داشته باشد:

class MusicBox
{
    // Fields
    public Artist[] Artists;

    // Constructor
    public MusicBox(ushort size)
    {
        Artists = new Artist[size];
    }

    // Methods
    public bool AddArtist()
    {
        // ...
    }
    public void RemoveArtist()
    {
        // ...
    }

    public void ShowArtists()
    {
       // ...
    }
}

همان‌طور که می‌بینید، این کلاس شامل یک فیلد به‌نام Artists (که آرایه‌ای از جنس Artist است)، یک constructor و سه متد است. البته در طی تکمیل برنامه فیلدها و متدهایی به برنامه افزوده می‌شود. در constructor این کلاس، آرایه‌ای از جنس Artist ساخته شده که اندازه‌ی این آرایه، در حین ساختن شیء از MusicBox مشخص می‌شود.

در قسمت بعد به کلاس Artist یک constructor اضافه می‌کنیم. هنگامی‌که یک شیء از Artist ساخته می‌شود چه اطاعاتی را باید مقداردهی شوند؟ به‌نظر می‌رسد نام و نام‌خانوادگی، تعداد آلبوم و تعداد تک‌آهنگ‌های منتشر شده از آن خواننده بهتر است که در constructor مشخص شوند:

class Artist
{
    // Fields
    private string ArtistName;
    private string ArtistFamily;
    private Album[] Albums;
    private Tune[] SingleTunes;

    // Constructor
    public Artist(string artistName, string artistFamily)
    {
        ArtistName = artistName;
        ArtistFamily = artistFamily;

        Albums = new Album[5];
        SingleTunes = new Tune[10];
    }

    // Methods
    public void AddAlbum()
    {
        // ...
    }

    public void RemoveAlbum()
    {
        // ...
    }
    public void AddSingleTune()
    {
        // ...
    }
    public void RemoveSingleTrack()
    {
        // ...
    }
}

اگر به constructor این کلاس توجه کنید، می‌بینید که دو پارامتر artistName و artistFamily وجود دارند که به فیلدهای ArtistName و ArtistFamily اختصاص می‌یابند. همچنین آرایه‌ای از Album به اندازه ۵ (تعدادی آلبومی که هر خواننده می‌تواند در این جعبه موسیقی داشته باشد) و آرایه‌ای از Tune به اندازه ۱۰ (تعداد تک‌آهنگی که هر خواننده می‌تواند داشته باشد) در این constructor به‌وجود آمده است. این مقادیر (اندازه آرایه‌ها) را نیز می‌توانستیم مستقیماً از کاربر دریافت کنیم تا اندازه آن‌ها ثابت نباشد اما در این‌جا آن‌ها را ثابت در نظر می‌گیریم.

به نظر شما constructor کلاس Album به چه چیزهایی نیاز دارد؟ هنگامی که یک شیء از کلاس Album در حال ساخته شدن است، چه فیلدهایی باید مقداردهی شوند؟ مسلم است که همه‌ی فیلدهای آن باید مقداردهی شوند. هنگامی که قصد دارید یک Album بسازید باید نام آلبوم، صاحب آن، سبک، سال انشار و آهنگ‌هایی که در آن آلبوم قرار دارند را مشخص کنید. مجدداً به کلاس Album توجه کنید:

class Album
{
    // Fields
    private string AlbumName;
    private string AlbumOwner;
    private string AlbumGenre;
    private ushort AlbumYear;
    private Tune[] Tunes;

    // Constructor
    public Album(string albumName, Artist artist,
        string albumGenre, ushort albumYear, Tune[] tunes)
    {
        AlbumName = albumName;
        AlbumOwner = artist.GetArtistName();
        AlbumGenre = albumGenre;
        AlbumYear = albumYear;
        Tunes = tunes;
    }

    // Methods
    public void AddTune()
    {
        // ...
    }
    public void RemoveTune()
    {
        //...
    }
}

هنگامی‌که یک شیء از کلاس Album در حال ساخته شدن است، باید نام آلبوم، یک شیء Artist، سبک آلبوم، سال انتشار و یک آرایه از Tune را به آن بدهید تا شیء Album ساخته شود. نکته قابل توجه، شیء Artist و آرایه Tune است. هنگامی‌که شما یک شیء از Artist را ساخته و به constructor می‌دهید می‌توانید به تمام اعضای public شیء Artist دسترسی داشته باشید. همان‌طور که می‌بینید برای فیلد AlbumOwner ما به نام خواننده (صاحب آلبوم) نیاز داریم. برای این منظور یک متد public به کلاس Artist اضافه می‌کنیم تا نام خواننده را return کند. (به‌دلیل این‌که فیلدهای Artist همه‌گی private هستند نمی‌توانیم مستقیماً به آن‌ها دسترسی داشته باشیم):

public string GetArtistName()
{
    return ArtistName;
}

این متد در کلاس Artist قرار دارد و رشته‌ی ArtistName را return می‌کند و به‌صورت زیر به رشته‌ی AlbumOwner اختصاص داده می‌شود:

AlbumOwner = artist.GetArtistName();

همچنین tunes که آرایه‌ای از کلاس Tune است به constructor داده شده و به فیلد Tunes اختصاص می‌یابد. دقت کنید که در این لحظه شما آرایه‌ای به‌اسم tunes از جنس Tune را در آرایه‌ای دیگر به‌اسم Tunes که از جنس Tune است، می‌ریزید. آرایه‌ها باید همجنس هم باشند (هردو از جنس Tune)  در غیر این‌صورت برنامه شما کامپایل نخواهد شد. برای مثال نمی‌توانید آرایه‌ای از جنس Tune را به آرایه‌ای از جنس Artist اختصاص دهید.

نوبت به constructor کلاس Tune می‌رسد. Tune یا همان آهنگ مورد نظر برای هر خواننده، دو نوع دارد. آهنگ یا در یک آلبوم قرار دارد و یا به‌صورت تک‌آهنگ است. هنگامی‌که شما در حال ساخت شیء از Tune هستید، می‌توانید آهنگ را طوری به‌وجود آورید که مخصوص آلبوم یا به‌صورت تک‌آهنگ باشد. آهنگی که مخصوص آلبوم است، بعضی از اطلاعات آن مثل سال انتشار و صاحب آهنگ از قبل مشخص است اما یک تک‌آهنگ به سال انتشار و نام صاحب اثر نیز نیاز دارد. برای این منظور در این‌جا از constructor overloading استفاده کرده‌ایم:

class Tune
{
    private string TuneName;
    private string Composer;
    private string Songwriter;
    private string Arrangement;
    private string TuneOwner;
    private string TuneGenre;
    private ushort TuneYear;

    // Constructor for album tunes
    public Tune(
        string tuneName,
        string tuneGenre,
        string composer,
        string songwriter,
        string arrengement
        )
    {
        TuneName = tuneName;
        TuneGenre = tuneGenre;
        Composer = composer;
        Songwriter = songwriter;
        Arrangement = arrengement;
    }

    // Constructor for single tunes
    public Tune(
        string tuneName,
        string tuneGenre,
        string composer,
        string songwriter,
        string arrengement,
        ushort tuneYear,
        Artist artist
        )
        : this(tuneName, tuneGenre, composer, songwriter, arrengement)
    {
        TuneOwner = artist.GetNameAndFamily();
        TuneYear = tuneYear;
    }
}

به این ترتیب برای ساخت شیء از کلاس Tune به دو طریق می‌توانیم این‌کار را انجام دهیم. به‌منظور ساخت آهنگ برای آلبوم بایستی نام، سبک، شاعر، آهنگ‌ساز و تنظیم را مشخص کنید ولی به‌منظور ساخت تک‌آهنگ کافی است علاوه بر موارد قبلی، سال انتشار و Artist هم مشخص کنید. نکته‌ی قابل توجه در این‌جا کلمه‌ی کلیدی this در constructor تک‌آهنگ است. اگر در این‌جا از کلمه‌ی کلیدی this استفاده نمی‌کردیم، آن‌گاه constructor به شکل زیر می‌شود:

// Constructor for album tunes
public Tune(
    string tuneName,
    string tuneGenre,
    string composer,
    string songwriter,
    string arrengement
    )
{
    TuneName = tuneName;
    TuneGenre = tuneGenre;
    Composer = composer;
    Songwriter = songwriter;
    Arrangement = arrengement;
}

// Constructor for single tunes
public Tune(
    string tuneName,
    string tuneGenre,
    string composer,
    string songwriter,
    string arrengement,
    ushort tuneYear,
    Artist artist
    )
{
    TuneOwner = artist.GetNameAndFamily();
    TuneYear = tuneYear;

    // without this keyword
    TuneName = tuneName;
    TuneGenre = tuneGenre;
    Composer = composer;
    Songwriter = songwriter;
    Arrangement = arrengement;
}

همان‌طور که می‌بینید بدون کلمه‌ی کلیدی this مجبور شدیم چند خط کد اضافه‌تر بنویسیم تا فلیدها را مقداردهی کنیم درحالی‌که constructor قبلی این مقداردهی‌ها را انجام می‌دهد و در این‌جا فقط اضافه‌نویسی کرده‌ایم. با کلمه‌ی کلیدی this فیلدهایی که توسط constructor قبلی می‌توانند مقداردهی شوند را مشخص می‌کنیم تا آن constructor مقادیر را به فیلدها اختصاص دهد و در constructor دومی، فقط TuneYear و TuneOwner را مقدادهی می‌کنیم.

ادامه حل تمرین را در قسمت بعد دنبال کنید.



نویسنده / مترجم : مسعود درویشیان

علاقه مند به موسیقی و برنامه نویسی بازی


۳۴ دیدگاه برای این نوشته ثبت شده است


  1. رضا
    ۱۸ فروردین ۱۳۹۲

    سلام .
    وقت بخیر . من تا الان تونستم چند قسمت از آموزش های شما رو دنبال کنم .
    بیسیار جذاب و ساده توضیح داده شده . متشکر .

    میخواستم بپرسم تو این آموزه ها قسمتی هست که با استفاده از اون بتونیم یک دیکشنری ویندوز اپلیکیشن زیبا و کاربردی بسازیم ؟




    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

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




      • رضا
        ۱۸ فروردین ۱۳۹۲

        در کل با محیط ویندوز اپلیکیشن تو این مباحث آموزشی کار نمیشه ؟

        اگه راهنمایی در این مورد وجود داره یا کتاب الکترونیکی ممنون میشم معرفی کنید .
        البته مثل مقالات شما که فوق العاده ساده نویسی و بیان شده .




        • مسعود درویشیان
          ۱۸ فروردین ۱۳۹۲

          نه اینجا فقط با کنسول کار می‌کنیم
          کتاب Murach’s C# 2010, 4th Edition فکر کنم خوب باشه




  2. محمد فر
    ۱۸ فروردین ۱۳۹۲

    سلام استاد.من الان جلسه ۲۵ ام.خیلی دوست دارم زودتر خودمو برسونم.شما چه روزهایی درس جدید رو میزارید؟




    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

      سلام، هر هفته روزای جمعه




  3. davoud
    ۱۸ فروردین ۱۳۹۲

    سلام مسعود جان
    استادم برنامه داده گفته طبق سوییچ بنویسید
    من اونا رو جدا جدا می تونم بنویسم ولی طبق سوییچ نه . اگه راهنمایی کنید ممنون میشم
    برنامه اینه:
    برنامه ای بنویسید که عملیات زیر را انجام دهد
    ۱- ب. م.م و ک م م دو عدد
    ۲ اعداد اول کوچکتر از n
    ۳- جمله انم فیبوناچی
    ۴- n به توان n
    ۵- اعداد تام کوچکتر از n
    ۶- exit
    چطور میتون اینا با هم ادغام کنم که بشه سوییچ؟ مرسی




    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

      سلام، فقط کافیه هر کار خاص رو بذاری توی قسمت‌های مختلف switch

      using System;
      class Program
      {
          static void Main(string[] args)
          {
              Proccess(ShowMenu());
          }
          static string ShowMenu()
          {
              Console.WriteLine("1. B.M.M");
              Console.WriteLine("2. K.M.M");
              // ....
              Console.Write("Choose one number: ");
              return Console.ReadLine();
          }
          static void Proccess(string choice)
          {
              switch (choice)
              {
                  case "1":
                      // B.M.M
                      break;
                  case "2":
                      // K.M.M
                      break;
      
                  // and so on...
              }
          }
      }
      



      • davoud
        ۱۸ فروردین ۱۳۹۲

        مرسی از راهنمایتون. فقط یه سوال من برای هر برنامه یک سوییچ ایجاد کنم؟ یهنی ۵ تا سوییچ داشته باشم؟




        • مسعود درویشیان
          ۱۸ فروردین ۱۳۹۲

          نه، شما یه switch دارین، هر برنامه‌تون رو توی یه case قرار بدید
          مثل همینی که براتون نوشتم، ب.م.م توی یه case، ک.م.م توی یه case دیگه و…




  4. داوود
    ۱۸ فروردین ۱۳۹۲

    به به ؛ سلام آقا مسعود گل؛ چه عجب!!! برگشتید دوباره!
    سال جدید رو مجددا به حضرتعالی تبریک میگم.
    آواتار جدیدت شبیه کارآگاهها شده. مبارکه!!!!
    مسعود جان پس طبق گفته شما در ابتدای این درس اگه نتونستیم خیلی جالب این برنامه رو بنویسیم نگران و ناراحت نباشیم؟
    ضمنا اشکال نداره اگه درس ۲۶ رو خوب یاد نگرفتیم؟ آخه من بعد از خوندن اون درس کلا برگشتم و دوباره از ابتدای کلاسها شروع به خوندن کردم. هرچی یادداشتم رو با درس ۲۶ گیج شده و قاطی کردم. میشه درس ۲۶ رو خوب یاد نگیریم؟
    ضمنا یک سوال داشتم؛ چطور یک متغیر رو طوری عمومی در نظر بگیریم که بشه در همه کلاسهای همون برنامه ازش استفاده کرد؟ آیا اصلا این کار اصولی هستش و با کپسوله سازی منافات نداره؟؟
    بعنوان مثال فرض کنیم برنامه ای هست که قراره هر کلاس اون عملیات مختلف ریاضی رو انجام بدن.
    ما در ابتدا متغیر رو چطوری تعریفش کنیم و چطوری بگیریمش که در همه کلاسها قادر به استفاده از اون باشیم؟
    ممنون و دستت درد نکنه که دوباره برگشتی.
    موفق باشی




    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

      سلام مرسی از لطفت، سال نو شما هم مبارک باشه
      نه اگه نتونستید تمرین رو حل کنید مشکلی نداره ولی به حل تمرین خوب دقت کنید
      قسمت ۲۶ هم اتفاقاً خیلی مهم هست هرجاشو متوجه نشدید بگید تا من واضح‌تر بگم

      در مورد متغیر هم public در نظر می‌گیرید دیگه! (اگه می‌خواین تو کلاس‌های دیگه هم مورد استفاده قرار بگیره!) اگه می‌خواین علاوه بر public بودن به هیچ شیءای وابسته نباشه، اونو static در نظر می‌گیرید. البته access modifiers های دیگه هم هستن که در جای خودشون توضیح داده می‌شه




    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

      در ضمن مگه قرار بود برنگردیم؟ :) این مجموعه آموزشی که نیمه کاره نمی‌مونه، تا آخرش با موفقیت پیش میره ;)




  5. davoud
    ۱۸ فروردین ۱۳۹۲

    ببخشید من گیج شدم این برنامه ب م م و ک م م منه میشه بگید این رو چور داخل برنامه شما بذارم؟

            static void Main(string[] args)
            {
                int a = 0, b = 0;
                int bmm = 0, kmm = 0;
                int x1=0,x2=0,x3=0,k1=0,k2=0;
                Console.Write("Enter a : \t");
                    a=int.Parse(Console.ReadLine());
                    Console.Write("Enter b : \t");
                    b=int.Parse(Console.ReadLine());
                    x1=(a%b);
                    x2=(b%x1);
                    x3=(x1%x2);
                    if (x3 == 0)
                    {
                        bmm = x2;
    
                        k1 = (a / bmm);
                        k2 = (k1 * b);
                        kmm = k2;
                    }
                Console.Write("a is {0} , b is {1} , bmm is {2} and kmm is {3} .\n",a,b,bmm,kmm);
                Console.ReadLine();
    



    • مسعود درویشیان
      ۱۸ فروردین ۱۳۹۲

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

      using System;
      class Program
      {
          static void Main(string[] args)
          {
              Proccess(ShowMenu());
          }
          static string ShowMenu()
          {
              Console.WriteLine("1. B.M.M");
              Console.WriteLine("2. K.M.M");
              // ....
              Console.Write("Choose one number: ");
              return Console.ReadLine();
          }
          static void Proccess(string choice)
          {
              switch (choice)
              {
                  case "1":
                      // B.M.M
                      int a = 0, b = 0;
                      int bmm = 0, kmm = 0;
                      int x1 = 0, x2 = 0, x3 = 0, k1 = 0, k2 = 0;
                      Console.Write("Enter a : \t");
                      a = int.Parse(Console.ReadLine());
                      Console.Write("Enter b : \t");
                      b = int.Parse(Console.ReadLine());
                      x1 = (a % b);
                      x2 = (b % x1);
                      x3 = (x1 % x2);
                      if (x3 == 0)
                      {
                          bmm = x2;
      
                          k1 = (a / bmm);
                          k2 = (k1 * b);
                          kmm = k2;
                      }
                      Console.Write("a is {0} , b is {1} , bmm is {2} and kmm is {3} .\n", a, b, bmm, kmm);
                      Console.ReadLine();
                      break;
                  case "2":
                      // K.M.M
                      break;
      
                  // and so on...
              }
          }
      }
      



      • davoud
        ۱۸ فروردین ۱۳۹۲

        مرسی و شب خوش




      • davoud
        ۱۹ فروردین ۱۳۹۲

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

        static void Main(string[] args)
                {
                    Proccess(ShowMenu());
                }
                static string ShowMenu()
                {
                    Console.WriteLine("1. B.M.M");
                    Console.WriteLine("2. K.M.M");
                    Console.WriteLine("3.primeNumber");
                    Console.WriteLine("4.fibonachi");
                    Console.WriteLine("5.power");
                    Console.WriteLine("6.tam");
        
                    Console.Write("Choose one number: ");
                    return Console.ReadLine();
                }
                static void Proccess(string choice)
                {
                    switch (choice)
                    {
                        case "1":
                            // B.M.M
                            int a = 0, b = 0;
                            int bmm = 0, kmm = 0;
                            int x1 = 0, x2 = 0, x3 = 0, k1 = 0, k2 = 0;
                            Console.Write("Enter a : \t");
                            a = int.Parse(Console.ReadLine());
                            Console.Write("Enter b : \t");
                            b = int.Parse(Console.ReadLine());
                            x1 = (a % b);
                            x2 = (b % x1);
                            x3 = (x1 % x2);
                            if (x3 == 0)
                            {
                                bmm = x2;
        
                                k1 = (a / bmm);
                                k2 = (k1 * b);
                                kmm = k2;
                            }
                            Console.Write("a is {0} , b is {1} , bmm is {2} and kmm is {3} .\n", a, b, bmm, kmm);
                            Console.ReadLine();
                            break;
                        case "2":
                            // K.M.M
                            break;
        
                        case "3":
                            //primeNumber
                            static void Main(string[] args)
                {class Program
        {
        //*** *
        static bool Prime(long n)
        {
        if ((n == 2) || (n == 3) || (n == 5)) return true;
        else
        for (int i = 2; i = 100000; i--)
        if (Prime(i) == true) { Console.Write("{0}\t", i); 
            break;  
            
            case "4":
            //fibonachi
            int Num, Number1, Number2, Number3;
                    Console.Write("Please enter your number count: ");
                    Num = Convert.ToInt32(Console.ReadLine());
                    Number1 = 1;
                    Number2 = 2;
                    Console.Write("1 " + Number1 + " " + Number2);
                    for (int i = 3; i < Num; i++)
                    {
                        Number3 = Number1 + Number2;
                        Console.Write(" " + Number3);
                        Number1 = Number2;
                        Number2 = Number3;
                    }
        
                    break ;
            case "5":
                //power
                       Console.Write("Enter base number: ");
                int baseNo = Convert.ToInt32(Console.ReadLine());
                Console.Write("Enter power number: ");
                int powerNo = Convert.ToInt32(Console.ReadLine());
         
                int result = 1;
         
                for (int counter = 1; counter <= powerNo; counter++)
                    result = baseNo * result;
         
                Console.WriteLine();
                Console.WriteLine("The result is " + result);
                Console.WriteLine();
                break ;
            case "6":
            //tam
            private bool IsPerfectNumber(int Input)
        {
        if (Input == 1 | Input == 0)
        return true;
        
        if (Input < 0)
        return false;
        
        
        bool output = false;
        int sum = 0;
        
        for (int i = 1; i <= Math.Floor((double)(Input / 2)); i++)
        {
        if (Input % i == 0)
        {
        sum += i;
        }
        }
        
        if (sum == Input)
        output = true;
        else
        output = false;
        
        
        return output;
                break ;
                default :
                Console .WriteLine ("exit");
                break;
        
        
            
                    }
                }
            }
        }
        



        • مسعود درویشیان
          ۱۹ فروردین ۱۳۹۲

          آره البته حواستون باشه، هر برنامه فقط یه متد ()Main داره، شما این برنامه‌ها رو قبلاً جداجدا می‌نویشتین، حالا هرچیزی که توی متد ()Main اون برنامه‌های جداجدای قبلی‌تون بوده رو بر می‌دارین می‌ذارین توی case های مختلف :)
          آره تقریباً درسته




          • davoud
            ۱۹ فروردین ۱۳۹۲

            مرسی از راهنمایتون




  6. داوود
    ۱۹ فروردین ۱۳۹۲

    ممنونم مسعود جان؛ حالا که دوباره شروع کردم و از اول دارم میخونم و الان رسیدم به درس ۱۴ و ۱۵٫ احساس کردم شاید خوب نخوندم که اون قسمت برام سنگین و درکش مشکل بود.
    سعی می کنم سرعتم رو بیشتر کنم تا زودتر برسم به او ن قسمت.
    ضمنا در خصوص سوالی که کرده بودم ؛ این برنامه رو ببین:

    using System;
    class Program
    {
        
        static void Main()
        {
            
            divizer MyProg = new divizer();
            MyProg.GetNumber("Please Enter your Number:");
            MyProg.Process();
            fortest ff = new fortest();
            ff.test();
            
    
        }
    }
    class divizer
    {
        private int k;
        public int GetNumber(string message)
        {
            Console.WriteLine(message);
            k = int.Parse(Console.ReadLine());
            return k;
        }
    
        public int ReadNumber()
        {
            return k;
        }
    
        public void Process()
        {
            for (int j = 1; j < k; j++)
            {
                if ((k % j) == 0)
                    Console.WriteLine(j);
            }
    
        }
    }
    
    class MySum
    {
        
        public void test()
        {
           
           
          
        }
    
    }
    
    class Myminues
        {
    
        public void test()
        {
    
    
    
        }
    
    }
    

    در این برنامه به چه نحوی ما K رو از کاربر دریافت کنیم که علاوه بر اینکه فقط یکبار دریافت بشه؛ تو همه کلاسها هم قابل استفاده باشه؟ کجا تعریفش کنیم که این قابلیت رو داشته باشه؟
    ممنونم




    • مسعود درویشیان
      ۱۹ فروردین ۱۳۹۲

      متغیر رو اینطوری تعریف می‌کنی:

      و اینطوری هم استفاده می‌کنی:




      • داوود
        ۱۹ فروردین ۱۳۹۲

        خیلی خیلی ممنون و متشکرم. مرسی. عالی بود.




  7. رضا
    ۱۹ فروردین ۱۳۹۲

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

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

    میتونم ایمیلتون رو داشته باشم ؟




  8. رضا
    ۱۹ فروردین ۱۳۹۲

    رفتم متوجه نشدم .

    این کد رو نوشتم اما بر حسب رادیان میده

     Console.BackgroundColor = ConsoleColor.Blue;
                Console.Clear();
                Console.ForegroundColor = ConsoleColor.Yellow;
                double x; double y; double sum; double Multiplication; double Subtraction; double Division; double RemainsDivided;
                double sin; double cos; double tan; double log; double Abs;
                double Cosh; double sinh; double tanh; double Power1; double Power2;
                double xPowerY; double jazr;
                Console.WriteLine("please enter x: ");
                x = double.Parse(Console.ReadLine());
                Console.WriteLine("please enter y: ");
                y = double.Parse(Console.ReadLine());
                sum = x + y;
                Subtraction = x - y;
                Multiplication = x * y;
                Division = x / y;
                RemainsDivided = x % y;
                sin = Math.Sin(x * 180);
                sin = Math.Round(sin, 3);
                cos = Math.Cos(x);
                cos = Math.Round(cos, 3);
                tan = Math.Tan(x);
                tan = Math.Round(tan, 3);
                log = Math.Log(x, y);
                log = Math.Round(log, 3);
                Abs = Math.Abs(x);
                Cosh = Math.Cosh(x);
                Cosh = Math.Round(Cosh, 3);
                sinh = Math.Sinh(x);
                sinh = Math.Round(sinh, 3);
                tanh = Math.Tanh(x);
                tanh = Math.Round(tanh, 3);
                jazr = Math.Sqrt(x);
                jazr = Math.Round(jazr, 3);
                Power1 = Math.Pow(x, 2);
                Power2 = Math.Pow(x, 3);
                xPowerY = Math.Pow(x, y);
                Console.WriteLine("sum = " + sum);
                Console.WriteLine("tafrigh = " + Subtraction);
                Console.WriteLine("zarb = " + Multiplication);
                Console.WriteLine("taghsim = " + Division);
                Console.WriteLine("baghi mande taghsim = " + RemainsDivided);
                Console.WriteLine("sin = " + sin);
                Console.WriteLine("cos = " + cos);
                Console.WriteLine("tan = " + tan);
                Console.WriteLine("sinh = " + sinh);
                Console.WriteLine("cosh = " + Cosh);
                Console.WriteLine("tanh = " + tanh);
                Console.WriteLine("log = " + log);
                Console.WriteLine("ghadre motlagh = " + Abs);
                Console.WriteLine("x^2 = " + Power1);
                Console.WriteLine("x^3 = " + Power2);
                Console.WriteLine("x^y = " + xPowerY);
                Console.WriteLine("jazr = " + jazr);
                Console.ReadLine();
    



    • مسعود درویشیان
      ۱۹ فروردین ۱۳۹۲

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

      using System;
      class TrigonometricDemo
      {
          static double DegreeToRadian(double angle)
          {
              return Math.PI * angle / 180.0;
          }
          static double Cosine(double angle)
          {
              return Math.Cos(DegreeToRadian(angle));
          }
          static void Main()
          {
              Console.WriteLine("Cosine: " + Cosine(2));
          }
      }
      



  9. شکوفه
    ۱۹ فروردین ۱۳۹۲

    سلام
    منم همین مشکلو دارم
    اگه میشه کد تبدیل رو تو برنامه آقا رضا بذارید تا متوجه بشم کجای برنامه قرار میگیره
    اینجور که شما گذاشتید همش ارور میده
    با تشکر از شما




    • مسعود درویشیان
      ۱۹ فروردین ۱۳۹۲

      متد DegreeToRadian دقیقا این تبدیل رو انجام می‌ده
      مشکل نداره تستش کردم




      • رضا
        ۱۹ فروردین ۱۳۹۲

        جناب درویشیان منم هر کاری کردم نتونستم این کد رو جایی قرار بدم این لینک سورس هست ممنون میشم ویرایشش کنید تا متوجه بشیم از کدی که شما دادید

        http://upit.cc/f/601ebb7f.txt




        • مسعود درویشیان
          ۲۰ فروردین ۱۳۹۲

          ببینید، متد ()DegreeToRadian رو به برنامه اضافه می‌کنید، وقتی می‌خواهید ورودی رو به تابع ()Math.Sine یا ()Math.Cos بدید از متد ()DegreeToRadian استفاده می‌کنید تا ورودی‌تون بر حسب رادیان بشه:

          using System;
          class TrigonometricDemo
          {
              static double DegreeToRadian(double angle)
              {
                  return Math.PI * angle / 180.0;
              }
              static void Main(string[] args)
              {
                  double sin, cos, x, y;
          
                  Console.Write("please enter x: ");
                  x = Convert.ToDouble(Console.ReadLine());
          
                  sin = Math.Sin(DegreeToRadian(x));
                  cos = Math.Cos(DegreeToRadian(x));
          
                  Console.WriteLine("Sine: " + sin);
                  Console.WriteLine("Cosine: " + cos);
              }
          }
          



  10. شکوفه
    ۳ اردیبهشت ۱۳۹۲

    سلام استاد
    اگه میشه مثلث خیام رو آموزش بدید
    م تا قسمت ۱۵ رو مطالعه کردم اما نمیتونم مثلث خیام رو طراحی کنم و شدیدا به کدش نیاز دارم
    یه کدی در دستم هست اما یه جاییش رو ایراد میگیره
    اگه میشه کمکم کنید
    ممنونم




    • شکوفه
      ۳ اردیبهشت ۱۳۹۲

      سلام
      کد درستو پیدا کردم
      فقط سخته اگه آموزش بدید خیلی خوب میشه
      ممنونم

      int row;
      Console.BackgroundColor = ConsoleColor.Blue;
      Console.ForegroundColor = ConsoleColor.White;
      Console.Clear();
      Console.Write(“enter number Row: “);
      row = Convert.ToInt32(Console.ReadLine());
      Console.Clear();
      int col = Console.WindowWidth / 2;
      for (int i = 0; i < row; i++)
      {
      for (int j = 0; j <= i; j++)
      {
      Console.SetCursorPosition(col + j * 6, i);
      Console.Write(combination(i, j));
      }
      col -= 3;
      }
      Console.ForegroundColor = ConsoleColor.White;
      Console.Write("\n—————————————-\n"); //OR console.writeline(…);
      Console.Write("press any key to exit…");
      Console.ReadKey(false);
      }
      //———————
      static int combination(int n, int r)
      {
      return fact(n) / (fact(n – r) * fact(r));
      }
      //————-
      static int fact(int n)
      {
      if (n <= 1)
      return 1;
      else
      return n * fact(n – 1);




  11. محمد
    ۱۸ شهریور ۱۳۹۳

    تو این برنامه دیگه نمی شه سرچ کرد رو البوم ها و تاریخ های انتشار و موسیقی ها؟؟؟ نه .من فکر می کنم باید هر موسیقی یه شی باشه گه ویژگی های مختلفی هم داشته با شه مثل آلبوم و چیزای دیگه نه این که آلبوم هم خودش یه شی باشه حد اقل فکر می کنم ویندوز با موسیقی ها اینجوری رفتار می کنه ،نه؟؟؟؟؟؟




  12. esysss
    ۲۶ شهریور ۱۳۹۳

    احساس میکنم که خیلی برنامه رو الکی شلوغ کردین به نظرم نیازی به این کارا نبود



دیدگاه خود را بنویسید





نشانی ایمیل شما منتشر نخواهد شد.

کامنت های شما بعد از تأیید توسط نویسنده وبلاگ، منتشر خواهند شد.

لطفا دیدگاهتان تا حد امکان مربوط به پست بالا باشد. اگر حرف دیگری دارید و یا قصد تماس با من را دارید، از فرم تماس استفاده کنید.

شما میتوانید با مراجعه به سایت گراواتار یک آواتار اختصاصی برای خود تعریف کنید، تا در کنار نام شما نمایش داده شود

برای قرار دادن کدهای نمونه می توانید از تگ های [php] ، [html] ، [css] و [js] استفاده کنید.
به عنوان مثال کدهای php را می توان به صورت زیر قرار داد:
[php] var $whoLoveIranians = "WebTarget!"; [/php]



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2017 وب‌تارگت

استفاده از مطالب وب سایت در سایر وب سایت‌ها و نشریات چاپی با ذکر منبع آزاد است.