Тимофей Мартынов
Тимофей Мартынов личный блог
12 декабря 2012, 18:54

Чем для гуманитария оборачивается изучение C#.

Запись почти оффтоп, но думаю кому-то будет интересна.
Почему C#? Вроде как это наиболее продвинутый способ написания торговых роботов. Вот и изучаю основы.

Еще один ответ на вопрос зачем это надо, — это попытка впоследствии автоматизировать датамайнинг. (поиск стат. закономерностей из набора данных). Как сделать это максимально быстро без использования программирования я не знаю. 

-----------------------------------------------------
Вчера писал о том, как у меня возник ступор...

Хороший пример, и все встает на свои места. Разбираю по полочкам

Делаем вот такую программку:
Чем для гуманитария оборачивается изучение C#.

Программка забирает три значения
1. Количество людей на пире (int)
2. украсить ли еду (bool)
3. что написать на торте? (string)

И выдает значение суммы, сколько это будет стоить.

Каждый доп. рот — это доп бабос,
украсить — еще надбавочка
Ну и за каждую буковку на торте нада заплатить
а если челов больше 8, то надо взять большой торт, к-й стоит еще дороже

Как только меняешь параметр, идет автоматический перерасчет стоимости.

Создается класс birthdayParty (его опишем чуть позже)
ну и его экземпляр:
BirthdayParty birthdayParty;

1. Мы определяем новый объект birthdayParty, которому передаем три параметра по умолчанию.
2. Вызываем ф-ю показа стоимости мероприятия ()

        public Form1()
        {
            InitializeComponent();
            birthdayParty = new BirthdayParty((int)numericUpDown2.Value, FancyDecor.Checked, textBox1.Text);
            DisplayBirthdayPartyCost();
        }

3. Через функцию DisplayBirthdayPartyCost() мы:
    1. забираем обрезанный (если слишком длинный) текст с поздравлением, пишем его  
    2. Выводим СТОИМОСТЬ (248,50 на картинке) из метода birthdayParty.CalculateCost(), который описан здесь же в form1:

        private void DisplayBirthdayPartyCost()
        {
            textBox1.Text = birthdayParty.CakeWriting; — получили «отрезанный» кусок поздравления, если он оказался слишком длинным
            decimal Cost = birthdayParty.CalculateCost(); — получили значение расчетов из метода CalculateCost()
            birthdayCost.Text = Cost.ToString(«c»); — и вывели его в текстовую метку, там где стоит 248,50 на картинке
        }

4. Далее есть три обработчика формы, если 

а), поменяется крутилка с количеством гостей numericUpDown2.Value
б). поменяется текст поздравления textBox1.Text
в). или значение галки FancyDecor.Checked

Каждый раз мы отправляем новый параметр экземпляру класса birthdayParty и вызываем функцию DisplayBirthdayPartyCost(), чтобы поменять стоимость на экране,

Класс BirthdayParty при этом является инкапсулированным

Какие обращения к классу мы используем?
birthdayParty.CakeWriting
birthdayParty.CalculateCost()


а также через обработчики событий ( я их здесь не указал) через:
birthdayParty.CalculateCostOfDecorations(FancyDecor.Checked);
birthdayParty.NumberOfPeople = (int)numericUpDown2.Value;
birthdayParty.CakeWriting = textBox1.Text;

Три последние мы используем для передачи данных классу, а 
birthdayParty.CalculateCost() содержит инфу с расчитанной стоимостью мероприятия

насколько интуитивно я понял, мы передаем в инкапсулированный класс переменные при помощи КОНСТРУКТОРА.
Этот метод выполняется самым первым при работе с инкапсулированным классом, и с него начинается работа:

Чем для гуманитария оборачивается изучение C#.

две упомянутые в констркукторе функции ничо сложного из себя не представляют:

        private void CalculateCakeSize()
        {    
            if (NumberOfPeople <= 4) CakeSize = 8;
            else CakeSize = 16;
        }

        public void CalculateCostOfDecorations(bool fancy)
            {
                fancyDecorations = fancy;
                if (fancy) CostOfDecorations = (NumberOfPeople + 15.00M) + 50M;
                else CostOfDecorations = (NumberOfPeople + 7.50M) + 30M;
            }

Самый большой интерес представляет функция CalculateCost(). которая и ведет расчеты. Но и здесь блять ничего необычного!!!
Чем для гуманитария оборачивается изучение C#.

Остается понять, что происходит с «секретными» инкапсулированными переменными cakeWriting,NumberOfPeople и FancyDecorations.

Вот здесь типа вся соль!
Чем для гуманитария оборачивается изучение C#.

И опять ничерта не понятно:)))
Что мы сделали в этом коде?
получили значение cakeWriting в обработку на местном уровне?
это свойство, которое типа определяет поместится ли надпись на торте.
Что в итоге стало с CakeWriting и cakeWriting после этого свойства?
Вообще не понятно, нахер их дублировать:)))

Более интересна история с переменной numberofPeople, ибо ее использует наш главный метод расчета стоимости.
Что происходит с ней?
Чем для гуманитария оборачивается изучение C#.

Так. В этот момент я понял, что мой мозг отказывается думать:)
Продолжим геморрой завтра=)

полный текст 

BirthdayParty.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace example_20
{
    //у нас получился полностью изолированный класс
    class BirthdayParty
    {
        public const int CostOfFoodPerPerson = 25;
        public decimal CostOfDecorations = 0;
        private bool fancyDecorations;
        public int CakeSize;
        // это конструктор, которому мы передаем три параметра
        public BirthdayParty(int numberOfPeople, bool fancyDecorations, string cakeWriting) 
        {
            //«спускаем» полученные параметры в локальный уровень
            this.numberOfPeople = numberOfPeople; 
            this.fancyDecorations = fancyDecorations;
            CalculateCakeSize(); //вычисляем размер торта
            this.CakeWriting = cakeWriting;
            //вычисляем стоимость украшений, но как мы ее передадим во вне?
            CalculateCostOfDecorations(fancyDecorations);
        }
        //это внутренний метод расчета размера торта исхода из количества гостей   
        private void CalculateCakeSize()
        {    
            if (NumberOfPeople <= 4) CakeSize = 8;
            else CakeSize = 16;
        }
        private string cakeWriting = "";
        //Это? конструктор? или? свойство?, который получает строку и определяет, поместится ли она на торте:))
        public string CakeWriting
        {
            get { return this.cakeWriting; } //приняли строчку с надписью текста
            set
            {                            //а это то, что бы возвращаем
                int maxLength;
                if (CakeSize == 8) maxLength = 16; 
                else maxLength = 40;
                //откуда берется value хуй его знает //наверна значение принятой переменной
                if (value.Length > maxLength)
                {
                    MessageBox.Show(«слишком много букв для » + CakeSize + " дюймового торта");
                    if (maxLength > this.cakeWriting.Length) maxLength = this.cakeWriting.Length;
                    //обрезать поздравительную надписть по максимальной длине
                    this.cakeWriting = cakeWriting.Substring(0, maxLength);
                }
                else
                {
                    this.cakeWriting = value;
                }
            }
        }
        //метод расчета стоимость торта и суммарная стоимость пиршества
        public decimal CalculateCost()
        {
            //CostOfDecorations и CostOfFoodPerPerson — это постоянные, определены выше
            //не пойму где определяется NumberOfPeople????
            decimal TotalCost = CostOfDecorations + (CostOfFoodPerPerson * NumberOfPeople);
            decimal CakeCost;
            if (CakeSize == 8) CakeCost = 40M + CakeWriting.Length * .25M;
            else CakeCost = 75M + CakeWriting.Length * .25M;
            //возвращаем сумму двух переменных
            return TotalCost + CakeCost;
        }
        private int numberOfPeople;
        //еще одно свойство? чтобы получить из внешнего мира число людей и работать с ним?
        public int NumberOfPeople
            {
                get { return numberOfPeople; }
                set
                {//получили число, запускаем его внутрь кода при помощи «numberOfPeople = value;»
                    //запускаем расчет стоимости украшений и расчет величины
                    numberOfPeople = value;
                    CalculateCostOfDecorations(fancyDecorations);
                    CalculateCakeSize();
                    //??? нахуй здесь эта строчка нужна я не понимай
                    this.CakeWriting = cakeWriting;
                }
            }
        //метод расчета стоимости украшений 
        public void CalculateCostOfDecorations(bool fancy)
            {
                fancyDecorations = fancy;
                if (fancy) CostOfDecorations = (NumberOfPeople + 15.00M) + 50M;
                else CostOfDecorations = (NumberOfPeople + 7.50M) + 30M;
            }
    }
}


Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace example_20
{
    public partial class Form1: Form
    {
     //ошибся с объявлением:)   public int NumberOfPeople = 1;
        DinnerParty dinnerParty;
        BirthdayParty birthdayParty;
     ;   public Form1()
        {
            InitializeComponent();
            dinnerParty = new DinnerParty((int)numericUpDown1.Value, HealthyOption.Checked, FancyDecorations.Checked);
            //где описан?
            DisplayDinnerPartyCost();
            birthdayParty = new BirthdayParty((int)numericUpDown2.Value, FancyDecor.Checked, textBox1.Text);
            DisplayBirthdayPartyCost();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void label5_Click(object sender, EventArgs e)
        {
        }
        //с помощью этого метода мы передаем информацию 
        private void DisplayBirthdayPartyCost()
        {
            textBox1.Text = birthdayParty.CakeWriting;
            decimal Cost = birthdayParty.CalculateCost();
            birthdayCost.Text = Cost.ToString(«c»);
        }
        private void DisplayDinnerPartyCost()
        {
            decimal cost2 = dinnerParty.CalculateCost(HealthyOption.Checked);
            label3.Text = cost2.ToString(«c»);
        }
        private void FancyDecor_CheckedChanged(object sender, EventArgs e)
        {
            birthdayParty.CalculateCostOfDecorations(FancyDecor.Checked);
            DisplayBirthdayPartyCost();
        }
        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {
            birthdayParty.NumberOfPeople = (int)numericUpDown2.Value;
            DisplayBirthdayPartyCost();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            birthdayParty.CakeWriting = textBox1.Text;
            DisplayBirthdayPartyCost();
        }
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            dinnerParty.NumberOfPeople = (int)numericUpDown1.Value;
            DisplayDinnerPartyCost();
        }
        private void FancyDecorations_CheckedChanged(object sender, EventArgs e)
        {
            dinnerParty.CalculateCostOfDecorations(FancyDecorations.Checked);
            DisplayDinnerPartyCost();
        }
        private void HealthyOption_CheckedChanged(object sender, EventArgs e)
        {
            dinnerParty.SetHealthyOption(HealthyOption.Checked);
            DisplayDinnerPartyCost();
        }
        private void label6_Click(object sender, EventArgs e)
        {
        }
        
    }
}




upd.
счас в планах параллельно изучить курс программирования торговых роботов Игоря Чечета и Дмитрия Власова.

хочу-таки также посмотреть чо дельного сказал Марсель в своем вебинаре по дата-майнингу
36 Комментариев
  • Студент
    12 декабря 2012, 19:01
    ))) Тима улыбнул
  • Bubellar
    12 декабря 2012, 19:04
    На куй бездей пати=)
  • somebody
    12 декабря 2012, 19:12
    Не проще ли поставить задачу специальным людям?
  • Счастливый Конец
    12 декабря 2012, 19:22
    Да… какой винегрет то на форме, то по русски, то по английски… а давай еще на хинди напиши чего…
    Там все в одну функцию укладывается СalculateCost() которую можно сделать private на той форме или сделать статической в отдельном классе расчетов, нафига создавать экземпляр класса то. В общем, вам до робота как до парижа раком… увы…

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн