/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema en codigo

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
mariano_co



Registrado: 01 Oct 2012
Mensajes: 4

MensajePublicado: 02/10/2012 5:23 pm
Título: Problema en codigo

Hola, tengo un problema con este programa...

cuando lodepuro me da error de acceso a memoria, espero puedan ayudarme... muchas gracias...


#include<stdio.h>
#include<math.h>
#include<stdlib.h>


void filascolumnas (int &x, int &y)
{
printf ("Ingrese la cantidad de filas");
scanf ("%d",&x);
printf ("Ingrese la cantidad de columnas");
scanf ("%d",&y);

}

void leermatriz (float z[1000][1000], int x, int y)
{
int i,j;

for (i=1;i<=x;i++)
{
for (j=1;j<=y;j++)
{
printf ("Ingrese la componente [%d][%d]",x,y);
scanf ("%f",z[x][y]);
}
}
}

void promedioalumno (float z[1000][1000], int x, int y, float promedioalumno[1000])
{
int i,j;
float sumafil[1000];

for (i=1;i<=x;i++)
{
sumafil[i]=0;

for (j=1;j<=y;j++)
{
sumafil[i]=sumafil[i]+z[i][j];
}
}

for (i=1;i<=x;i++)
{
promedioalumno[i]=sumafil[i]/y;
}
}

void mejorpromedio (float promedioalumno[1000], int x,int &alumno, float &mejorprom)
{
int i;

mejorprom=promedioalumno[1];

for (i=1;i<=x;i++)
{
if (promedioalumno[i]>mejorprom)
{
mejorprom=promedioalumno[i];
alumno=i;
}
}
}

void libresyreg (float z[1000][1000], int x, int y, int ®ulares, int &libres)
{

int i,j;
regulares=0;
libres=0;

for (i=1;i<=x;i++)
{
for (j=1;j<=y;j++)
{
if (z[i][j]>=4)
{
regulares++;
}
else
{
libres++;
}
}
}
}

float promediogeneral (float z[1000][1000], int x, int y)
{
float promgeneral;
int i,j;

for (i=1;i<=x;i++)
{
for (j=1;j<=y;j++)
{
promgeneral=promgeneral+z[i][j];
}
}

promgeneral=promgeneral/x*y;

return promgeneral;
}

int main ()
{
int m,n,i;
float a[1000][1000],promalumno[1000],mejorprom,promgeneral;
int alumno,regulares,libres;

filascolumnas (m,n);
leermatriz (a,m,n);
promedioalumno (a,m,n,promalumno);
mejorpromedio (promalumno,m,alumno,mejorprom);
libresyreg (a,m,n,regulares,libres);
promgeneral=promediogeneral (a,m,n);

for (i=1;i<=m;i++)
{
printf ("El Promedio del alumno %d es %f\n",i,promalumno[i]);
}
printf ("\n\n");

printf ("El Mejor promedio es %f\n\n",mejorprom);

printf ("El promedio general del curso es %f\n\n",promgeneral);

printf ("La cantidad de alumnos libres es %d\n",libres);
printf ("La cantidad de alumnos regulares es %d\n\n",regulares);

system ("pause");

return 0;

}
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 329
Ubicación: MICA S.A.

MensajePublicado: 03/10/2012 7:41 am
Título:

Hola,

Perdóname si meto la pata. He mirado tu código por encima y me gustaría hacerte un comentario. Si estoy equivocado te pido mil disculpas. Al fin y al cabo estamos para mejorar.

scanf ("%f",z[x][y]);

Un ejemplo:

char cadena[12];
strcpy(cadena, "agradable");
cadena[1] es igual al char 'g';
&cadena[1] apunta a la cadena "gradable".

scanf("%c", cadena[1]) dará error porque cadena[1] es el caracter 'g'.

scanf("%c", &cadena[1]) copiará en la segunda posición de cadena un carácter.

Espero que te sea útil.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
mariano_co



Registrado: 01 Oct 2012
Mensajes: 4

MensajePublicado: 03/10/2012 4:22 pm
Título:

untio escribió:
Hola,

Perdóname si meto la pata. He mirado tu código por encima y me gustaría hacerte un comentario. Si estoy equivocado te pido mil disculpas. Al fin y al cabo estamos para mejorar.

scanf ("%f",z[x][y]);

Un ejemplo:

char cadena[12];
strcpy(cadena, "agradable");
cadena[1] es igual al char 'g';
&cadena[1] apunta a la cadena "gradable".

scanf("%c", cadena[1]) dará error porque cadena[1] es el caracter 'g'.

scanf("%c", &cadena[1]) copiará en la segunda posición de cadena un carácter.

Espero que te sea útil.


Muchas gracias por la observación, era algo que me pasé por alto, sin embargo sigo sin poder hacer funcionar el programa, me da un error en tiempo de ejecucion apenas lo abro...
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 329
Ubicación: MICA S.A.

MensajePublicado: 04/10/2012 7:25 am
Título:

Hola de nuevo,

De nuevo, perdóname mis errores.

Si lees en esta página:



verás que hay problemas con arrays locales demasiado grandes. Las variables locales se crean en la pila. He probado tu código. He intentado agrandar la pila, pero sigue fallando, por lo que he tomado otra aproximación:

Declara el array de 1000 filas y 1000 columnas global. Así se creará en el heap y no en la pila. Eso quita el fallo de segmentación.

Después, sustituye tu función para leer datos por:

Código:

void leermatriz (float z[1000][1000], int x, int y)
{
    int i,j;
    for (i=1;i<=x;i++)
    {
        for (j=1;j<=y;j++)
        {
            printf ("Ingrese la componente [%d][%d]",i,j);
            scanf ("%f",&z[x][y]);
        }
    }
}


Para que no diga siempre que está leyendo la fila y la columna máximas he cambiado x por i e y por j, y observa también el & en el scanf.

El resto del programa no hace ningún estropicio grande por lo que no lo he comprobado.

De nuevo, perdona mis errores.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6817
Ubicación: Mexico

MensajePublicado: 04/10/2012 8:01 am
Título:

Como ya te comento untio dos de los problemas con tu programa son:
1) Faltaba el operador "&" en la llamada a "scanf".
2) Los indices de los arrays inician en 0 y terminan en "N-1" donde "N" es el numero de elementos.

A mi lo que me preocupa es: ¿Que lenguaje estas utilizando?

El uso de referencias apunta a C++ pero aparte de ellas el programa no tiene nada de este y debería, por lo menos, generar mensajes de advertencia.

¿Nos puedes confirmar el lenguaje?

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com