Среда, 18 Декабря 2024, 09:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Разбивка int на цифры и загрузка в список (решено)
CoreДата: Вторник, 15 Сентября 2020, 20:51 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Каким образом можно разбить int на отдельные цифры, и загрузить в список?
На пример: было
Код
int a = 8765;
а стало
Код
var list = new List<int>{8,6,7,5};




Сообщение отредактировал Core - Суббота, 19 Сентября 2020, 12:20
LLLДата: Вторник, 15 Сентября 2020, 21:01 | Сообщение # 2
участник
Сейчас нет на сайте
можно ToString и Parse юзать. Ну т.е. через string это сделать.
CoreДата: Вторник, 15 Сентября 2020, 21:30 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
LLL, Прочел документацию и все равно не представляю, как именно использовать Parse в моем случае.

DivESДата: Вторник, 15 Сентября 2020, 21:56 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Core, так а в чём, собственно, проблема? Переводишь из целочисленного типа в строковый с помощью метода ToString().
Затем хотя бы тем же циклом с перебором заполняешь свой список символами из строки (учитывая, что строка — коллекция символов; доступ осуществляется по []).
Всё же в течение пары минут нагугливается. <_<
метод ToString(), сам String
drcrackДата: Вторник, 15 Сентября 2020, 23:01 | Сообщение # 5
старожил
Сейчас нет на сайте
Код
var a = 87650000;
var list = new List<int>(16);

while(a > 0) {
  list.Insert(0, a % 10);
  a /= 10;
}


(Список сразу аллоцируется на 16 элементов — ближайшая степень двойки к максимальному числу цифр в int)

PS Кто-то скажет что лучше использовать Add и потом сделать Reverse, но на мой взгляд, это не особо нужная микрооптимизация которая толком ничего не ускоряет и портит семантику этого куска кода. Хотя, если это все обернуть в метод, можно сделать и с Reverse.


Сообщение отредактировал drcrack - Вторник, 15 Сентября 2020, 23:11
CoreДата: Среда, 16 Сентября 2020, 17:53 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
DivES, Те к символам из стринга можно обратиться с помощью []?
Код

    class Program
    {
        public static string FakeBin(string x)
        {
            var list = new List<int> { };
            foreach (var i in x)
                Console.WriteLine(x[i]);//тут :p
            return x;
        }
        public static void Main(string[] args)
        {
            FakeBin("987987");
            Console.ReadKey();
        }
    }

У меня пишет, что индекс вне границ массива




Сообщение отредактировал Core - Среда, 16 Сентября 2020, 17:54
DivESДата: Среда, 16 Сентября 2020, 20:35 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Core, ты вообще понял, что ты сделал? :D
Не отвечай, знаю, что не понял.
Код
foreach (var i in x)

Для каждого i в x, где x — строка.
А значит что? Правильно, i будут символами.
И что же ты делаешь дальше?
Пытаешься обратиться по индексу (i), который является первым символом твоей строки.
А там что? Девятка. А массив какой длины? Шесть.
Ну нельзя же так.
Два варианта:
Код

foreach (var i in x)
    list.Append(i);

или
Код

for (int i = 0; i < x.Length(); ++i)
    list.Append(x[i]);

где Length() возвращает длину строки, а Append() — добавляет элемент к списку.

Без обид, надеюсь. Просто ты должен был использовать один из способов, а использовал оба. foreach как раз ведь и применяется, чтобы с индексами не возиться. laugh


Сообщение отредактировал DivES - Среда, 16 Сентября 2020, 20:41
CoreДата: Среда, 16 Сентября 2020, 21:14 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
DivES, Спасибо за то, что уделяешь время таким нубам как я.
Без шуток, ты - один из лучших обитателей gcup! :)

Свою ошибку понял и исправил. Все работает как нужно


drcrackДата: Четверг, 17 Сентября 2020, 12:46 | Сообщение # 9
старожил
Сейчас нет на сайте
Цитата
Пытаешься обратиться по индексу (i), который является первым символом твоей строки.
А там что? Девятка. А массив какой длины? Шесть.

Был бы массив размером больше 9, все равно не помогло бы, т.к. у девятки ASCII код 57, а именно он и используется в качестве индекса в этом случае :D
CoreДата: Четверг, 17 Сентября 2020, 16:26 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Цитата drcrack ()
у девятки ASCII код 57

Кстати, на счет этого...
Код

namespace ConsoleApplication1
{
    class Program
    {
        public static string FakeBin(string x)
        {
            var y = ""; //Результат
            var bufOut = "";//Для конвертации в string
            int buf = 0;//Для конвертации в int, и всех последующих операций
            foreach (var i in x){
                buf = Convert.ToInt32(i);//Конвертируем входные данные в int, и записываем в buf
                Console.WriteLine("i:"+i);//ДЕБАГ Вывод символа, который находится в i (входные данные)
                Console.WriteLine("buf:"+buf);//ДЕБАГ Вывод того, что записалось в buf, после конвертации i в int
                if (buf >= 5) { buf = 1; } else { buf = 0; }//Проверка значения цифры. Если больше, или равно 5, то заменяем содержимое на 1, иначе на 0
                bufOut = Convert.ToString(buf);//Конвертируем все данные обратно в string
                y += bufOut;//Складываем все в один string (y)
            }
            Console.WriteLine("");//Отступ
            Console.WriteLine("Output: "+y);//Вывод выходных данных
            return y;//Возвращаем Выходные данные
        }
        public static void Main(string[] args)
        {
            FakeBin("52744248"); //В данном случае, выходные данные должны быть 10100001
            Console.ReadKey();//Ожидание нажатия любой клавиши.
        }
    }
}


Пытаюсь сделать что-то вроде генератора поддельного двоичного кода.
В buf записывается код ASCII, а по задумке, там должна храниться цифра из стринга.
Может есть функция, которая преобразовывает ASCII код цифры в саму цифру?


drcrackДата: Четверг, 17 Сентября 2020, 22:24 | Сообщение # 11
старожил
Сейчас нет на сайте
Цитата
Может есть функция, которая преобразовывает ASCII код цифры в саму цифру?


Вот это все:
Код
buf = Convert.ToInt32(i);//Конвертируем входные данные в int, и записываем в buf
                Console.WriteLine("i:"+i);//ДЕБАГ Вывод символа, который находится в i (входные данные)
                Console.WriteLine("buf:"+buf);//ДЕБАГ Вывод того, что записалось в buf, после конвертации i в int
                if (buf >= 5) { buf = 1; } else { buf = 0; }//Проверка значения цифры. Если больше, или равно 5, то заменяем содержимое на 1, иначе на 0
                bufOut = Convert.ToString(buf);//Конвертируем все данные обратно в string
                y += bufOut;//Складываем все в один string (y)


Делается одной строчкой:
Код
y += (char) ('0' + (i - '0') / 5);


PS Если это делается часто, лучше использовать StringBuilder чтобы не плодить новые строки на каждой итерации (каждый лишний обьект приближает сборку мусора, а также замедляет ее)


Сообщение отредактировал drcrack - Четверг, 17 Сентября 2020, 22:37
CoreДата: Пятница, 18 Сентября 2020, 15:58 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
Цитата drcrack ()
Делается одной строчкой:

Не очень понимаю такой синтаксис. Можно подробнее рассказать о том, что за что отвечает? :'p




Сообщение отредактировал Core - Пятница, 18 Сентября 2020, 15:59
drcrackДата: Пятница, 18 Сентября 2020, 16:56 | Сообщение # 13
старожил
Сейчас нет на сайте
i - '0' возвращает разницу между символом i и символом 0
для цифр это совпадает с их числовым значением т.к. они идут подряд начиная с '0'
далее это делится на 5 челочисленным делением, что для 0-4 дает 0, а для 5-9 дает 1
далее к '0' прибавляется то что получилось (0 или 1), получается либо '0' либо следующий символ т.е. '1'
ну и (char) конвертирует результат в символ т.к. после сложения '0' с числом получится число и если убрать (char) то в строке будут ascii коды


Сообщение отредактировал drcrack - Пятница, 18 Сентября 2020, 16:57
CoreДата: Пятница, 18 Сентября 2020, 17:49 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
drcrack, Спасибо за помощь. =)

OpenGOOДата: Суббота, 19 Сентября 2020, 10:54 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
вот ещё вариант
Код

    int value = 8765;
    var list = new List<int>();
    while (true) {
        int remainder;
        value = Math.DivRem(value, 10, out remainder);
        list.Insert(0, remainder);
        if (value == 0) {
            break;
        }
    }


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг