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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
konstantin.vasilkov
Сообщения: 2
Зарегистрирован: 24 авг 2016, 13:18

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

В общем буду рад любой подсказке, в каком направлении мне стоит копать))) Всем откликнувшимся заранее огромное спасибо!
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Чтобы взять 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;
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Можно поступить ещё проще. Считать данные не как число, а как строку. Тогда доступ к каждому отдельному элементу будет таким же простым, как и в обычном массиве. Нужно только будет учесть, что в ячейках будут лежать не цифры (например 1, 2), а символы ('1', '2'), так что для того, чтобы из символа получить соответствующую цифру, нужно от его значения отнять '0'. Ну и с негативным тестингом тоже немного поиграть: как минимум обработать случай того, что символ не является цифрой, выдав ошибку.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
konstantin.vasilkov
Сообщения: 2
Зарегистрирован: 24 авг 2016, 13:18

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

Спасибо за подсказку, решил попробовать ваш метод. Получается число ЛОНГ положит ьв массив по элементам. Загвоздка теперь в том, что числа в массиве лежат в обратном порядке. Как перевернуть массив в джаве я знаю. Но вот как сделать это в Си не приложу ума. Может и тут сможете подсказать?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

#include <algorithm>
...
long arr[N];
std::reverse(arr, arr + N);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Это как-то тупо. Лучше бы их класть в массив в прямом порядке. То есть брать разряды не от нуля и выше, а от максимума и ниже. Как вы наверное знаете из математики, максимальный разряд числа это (логарифм числа по основанию 10) + 1.
2B OR NOT(2B) = FF
Ответить