¿Cuál es el error? Hallar el porcentaje de pares, impares y ceros

#include <iostream>
#include <conio.h>

using namespace std;

int main(){
    int n;
    int num[100];
    int n_pares=0;
    int n_impares=0;
    int ceros=0;
    int p_pares;
    int p_impares;
    int p_ceros;

cout<<"numero de digitos : ";
cin>>n;

for(int i=1;i<=n;i++){
    cout<<"numero "<<i<<":"<<endl;
    cin>>num[i];

    if(num[i]==0)
    {
        n_pares=n_pares+1;
    }
    else if(num[i]==1)
    {
        n_impares=n_impares+1;
    }
    else if(num[i]==0)
    {
        ceros=ceros+1;
    }
}

p_pares=((n_pares)/n)*100;
p_impares=((n_impares)/n)*100;
p_ceros=((ceros)/n)*100;    


cout<<"\n";
cout<<"-----------------------"<<endl;
cout<<"porcentaje de pares : "<<p_pares<<endl;
cout<<"porcentaje de impares : "<<p_impares<<endl;
cout<<"porcentaje de ceros : "<<p_ceros<<endl;

getch();
return 0;
}
3
задан 26.09.2016, 17:35
5 ответов

Он лучше, если цикл повторяет с нуля:

for(int i = 0; i < n; i++)

comprobaciГіn может делаться с:

if(num[i] == 0)
    ceros++;
else
    (num[i] & 1) ? n_impares++ : n_pares++;

Альтернатива tambiГ©n может быть:

if(num[i] == 0)
{
    ceros++;
}
else if (num[i] & 1)
{
    n_impares++;
}
else
{
    n_pares++;
}

у Всего nГєmero нечетный есть наименее значительный включенный бит. С другой стороны, они nГєmeros ты рожаешь, всегда у них есть Ваш наименее значительный бит, равный нулю.

мы Можем использовать эту особенность, если мы используем оператор AND из бита в бит (&), не запутывать с AND lГіgico (&&).

  xxxx ... xxx0    número par en binario, un ejemplo puede ser el número 20: 0010 0100
&             1
  -------------
              0   =>  Resultado 0, entonces el número es par


  xxxx ... xxx1    número impar en binario, un ejemplo puede ser el número 21: 0010 0101
&             1
  -------------
              1   =>  Resultado 1, entonces el número es impar

Потом, чтобы вычислять процентное содержание, предпочтительно работать с переменными numГ©ricas плавающего типа float, но если хочется использовать целые числа, тогда нужно оставлять ее divisiГіn для Гєltimo, а именно, которая должна быть Гєltima operaciГіn ее lГ-nea cГіdigo:

p_pares   = 100 * n_pares/n;
p_impares = 100 * n_impares/n;
p_ceros   = 100 * ceros/n;    

CГіdigo завершил:

#include <iostream>
#include <conio.h>

using namespace std;

int main(){
    int n;
    int num[100];
    int n_pares=0;
    int n_impares=0;
    int ceros=0;
    int p_pares;
    int p_impares;
    int p_ceros;

cout<<"numero de digitos : ";
cin>>n;

for(int i=0;i<n;i++){
    cout<<"numero "<<i+1<<":"<<endl;
    cin>>num[i];

    if(num[i] == 0)
        ceros++;
    else
        (num[i] & 1) ? n_impares++ : n_pares++;        
}

p_pares=100*n_pares/n;
p_impares=100*n_impares/n;
p_ceros=100*ceros/n;    

cout<<"\n";
cout<<"-----------------------"<<endl;
cout<<"porcentaje de pares : "<<p_pares<<endl;
cout<<"porcentaje de impares : "<<p_impares<<endl;
cout<<"porcentaje de ceros : "<<p_ceros<<endl;

getch();
return 0;
}
2
ответ дан 24.11.2019, 13:18
  • 1
    Не абсолютно необходимо иметь 3 счетчика. Например, возможно вычислять n_impares = n - n_pares - ceros. –  Mariano 24.09.2016, 13:41

Чтобы не менять твой код, я буду работать с тем, который уже у тебя есть:

Очень важная вещь состоит в операциях в том, что ты используешь, чтобы находить процентное содержание.

p_pares=((n_pares)/n)*100;
p_impares=((n_impares)/n)*100;
p_ceros=((ceros)/n)*100;    

Они правильны, но здесь находится большая проблема:

Когда ты объявляешь переменные n_pares, n_impares и нули. Так как ты объявляешь их как целые числа, int, но когда ты реализуешь операции деления, не сохраняют правильное деление, так как ты используешь с целыми числами, и реальными не числами. А следовательно, чтобы иметь результат правильного процентного содержания, необходимо объявлять переменные n_pares, n_impares и нули как double, не как int.

Кроме того, есть ошибки в проверке пар:

В этом "if", ты подтверждаешь, равно ли число 0, что не подразумевает, что это был пара или нечетный, просто, если это нуль. Чтобы подтверждать с if, - пара ли число мы можем подтверждать оставшуюся часть числа, разделенного между двумя:

if (номер [i] % 2 == 0)---> Подтверждает, в array - ПАРА ЛИ число

    if(num[i]==0)
    {
        n_pares=n_pares+1;
    }

То же самое происходит с нечетным, не надо помещать условие, если это не пара, он нечетный. А следовательно else и добавлять 1 к счетчику нечетных было бы достаточным.

    else if(num[i]==1)
    {
        n_impares=n_impares+1;
    }

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

    else if(num[i]==0)
    {
        ceros=ceros+1;
    }
}

Решение, предложенное для for

//Recuerda declarar las variables n_pares, n_impares 
//y ceros como double
double n_pares = 0;
double n_impares = 0;
double ceros = 0;

/* Codigo */

for(int i=1;i<=n;i++){
    cout<<"numero "<<i<<":"<<endl;
    cin>>num[i];

    // Si quieres contar el cero de forma independiente a los pares
    //añade un else al final de este if
    if(num[i]==0)
    {
        ceros=ceros+1;
    }

    if(num[i] % 2 == 0)
    {
        n_pares=n_pares+1;
    }
    else
    {
        n_impares=n_impares+1;
    }
}
2
ответ дан 24.11.2019, 13:18

Какова ошибка?

Многообразные ошибки.

  1. Договоренности в C ++ индексируются с 0.
for(int i=1;i<=n;i++){
    cout<<"numero "<<i<<":"<<endl;
    cin>>num[i];

Предыдущий код пробегает договоренность num с 1 в n; оба включенные. Если n он был 100 ты писал бы вне цикла, так как индексы идут 0 в 99. Если ты меняешь код в:

for(int i=0;i<n;i++){
    cout<<"numero "<<i<<":"<<endl;
    cin>>num[i];

Ты пробежал бы индексы правильно (спасибо ArtEze). Ввиду того, что договоренности C ++ индексируются с 0, код, который пробегал цикл с 1 он оставлял индекс 0 не касаясь.

  1. Не известно, - пара ли число, сравнив это с 0. Единственное, что ты проверяешь,, - если число 0.
if(num[i]==0)
{
    n_pares=n_pares+1;
}
  1. Не известно, нечетное ли число, сравнив это с 1. Единственное, что ты проверяешь,, - если число 1... менее еще, сцепляя проверку, подтвердив, стоит ли он 0:
if(num[i]==0)
{
    n_pares=n_pares+1;
}
else if(num[i]==1)
{
    n_impares=n_impares+1;
}
  1. Никогда ты не будешь считать числа, которые будут exáctamente 0 потому что уже ты считал их как пары, ветвь if-else if-else if в котором ты увеличиваешь ceros никогда она не берется для стоимости 0 так как эти входят в первого if:
if(num[i]==0)
{
    n_pares=n_pares+1;
}
else if(num[i]==1)
{
    n_impares=n_impares+1;
}
else if(num[i]==0)
{
    ceros=ceros+1;
}

Например, для стоимости 0, 111 и 222 ты будешь считать 0 как пара (первый if), 111 как ничто (он не входит ни в какой if) и 222как ничто (он не входит ни в какой if).

Предложение.

Находить процентное содержание пар, нечетные и нули

Используй <algorithm>:

auto begin = std::begin(num);
auto end = std::end(num);
const float total = n;

float p_pares   = std::count_if(begin, end, [](int n){ return !(n % 2); }) / total;
float p_impares = std::count_if(begin, end, [](int n){ return (n % 2); }) / total;
float p_ceros   = std::count_if(begin, end, [](int n){ return !n; }) / total;

std::cout << "\n-----------------------\n";
std::cout << "porcentaje de pares : "   << 100.f * p_pares   << '\n';
std::cout << "porcentaje de impares : " << 100.f * p_impares << '\n';
std::cout << "porcentaje de ceros : "   << 100.f * p_ceros   << '\n';
2
ответ дан 24.11.2019, 13:18

Чтобы проверять, пара ли это или ты не был бы должен делать if(num[i] % 2 == 0), и если это не пара, он нечетный.

1
ответ дан 24.11.2019, 13:18

Чтобы знать, nГєmero - пара ли один bastarГ - чтобы с проверять si el residuo de la división de un número entre 2 es igual a 0, такой остаток получает с оператором mod (%)

В этом случае недостаток estarГ - в в цикле for в момент сравнивания ввода, чтобы знать, пара ли это или нечетный, quedarГ - в asГ - делая изменения и договоренности инициализируют в ней posiciГіn 0

for(int i=0;i<n;i++){
    cout<<"numero "<<i<<":"<<endl;
    cin>>num[i];

        if(num[i]==0) n_ceros+=1; 
        else  if(num[i] %2==0)n_pares+=1;
}
n_impares = n-(n_pares+n_ceros);
1
ответ дан 24.11.2019, 13:18
  • 1
    Не абсолютно необходимо иметь 3 счетчика. Например, возможно вычислять n_impares = n - n_pares - ceros. –  Mariano 24.09.2016, 13:42
  • 2
    @Mariano ты c и # 225; lculo пойми, что 0 не пара ни нечетный. –  PaperBirdMaster 26.09.2016, 17:31
  • 3
    @Mariano, что ты имеешь в виду. Ты можешь приходить к заключению о количестве элементов набора зная количество элементов другого двух. Но это s и # 243; оно это функционирует, если наборы - disjuntos. –  PaperBirdMaster 28.09.2016, 09:49
  • 4
    @PaperBirdMaster я только что прочитал хорошо твой комментарий (hab и # 237; в интерпретированный в rev и # 233; s). S и # 237; я беру на себя ответственность (видя c и # 243; я говорю об авторе), что не считаются 0 парой... Он неправильный, но часто я это увидел туз и # 237; в этих упражнениях. –  Mariano 28.09.2016, 09:55
  • 5
    @Mariano в самом деле, seg и # 250; n c и # 243; я говорю автора и #250; nico n и # 250; простая пара вселенной - 0 xD –  PaperBirdMaster 28.09.2016, 10:34