2016-01-27 3 views
-1

Я ищу для вычисления четных чисел в заданной строке с C++. Мой код:Подсчет числа четных цифр в номере?

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int i(0), c(0), z(0), j(1), n1, x(0); 
string n; 

int main() 
{ 
    cout << "Hello n world!" << endl; 
    cin >> n; //The number itself 

    while (true) 
    { 
     if ((n[i] >= '0' && n[i] <= '9')) 
     { 
      x++; 
     } 
     else break; 
     i++; 
    } //Counts the numbers 

    cout << "The number has " << x << " digit(s)." << endl; 

    istringstream convert(n); 
    if (!(convert >> n1)) 
     n1 = 0; //converts string to an int 

    while (c < x) 
    { 
     if (n1 % 2 == 0) 
     { 
      z++; 
     }; 
     n1 = n1 % 10; 
     c++; 
    }; //Counts the even numbers (I can feel this part is wrong, I just don't know how) 

    cout << "The number has" << z << " even digit(s)." << endl; 

    return 0; 
} 

Но когда я использую его, когда я вхожу 1022, я получаю 4 даже номера, и если я вхожу 696969 дает 0 четные числа. Что я делаю? Что не так с моим кодом?

+1

Это не сайт, на котором вы просите людей исправить код, который не работает. Вы должны следовать логике своей программы, найти ее часть, которая не делает то, что вы ожидаете, и задавать вопрос о _that_. –

+4

Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Этот код слишком усложнен. Подумайте об итерации по строковому символу по символу и использованию десятичных эквивалентных значений из таблицы ASCII. Я могу написать ваш 'main' разборчиво в 7 строках, поэтому стреляйте под 20. – AndyG

ответ

2

n1 = n1/10; not %

Это должно решить основную логику для вычисления количества четных чисел. В коде могут быть и другие ошибки. У меня нет C++ на моей машине, поэтому я не могу запустить его.

+1

Правда, но он также должен использовать%, чтобы извлечь последнюю цифру и проверить, равномерна ли она. – ChrisD

+0

Это обрабатывается (включая увеличение числа четных чисел) в коде прямо перед линией, упомянутой выше. – Maertin

+0

@ ChrisD- почему? Подумайте об определении четного. – Donnie

0

В этом цикле

while (c < x) 
{ 
    if (n1 % 2 == 0) 
    { 
     z++; 
    }; 
    n1 = n1 % 10; 
    c++; 
}; 

после переменной n1 первой итерации будет всегда равен последней цифре исходного числа первоначально хранится в n1.

Например, если у вас есть номер 1022 то после первой итерации из-за заявление

n1 = n1 % 10; 

n1 будет равен 2.

И в последующих итерациях n1 будет держать это значение, потому что

2 % 10 == 2 

В целом логика программы некорректной. Например, если пользователь вводит снабжать струной, тетивой "1022A" то выражение в, если заявление будет равно верно из-за ошибки

istringstream convert(n); 
if (!(convert >> n1)) 
    ^^^^^^^^^^^^^^^ this will be true because "1022A" is not a number 
    n1 = 0; //converts string to an int 

Так есть несоответствие между предыдущей петлей

while (true) 
{ 
if ((n[i] >= '0' && n[i] <= '9')) 
{ 
    x++; 
} 
else break; 
i++; 
} 

, что дает 4 и второй цикл, где n1 будет установлен на 0.

Если использовать циклы, то программа может быть записана следующим образом

#include <iostream> 
#include <string> 

int main() 
{ 
    std::cout << "Hello n world!" << std::endl; 

    std::string s; 
    std::cin >> s; //The number itself 

    unsigned int digits = 0, evens = 0; 

    for (std::string::size_type i = 0; i < s.size() && s[i] >= '0' && s[i] <= '9'; i++) 
    { 
     ++digits; 
     evens += (s[i] - '0') % 2 == 0; 
    }   

    std::cout << "The number has " << digits << " digit(s)." << std::endl; 
    std::cout << "The number has " << evens << " even digit(s)." << std::endl; 

    return 0; 
} 

Выход программы может выглядеть

Hello n world! 
1022A 
The number has 4 digit(s). 
The number has 3 even digit(s). 

Или вы могли бы проверить, является ли строка не имеет действительный номер представления и в этом случае выдает ошибку.

+0

's [i]% 2', который предполагает, что' '0 '% 2 == 0' ... Лучше делать' (s [i] -' 0 ')% 2 == 0' (который предполагает только что '0' - '9' является последовательным диапазоном). – Jarod42

+0

@ Jarod42 Я совсем забыл об этом. :) –

Смежные вопросы