Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Интерфейс IComparable , C#

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Vladimirll

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!  
 Подскажите пожалуйста . Если можете скорректируйте пошагово , правильно ли я понимаю в программе ,   программа  рабочая  ( для меня это важно)    :
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Pavlovs_199
{  
     
 
        class Monster : IComparable
        {
            public Monster(int health, int ammo, string name)
            {
                this.health = health;
                this.ammo = ammo;
                this.name = name;
            }
 
            virtual public void Passport()
            {
                Console.WriteLine("Monster {0} \t health = {1} ammo = {2}",
                                    name, health, ammo);
            }
 
           public int CompareTo(object obj)           // реализация интерфейса
            {  
              Monster temp=(Monster)obj;
              if (this.health>temp.health)  return 1;
              if (this.health<temp.health)  return -1;
                                            return 0;
            }
            string name;
            int health, ammo;
 
        }
        class Class1
        {
            static void Main()
            {
 
                const int n = 3;
                Monster[] stado = new Monster[n];
 
                stado[0] = new Monster(50,50,"Вася");
                stado[1] = new Monster(80,80,"Петя");
                stado[2] = new Monster(40,10,"Маша");
             
 
                Array.Sort(stado);           //  сортировка стала возможной
                foreach (Monster elem in stado) elem.Passport();
 
                Console.ReadKey();
 
            }
        }
    }
 
 
 
         Итак ,  с  самого  начала    :  
 
 
1_цикл
 
1шаг)        В  конструктор  попадают  значения    new  Monster(50,50,"Вася")   ;
2шаг)        А  в  public int CompareTo(object obj)   new Monster(80,80,"Петя")  ;
3шаг)        Происходит  сравнение  в  public int CompareTo(object obj) :  this.health   и  temp.health  ;
4шаг)        По  результату   сравнения  получается   return   -1    т.е.   ничего    не   меняется   ;
 
2_цикл
 
1шаг)        В  конструктор  попадают  значения    new  Monster(80,80,"Петя")  ;
2шаг)        А  в  public int CompareTo(object obj)   new Monster(40,10,"Маша")  ;
3шаг)        Происходит  сравнение  в  public int CompareTo(object obj) :    this.health  и  temp.health ;
4шаг)        По  результату  сравнения  получается   return   1    т.е.   Петя и Маша   меняются            местами;
 
3_цикл  (начинаем  с  начала  массива  объектов)
 
1шаг)         В  конструктор  попадают  значения    new  Monster(50,50,"Вася")   ;
2шаг)         А  в  public int CompareTo(object obj)   new Monster(40,10,"Маша ")   ;
3шаг)         Происходит сравнение  в  public int CompareTo(object obj) : this.health  и  temp.health  ;
4шаг)       По результату сравнения  получается   return  1   т.е.  Вася и Маша  меняются  местами;  
 
4_цикл  
 
1шаг)        В  конструктор  попадают  значения    new  Monster(50,50,"Вася")   ;
2шаг)        А  в  public int CompareTo(object obj)   new Monster(80,80,"Петя")  ;
3шаг)        Происходит сравнение  в  public int CompareTo(object obj) : this.health  и  temp.health  ;
4шаг)        По результату сравнения получается  return  -1    т.е.   ничего  не  меняется   ;
 
 
 

Всего записей: 66 | Зарегистр. 07-07-2015 | Отправлено: 16:53 17-01-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вы предполагаете, что по мере заполнения стада монстрами у них будет вызываться CompareTo ?
А нафига ?
 
Сначала заполнение стада вызовет конструктор три раза.
Потом сортировка будет вызывать CompareTo
Джедайской силой предрекаю, что на ваших данных в CompareTo оно попадёт тоже три раза.
 
Ну а так, по ходу жизни... Вы же не из головы код постите ? VS у вас под руками.  
Поставить в коде точки останова и посмотреть что происходит, в каком порядке, какие значения имеют переменные - это не быстрее чем ждать ответ в форуме ?

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 18:51 17-01-2016
Vladimirll

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KDPoid
  Ваш  совет  с  точкой  останова   практичен  ,  если  конечно даст  результат .  Спасибо !   Только  я  точкой  останова  никогда   практически  не  пользовался  .    Подскажите    пожалуйста ,  как   в  этой  программе  работать  с    точкой  останова  ?
 
 
P.S.  У   меня   точка   останова  находится  во  вкладке   ОТЛАДКА  
 

Всего записей: 66 | Зарегистр. 07-07-2015 | Отправлено: 16:14 19-01-2016 | Исправлено: Vladimirll, 16:15 19-01-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Например. поставить точку останова внутри конструктора Monster и внутри CompareTo.  
Потом запустить и будет видно сколько раз и в каком порядке происходит заход в интересные нам методы.
Или поставить на
stado[0] = new Monster(50, 50, "Вася");
Первая остановка будет до того, как произошло хоть что-то интересное
А потом при помощи F11, выполнить программу пошагово. Тоже будет наглядно, как оно по каким методам скачет.

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 20:10 19-01-2016 | Исправлено: KDPoid, 20:11 19-01-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Интерфейс IComparable , C#


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru