0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 64
1

Васильев C# Глава 8 задача 2 (Просьба объяснить формулировку(задача внутри)

24.10.2019, 07:31. Показов 3156. Ответов 9

Текст задачи
Написать программу , в которой есть класс с полем, являющимся ссылкой на одномерный целочисленный массив. У класса есть конструктор с одним целочисленным аргументом, определяющим размер массив. При создании объекта все элементы массива, получают нулевые значения. В классе перегружаются следующие операторы. Унарный оператор ~ перегружен таким образом, что результатом возвращается текстовая строка со значениями элементов массива(на который ссылается поле объекта, к которому применяется оператор). Унарный оператор инкремента ++ перегружен так, что его применение к объекту приводит к добавлению в массив нового элемента с нулевым значением. Результатом возвращается ссылка на объект-операнда. При применении к объекту оператор декремента -- из массива удаляется один элемент(например, последний), а результатом возвращается ссылка на объект-операнд.
Бинарный оператор сложения должен быть определен так, чтобы можно было вычислить сумму 2 объектов, объекта и числа, а также числа и объекта. Во всех случаях результатом возвращается новый объект. Если в операции участвуют два объекта-операнда, то в объекте-результате массив получается добавлением нового элемента к массиву из объекта-операнда. Значение добавляемого элемента определяется значением числа-операнда. Если к числу прибавляется объект, то новый элемент добавляется в начало массива. Если к объекту прибавляет число, то новый элемент добавляется в конец массива.

По порядку:
1) а результатом возвращается ссылка на объект-операнд. Как это?
я написал так, но кажется по условию возвращать должно что-то другое:
C#
1
2
3
4
5
6
7
8
9
10
11
public static string operator ~(MyClass obj)
    {
        string stringOfMassive="";
 
        foreach (int elem in obj.massive)
        {
            stringOfMassive += elem + " ";
        }
 
        return stringOfMassive;
    }
2)Бинарный оператор сложения должен быть определен так, чтобы можно было вычислить сумму 2 объектов, объекта и числа, а также числа и объекта.
Какие объекты? Что с чем тут складывать массив с числом? Массив с массивом? Как сложить массив с одним числом?
Или тут имеется в виду типа своеобразная конкатенация для массивов?

3)Если в операции участвуют два объекта-операнда, то в объекте-результате массив получается добавлением нового элемента к массиву из объекта-операнда. Тут складываются массивы? И в результирующий массив добавляется элемент из-какого-то массива-операнда?

Добавлено через 1 час 46 минут
Привёл не тот фрагмент кода в вопросе,
вот тот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static MyClass operator ++(MyClass obj)
    {
        MyClass obj1 = new MyClass(obj.massive.Length + 1);
 
        for (int count = 0; count < obj.massive.Length; count++)
        {
            obj1.massive[count] = obj.massive[count];
        }
        obj1.massive[obj1.massive.Length - 1] = 0;
        obj = obj1;
        obj1 = null;
        return obj;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2019, 07:31
Ответы с готовыми решениями:

Васильев C# Глава 7 задача 8 (Просьба объяснить формулировку(задача внутри)
Текст задачи Напишите программу с классом, у которого есть текстовое поле. Значение текстовому...

Считывание числа поциферно (задача Лафоре, 3 глава, объяснить код)
Напишите программу,которая позволяет пользователю ввести 6 цифр,а затем выводит результат типа long...

Прата, задача 2, глава 6
Доброго времени суток. Учу программирования по книжке Прата. И вот такая задача: &quot;Напишите...

Лафоре. Глава 11. Задача 2
Решал задачку из учебника - Лафоре. Глава 11. Задача 2. Вот код #include &lt;iostream&gt; #include...

9
1826 / 1168 / 501
Регистрация: 14.10.2018
Сообщений: 3,177
24.10.2019, 14:48 2
Лучший ответ Сообщение было отмечено Шрайн как решение

Решение

Шрайн, начнем по порядку
Цитата Сообщение от Шрайн Посмотреть сообщение
1) а результатом возвращается ссылка на объект-операнд.
Если проще - возвращаем this. НО так как мы находимся в статик-методе (this запрещен в статиках), то возвращаем ссылку на этот объект.
Цитата Сообщение от Шрайн Посмотреть сообщение
2)Бинарный оператор сложения должен быть определен так, чтобы можно было вычислить сумму 2 объектов, объекта и числа, а также числа и объекта.
Вы складываете объекты (ob1 + ob2), само собой компилятор скажет вам что это ерудна и выдаст ошибку, НО мы же перегружаем эти методы, а после перегрузки ЛОГИКА будет та, что задали вы сами. При сложении 2-ух объектов может:
1) складывать значения массивов этих 2-ух объектов
2) складываться какая то определенная переменная 1-го объекта с переменной 2-го объекта
3) происходить вычитание. переменная 1-го объекта вычитается значение переменной 2-го объекта и записывается в переменную 1-го объекта (казалось бы глупость, но это возможно).
4) или данные будут умножаться (каждое четное значение 1-го массива будет умножаться на случайный элемент 2-го массива)
Короче, вы просто начинаете издеваться над объектом так, как вам захочется. Любая фантазия в действительности
Цитата Сообщение от Шрайн Посмотреть сообщение
3)Если в операции участвуют два объекта-операнда, то в объекте-результате массив получается добавлением нового элемента к массиву из объекта-операнда
Как я упомянул выше - творите что хотите, главное чтобы поняли суть. Ну с массивами думаю разберетесь
Вот вам небольшой примерчик, думаю поможет, будут вопросы - спрашивайте
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
 
namespace Test
{
    class MyClass
    {
        int[] arr;
        public int number;
 
        public MyClass(int count)
        {
            arr = new int[count];
            FillArray();
            number = 0;
        }
 
        private void FillArray()
        {
            for (int i = 0; i < arr.Length; i++)
                arr[i] = 0;
        }
 
        public void PrintArray()
        {
            for (int i = 0; i < arr.Length; i++)
                Console.Write(arr[i].ToString());
            Console.WriteLine();
        }
 
        public void PrintNumber()
        {
            Console.WriteLine($"Значение number равно {number}");
        }
 
        // Перегрузка декремента
        public static MyClass operator --(MyClass myClass)
        {
            // Сделать проверку на длину базового массива
            int[] arrNew = new int[myClass.arr.Length - 1];
 
            // Переписываем массив, кроме последнего индекса
            for (int i = 0; i < arrNew.Length; i++)
                arrNew[i] = myClass.arr[i];
 
            // Базовый массив теперь указывает на другой массив (тот что создали только что)
            myClass.arr = arrNew;
 
            // Ссылка на объект-операнд
            // Если проще - аналог this (но мы в static методе, this тут нельзя писать)
            return myClass;
        }
 
        // Перегрузка плюса для 2-ух объектов
        public static MyClass operator+(MyClass current, MyClass other)
        {
            current.number += other.number;
            return current;
        }
 
        // Перегрузка плюса для объекта и числа
        public static MyClass operator +(MyClass myClass, int otherNumber)
        {
            myClass.number += otherNumber;
            return myClass;
        }
 
        // Перегрузка плюса для числа и объекта
        //public static MyClass operator +(int otherNumber, MyClass myClass)
        //{
        //    myClass.number += otherNumber;
        //    return myClass;
        //}
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass(5);
 
            // Результат перегрузки декремента
            myClass.PrintArray();
            myClass--;
            myClass.PrintArray();
 
 
            // Результат перегрузки плюса для 2-ух объектов
            MyClass myClassTwo = new MyClass(1);
            myClass.number = 10;
            myClassTwo.number = 5;
            myClass.PrintNumber();
            // Складывать классы - кто бы мог подумать
            myClass = myClass + myClassTwo;
            myClass.PrintNumber();
 
 
            // Результат перегрузки плюса для объекта и числа
            myClass = myClass + 100;
            myClass.PrintNumber();
 
            // ОШИБКА
            // Нет перегрузки числа и класса (до этого было наоборот)
            //myClass = 999 + myClass;
            //myClass.PrintNumber();
 
            Console.ReadKey();
        }
    }
}
1
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 64
24.10.2019, 15:27  [ТС] 3
Enifan,
1) То есть код в конце вопроса подходит под описание (возвращаем ссылку на объект)?
2) По перегрузке сложения:
2.1)Сложение объектов, это по сути сложение элементов двух массивов? Если да, то как я понимаю размерность надо задавать одинаковую для массивов.
2.2)Не очень мне всё же понятно как сложить массив с числом.
2.3)Так понимаю, что сложить число с массивом, можно также как и в п.п. 2.3, осталось понять как
3) я не понял его вообще: речь идёт о сложении двух массивов, но при этом непонятно о каком из двух операндов идёт речь и из какого операнда добавить элемент в результирующий массив.
Сложение объектов: То есть мы допустим берём "понравившийся" элемент из первого массива и добавляем его во второй массив и таким образом получаем новый результирующий массив?
Если прибавляем число к массиву, то это тоже самое что добавить его в начало массива как новый элемент, а если наоборот, то в конец?
0
1826 / 1168 / 501
Регистрация: 14.10.2018
Сообщений: 3,177
24.10.2019, 15:49 4
Шрайн,
1) Да, просто ссылку на этот самый объект (она же является аргументом в параметрах)
2.1) Сложение объектов - это не сложение массивов. Вы задаете что, что ХОТИТЕ. (хоть складывайте массивы, хоть складывайте переменные, хоть умножайте массивы). Если вздумали сложить массивы - то необязательно одинаковые массивы. Сложите те индексы что есть у обоих объектов, а если есть разница, то просто перепишите значение.
2.2) реализуйте так как хотите
2.3) код что я скидывал - там указано
3) а выбирайте тот операнд и тот массив что хотите и вставляйте куда хотите

Сложение объектов: если такая логика вам нравится - вперед.

Поймите одну вещь. Перегрузка операторов сделана для того, чтобы упрощать часть кода. В зависимости от вашей логики вы можете перегрузить что угодно и как угодно, чтобы сам код был более компактным.

В вашем задании главное не то чтобы сложить число и массив, а чтобы понять как это может быть удобно в некоторых ситуациях
1
1115 / 786 / 219
Регистрация: 15.08.2010
Сообщений: 2,167
24.10.2019, 16:00 5
Цитата Сообщение от Enifan Посмотреть сообщение
// Ссылка на объект-операнд
* * * * * * // Если проще - аналог this (но мы в static методе, this тут нельзя писать)
* * * * * * return myClass;
так нелья, нужно всегда возвращать новый объект класса
0
1826 / 1168 / 501
Регистрация: 14.10.2018
Сообщений: 3,177
24.10.2019, 16:09 6
КОП, а зачем нам новый? мы же перегруженные методы используем для старого
0
1115 / 786 / 219
Регистрация: 15.08.2010
Сообщений: 2,167
24.10.2019, 16:10 7
Цитата Сообщение от Enifan Посмотреть сообщение
а зачем нам новый?
иначе постфикс не будет работать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        class Tt
        {
            public int i;
 
            public static Tt operator ++(Tt t)
            {
                //return new Tt(){i = t.i + 1};
                t.i++;
                return t;
            }
 
            public override string ToString()
            {
                return this.i.ToString();
            }
        }
 
        public static void Main(string[] args)
        {
            var t = new Tt();
            Console.WriteLine(t);
            Console.WriteLine(t++);
            Console.WriteLine(++t);
корректный результат 0 0 2, а не 0 1 2
1
1826 / 1168 / 501
Регистрация: 14.10.2018
Сообщений: 3,177
24.10.2019, 16:28 8
Шрайн, просто суть в том, что в вашем задании не указывается как именно должен работать алгоритм сложения объекта и числа. Следовательно перегружайте на ваше усмотрение
вот еще примерчик, в котором перегрузка идет на любой вкус, можете выбрать один из предложенных
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
 
namespace Test
{
    class MyClass
    {
        int[] arr;
        public int number;
 
        public MyClass()
        {
            arr = new int[] { 0, 1, 2, 3, 4};
            number = 0;
        }
 
        public void PrintArray()
        {
            for (int i = 0; i < arr.Length; i++)
                Console.Write(arr[i].ToString() + " ");
            Console.WriteLine();
        }
 
        public void PrintNumber()
        {
            Console.WriteLine($"Значение number равно {number}");
        }
 
        // Перегрузка плюса для объекта и числа
 
        // Увеличивается переменная number
        //public static MyClass operator +(MyClass myClass, int otherNumber)
        //{
        //    myClass.number += otherNumber;
        //    return myClass;
        //}
 
        // Уменьшается переменная number
        //public static MyClass operator +(MyClass myClass, int otherNumber)
        //{
        //    myClass.number -= otherNumber;
        //    return myClass;
        //}
 
        // Умножается переменная number
        //public static MyClass operator +(MyClass myClass, int otherNumber)
        //{
        //    myClass.number *= otherNumber;
        //    return myClass;
        //}
 
        // Массив увеличился на единицу и в конец записалось входное число
        public static MyClass operator +(MyClass myClass, int otherNumber)
        {
            int[] newArr = new int[myClass.arr.Length + 1];
            for (int i = 0; i < myClass.arr.Length; i++)
                newArr[i] = myClass.arr[i];
            newArr[newArr.Length - 1] = otherNumber;
            myClass.arr = newArr;
            return myClass;
        }
 
        // Массив увеличился на единицу, вначале записалось число, а потом оставшийся массив
        //public static MyClass operator +(MyClass myClass, int otherNumber)
        //{
        //    int[] newArr = new int[myClass.arr.Length + 1];
        //    newArr[0] = otherNumber;
        //    for (int i = 0; i < myClass.arr.Length; i++)
        //        newArr[i + 1] = myClass.arr[i];
        //    myClass.arr = newArr;
        //    return myClass;
        //}
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            MyClass my = new MyClass();
            my += 5;
            my.PrintArray();
            my.PrintNumber();
 
            Console.ReadKey();
        }
    }
}
Добавлено через 16 минут
КОП, а если объект большой, то все данные переписывать?
0
1115 / 786 / 219
Регистрация: 15.08.2010
Сообщений: 2,167
24.10.2019, 16:37 9
Цитата Сообщение от Enifan Посмотреть сообщение
а если объект большой, то все данные переписывать?
1. Не переписываете и получаете неверный результат
2. Переписываете, дропается производительность, но код хотя бы работает
3. Не занимаетесь ерундой и не переопределяете всякие инкременты для огромных классов

я за 3
0
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 64
25.10.2019, 07:10  [ТС] 10
Enifan, Задание не моё, оно из учебника Васильева "C# для начинающих")
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2019, 07:10

Задача из книги Страуструпа 4 глава векторы
Задача: Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока...

Правильное ли решение задачи? Лафоре. 3 глава 9 задача
Представьте, что вы собираетесь пригласить к себе шестерых гостей, но за вашим столом могут...

Сокращение программы, приводит к другому результату. Лафоре 3 глава, 3 задача
Добрый день. Столкнулся с непонятным свойством. При сокращении программы, выводится другой...

Задача из Bjarne Stroustrup (Глава 12,7 №2)Графическая линия в консоли(в стиле ASCII)
Глава 12,7 №2. Implement a simple graphics system using whatever graphics facilities are available...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.