Tienes una notable colección de fallos en un código tan corto:
- La cabecera
<math.h>
es de c no de c++. 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;
}