С# не могу найти ошибку в индексации
Само задание звучит так: "Напишите программу с классом, в котором есть неотрицательное целочисленное поле. Опишите для класса индексатор с целочисленным индексом и set-аксессером. Присваивание значения проиндексированному объекту обрабатывается след. образом.В фактически присваиваемом значении берётся только последняя цифра. Индекс определяет разряд в числовом значении поля, в который записывается цифра. Нулевой разряд соотв. единицам, единичный десяткам и т.д. Например,если объект проиндексирован числом 1 и присваивается значение, заканчивающееся на 5, то это означает, что в числе ,которое которое является значением поля , в разряд десятков(1 разряд) нужно записать цифру 5."
Вот мой код:
class MyClass
{
public uint ch = 0;
public uint this [uint k]
{
set
{
uint a = ch;
int i = 0;
double x = Convert.ToDouble(ch);
// Подсчёт "длины" числа
while (x >= 1)
{
x = x / 10;
i++;
}
// Создание массива длинной в число
uint[] arr = new uint[i];
// Заполнение массива
for (int j = i - 1; j >= 0 ; j--)
{
arr[j] = a % 10;
a = (a - (a % 10)) / 10;
}
// Присваивание значения "разряду" числа
arr[k] = value % 10;
// Запись изменённого числа в поле
for (int j = i; j >= 0; j--)
{
ch = ch + (uint)Math.Pow(10, Convert.ToDouble(j)) * arr[j - 1];
}
}
}
}
class Program
{
static void Main(string[] args)
{
MyClass A = new MyClass();
Console.Write("Введите единицы: ");
A[0] = Convert.ToUInt32(Console.ReadLine());
Console.Write("Введите десятки: ");
A[1] = Convert.ToUInt32(Console.ReadLine());
Console.Write("Введите сотни: ");
A[2] = Convert.ToUInt32(Console.ReadLine());
Console.Write("Введите тысячи: ");
A[3] = Convert.ToUInt32(Console.ReadLine());
Console.WriteLine("Число = " + A.ch);
Console.Write("Измените десятки: ");
A[1] = Convert.ToUInt32(Console.ReadLine());
Console.WriteLine("Число = " + A.ch);
}
}
Вылезает ошибка в строке:
arr[k] = value % 10;
"Индекс находится вне границ массива"
Не могу понять почему и прошу помощи.
Ответы (2 шт):
Напиши:
try {
arr[k] = value % 10;
} catch {
Console.WriteLine($"arr[{k}] = {value % 10} Lenght:{arr.Lenght}");
}
И сразу станет очевидно.
Мне кажется, вы в какие-то дебри полезли, зачем массив, double и 3 цикла?
И лучше называйте переменные и поля понятными именами: ch похоже на character, лучше number.
class MyClass
{
public uint number = 0;
public uint this[uint k]
{
set
{
uint multiplier = (uint)Math.Pow(10, k); // получить множитель разряда
uint digit = number / multiplier % 10; // получить цифру
number -= digit * multiplier; // стереть старую цифру
number += value % 10 * multiplier; // записать новую
}
}
}
Вывод
Введите единицы: 1
Введите десятки: 2
Введите сотни: 3
Введите тысячи: 4
Число = 4321
Измените десятки: 5
Число = 4351
А если бы я любил сокращать как вы, у меня вообще получилось бы вот так :)
set
{
uint m = (uint)Math.Pow(10, k);
n += (value % 10 - n / m % 10) * m;
}