Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Создание класса с операциями


Автор: posthuman 13.12.2009, 15:53
Общие данные:
Каждый разрабатываемый класс должен, как правило, содержать следующие элементы: скрытые поля, конструкторы с параметрами и без параметров, методы; свойства, индексаторы; перегруженные операции. Функциональные элементы класса должны обеспечивать непротиворечивый, полный, минимальный и удобный интерфейс класса. При возникновении ошибок должны выбрасываться исключения.
Дана такая задачка:
Описать класс "предметный указатель". Каждый компонент указателя содержит слово и номера страниц, на которых это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти. Предусмотреть возможность формирования указателя с клавиатуры и из файла, вывода указателя, вывода номеров страниц для заданного слова, удаления элемента из указателя.
В общем вот такая она, задачка.

Автор: PaZ1T1V 13.12.2009, 19:12
а в чем собственно проблема то ? 

Автор: ДобренькийПапаша 13.12.2009, 19:41
Собственно, человек спроектировать грамотно не может. Мне бы тоже в качестве учебного примера было бы интересно посмотреть на грамотную реализацию.

Автор: posthuman 13.12.2009, 23:37
Код

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

namespace LabRab8
{
    struct PredUkaz
    {
        public string word; //слово из указателя
        public int[] page; //массив с номерами страниц
        public PredUkaz(string word, int[] page) //конструктор с параметрами
        {
            this.word = word;
            this.page = page;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            PredUkaz[] pu = new PredUkaz[4];
            //ввод данных
            Console.Write("Введите количество слов, которое вы желаете ввести: ");
            string buf = Console.ReadLine();
            for (int i = 1; i <= Convert.ToInt32(buf); i++)
            {
                Console.Write("Введите слово в указатель: ");
                pu[i].word = Console.ReadLine();

                Console.Write("Введите количество страниц для этого слова: ");
                string buf1 = Console.ReadLine();
                int buf11 = Convert.ToInt32(buf1);

                Console.Write("Введите номера страниц через запятую(,): ");
                string TempPage = Console.ReadLine();
                string[] TempPageMassive = TempPage.Split(',');
                int[] page = new int[] { 
                    int.Parse(TempPageMassive[0].ToString()),
                    int.Parse(TempPageMassive[1].ToString()),
                    int.Parse(TempPageMassive[2].ToString()) };
                pu[i].page = new int[buf11];
                pu[i].page = page;

            }
            //вывод введеных с клавиатуры данных
            Console.WriteLine();
            for (int k = 1; k <= Convert.ToInt32(buf); ++k)
            {
                Console.WriteLine("{0}\t\t{1},{2},{3}", pu[k].word, pu[k].page[0], pu[k].page[1], pu[k].page[2]);
            }
            Console.ReadLine();
        }
    }
}


На самом деле я даже представить не могу что должно получиться, но вроде как что-то на подобии указателя как в конце книги, ну это на мой взгляд. Вот то что я сделал, но все работает у меня боком раком.

Во-первых, у меня это объявлено как структура, переделывал в класс что-то не работает.
Во-вторых, не знаю как сделать так, чтобы для каждого слова было произвольное количество страниц. Тут кажется нужен ступенчатый массив.
Ну а вообще, указатель должен выглядить так:
A
Abort 12,13,14
Abs 50,62,17
B
base 12,17
BigMul 13
D
DataSet 123
E
EndRead 250,253
Что-то вроде этого.

Автор: ДобренькийПапаша 14.12.2009, 14:05
Если здесь единственное что требуется реализовать это то, что есть массив слов, а у каждого элемента этого массива есть массив чисел (страниц на которых есть слово), то проще всего, ИМХО, воспользоваться Dictiontary;

Код

public Dictionary<string, int[]> dictionary = new Dictionary<string, int[]>();


Dictionary это стандартное обобщение с методами типа Add(), Remove(), Clear(). В общем все удобства. Почитайте про это обобщение. Думаю это то, что решает ваше задачу самым простым способом.

Автор: posthuman 14.12.2009, 18:50
Как бы этот метод еще сложен для меня. Можно как-нибудь попроще задавать?
Код

public class MyIndex
{
public string word;//слово
public List<int> page = new List<int>();//страницы
public MyIndex(string _word, List<int> _page)
{
this.word = _word;
this page = _page;
}
}

Как можно вводить это с клавиатуры, чтобы введенное слово соответсвовало страницам?

Автор: ДобренькийПапаша 14.12.2009, 19:42
Вот программа в консоли. Работает. Запустите и введите Ivanov для проверки)))
Код

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

namespace ForVingradDictionary
{
    class Program
    {
        private Dictionary<string, int[]> index = new Dictionary<string,int[]>();
        public Dictionary<string, int[]> Index
        {
            get { return index; }
        }

        private List<int> GetPages(string word)
        {
            List<int> pages = new List<int>();
            foreach (KeyValuePair<string, int[]> item in index)
            {
                if (item.Key == word)
                {
                    pages.AddRange(item.Value);
                }
            }
            return pages;
        }
        static void Main(string[] args)
        {
            Program ex = new Program();
            ex.Index.Add("Ivanov", new int[] { 1, 25, 73 });
            ex.Index.Add("Petrov", new int[] { 2, 31, 86 });
            ex.Index.Add("Sidorov", new int[] { 3, 41, 72 });

            Console.Write("Input word:");
            string word = Console.ReadLine();
            Console.WriteLine();

            List<int> pages = ex.GetPages(word);

            Console.WriteLine("Pages for your word:");
            foreach (int page in pages)
            {
                Console.WriteLine(page.ToString());
            }

            Console.ReadLine();
        }
    }
}


Автор: posthuman 14.12.2009, 19:57
Код

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

namespace Primer
{
    class MyIndex
    {
        private Dictionary<string, int[]> index = new Dictionary<string, int[]>();

        public Dictionary<string, int[]> Index
        {
            get { return index; }
        }

        public List<int> GetPages(string word)
        {
            List<int> pages = new List<int>();
            foreach (KeyValuePair<string, int[]> item in index)
            {
                if (item.Key == word)
                {
                    pages.AddRange(item.Value);
                }
            }
            return pages;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyIndex ex = new MyIndex();
            ex.Index.Add("Ivanov", new int[] { 1, 25, 73 });
            ex.Index.Add("Petrov", new int[] { 2, 31, 86 });
            ex.Index.Add("Sidorov", new int[] { 3, 41, 72 });

            Console.Write("Input word:");
            string word = Console.ReadLine();
            Console.WriteLine();

            List<int> pages = ex.GetPages(word);

            Console.WriteLine("Pages for your word:");
            foreach (int page in pages)
            {
                Console.WriteLine(page.ToString());
            }

            Console.ReadLine();
        }
    }
}



Во. в отдельном классе работает.

Автор: ДобренькийПапаша 14.12.2009, 20:05
Ну разделил...
А вообще советую изучить основы)))
Код

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

namespace ForVingradDictionary
{
    class Book
    {
        private Dictionary<string, int[]> index = new Dictionary<string, int[]>();
        public Dictionary<string, int[]> Index
        {
            get { return index; }
        }

        public List<int> GetPages(string word)
        {
            List<int> pages = new List<int>();
            foreach (KeyValuePair<string, int[]> item in index)
            {
                if (item.Key == word)
                {
                    pages.AddRange(item.Value);
                }
            }
            return pages;
        }
    }
    class Program
    {
        
        static void Main(string[] args)
        {
            Book ex = new Book();
            ex.Index.Add("Ivanov", new int[] { 1, 25, 73 });
            ex.Index.Add("Petrov", new int[] { 2, 31, 86 });
            ex.Index.Add("Sidorov", new int[] { 3, 41, 72 });

            Console.Write("Input word:");
            string word = Console.ReadLine();
            Console.WriteLine();

            List<int> pages = ex.GetPages(word);

            Console.WriteLine("Pages for your word:");
            foreach (int page in pages)
            {
                Console.WriteLine(page.ToString());
            }

            Console.ReadLine();
        }
    }
}



p.s. Интересно кто за -3 проголосовал на все мои посты в этой теме?)))

Автор: posthuman 14.12.2009, 23:09
А можно как-нибудь попроще сделать тоже самое? Задание это по классам(глава 7), а то что напрограммировано в конце книги(глава 13).
Я основы читал и до сих пор читаю, просто задание на самом деле не легкое.
Я - не ставил(недостаточно у меня постов).

Автор: ДобренькийПапаша 15.12.2009, 10:09
Вот со структурой)))

Код

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

namespace Book
{
    struct Indexer
    {
        string word;
        int[] pages;

        public string Word
        {
            get { return word; }
        }
        public int[] Pages
        {
            get { return pages; }
        }

        public Indexer(string word, int[] pages)
        {
            this.word = word;
            this.pages = new int[pages.Length];
            this.pages = pages;
        }
    }
    class Program
    {
        const int len = 256;
        static void Main(string[] args)
        {
            Indexer[] book = new Indexer[len];

            book[0] = new Indexer("Ivanov", new int[] { 2, 25, 37 });
            book[1] = new Indexer("Petrov", new int[] { 3, 42, 21 });
            book[2] = new Indexer("Sidorov", new int[] { 12, 15, 32 });

            Console.Write("Input word:");
            string word = Console.ReadLine();

            for (int i = 0; i < len; i++)
            {
                if(book[i].Word==null)
                    break;
                if (book[i].Word == word)
                {
                    for (int j = 0; j < book[i].Pages.Length; j++)
                    {
                        Console.WriteLine(book[i].Pages[j].ToString());
                    }
                        
                }                
            }
            Console.ReadLine();
        }
    }
}

Автор: posthuman 15.12.2009, 19:12
неее. там же в задачке класс, а не структура.  но сделать его как-нибудь попроще. НАпример, как нибудь мой 2ой пост в этой теме переделать в класс можно? или только в этой задачке Dictionary подойдет?

Автор: ДобренькийПапаша 15.12.2009, 19:25
В моём последнем посте можешь структуру заменить на класс, изменив одно слово. Сделано предельно просто. Куда ещё проще я не знаю.
Элементарно всё...

Автор: posthuman 15.12.2009, 19:27
Ихменив струтуру на класс, придется менять и функцию main. Создавать нужно иначе экземпляр класса с аргументами, и производить ввод данных.

Автор: ДобренькийПапаша 15.12.2009, 19:54
Я только что изменил слово struct на class.
Всё запустилось и работало. Я даже не знаю зачем я проверял это... Не знаю откуда вы взяли чего-то там про ввод и создание...

p.s. Да, в C# структура от класса сильно отличается, это правда. Но это другая история.

Автор: SpbFlush09 17.12.2009, 20:50
Ребят, помогите класс создать, у меня с ними полнейший завал, не понимаю их совсем!!! 
Задача :
Описать класс, представляющий круг. Предусмотреть методы для создания объектов вычисления площади круга, длины окружности и проверки попадания заданной точки внутрь круга. Описать свойства для получения состояния объекта. Написать программу, демонстрирующую все разработанные элементы класса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)