Nota inicial: Para el código, usa las etiquetas GeSHi, gracias.
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
Si estás cargando las librerías cstdlib e iostream, estás programando en C++, no en C. Los includes de la librería estándar de C tienen TODOS el ".h"... en el caso de la librería de C++, NO hay includes con ".h". Te lo comento para que luego no te lleves sustos.
using namespace std;
Los espacios de nombre son también un elemento propio de C++... deberías quitarlo y, si te aparecen errores por ello, es porque estás haciendo uso de utilidades propias de C++.
int carga (int x);
int carga (int x) /* Funcion que permite cargar toda la matriz*/
{
}
Las declaraciones de funciones ( en tu caso la primera línea del código que te he puesto ) sólo son necesarias cuando aparecen llamadas a la función antes que su implementación. Un ejemplo:
void func3( void );
void func1( void )
int main( void )
{
func1( ); // Ok, su uso es posterior a su implementacion
func2( ); // Error, esta funcion no esta definida todavia
func3( ); // Ok, no esta implementada pero si definida
}
void func2( void )
void func3( void )
Más cosas...
int carga (int x) /* Funcion que permite cargar toda la matriz*/
{
int register k,l;
for (k=0;k<N;k++)
{
for (l=0;l<M;l++)
{
printf ("Ingrese un numero "); }
}
}
La llamada a "scanf" esta mal por tres razones:
1. %f se usa para números con decimales (float, double)... x es de tipo entero (int)
2. scanf necesita un puntero a la variable donde debe almacenar los valores que introduzca el usuario... 'x' se está pasando por valor
3. 'carga' está recibiendo 'x' por valor, es decir, todos los cambios que se hagan en 'x' se van a perder una vez el código sale de la función 'carga'.
Ah si... segun la firma actual, 'carga' debería tener un return y devolver un entero... si una función no ha de devolver nada debe ir precedida de 'void'.
La función debería estar más bien así:
void carga (int* x) /* Funcion que permite cargar toda la matriz*/
{
int register k,l;
for (k=0;k<N;k++)
{
for (l=0;l<M;l++)
{
printf ("Ingrese un numero "); }
}
}
Ahora, 'x' es un puntero, por lo que, por un lado, scanf podrá almacenar el valor en la variable apuntada por 'x' sin problemas y, por otro, los cambios en 'x' se reflejarán fuera de la función.
Debido al cambio de la firma de "carga", también hay que cambiar ahora sus llamadas. "carga" ahora necesita un puntero:
int main(int argc, char *argv[])
{
int num;
carga (&num);
}
Más cosas...
int arr[N][M];
int cascara;
int i, j;
for (i=0; i<N; i+1)
{
for (j=0; j<M; j+1)
{
cascara = (cascara + arr[j]);
}
}
'arr' es un arreglo bidimensional, luego para acceder a sus valores necesitas pasarle dos índices... tu estás pasando sólamente uno. Esto tendría que quedar más o menos así:
int arr[N][M];
int cascara;
int i, j;
for (i=0; i<N; i+1)
{
for (j=0; j<M; j+1)
{
cascara = (cascara + arr[i][j]);
}
}
Además, 'arr' está definda tal que 'arr[N][M]'... no tiene sentido que le pases como primer índice 'j', que está definida en el rango '0..M'; necesitas un índice definido en el rango '0..N' y ese índice es 'i'... no 'j'.
Por otro lado, no has asignado valores a los elementos contenidos en 'arr', así como tampoco has asignado valores a 'cascara' (ni a otras tantas variables)... los resultados finales de las operaciones que tienes puestas ahí van a ser totalmente incoherentes, ya que estás leyendo basura:
int main( )
{
int numero;
}
¿Qué imprime el código anterior? ¿tu lo sabes? yo lo único que se es que la salida del programa puede cambiar en diferentes ejecuciones. Sin embargo:
int main( )
{
int numero = 10;
}
Estoy totalmente seguro que la salida de esta segunda versión será siempre '10'.
Más cosas... podría seguir pero creo que ya es bastante ayuda.
Moraleja: Estudia unos cuantos tutoriales o manuales de C antes de meterte en estos jardines... aprenderá más, será más satisfactorio para tí y aprenderás más ( lo pongo dos veces para darle énfasis... es importante).