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

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


مسعود درویشیان 53 دیدگاه سی شارپ Saturday, 13th April , 2013 38795 بازدید

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

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

کلاس 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("║ 1. Add Artist               ║");
        Console.WriteLine("║ 2. Show Artists             ║");
        Console.WriteLine("║ 3. 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;

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



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

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


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


  1. رضا
    13 April 2013

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




  2. hamzeh
    13 April 2013

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




  3. رضا
    13 April 2013

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




    • مسعود درویشیان
      13 April 2013

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

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




  4. ناشناس
    14 April 2013

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




    • مسعود درویشیان
      14 April 2013

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




  5. abbas
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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




      • abbas
        17 April 2013

        من یه مقداریشو نوشتم میشه اگه درسته تصحیحش کنید ممنون میشم
        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();

        }




        • مسعود درویشیان
          17 April 2013
          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
    17 April 2013

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




  7. رضا
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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




  8. رضا
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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




  9. رضا
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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




  10. داوود
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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




  11. مهسا
    17 April 2013

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

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




    • مسعود درویشیان
      17 April 2013

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




  12. مهسا
    18 April 2013

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




    • مسعود درویشیان
      18 April 2013

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




  13. مهسا
    18 April 2013

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

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

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




    • مسعود درویشیان
      18 April 2013

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

      do-while

      خروجی:

      do-while result

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

      while

      خروجی:

      while result




  14. مهسا
    18 April 2013

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




  15. داوود
    18 April 2013

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

    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 رو تعریف کردم؛ چرا ایراد میگیره؟ متدی که برای دریافت نام ایجاد کردم؛ از نظر شما مشکلی نداره؟ ممنون




    • مسعود درویشیان
      18 April 2013
      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 متد نیست که آخرش () بذاری!




      • داوود
        19 April 2013

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




        • مسعود درویشیان
          19 April 2013

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




          • داوود
            19 April 2013

            ممنونم ازت؛ مسعود جان من اومدم ویه متد به برنامه اضافه کردم و بدین نحو فراخوانیش کردم(البته فعلا برای اینکه کمتر وقت بگیره خودم عدد رو بهش دادم و بعد از اینکه اصلاح شد از کاربر عدد رو میگیرم) در واقع برای حذف یک عنصر از آرایه مون هستش.
            نحوه فراخوانیش در برنامه:
            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);
            }
            }
            }
            چه دلیل داره که توسط این متد قادر به حذف یک عنصر از آرایه م نیستم و برنامه خطا می گیره؟؟؟؟
            با تشکر




          • مسعود درویشیان
            19 April 2013

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




  16. مهسا
    18 April 2013

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

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




  17. مهسا
    18 April 2013

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




  18. رضا
    18 April 2013

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

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




    • مسعود درویشیان
      18 April 2013

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




  19. مهسا
    19 April 2013

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




  20. مهسا
    20 April 2013

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




  21. داوود
    21 April 2013

    از پاسخها و توضیحاتت ممنون مسعود جان؛
    آقا مسعود این تکه کد هم مربوط به 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. رایتل
    26 April 2013

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




  23. محمد فر
    26 April 2013

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




  24. kamal
    26 April 2013

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




  25. داوود
    27 April 2013

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




  26. میلاد
    28 April 2013

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

    آقا قسمت 30 نمی آید؟

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




    • مسعود درویشیان
      28 April 2013

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




  27. مهسا
    28 April 2013

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




  28. رضا
    30 April 2013

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



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

      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. بهاره
    18 August 2013

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



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





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

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

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

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

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



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

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