Как преобразовать массив целых чисел в целочисленное значение?

У меня есть клавиатура, которую я использую для ввода цифр в микроконтроллер (atmega32 avr). Пользователь сможет ввести 1, 2 или 3 цифры, потому что я определил диапазон ввода [0-999]. Каждая из этих цифр будет храниться в позиции массива целых чисел.

Итак, если мой массив определен как int d[3] и пользователь последовательно вводит 2, 6, 9, у меня будет d[0] == 2, d[1] == 6 и d[2] == 9. Теперь я хочу сделать целое число из этих цифр {2, 6, 9}: value == 269. Как я могу это сделать?


person Aashkanpasha    schedule 03.08.2019    source источник
comment
С это не С++. Выберите соответствующий тег для кода, который вы пишете, и отредактируйте свой вопрос. Также отформатируйте его, используя уценку.   -  person D. Ben Knoble    schedule 03.08.2019
comment
Спасибо. Поскольку число может быть между 0-999, оно не работает для всех. Если оператор вводит только 3 и 8. Таким образом, мы имеем y=380, а не 38. Я прав??   -  person Aashkanpasha    schedule 03.08.2019


Ответы (3)


Следующий ответ должен быть применим для любого языка. Это было бы довольно просто, я бы посоветовал вам немного по-другому отформатировать значения в вашем массиве. Я думаю, было бы проще, если бы оператор ввел однозначное число и сохранил бы его так: {0, 0, 5}. Если это двузначное число, сохраните его так: {0, 5, 9}. Наконец, если оператор вводит трехзначное число, сохраните его так: {5, 9, 2}.

Наконец, после форматирования массива вы можете использовать следующую логику для получения числа. Например, если массив равен arr = {5, 9, 8};, вы можете сделать следующее, чтобы получить его как число:

arr[0] * 100 + arr[1] * 10 + arr[2]

Это сработает, если вы последуете совету по форматированию, который я дал выше.

person Abhinav Vemulapalli    schedule 03.08.2019
comment
Спасибо, дорогой. Вы имеете в виду, что оператор вводит 0 0 5 вместо 5??? Я знаю, что это упрощает проблему, но именно поэтому босс работает только со мной, и я не могу сказать, что не могу сделать это, чтобы ввести 3 цифры. - person Aashkanpasha; 03.08.2019
comment
Вы могли бы сделать это, но для лучшего взаимодействия с пользователем вы захотите, чтобы пользователь ввел только 5, а затем в вашем коде дополнил его нулями при вводе в массив. - person Abhinav Vemulapalli; 03.08.2019
comment
Имеет ли это смысл, Ашканпаша? - person Abhinav Vemulapalli; 03.08.2019
comment
Я думаю, что моя ошибка в другом. Keypad() сканирует мою клавиатуру.....t=keypad(); ...... поэтому, когда я хочу, чтобы l[i]=t было неправильным, я хочу создать массив с помощью моих целых чисел t. Что я должен делать? - person Aashkanpasha; 03.08.2019
comment
Мне жаль, что я не знаком с точными методами и т. д., поэтому вам придется обратиться к документации того, что вы используете. Вы также можете задать другой вопрос по этому поводу. Если я ответил на ваш первоначальный вопрос о том, как сделать целое число из элементов массива, пожалуйста, подтвердите ответ. Надеюсь, это поможет, и извините, я не мог больше помочь! - person Abhinav Vemulapalli; 03.08.2019
comment
@Aashkanpasha, пожалуйста, предоставьте код о Keypad () или задайте новый вопрос. Мы не сможем вам помочь, если вы не покажете код - person abhivemp; 03.08.2019
comment
@AbhinavVemulapalli отвечает на ваш вопрос. Ваша ошибка немного специфична. Пожалуйста, дополните - person abhivemp; 03.08.2019
comment
@Aashkanpasha: основной алгоритм, если вы хотите написать цикл, - total = total*10 + digit. Затем вы можете остановиться на первой нецифре. Если у вас уже есть массив int, вы не сможете определить разницу между 1 и 100, если только не используете какое-то сигнальное значение. - person Peter Cordes; 08.08.2019

Вы можете создать число итеративно, умножив цифру на степень соответствующей единицы.

Пример: {2, 6, 9} может быть выражено как ((2 * 10^2) + (6 * 10^1) + (9 * 10^0))

#include <stdio.h>
#include <stdlib.h>


long power_10 (int exp)
{
    long res = 1;
    int  i;  

    for (i = 1; i <= exp; i++) {
        res = res * 10; 
    }   
    return res;
}

int main()
{
    int   arr[] = {2, 6, 9}; 
    int   i = 0;
    int   len = sizeof(arr)/sizeof(arr[0]);
    long  num = 0;

    for (i = 0; i < len; i++) {
        num += arr[i] * power_10((len - 1 - i));    
    }   
    printf("%ld\n", num);
}
person Sumit Trehan    schedule 08.08.2019

Вам нужно решить две проблемы, не так ли?

  • Проблема № 1: определить, когда ввод завершен
  • Задача №2: преобразовать массив цифр в одно целое значение

Я вижу два пути решения проблемы №1:

  1. Завершите ввод с помощью часового. – Есть ли на вашей клавиатуре что-то вроде клавиши ввода?
  2. Завершайте ввод с тайм-аутом. – Запускайте таймер после каждого чтения. Переполнение может указывать на то, что пользователь закончил ввод.

В обоих случаях вы можете подсчитать, сколько цифр сообщил пользователь до дозорного/тайм-аута.


Осталось решить задачу №2:

Если вы сохранили свои цифры в массиве, начиная с нулевого индекса, от старшей значащей цифры до младшей значащей цифры, то решение будет примерно таким:

// note: n_digits and d come from the solution of the first problem

int sum = 0;
for (int i = 0; i < n_digits; ++i) {
    sum = sum*10 + d[i];
}

// do whatever you need with the result
printf("%d\n", sum);
person rrd    schedule 08.08.2019