Страница 1 из 1

Ввод данных из консоли в одномерный массив (Си)

Добавлено: 24 авг 2016, 13:36
konstantin.vasilkov
Всем привет!
Начал изучение гарводского курса CS50 и столкнулся с небольшими затруднениями при решении задачи.
Дано: пользователь вводит число с клавиатуры (номер кредит. краты). Мы должны проверить является ли карта настоящей, выполнив некоторые математические операции с отдельными цифрами этого номера. По условиям рекомендуют номер записывать с помощью функции GetLongLong из библиотеки курса. Математические операции предполагают например удвоение каждой второй цифры в этом номере. То есть по сути требуется эту каждую вторую как-то вычленить из полного номера.
Вот тут у меня и произошло заклинивание. Ведь если мы положим номер в одну переменную типа лонг, то доступ к каждой второй цифре затруднителен. Или нет и я просто не знаю как?
Есть конечно варинт с массивом данных. Тогда мне не понятно как сделать так, чтобы каждая последущая напечатанная цифра попадала в отдельную ячейку массива, не применяя при этом клавиши Enter?

В общем буду рад любой подсказке, в каком направлении мне стоит копать))) Всем откликнувшимся заранее огромное спасибо!

Re: Ввод данных из консоли в одномерный массив (Си)

Добавлено: 24 авг 2016, 14:08
Absurd
Чтобы взять N-ную цифру из числа надо число сдвинуть вправо на N позиций (в десятичной системе) и посмотреть на остаток от деления на 10 у полученного числа. Правый сдвиг на N позиций в десятичной системе это деление на 10^N.

То есть имеем

Код: Выделить всё

int ipow(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        base *= base;
    }

    return result;
}

// ...

long number = ///...
int digit = (number / ipow(10, N)) % 10;

Re: Ввод данных из консоли в одномерный массив (Си)

Добавлено: 24 авг 2016, 14:18
Romeo
Можно поступить ещё проще. Считать данные не как число, а как строку. Тогда доступ к каждому отдельному элементу будет таким же простым, как и в обычном массиве. Нужно только будет учесть, что в ячейках будут лежать не цифры (например 1, 2), а символы ('1', '2'), так что для того, чтобы из символа получить соответствующую цифру, нужно от его значения отнять '0'. Ну и с негативным тестингом тоже немного поиграть: как минимум обработать случай того, что символ не является цифрой, выдав ошибку.

Re: Ввод данных из консоли в одномерный массив (Си)

Добавлено: 26 авг 2016, 12:01
konstantin.vasilkov
Absurd писал(а):Чтобы взять N-ную цифру из числа надо число сдвинуть вправо на N позиций (в десятичной системе) и посмотреть на остаток от деления на 10 у полученного числа. Правый сдвиг на N позиций в десятичной системе это деление на 10^N.
[/code]

Спасибо за подсказку, решил попробовать ваш метод. Получается число ЛОНГ положит ьв массив по элементам. Загвоздка теперь в том, что числа в массиве лежат в обратном порядке. Как перевернуть массив в джаве я знаю. Но вот как сделать это в Си не приложу ума. Может и тут сможете подсказать?

Re: Ввод данных из консоли в одномерный массив (Си)

Добавлено: 26 авг 2016, 12:45
Romeo

Код: Выделить всё

#include <algorithm>
...
long arr[N];
std::reverse(arr, arr + N);

Re: Ввод данных из консоли в одномерный массив (Си)

Добавлено: 26 авг 2016, 16:17
Absurd
Это как-то тупо. Лучше бы их класть в массив в прямом порядке. То есть брать разряды не от нуля и выше, а от максимума и ниже. Как вы наверное знаете из математики, максимальный разряд числа это (логарифм числа по основанию 10) + 1.