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

ادامه‌ی حل تمرین شماره 14


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

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

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

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

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.GetArtistName();
        TuneYear = tuneYear;
    }
}

کلاس Album: این کلاس شامل یک‌سری فیلد برای نگهداری اطلاعات مربوط به آلبوم مثل نام، سبک، صاحب اثر و…، یک constructor و دو متد است. این کلاس همچنین شامل آرایه‌ای از کلاس Tune برای نگهداری آهنگ‌های آلبوم است.

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()
    {
        //...
    }
}

کلاس Artist: این کلاس شامل فیلد، یک‌سری متد و constructor است. این کلاس همچنین شامل آرایه‌ای از Tune و آرایه‌ای از Album است. آرایه‌ی Tune به‌منظور ذخیره تک‌آهنگ‌ها و آرایه‌ی Album به‌منظور نگهداری آلبوم‌های خواننده‌ی مورد نظر است.

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 string GetArtistNameAndFamily()
    {
        return ArtistName + " " + ArtistFamily;
    }

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

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

کلاس MusicBox: این کلاس شامل آرایه‌ای از Artist، یک constructor و تعدادی متد است.

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

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

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

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

کلاس UI: علت به‌وجود آوردن این کلاس این است که در این‌جا به عبارتی engine برنامه را (تا حدودی) جدا در نظر بگیریم. یک Music Player واقعی را تصور کنید، آیا شما وقتی‌که دکمه خاموش/روشن را فشار می‌دهید تا دستگاه  خاموش/روشن شود از اتفاقاتی که پشت دکمه می‌افتد با خبر هستید؟ مسلماً نه! در این‌جا نیز قضیه به همین صورت است.

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

class UI
{
    // Fields
    MusicBox MyMusicBox;

    // Constructor
    public UI()
    {
        // A music box with 10 artists.
        MyMusicBox = new MusicBox(10);
    }

    // Methods
    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":
                Environment.Exit(0);
                // Exit
                break;
            default:
                Console.WriteLine("Invalid Choice!");
                break;
        }
    }
}

کلاس Program: در این کلاس موتور برنامه به حرکت در می‌آید. ابتدا یک شیء از کلاس UI به‌وجود آورده‌ایم تا به اعضای آن دسترسی داشته باشیم و سپس در یک حلقه‌ی بی‌نهایت متد ()Proccess را صدا زده‌ایم. علت وجود حلقه‌ی بی‌نهایت این است که برنامه تا زمانی که کاربر نخواهد، Exit نشود.

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

در مرحله‌ی بعد قصد داریم یک خواننده را به جعبه‌ی موسیقی اضافه کنیم. با ساده‌ترین حالت ممکن مثال می‌زنیم. تمام کاری که قرار است انجام دهیم این است که یک شیء Artist درست کرده و آن را در جعبه‌ی موسیقی‌مان (MusicBox) ذخیره کنیم و تمام! به کلاس Artist نگاهی بیندازید، برای این‌که از این کلاس شیء بسازید به نام و نام‌خانوادگی هنرمند نیاز دارید (با توجه به constructor) و مسلماً قرار است که این نام و نام‌خانوادگی از کاربر گرفته شود پس در ابتدا در “case “1 متد ()Proccess این‌چنین می‌نویسیم:

// Add Artist
Console.Write("Enter artist's name: ");
string artistName = Console.ReadLine();
Console.Write("Enter artist's family: ");
string artistFamily = Console.ReadLine();
Artist anArtist = new Artist(artistName, artistFamily);

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

static string GetInput(string message)
{
    Console.Write(message);
    return Console.ReadLine();
}

این متد پیغام را می‌گیرد و نمایش می‌دهد و ورودی کاربر (که یک رشته است) را return می‌کند. بعد از استفاده از این متد ساخت شیء بسیار راحت‌تر خواهد شد:

Artist anArtist = new Artist(
            GetInput("Enter artist's name: "),
            GetInput("Enter artist's family: ")
            );

در این‌جا برای ساخت شیء از Artist دو argument به آن داده‌ایم اما تفاوت در این‌جاست که این argument ها دو متد هستند که ابتدا یک پیغام را چاپ می‌کنند و ورودی گرفته شده از کاربر را تحویل constructor کلاس Artist می‌دهند تا شیء anArtist ساخته شود. اکنون باید این شیء ساخته شده را ذخیره کنیم اما در کجا؟ ما در کلاس MusicBox آرایه‌ای از جنس Artist در نظر گرفتیم تا هر خواننده را (تمام و کمال) در یک خانه از این آرایه ذخیره کنیم. آرایه از جنس Artist است و شما در خانه‌های آن می‌توانید اشیایی از جنس Artist ذخیره کنید. اگر به‌یاد داشته باشید متدی به‌نام ()AddArtist  در کلاس MusicBox تعریف کردیم اما بدنه‌ی آن خالی بود. ما از این متد برای ذخیره کردن خواننده استفاده می‌کنیم. متد ()AddArtist باید به‌عنوان ورودی یک Artist را دریافت و آن را در آرایه‌ی Artists ذخیره کند:

public bool AddArtist(Artist artist)
{
    Artists[0] = artist;
    return true;
}

متد بالا، پارامتر artist را در خانه‌ی اول آرایه‌ی Artists ذخیره می‌کند اما ما نیاز داریم دفعه‌ی بعد، خواننده در خانه‌ی بعدی آرایه ذخیره شود همچنین اگر آرایه پر شده است، متد false را return کند پس یک متغیر به اسم Counter تعریف می‌کنیم تا index خانه‌های آرایه را نگه دارد. به متد ()AddArtist و constructor در کلاس MusicBox مجدداً توجه کنید:

class MusicBox
{
    // Fields
    public Artist[] Artists;
    private byte Counter;

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

    // Methods
    public bool AddArtist(Artist artist)
    {
        if (Counter < Artists.Length)
        {
            Artists[Counter] = artist;
            Counter++;
            return true;
        }
        else return false;
    }

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

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

همین‌طور متد ()Process در کلاس UI به‌صورت زیر است:

public void Proccess(string choice)
{
    switch (choice)
    {
        case "1":
            // Add Artist
            Artist anArtist = new Artist(
                GetInput("Enter artist's name: "),
                GetInput("Enter artist's family: ")
                );
            MyMusicBox.AddArtist(anArtist);
            break;
        case "2":
            // show Artists
        break;
        case "3":
            // Exit
            Environment.Exit(0);
        break;
        default:
            Console.WriteLine("Invalid Choice!");
        break;
    }
}

به “case “1 توجه کنید که چگونه یک شیء از کلاس Artist ساخته‌ایم و سپس از طریق متد ()AddArtist این شیء ساخته شده را ذخیره کرده‌ایم. متد ()AddArtist یک شیء از جنس Artist دریافت کرده و آن را در خانه‌های آرایه ذخیره می‌کند.

در مرحله‌ی بعد قصد داریم خواننده‌ها‌ی ذخیره شده را نمایش دهیم. برای این منظور در متد ShowArtists کلاس MusicBox می‌نویسیم:

public void ShowArtists()
{
    for (int i = 0; i < Artists.Length; i++)
    {
        if (Artists[i] == null) continue;
            Console.WriteLine(Artists[i].GetArtistNameAndFamily());
    }
}

توسط این متد، نام و نام‌خانوادگی هر خواننده (که در خانه‌های آرایه‌ی Artists ذخیره شده‌اند) را نمایش می‌دهیم و هر خانه‌ی آرایه که خالی باشد نادیده در نظر گرفته می‌شود. در نهایت در “case “2 متد ()Process می‌نویسیم:

case "2":
    // show Artists
    Console.WriteLine();
    MyMusicBox.ShowArtists();
    break;

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



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

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


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


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

    با سلام و خسته نباشیید ببخشیید آقا مسعود پلاتفرم چیه تعریفش و…… باتشکر




  2. hamzeh
    ۲۴ فروردین ۱۳۹۲

    salam agha masoud vaghen dastetoon dard nakone . khaily alie.khoda azat razi bashe
    karet 20 20 20 va alye




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

    با سلام ببخشیید اگر ممکنه خودتون توضیح بدهید فارسی من انگلیسیم قوی نیتش در حد صفر هستمم هیچی بلد نیستم باتشکر




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

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

      در ضمن اگه دوست داری برنامه‌نویسی رو حرفه‌ای دنبال کنی به شدت نیاز داری که توی انگلیسی قوی باشی. پس یه فکری براش کن ;)




  4. ناشناس
    ۲۵ فروردین ۱۳۹۲

    سلام خسته نباشید
    متأسفانه فایل pdf خرابه




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

      ممنون که اطلاع دادید، درست شد :)




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

    با سلام میشه در خصوص این برنامه منو راهنمایی کنید با تشکر
    برنامه:
    سیستم اموزش
    دارای موجودینت دانشجو شامل اطلاعات نام ونام خانوادگی و نمره . دارای حادکثر ۱۰ دانشجو
    ۱- new student
    ۲- enter grade
    ۳- nam student max v min
    ۴- sort by grade
    ۵- exit




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

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




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

        من یه مقداریشو نوشتم میشه اگه درسته تصحیحش کنید ممنون میشم
        Console.WriteLine(“enter a new student:”);
        string[] Names = new string[10];
        for (int i = 0; i < Names.Length; i++)
        {
        Console.WriteLine("{0}th new student :", i + 1);
        Names[i] = Console.ReadLine();
        for (int j = i; j <= i; j++)
        {
        Console.WriteLine("{0}grade :", j + 1);
        Names[j] = Console.ReadLine();

        }
        // sort by max/min

        int max, min;

        int x = max = min = int.Parse(Console.ReadLine());
        for (int k = 0; k <= i; k++)
        {
        Console.WriteLine("{0}th number: ", k);
        x = int.Parse(Console.ReadLine());
        if (x max)
        max = x;
        if (++k <= 10)
        break;
        Console.WriteLine("Max is : {0} and Min is {1}", max, min);
        Console.ReadKey();

        }




        • مسعود درویشیان
          ۲۸ فروردین ۱۳۹۲
          using System;
          class Student
          {
              private string Name, Surname;
              private int Grade;
          
              public Student(string name, string surname, int grade)
              {
                  Name = name;
                  Surname = surname;
                  Grade = grade;
              }
          
              public void Show()
              {
                  Console.WriteLine("   Name: " + Name);
                  Console.WriteLine("   Surname: " + Surname);
                  Console.WriteLine("   Grade: " + Grade);
              }
          }
          class StudentDemo
          {
              static void Main()
              {
                  Student[] students = new Student[2];
          
                  for (int i = 0; i < students.Length; i++)
                  {
                      students[i] = new Student(
                          GetInput("Enter Name: "),
                          GetInput("Enter Surname: "),
                          Convert.ToInt32(GetInput("Enter Grade: "))
                          );
          
                      Console.WriteLine();
                  }
          
                  Console.WriteLine("Students:");
                  for (int i = 0; i < students.Length; i++)
                  {
                      students[i].Show();
                      Console.WriteLine();
                  }
          
              }
          
              static string GetInput(string message)
              {
                  Console.Write(message);
                  return Console.ReadLine();
              }
          }
          



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

    مرسی مسعود جان و با تشکر از همکاری و راهنمایی های خوبتان




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

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




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

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




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

    با عرض سلام ببخشیید آقای درویشیان من چطوری زبانم رو قوی کنم وقت زبان انگلیسی صفر هستم آیا میشه همزمان هم دروس دانشگاهم رو بخونم و هم برنامه نویسی و هم زبان انگلیسی یاد بگیرم اگه ممکنه روشی بهم ارائه بدهید
    باتشکر




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

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




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

    اوکی دستتون درد نکنه ولی به جای گرفتن مجموعهی آموزشی english today از این سایت استفاده کنم چی http://dude-club.com/?p=194
    و
    http://dude-club.com/?p=70 چی نظرتون چی هستش خوبه یا نه یا اینکه باز مجموعه ی آموزشی رو بگیرم چون این سایت هم میتونید مطلب انگلیسی رو گوش کنی من خودم میخوام خونه یاد بگیرم کلاس نمیرم فقط اگه روزی ۳۰ دقیقه فقط لغت و زبان انگلیسی بخونم کافی هستش یا نه
    و اگه ممکنه بهم بگویید از کدوم شروع کنم از این http://dude-club.com/?p=70 یا http://dude-club.com/?p=194
    باتشکر




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

      بله این هم عالیه ولی مهم‌تر از همه ادامه دادن و پشت‌کار خودتونه :)




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

    سلام مسعود جان؛ خوبی عزیزم؟؟
    ببخشید من هنوز تو دور دوم تو درس بیست و یکم هستم؛ یکم یواشتر برید لطفا تا بهتون برسم.
    بابت آموزشهای خوبت مثل همیشه ازت ممنون + سپاسگزارم؛ دستت درد نکنه.
    دوستدارت!




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

      سلام، قربانت داوود جان :)
      خیلی کار خوبی می‌کنی که داری مجدداً از اول می‌خونی




  11. مهسا
    ۲۸ فروردین ۱۳۹۲

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

    راستی یک سوال برام پیش اومد اونم اینکه چه موقعی از روش روش نردمانی if-else ladder استفاده میکنیم مگر ما نمی تونیم از سویچ استفاده کنیم و اینکه برای تمرین بیشتر چه کتابی رو معرفی کنید فقط باید بشینم بخونیم خوبه یا نه روشی خاصی دارید بهم معرفی کنید




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

      کتاب فارسی‌ها رو تو این زمینه نمی‌شناسم. این مجدداً از اول بخونید خیلی عالیه چون باعث می‌شه همه مطالب دوباره براتون مرور بشه. بهترین کار اینه که هم بخونید و هم تمرین کنید (حتماً تمرین‌ها رو با کامپیوتر انجام بدید)
      switch و if-else-if ladder یه جورایی مثل هم هستن ولی به نظر من استفاده از switch می‌تونه گاهی جالب‌تر باشه ولی بستگی به موقعیت داره، از هردوش می‌تونید استفاده کنید.




  12. مهسا
    ۲۹ فروردین ۱۳۹۲

    با عرض سلام
    ببخشیید آقای درویشان من دوباره شروع کردم به خوندن و تا الان تمرینات و همه رو تا قسمت یازدهم رو انجام داد خودم فقط توی قسمت یازدهم توی دستورات do_while مشکل دارم چه موقعی باید ازش استفاده کرد و اینکه چرا توی مثالی که گفتید میشه تحلیلش رو هم بگید منظورم بیشتر توضیح بدهید با مثال و چه فرقی با دستور while داره مثلا ما با دستوری میخواهیم از اعداد یک تا ۵ رو چاپ کنیم با while میشه ولی با dowile ابتدا چاپ میشه بعد شرط چک میشه (منظورم اگه نخواهیم اصلا از این دستور استفاده نکنیم ) مشکلی پیش نمیاد
    باتشکر




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

      بینید سی‌شارپ میاد یه سری امکانات و دستور به برنامه‌نویس ارائه می‌ده تا بتونه توی موقعیت‌های خاص و مختلف و بر اساس نیازش از اون استفاده کنه. دوستور do-while هم همینه! شما ممکنه یه‌جا دارید یه برنامه‌ای می‌نویسید که می‌بینید به این دستور احتیاج پیدا می‌کنید (تازه ممکنه مشکل‌تون رو با for و while هم بتونید به‌راحتی برطرف کنید)
      دستور do-while تنها کاری که می‌کنه اینه که اول یه بار دستورات داخل حلقه رو اجرا می‌کنه و بعد میاد شرط رو بررسی می‌کنه. خوب مزیت این‌کار چیه؟! مثلا شما یه‌جای برنامه‌ات می‌خوای فلان دستورات تو یه حلقه تکرار بشن ولی اگه شرط حلقه برقرار نبود دیگه حداقل یه بار اجرا شده باشن! چون do-while یه‌بار حلقه رو اجرا می‌کنه بعد میاد شرط رو چک می‌کنه که اگه شرط برقرار نبود حداقل یه بار دستورات داخلش اجرا شده باشند.




  13. مهسا
    ۲۹ فروردین ۱۳۹۲

    ببخشیید آقای درویشیان منظورم این مثالی که گفتید

    using System;
    class Example
    {
        static void Main()
        {
            int number = 3;
     
            do
            {
                Console.WriteLine("False condition, once execute!");
            } while (number &lt; 2);
        }
    }
    

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




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

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

      do-while

      خروجی:

      do-while result

      حالا اگه while یا for بود، چون شرط بالای حلقه قرار داره، اول شرط بررسی می‌شه و اگه شرط برقرار نبود یه‌راست از حلقه خارج می‌شه:

      while

      خروجی:

      while result




  14. مهسا
    ۲۹ فروردین ۱۳۹۲

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




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

    سلام مسعود عزیز؛
    وقتت بخیر و آخر هفته خوبی داشته باشی.
    فکر کنم مهسا خانوم هم روش من رو در پیش گرفته.
    مسعود جان نمیدونم کار درستی می کنم یا نه ؛ چون قبلا گفته بودی هر سوال رو تو پست مربوط به خودش مطرح کنید. اگه سوالم مربوط به همون پست هستش لطفا این دفعه اگه اشکال نداره شما زحمت گذاشتن تو پست مربوطه رو بکش از دفعه دیگه تو همون پست سوالمو میذارم.
    سوالم مربوط به پست درس ۱۹ هست. جایی که میخواستیم ایجاد کنیم. (سوالم مربوط به آرایه ها هست):
    برنامه رو ببینید:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    class person
    {
       public static int sizearray = 5;
       public string[] fname = new string[sizearray];
    
        public void getname(string text)
         {
           Console.WriteLine(text);
           for (int j = 0; j < person.sizearray; j++)
           {
               string myname = Console.ReadLine();
               fname[j] = myname;
           }
         }
    }
    
    class example
    {
        static void Main()
        {
            person mytest = new person();
            //for (int i = 0; i < mytest.fname.Length(); i++)
            mytest.getname("Please Enter Names");
        }
    }
    

    ابتدا میخواستم در Main اقدام به گرفتن نام بکنم. ولی طبق کدی که اونو غیرفعالش کردم؛ اگه اینجوری بنویسم ایراد میگیره:
    //for (int i = 0; i < mytest.fname.Length(); i++) بعدش برای همین اومدم و sizearray رو تعریف کردم؛ چرا ایراد میگیره؟ متدی که برای دریافت نام ایجاد کردم؛ از نظر شما مشکلی نداره؟ ممنون




    • مسعود درویشیان
      ۲۹ فروردین ۱۳۹۲
      using System;
      class GetInputDemo
      {
          static void Main()
          {
              Person p = new Person();
              p.SetNames("Enter Name: ");
              Console.WriteLine();
              p.ShowNames();
          }
      }
      
      class Person
      {
          public string[] Names;
          public Person()
          {
              Names = new string[3];
          }
      
          public void SetNames(string message)
          {
              for (int i = 0; i < Names.Length; i++)
              {
                  Console.Write(message);
                  Names[i] = Console.ReadLine();
              }
          }
      
          public void ShowNames()
          {
              for (int i = 0; i < Names.Length; i++)
              {
                  Console.WriteLine(Names[i]);
              }
          }
      }
      

      علت اینکه برنامه‌ات Error می‌ده اینه که Length متد نیست که آخرش () بذاری!




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

        درست میگید؛ببخشید حواسم نبود و این رو بذارید به حساب کم اطلاعی بنده. ببخشید.
        مسعود جان یک سوال:
        در اینجا شما از سازنده استفاده کردین:
        public Person()
        {
        Names = new string[3];
        }
        میشه علتشو بگید؟ اونجوری که من نوشته بودم بهینه نبود؟ یا خوانایی برنامه کمتر بود که شما از سازنده استفاده کردین؟




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

          چون یکی از استفاده‌های constructor اینه که یه سری از فیلدهامون در حین ساخت شیء، مقداردهی بشن پس این‌جوری بهتر و استانداردتر هست.




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

            ممنونم ازت؛ مسعود جان من اومدم ویه متد به برنامه اضافه کردم و بدین نحو فراخوانیش کردم(البته فعلا برای اینکه کمتر وقت بگیره خودم عدد رو بهش دادم و بعد از اینکه اصلاح شد از کاربر عدد رو میگیرم) در واقع برای حذف یک عنصر از آرایه مون هستش.
            نحوه فراخوانیش در برنامه:
            class example
            {
            static void Main()
            {
            person mytest = new person();
            mytest.getname(“Please Enter Names:”);
            mytest.show();
            mytest.Delete(2);
            mytest.show();

            }
            }
            من میخوام که عنصر دوم حذف بشه(که حالا چون از صفر شروع میشن ؛ میشه سومی).
            میخواستم بعد از اجرای متد Delete مجددا عناصر آرایه م رو ببینم و به همین دلیل از متد show نیز بعدش مجددا استفاده کردم.
            این هم متد Delete:
            public void Delete(int id)
            {
            for (int j = 0; j < Names.Length; j++)
            {
            if (id == j)
            {
            Names[j].Remove(j);
            }
            }
            }
            چه دلیل داره که توسط این متد قادر به حذف یک عنصر از آرایه م نیستم و برنامه خطا می گیره؟؟؟؟
            با تشکر




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

            شما اگه می‌خوای یه شیء رو پاک کنی کافیه اونو برابر با null قرار بدی
            وقتی هم می‌خوای با حلقه عناصر داخل آرایه رو نشون بدی، داخل حلقه یه if میذاری و میگی هر خونه‌ای که null هست، continue بشه




  16. مهسا
    ۲۹ فروردین ۱۳۹۲

    اوکی دستتون دردنکنه من یاد گرفتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتم

    واقعا هر چی ازتون تشکر کنممممممممممممممممممممم بازم کمه




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

      خواهش می‌کنم :)




  17. مهسا
    ۲۹ فروردین ۱۳۹۲

    ببخشیید دوباره مزاحم شدم فقط آموزش بعدی رو کی قرار می دهید




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

    با سلام ببخشیید آقای مهندس

    من برنامه هایی که می نویسم انگار داره حفظ میکنم مثلا اعداد اول و………. رو کد ها رو حفظ میکنم فکر کنم مثلا یه برنامه ای دیگه بدهم بدهند نمی تونم بنویسم و همیشه هم اول میرم ویژال استدیو رو باز میکنم و میرم سراغ کد دیگه تحلیل و….. نمی کنم و تحلیل کردن هم بلد نیستم نمی دونم باید چیکار نه برای این مثال بلکه برای هر مسئله ای حتی پروزه های بزرگ این مشکلو دارم نمی دونم باید چیکار کنم ممنون میشم راهنماییم کنید




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

      یکی از خوبی‌های برنامه‌نویسی اینه که آدم رو وادار به فکر کردن می‌کنه شما مشکلت اینه که رو مسئله فکر نمی‌کنی! خود تحلیل یعنی فکر کردن. اگه شما یه مساله رو نمی‌فهمی، روش فکر کن، حتی اگه شده چند روز روش فکر کن. وقتی مغزت رو عادت بدی به فکر کردن بعد یه مدت مغزت قوی‌تر عمل می‌کنه دقیقاً مثل یه ورزشکار که اولش نمی‌تونه وزنه بزنه اما با تمرین سخت می‌تونه بعد یه مدت وزنه‌های سنگین‌تری رو بزنه. مغز هم دقیقاً همینه، هرچی بیشتر ازش استفاده کنی، قوی‌تر می‌شه




  19. مهسا
    ۳۰ فروردین ۱۳۹۲

    با عرض سلام ببخشیید آقای درویشیان همیشه مزاحم میشم
    دربارهی این جملات میخواستم بیشتر توضیح بدهید و مثال بزنید در حلقه های while و do while کلمهی contnue موجب می شود مستقیما به قسمت condition حلقه برود و مجددا حلقه را اجرا کند. اینو رو با مثال همراه با توضیحاتی که توی مقالات برای دستورات دیگه می دادید این رو همینطور توضیح بدهید باتشکر




  20. مهسا
    ۳۱ فروردین ۱۳۹۲

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




  21. داوود
    ۱ اردیبهشت ۱۳۹۲

    از پاسخها و توضیحاتت ممنون مسعود جان؛
    آقا مسعود این تکه کد هم مربوط به Update کردن یک عنصر از عناصر داخل آرایه هستش؛ آیا درست نوشتم و خوبه:
    [#C]
    public void UpDate(string text)
    {
    Console.WriteLine(text);
    int id = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine(“Please Enter New Name that you want Replaced.”);
    string newname = Console.ReadLine();
    for (int j = 0; j < Names.Length; j++)
    {
    if (id == j)
    {
    Names[j] = newname;
    Console.WriteLine("Element {0} has been Updated successfully", j);
    }
    }
    }

    [#C/]
    ابتدا ID نام شخصی رو که میخوایم تغییرش بدیم میگیریم و بعدش نام جدید رو وارد می کنیم. در انتها با استفاده از متد show که در پستهای قبلی اونو گذاشتم ؛ تغییرات رو نشون میدیم.
    آیا خوبه همینجوری یا نه؟؟ و اینکه منظور شما همینجوری بود؟




  22. رایتل
    ۶ اردیبهشت ۱۳۹۲

    خوب بود اما طولانی




  23. محمد فر
    ۶ اردیبهشت ۱۳۹۲

    سلام.خبری از قسمت ۳۰ نیست؟چرا دیر شد.




  24. kamal
    ۶ اردیبهشت ۱۳۹۲

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




  25. داوود
    ۷ اردیبهشت ۱۳۹۲

    دوستان دیرتر بیاد که بهتره؛ بشینید از اول بخونید؛ باور کنید خیلی خوبه.
    شاید آقای درویشیان درگیر کاری هستند بنده خدا !!
    گناه داره، اذیتش نکنید.




  26. میلاد
    ۸ اردیبهشت ۱۳۹۲

    سلام و خسته نباشید
    آقا ممنون از همه قسمتا تا اینجا

    آقا قسمت ۳۰ نمی آید؟

    منتظر هستیمااااااا…




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

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




  27. مهسا
    ۸ اردیبهشت ۱۳۹۲

    با عرض سلام ببخشیید آقای درویشیان همیشه مزاحم میشم
    دربارهی این جملات میخواستم بیشتر توضیح بدهید و مثال بزنید در حلقه های while و do while کلمهی contnue موجب می شود مستقیما به قسمت condition حلقه برود و مجددا حلقه را اجرا کند. اینو رو با مثال همراه با توضیحاتی که توی مقالات برای دستورات دیگه می دادید این رو همینطور توضیح بدهید باتشکر




  28. رضا
    ۱۰ اردیبهشت ۱۳۹۲

    سلام جناب آقای مهندس درویشیان ببخشیید من یه مشکلی داشتم توی حل تمرین شماره ی ۱۰ که گفتید یک مستطیل بکشم که سایزشو دریافت کنه به مشکل برخوردم هرچند اینکه توضیح دادید توی مقاله ولی بازم به مشکل برخوردم میشه دوباره از اول بیشتر توضیح بدهید باتشکر




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

      خیلی ساده‌ست!
      حلقه‌ی خارجی برای چاپ کردن سطرهاست و حلقه‌ی داخلی برای چاپ کردن ستون‌ها.
      برنامه وارد حلقه‌ی خارجی می‌شه (سطر اول) و توسط حلقه‌ی داخلی مثلا ۱۰ تا ستاره رو چاپ می‌کنه (۱۰ تا ستون) بعد دوباره برمی‌گرده اول حلقه‌ی خارجی (سطر دوم) و دوباره می‌ره داخل حلقه داخلی و ۱۰ تا ستاره رو چاپ می‌کنه. این‌کار رو این‌قدر انجام می‌ده تا شرط حلقه‌ی خارجی نقض بشه:

      using System;
      class Rectangle
      {
          private int Width { get; set; }
          private int Height { get; set; }
      
          public static void DrawRectangle(int width, int height)
          {
              for (int i = 0; i < height; i++)
              {
                  for (int j = 0; j < width; j++)
                  {
                      Console.Write("*");
                  }
                  Console.WriteLine();
              }
          }
      }
      class MainClass
      {
          static void Main()
          {
              int width = Convert.ToInt32(GetInput("Width: "));
              int height = Convert.ToInt32(GetInput("Height: "));
      
              Console.WriteLine();
              Rectangle.DrawRectangle(width, height);
          }
          static string GetInput(string message)
          {
              Console.Write(message);
              return Console.ReadLine();
          }
      }
      



  29. بهاره
    ۲۷ مرداد ۱۳۹۲

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



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





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

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

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

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

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



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

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