Добавление целочисленных значений в строке - PullRequest
1 голос
/ 22 марта 2019

У меня проблемы с выяснением одной из моих домашних задач.

"Напишите программу, которая просит пользователя ввести последовательность однозначных чисел, не разделяя их. Чтение ввода в виде строки c или строки. Программа должна отображать все однозначные числа в Например, если пользователь вводит 2514, программа должна отобразить 12, что равно (2 + 5 + 1 + 4). Программа также должна отображать самые высокие и самые низкие цифры в строке. "

У меня проблема с выяснением, как сложить целые числа в строке. Мой код ниже, и любая помощь приветствуется, спасибо!

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    //Declaring Variables & Character Array:
    int size;
    int sum;
    char integers[size];

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers) + 1;

    //Adding up Contents Within String:
    for(int i = 0; i < size; i++)
    {
        if(integers[i] > 0 && integers[i] < 9 && integers != "\0")
        {
           sum = integers[i]++;
        }
    }

    //Outputting Sum:
    cout << sum;

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Итак, есть несколько проблем с вашим подходом, рассмотрим следующие советы:

  1. Не читайте в массив символов, вместо этого читайте из cin в std::string.
  2. Когда вы итерируете по символам строки в цикле for, они не являются числами, а являются символами ascii. Вам нужно разобраться, как перевести '0' в 0 (подсказка, символы ascii тоже имеют числовые значения, возможно, исследуем это).
  3. sum = integers[i]++; это не то, как вы суммируете до чисел ..
1 голос
/ 22 марта 2019

Используя помощь от вас выше, я отредактировал ее так, что теперь она работает так:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    //Declaring Variables & Character Array:
    int size;
    char integers[size];
    int sum;

    //Small and Large Numbers:
    int small = 9;
    int large = 0;

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers) + 1;

    for(int i = 0; i < size; i++)
    {
        if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
        { 
            if(integers[i] == '0')
                sum += 0;
            if(integers[i] == '1')
                sum += 1;
            if(integers[i] == '2')
                sum += 2;
            if(integers[i] == '3')
                sum += 3;
            if(integers[i] == '4')
                sum += 4;
            if(integers[i] == '5')
                sum += 5;
            if(integers[i] == '6')
                sum += 6;
            if(integers[i] == '7')
                sum += 7;
            if(integers[i] == '8')
                sum += 8;
            if(integers[i] == '9')
                sum += 9;
        }
    }

    cout << sum << endl;


    return 0;
}
1 голос
/ 22 марта 2019

Вы можете использовать что-то вроде этого:

std::string integers;

//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
int sum = 0;

for (char c : integers)
    if (c >= '0' && c <= '9')
        sum += c - '0';

Чтобы объяснить, что делает приведенный выше код, я считаю, что первые несколько строк очевидны, я перейду к циклу for(). Это форма цикла foreach, используемого в C ++. Он захватывает символ за строкой из строки и сохраняет его в переменной (в данном случае в c), и внутри цикла мы обычно проверяем, является ли c представлением ASCII числа от 0 до 9. После этого представление ASCII преобразуется в integer (c - '0').

Ваш подход сравнивает целые числа с символами ASCII, вы можете попробовать это:

if(integers[i] >= '0' && integers[i] =< '9' && integers != '\0') {
    sum = integers[i] - `0`;
}

У вас также есть проблема:

integers != "\0"

должно быть:

integers[i] != '\0'

"" - это представление строки, и даже если у вас есть "", это пустая строка, но в ней содержится \0. В приведенном выше случае «\ 0» содержит «\ 0 \ 0». В общем, вам нужно сравнить один символ с \0, где вы сравниваете строку с \0\0.

Еще одна ошибка:

int size;
...
char integers[size];
...
cin >> integers; // SEGFAULT HERE
size = strlen(integers); 

неинициализированные переменные являются неопределенным поведением в C ++ и могут содержать мусор от 0 до MAX_INT. Вы можете получить segfault, если size равно 0, и позже вы попытаетесь ввести более 0 символов в integers. Вы получите сегфо до того, как достигнете size = strlen().

Другая неинициализированная переменная:

int size;

Я на самом деле получил 432552 в качестве вывода из вашей программы после исправления всех упомянутых выше ошибок.

Вот ваш отлаженный код:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    //Declaring Variables & Character Array:
    int size = 100; // UNINITIALIZED VARIABLE
    int sum = 0;    // UNINITIALIZED VARIABLE
    char integers[size];

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers); // +1 ??? why

    //Adding up Contents Within String:
    for(int i = 0; i < size; i++)
    {
        // integers[i] >= 0 is comparing char to int
        // integers[i] <= 9 is comparing char to int
        // ingegers == "\0" is comparing entire string with stirng which contains "\0":s
        // < and > shoudl be <= nad >= to include 0 and 9                                                                                                                                                                                
        if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
        {
           // sum = integers[i]++; is incrementing character at integer[i]` not `sum`
           sum += integers[i] - '0';
        }
    }

    //Outputting Sum:
    cout << sum;

    return 0;
}

Ха только что осознал еще одну ошибку: strlen() возвращает длину целого числа. Допустим, string s="ABCD" задано strlen(s) вернет 4, а позже for() цикл цикла переходит от 0 до 4, но не включая 4 с s[0] = 'A', s[1] = 'B', s[2] = 'c' и s[3] = 'D'.

Хорошо, для дальнейшего объяснения, символы также имеют цифровые значения: enter image description here

Если вы видите, что все символы имеют десятичные значения: вот краткая таблица символов 0 - 9 из таблицы ascii выше:

 Character | Decimal Value
 ----------+--------------
   0       |    48
   1       |    49
   2       |    50
   3       |    51
   4       |    52
   5       |    53
   6       |    54
   7       |    55
   8       |    56
   9       |    57

сделав так:

 integers[i] - '0'

- это как сказать

 integers[i] - 48

, если integer[i] равно 8, оно будет содержать десятичное значение 56. Так что 56 - 48 даст целочисленное значение 8

...