0

estoy empezando a programar en c++ y estaba tratando de hacer un programa que me elevara todos los numeros enteros al cuadrado del 1 al 10. la cosa es que cuando lo ejecuto me sale unos resultados nada que ver. Aqui esta mi programa para ver si me pueden ayudar a corregirlo. si lo corrigen expliquenme cual fue mi error o errores porfa.

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


using namespace std;
    int main () {
        int a, b[9], c=0; 
        for (a>=1;a<=10;){ 
            pow(a,a)==b[c];
            cout<<b[c]<<endl; 
            a++;
            c++;
        } getch();
        return 0;
    } 
karantooo
  • 21
  • 1
  • 3

3 Answers3

1

Karantoo. Bienvenide a StackOverflow. Esta es una posible solución a tu problema.

#include <iostream>
#include <math.h>

int main(){
    for(int i = 1; i <= 10; ++i)
    {
        std::cout << pow(i, 2) << '\n';
    }
    return 0;
}

Te explico. Dentro del ciclo for, el cual comienza en 1 y se repite 10 veces se imprime en consola el resultado de la función pow. La cual toma como primer argumento el número base (en este caso el valor de almacenado dentro la variable i del ciclo for, el segundo argumento es el exponente al cual quieres elevar la base. Puedes leer más sobre el uso de la función pow en este enlace.

Puede que una de las razones por la cual tu programa no funcione es porque al declarar las variables no les estás asignando ningún valor. Podemos observarlo de la siguiente manera:

int main(){
    int a, b[9], c=0;
    cout << "a " << a << endl;
    for(int i =0;i <  9;++i)
    {
        cout << "b " << b[i] << endl;
    }
    cout << "c " << c << endl;
    return 0;
}

Lo cual compila correctamente, pero al ejecutarlo dos veces obtenemos lo siguiente:

➜  ~ ./a.out     
a 22099
b 877676960
b 32758
b 0
b 0
b 2111314656
b 22099
b 2111314032
b 22099
b 1747998336
c 0
➜  ~ ./a.out
a 21922
b 2117204384
b 32576
b 0
b 0
b 1325120224
b 21922
b 1325119600
b 21922
b -1271446880
c 0
➜  ~ 

Como puedes observar la variable a y el arreglo de b[] no se les asigna un valor antes de utilizarlas, al hacer esto se genera un valor en tiempo de ejecución.

akko
  • 2,378
  • 2
  • 27
  • 56
  • +1. Solo un pequeño detalle, sería bueno que en lugar de usar `` emplearás la versión para C++: ``. – Xam Sep 09 '18 at 15:29
  • se recomienda usar `i*i` en vez de `pow(i, 2)`, es más eficiente :-) –  Sep 09 '18 at 22:30
0

Lo que pasa es que no estas elevando al cuadrado.

pow(a,a)==b[c];

debería ser al revés y al cuadrado

b[c] = pow(a, 2);

te dejo un ejemplo:

int main()
{
    int b[11];
    for(int i = 1; i < 11; i++){
        b[i]=pow(i,2);
        cout<<b[i]<<endl;
    }
    return 0;
}

Saludos

Chris Vazquez
  • 411
  • 3
  • 8
0

Tienes una notable colección de fallos en un código tan corto:

  • La cabecera <math.h> es de no de . Las cabeceras de C disponen de una versión adaptada a C++ que tiene el prefijo c y carece de extensión. Si realmente necesitas usar la cabecera de C <math.h> (que nunca será el caso) debes usar su equivalente de C++ <cmath> . Lee este hilo para saber por qué.
  • La cabecera <conio.h> no existe en C++ y ni siquera es estándar C, consulta esta pregunta para saber por qué.
  • No hay obligación de usar la cláusula using namespace std; pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
  • Procura inicializar las variables; en C++ no se asigna un valor a las variables a no ser que el programador lo pida explícitamente; si no se las inicializa las variables obtendrán valores indeterminados (generalmente valores residuales de memoria) y esto provocará comportamientos inesperados en el programa.
  • Evita abusar de std::endl (pues puede causar problemas de rendimiento) y favorece el uso del salto de línea explícito (\n). Lee este hilo para saber por qué.
  • Procura favorecer el pre-incremento frente al post-incremento.

Además de esos fallos, tienes los siguientes errores:

Tu bucle es incorrecto.

El bucle for de C++ se divide en tres partes:

for ( inicialización; condición de salida; sentencia de avance) {
    código
}

En la inicialización se suelen poner las expresiones que inicializan las variables que se usarán para que el bucle ruede. En la condición de salida debería escribirse una expresión que resulte en verdadero o falso siendo este último resultado el que pare el bucle. La sentencia de avance es una expresión que puede modificar datos que podrían influir en el funcionamiento del bucle.

En tu bucle:

int a, b[9], c=0; 
for (a>=1;a<=10;)

En la inicialización tienes la expresión a>=1, la inicialización se ejecuta una sola vez y en tu caso evaluará si a es mayor o igual a 1 devolviendo un valor verdadero o falso que se pierde al no ser almacenado en ningún sitio. Tu condición de salida es a<=10 comprueba si a es menor o igual a 10 y en caso de ser falso finalizará el bucle, pero como no has inicializado a, ésta variable podría tener un valor mayor a 10 nada más llegar al bucle.

La forma correcta de escribir tu bucle sería:

int b[9], c=0; \\ <-- 'a' ahora forma parte del bucle for.

for (int a = 0; a < 10; ++a)
\\   ~~~~~~~~~  ~~~~~~  ~~~ <-- Avance
\\      \          \
\\       \          \-- Condición de salida
\\        \
\\         \-- Inicialización

Y podría leerse como "Desde que a es 0 y mientras que a sea menor a 10, suma 1 a a".

Comparas dos números, sin importante el resultado.

En la expresión:

pow(a,a)==b[c];

Elevas a a la potencia de a y comparas si ese cálculo es igual al contenido de la formación b en la posición c, que al no haber inicializado b no podremos deducir el resultado (aunque es muy probable que sea falso) pero da igual, porque descartas el resultado, seguramente lo que querías hacer era asignar (no comparar):

   b[c] = pow(a,a);
\\ ~~~~~~ ~~~~~~~~ <-- Resultado de elevar 'a' a la potencia de 'a'
\\   \
\\    \-- Asigna a la posición 'c' de la formación 'b'

Propuesta.

Teniendo en cuenta todo lo mencionado antes, tu código podría quedar así:

#include <iostream>
#include <cmath> // <-- <cmath>, no <math.h>

int main () {
    using namespace std; // <-- cláusula using dentro de main

    int b[9]{};

\\       vvvvv <-- variable 'a' inicializada a 0.
    for (a = 1; a < 11; ++a){ // Bucle de 1 a 10.
        b[a - 1] = pow(a, 2);
        cout << b[c] << '\n'; 
    }

    return 0;
} 
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82