Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 89

Соответствует ли код условиям задачи (внутри)?

08.11.2019, 11:41. Показов 2862. Ответов 9

Студворк — интернет-сервис помощи студентам
Задача:
Напишите программу, в которой есть базовый класс с открытым целочисленным полем.
В классе описан виртуальный индексатор, позволяющий считывать цифры в десятичном представлении числа (значение поля).
На основе базового класса создаётся производный класс, в котором появляется ещё одно открытое целочисленное поле.
В производном классе описывается версия индексатора с двумя индексами: первый индекс определяет поле, значение которого используется, а второй определяет разряд, для которого считывается цифра.
Индексатор с одним индексом переопределяется так, что вычисления (считывание цифры в десятичном представлении числа) производятся на основе значения, равного сумме значений полей индексируемого объекта

Код
Кликните здесь для просмотра всего текста
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
class Base
{
    public int number = 1024;
 
    //индексатор возвращающий цифру из числа number
    public virtual int this[int k]
    {
        get
        {
            return Convert.ToInt32(this.number.ToString()[k]);
        }        
    }
}
 
class MyClass: Base
{
    new public int number = 2048;
    //переопределение индексатора возвращающего цифру из числа,
    //являющегося суммой number производного и базового класса
    public override int this[int k]
    {
        get
        {
            int num = number + base.number;            
            return Convert.ToInt32(num.ToString()[k].ToString());
            
        }
    }
    //перегрузка индексатора возвращающего цифру из числа number
    //если символьный аргумент равен 'p', то из number производного класса, 
    //иначе из базового
    public int this[char c, int k]
    {
        get
        {
            if (c == 'p')
            {
                
                return Convert.ToInt32(number.ToString()[k].ToString());
            }
            else
            {
                return Convert.ToInt32(base.number.ToString()[k].ToString());
            }
        }
    }
   
}
 
class Program
{
    static int Main()
    {
        //создание объекта производного класса
        MyClass obj = new MyClass();
        //вызов переопределённого индексатора 
        Console.WriteLine(obj[2]);
        //вызов перегруженного индексатора 
        Console.WriteLine(obj['p',2]);
        Console.WriteLine(obj['b', 2]);
        return 0;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2019, 11:41
Ответы с готовыми решениями:

Точно ли код соответствует условию задачи?
1. Создайте командный файл, работающий с двумя параметрами и выполняющий следующие действия без вывода на экран монитора командных строк:...

Соответствует ли последовательность заданным условиям
Ввести N чисел, проверить, являются ли введенные числа перестановкой {1,2,3,4,.....,2*n-1}. А так же составить последовательность...

Найти такую кривую, которая соответствует заданным условиям
Найти такую ​​кривую, проходящую через точку P (0; -2), чтобы угловой коэффициент касательной в любой ее точке равен ординате этой точки,...

9
 Аватар для dazering
92 / 62 / 31
Регистрация: 22.12.2018
Сообщений: 121
08.11.2019, 16:41
По заданию вроде всё так. Только, в дочернем классе не обязательно перекрывать поле родительского.

Но, что если значение индекса будет больше, чем длина числа? Будет exception Index Out Of Range с последующим аварийным завершением программы. Имеет смысл, реализовывать проверку,т.к. отлов исключений тяжелее, чем if, да и предназначен совсем для другой цели.

На 43 строке, можно обратиться напрямую к базовому индексатору.

На будущее: если есть некое вычисление повторяющееся много раз (как, например у вас во всех возвратах индексатора двойной ToString), имеет смысл его результат сохранить в переменную(свойство). Этот шаг немного повысит скорость выполнения.

Или просто есть, переменная с длинным обращением к ней, мы можем сделать ей "псевдоним". Убиваем двух зайцев: нет многочисленных вычислений одного и того же значения и таким образом немного повышается удобочитаемость.

Иллюстрация на основе Вашего кода
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
    class Base
    {
        public Base()
        {
            numberInStr = BaseNumber.ToString();
            length = numberInStr.Length;
        }
        public int BaseNumber = 1024;
        private string numberInStr;
        private int length;
 
        //индексатор возвращающий цифру из числа MyNumber
        public virtual int this[int k]
        {
            get
            {
                if (k >= 0 && k < length)
                {
                    return (int)char.GetNumericValue(this.numberInStr[k]);
                }
                return -1;
            }
        }
    }
 
    class MyClass : Base
    {
        public MyClass()
        {
            numberInStr = MyNumber.ToString();
            length = numberInStr.Length;
            sumBaseNumAndThisInStr = (MyNumber + BaseNumber).ToString();
            lengthSumBaseNumAndThisInStr = sumBaseNumAndThisInStr.Length;
        }
        public int MyNumber = 2048;
        private string numberInStr;
        private int length;
 
        protected string sumBaseNumAndThisInStr;
 
        protected int lengthSumBaseNumAndThisInStr;
        //переопределение индексатора возвращающего цифру из числа,
        //являющегося суммой MyNumber производного и базового класса
        public override int this[int k]
        {
            get
            {
                if (k >= 0 && k < lengthSumBaseNumAndThisInStr)
                {
                    return (int)char.GetNumericValue(sumBaseNumAndThisInStr[k]);
                }
                return -1;
 
            }
        }
        //перегрузка индексатора возвращающего цифру из числа MyNumber
        //если символьный аргумент равен 'p', то из MyNumber производного класса, 
        //иначе из базового
        public int this[char c, int k]
        {
            get
            {
                if (c == 'p')
                {
 
                    if (k >= 0 && k < length)
                    {
                        return (int)char.GetNumericValue(numberInStr[k]);
                    }
                    return -1;
                }
                else
                {
                    return base[k];
                }
            }
        }
    }
 
    class Program
    {
        static int Main()
        {
            //создание объекта производного класса
            MyClass obj = new MyClass();
            //вызов переопределённого индексатора 
            Console.WriteLine(obj[2]);
            //вызов перегруженного индексатора 
            Console.WriteLine(obj['p', 2]);
            Console.WriteLine(obj['b', 2]);
            Console.ReadLine();
            return 0;
        }
    }
1
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 89
09.11.2019, 03:38  [ТС]
Цитата Сообщение от dazering Посмотреть сообщение
На будущее: если есть некое вычисление повторяющееся много раз (как, например у вас во всех возвратах индексатора двойной ToString), имеет смысл его результат сохранить в переменную(свойство). Этот шаг немного повысит скорость выполнения.
Тут не уверен, что понял правильно, имеется в виду разложение строкИ:
C#
1
return Convert.ToInt32(base.number.ToString()[k].ToString());
На стрОки:
C#
1
2
3
string StrNumber=base.number.ToString();
StrNumber=StrNumber.ToString();
return  Convert.ToInt32(StrNumber);
Добавлено через 15 минут
вернее так:
C#
1
2
3
string StrNumber=base.number.ToString();
StrNumber=StrNumber[k].ToString();
return  Convert.ToInt32(StrNumber);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 08:54
Шрайн, индексатор лучше переписать так
C#
5
6
7
8
9
10
11
12
13
14
15
    //индексатор возвращающий цифру из числа number
    public virtual int this[int k]
    {
        get
        {
            int num = number > 0 ? number: -number;
            for(int i = 0; i < k && num != 0; i++)
                   num /= 10;
            return num % 10;
        }        
    }
Добавлено через 2 минуты
Аналогично сделать и для индексаторов в производном классе.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 08:58
dazering, ваш код - вообще, ошибка!
Поле BaseNumber публичное.
Оно может изменяться извне.
И какие тогда будет значения у полей numberInStr и length?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 09:00
Шрайн, доделайте свой код.
Не надо брать за основу код от dazering - это неправильная реализация.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 09:52
Шрайн, полный код базового класса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class IntDigits
{
    public int Number;
 
    protected static int Digit(int number, int index)
    {
         int num = number > 0 ? number: -number;
         for(int i = 0; i < index && num != 0; i++)
               num /= 10;
         return num % 10;
     }     
 
    //индексатор возвращающий цифру из числа number
    public virtual int this[int k]
        => Digit(Number, k);
}
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 09:52
Добавлено через 38 минут
Полный код производного класса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class IntsDigits : IntDigits
{
    public int NumberSecond;
 
    //индексатор возвращающий цифру из числа Number или NumberSecond
    public int this[int j, int k]
    {
         switch (j)
         {
             case 0: return Digit (Number, k);
             case 1: return Digit (NumberSecond, k);
             default: throw new IndexOutOfRangeException();
           }
     }
 
    //индексатор возвращающий сумму цифр из числа Number или NumberSecond
    public override int this[int k]
        => this[0, k] + this [1, k];
}
Добавлено через 1 минуту
Пишу со смарта - могут быть мелкие ошибки.
1
 Аватар для dazering
92 / 62 / 31
Регистрация: 22.12.2018
Сообщений: 121
09.11.2019, 12:13
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ваш код - вообще, ошибка!
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не надо брать за основу код от dazering - это неправильная реализация
Именно по этой причине было написано в спойлере:
Цитата Сообщение от dazering Посмотреть сообщение
Иллюстрация на основе Вашего кода
по образу и подобию...

К сожалению, данная реализация ошибочна, т.к. складывает только один разряд, без учёта следующего. Т.е. например: в родительском классе число 1024, в дочернем 2048. Обращаемся по индексу 2 и получаем 2+4 возврат 6, но по правилам сложения 1024+2048=3072 возврат 7.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
//индексатор возвращающий сумму цифр из числа Number или NumberSecond
    public override int this[int k]
        => this[0, k] + this [1, k];
Можно так:
C#
1
2
        public override int this[int k]
            => Digit((NumberSecond + Number),k);
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
09.11.2019, 15:01
dazering, да, невнимательно прочёл задание.
Нужна не сумма цифр, а цифра суммы.

Шрайн, переопределенный индексаторов возьмите из последнего поста dazering.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2019, 15:01
Помогаю со студенческими работами здесь

Автоматический запуск макроса при открытии любой книги, которая соответствует конкретным условиям
Добрый день, уважаемые форумчане! Нужна ваша помощь:) Ситуация следующая. Мне на почту каждый день приходит екселевский файл, который...

Метод из интерфейса должен создавать новый массив (код программы и текст задачи внутри)
Текст Задачи Сложности с этим фрагментом: метод из интерфейса должен создавать новый массив Код программы: using System; ...

У меня есть файл и внутри этого файла есть код, я хочу его открыть в IDLE питон так, чтобы внутри код вывести
У меня есть файл и внутри этого файла есть код, я хочу его открыть в IDLE питоне так, чтобы код можно было выполнить в idle: Файл с таким...

Объясните, пожалуйста, что значит код, расположенный внутри тега, и код, расположенный внутри страницы?
Объясните, пожалуйста, что значит код, расположенный внутри тега, и код, расположенный внутри страницы. Не совсем понятно, чем они...

Решение задачи по данным условиям
Доброго времени суток. Есть задача: Использую данный код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru