11 августа 2010

глава 11 позади)

1. Создайте класс типа коллекции по имени People, представляющий собой
коллекцию показанного ниже класса Person. Элементы в этой коллекции должны
быть доступны через строковый индексатор, в роли которого должно выступать
имя человека, идентичное хранящемуся в свойстве Person.Name:

public class Person
{
private string name;
private int age;
public string Name
{
get
{
return name;
}
set 
name = value; 
public int Age 
get 
return age; 
set 
age = value; 
2. Расширьте класс Person из предыдущего упражнения так, чтобы в нем  
перегружались операции >,<,>= и <= и выполнялось сравнение свойства Age со  
свойством Age других экземпляров Person. 
3. Добавьте в класс People метод GetOldest, возвращающий массив объектов 
Person с наибольшим значением в свойстве Age (их может быть как один, так 
и больше, поскольку многие элементы могут иметь в этом свойстве одинаковое 
значение) с использованием перегруженных версий операций, которые  
определили ранее. 
4. Реализуйте в классе People интерфейс ICloneable для обеспечения  
возможности глубокого копирования. 
5. Добавьте в класс People итератор, позволяющий получать значения Age всех 
членов в цикле f о reach показанным ниже образом: 
foreach (int age in myPeople.Ages) 
// Отображение значений возраста. 


Person.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11HW1
{
    class Person:ICloneable
    {
        private string name;
        private int age;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
        public Person(string imaya, int vozrast)
        {
            Name = imaya;
            Age = vozrast;
        }
        public override string ToString()
        {
            return name + " " + age;
        }

        public object Clone()
        {
            return MemberwiseClone();
        }
        public static bool operator <=(Person per1, Person per2)
        {
            return (per1.age <= per2.age);
        }
        public static bool operator >(Person per1, Person per2)
        {
            return (per1.age > per2.age);
        }
        public static bool operator <(Person per1, Person per2)
        {
            return (per1.age < per2.age);
        }
        public static bool operator >=(Person per1, Person per2)
        {
            return (per1.age >= per2.age);
        }
    }
}

People.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11HW1
{
    class People:DictionaryBase,ICloneable
    {

        public void Add(Person newPerson)
        {
            Dictionary.Add(newPerson.Name, newPerson);
        }
        public void Remove(Person newPerson)
        {
            Dictionary.Remove(newPerson);
        }
        public Person this[string Name]
        {
            get
            {
                return (Person)Dictionary[Name];
            }
            set
            {
                Dictionary[Name] = value;
            }
        }
        public object Clone()
        {
            People CP =new People();
            foreach (Person copyper in InnerHashtable.Values)
            {
                CP.Add((Person)copyper.Clone());

            }
                return CP;
        }

        public People GetOldest(People otryad)
        {

            Person min = new Person("0", 0);
            People max = new People();
            foreach (DictionaryEntry per in otryad)
            {

                if (((Person)per.Value).Age == min.Age)
                {
                    max.Add((Person)per.Value);
                    min.Age = ((Person)per.Value).Age;
                    min.Name = ((Person)per.Value).Name;
                }

                else if (((Person)per.Value).Age > min.Age)
                {
                    max.Clear();
                    max.Add((Person)per.Value);
                    min.Age = ((Person)per.Value).Age;
                    min.Name = ((Person)per.Value).Name;
                }
            }
            return max;
        }

        public new IEnumerator GetEnumerator()
        {
            int age;
            foreach(DictionaryEntry per in InnerHashtable)
            {
                yield return age = ((Person)per.Value).Age;
            }

        }

    }
}

Program.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11HW1
{
    class Program
    {
        static void Main(string[] args)
        {
            string otvet="y";
            while (otvet == "y")
            {
                Console.Clear();
                People otryad = new People();
                People max = new People();
                People clone = new People();
                Console.WriteLine("Введите количество людей в отряде.");
                int kolvo = Convert.ToInt16(Console.ReadLine());
                for (int i = 0; i < kolvo; i++)
                {
                    Console.WriteLine("Введите имя бойца:");
                    string newimya = Console.ReadLine();
                    Console.WriteLine("Введите возраст бойца:");
                    
                    int newvozrast = Convert.ToInt16(Console.ReadLine());
                    otryad.Add(new Person(newimya, newvozrast));
                    Console.WriteLine("Новый боец включен в отряд, его зовут - {0}, его возраст - {1}.",otryad[newimya].Name,otryad[newimya].Age);

                }
                Console.WriteLine();
                clone = (People)otryad.Clone();

                foreach (int age in otryad)
                {
                    Console.WriteLine("Возрасты всех членов отряда {0}", age);
                }


              /*  foreach (DictionaryEntry otr in clone)
                {
                    Console.WriteLine("Клонированный массив - имя {0}", ((Person)otr.Value).Name);
                    Console.WriteLine("Клонированный массив - возраст {0}", ((Person)otr.Value).Age);
                }*/

                max = otryad.GetOldest(otryad);
                foreach (DictionaryEntry otr in max)
                {
                    Console.WriteLine("Имя бойца с максимальным возрастом : {0}", ((Person)otr.Value).Name);
                }
                Console.WriteLine("Сравним бойцов по возрасту.");
                Console.WriteLine("Введите имя первого бойца.");
                string boec1 = Console.ReadLine();
                Console.WriteLine("Введите имя второго бойца.");
                string boec2 = Console.ReadLine();
                if (otryad[boec1] > otryad[boec2])
                {
                    Console.WriteLine("Боец:{0}, старше чем боец {1}.",boec1,boec2);
                }
                else if (otryad[boec1] >= otryad[boec2])
                {
                    Console.WriteLine("Боец:{0}, одинакового возраста с бойцом {1}.", boec1, boec2);
                }
                else
                    Console.WriteLine("Боец:{0}, младше чем боец {1}.", boec1, boec2);
                Console.WriteLine("Введите имя, чтобы узнать возраст.");
                string currname = Console.ReadLine();
                Console.WriteLine("Его возраст: {0}.", otryad[currname].Age);

                Console.WriteLine("Изменяем значение возраста этого бойца на 1.");
                otryad[currname].Age = otryad[currname].Age + 1;
                Console.WriteLine("Его возраст теперь = {0}.", otryad[currname].Age);
                Console.WriteLine("Проверяем клонированный массив.");
                foreach (DictionaryEntry otr in clone)
                {
                    Console.WriteLine("Клонированный массив - имя {0}", ((Person)otr.Value).Name);
                    Console.WriteLine("Клонированный массив - возраст {0}", ((Person)otr.Value).Age);
                }


                Console.WriteLine("Введите \"y\" что бы продолжить.");

                otvet = Console.ReadLine();
            }
        }
    }
}

Комментариев нет: