1

Necesito captar un valor de la cantidad de veces que almacenaras números, pero no consigo hacer que me imprima la cantidad de veces que almacene un 0 en uno o n valores.

Tengo esto de codigo

#include "pch.h"
#include <iostream>
using namespace std;
int i,c;
int num[100];
int main()
{
    int n;
    cout << "Dame el valor de n: "; 
    cin >> n;

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

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

        do {

            int ceros = 1,almacenaceros=0;

            almacenaceros = +1;

            cout << "hay " << almacenaceros << "ceros" << endl;


        } while (num[i] == 0);

    }

    system("pause");
    return 0;
}
Cesar Romero
  • 2,000
  • 3
  • 13
  • 27

3 Answers3

2

Si el contador de ceros se declara dentro de cada iteración dificilmente va a funcionar como esperas:

for (i = 0; i < n; i++) { // Inicio del bucle

    do {

        int ceros = 1,almacenaceros=0; // Declaras la variable almacenaceros

        almacenaceros = +1;

        cout << "hay " << almacenaceros << "ceros" << endl;


    } while (num[i] == 0); // la variable muere y su valor se pierde
    //           ^ Nota que en el bucle do-while, el valor de i no cambia --> recursión infinita si num[i]==0

}

Tienes que garantizar que la variable va a estar viva durante todo el tiempo que la necesites. En este caso, la variable tendrá que existir ininterrumpidamente desde que empiezas a buscar números hasta que muestras el resultado final:

int almacenaceros = 0; // Variable declarada fuera del bucle
                       // Seguirá viva al finalizar dicho bucle
for( int i=0; i<n; i++ )
{
  if( num[i] == 0 )
    almacenaceros++; // Modificamos su valor cuantas veces necesitemos
}

std::cout << "hay " << almacenaceros << " ceros\n"; // Mostramos el valor final
eferion
  • 49,291
  • 5
  • 30
  • 72
1

Podrías realizar algo como esto:

#include <iostream>

using namespace std;

int main()
{
    int i; int num[100]; int n; int almacenaceros=0;
    cout << "Dame el valor de n: "; 
    cin >> n;

    for (i = 0; i < n; i++) {
        cout << "Dame numero: ";
        cin >> num[i];
        //Luego de leer el numero se verifica si es el numero cero
        //y se incrementa el contador de ceros.
        if (num[i] == 0) {
            almacenaceros += 1;
        };
    }
    //Al finalizar el for imprimes la cantidad de ceros ingresados.
    cout << "hay " << almacenaceros << " ceros" << endl;
    system("pause");
    return 0;
}

Realizo la comparación dentro del mismo for donde se lee el numero que ingrese el usuario porque así se evita realizar otro for. Y el do..while no es necesario; es suficiente usar el if para realizar la comparación.

Corriendo: https://onlinegdb.com/B1I8qP4dV

Cesar Romero
  • 2,000
  • 3
  • 13
  • 27
1

Si sólo necesitas contar los 0 que se introducen, no necesitarás siquiera guardar los datos:

#include <iostream>

int main()
{
    using namespace std;
    int cantidad, ceros;
    cout << "Dame la cantidad: "; 
    cin >> cantidad;

    for (int indice = 0; indice < cantidad; ++indice) {
        int numero;
        cout << "Dame numero: ";
        cin >> numero;
        ceros += numero ? 0 : 1;
    }

    cout << "hay " << ceros<< " ceros\n";
    return 0;
}

Los cambios que he hecho a tu código son los siguientes:

  • La cláusula using namespace std está dentro de main. Usar esta cláusula no es obligatorio (sólo es una ayuda a la escritura de código), si realmente quieres usarla, lo aconsejable es usarla en el ámbito más pequeño posible. Lee este hilo para saber más.
  • He cambiado los nombres de las variables. Es muy importante que los nombres de las variables sean autoexplcativos y claros, con el nombre adecuado puedes transmitir a otras personas (incluído tu "yo futuro") la intencionalidad y propósito del código.
  • He movido la variable de control del primer bucle for del ámbito global al ámbito del bucle. Se considera una buena práctica que el ámbito de las variables sea el más pequeño posible y que su declaración y uso esté lo más próximo posible. El ámbito global es el más grande posible, por lo que no seguías esta premisa. Lee esta respuesta para tener más detalles sobre variables globales.
  • He cambiado el post-incremento a pre-incremento, lee este artículo para saber por qué es una mejora.

Respecto a la manera de contar ceros:

ceros += numero ? 0 : 1;

Estoy usando dos trucos de C++:

  • Conversión implícita de número a valor booleano. En C++ (y C) los valores numéricos se convierten implícitamente a valores booleanos (verdadero/falso) cuando se usan en el contexto de una expresión booleana. La conversión se realiza con estas sencillas normas:
    • Si el valor es 0, la expresión booleana es false.
    • Si el valor es 1, la expresión booleana es true.
  • Operador ternario. El operador ternario es una instrucción if convertida a expresión. Su formato es: condición ? valor verdadero : valor falso. Si condición se cumple el valor de la expresión será valor verdadero, en caso contrario será valor falso.

Con estos trucos, la expresión que cuenta los ceros, sumará 0 al contador cuando numero sea cualquier valor diferente de 0 y sumará 1 al contador cuando el valor sea cero.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82