elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejercicio compila pero no se ejecuta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio compila pero no se ejecuta  (Leído 8,121 veces)
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Ejercicio compila pero no se ejecuta
« en: 10 Abril 2014, 08:30 am »

Muy buenas de nuevo. Estoy haciendo un programa ( muy básico ) en el que se debe introducir un número de alumnos, luego pedir una calificación a cada uno en el intervalo [0, 10], y por último clasificar el número de aprobados, notables, etc. TODO CON ENTEROS.
De momento llevo lo siguiente:

Código:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];


do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

for (i = 0; i < alumnos; i++){
do{
notas[i] = malloc (TAMANIO * sizeof (char));
 
       printf("Nota alumno %d : ", i + 1);
       scanf("%[^\n]", notas[i]);
       while(getchar() != '\n');
      
       x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
   }


return EXIT_SUCCESS;
}

El problema es que compila pero en cuanto se abre la consola se termina el proceso.
No encuentro que puede estar mal.
Agradecería mucho indicaciones de cómo mejorar un poco el código (ya que lo veo un poco desastroso, sobre todo en la declaración de variables  ;D )

Gracias.


« Última modificación: 10 Abril 2014, 11:38 am por David8 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #1 en: 10 Abril 2014, 12:44 pm »

¿Que IDE usas?

En el codeblocks si pulsas F8 activas el depurador, y puedes avanzando el programa línea a línea. Así ves donde el programa "estalla".

Otra opción es ir poniendo printfs por el código y ver cuantos printfs llega a escribir antes de que de error, pero el depurador es una tecnica un poco chapucera xD


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #2 en: 10 Abril 2014, 13:20 pm »

Uso el dev c++
Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows

No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...

Un saludo
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #3 en: 10 Abril 2014, 13:35 pm »

Uso el dev c++
Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows

No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...

Un saludo
Te lo he dicho, tienes que averiguar en que línea te da el problema.

Hazme caso y pon printfs cada 3-4 líneas de código:

Código
  1. int main(void)
  2. {
  3.        printf("1 - Inicio \n");
  4. char nAlumnos[TAMANIO];
  5. int alumnos;
  6. int longitud;
  7. int x;   // valor que devuelve la función verificarEntrada()
  8. int i;
  9. char *notas[alumnos];
  10. int notasEnteras[alumnos];
  11.  
  12.        printf("2 - Tras declarar las variables \n");
  13.  
  14.        // Etc...
  15.  

Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual).

PD: Por cierto, usas la variable "alumnos" pero no está inicializada.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #4 en: 10 Abril 2014, 13:51 pm »

Te lo he dicho, tienes que averiguar en que línea te da el problema.

Hazme caso y pon printfs cada 3-4 líneas de código:

Código
  1. int main(void)
  2. {
  3.        printf("1 - Inicio \n");
  4. char nAlumnos[TAMANIO];
  5. int alumnos;
  6. int longitud;
  7. int x;   // valor que devuelve la función verificarEntrada()
  8. int i;
  9. char *notas[alumnos];
  10. int notasEnteras[alumnos];
  11.  
  12.        printf("2 - Tras declarar las variables \n");
  13.  
  14.        // Etc...
  15.  

Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual).

PD: Por cierto, usas la variable "alumnos" pero no está inicializada.


Probaré lo de los prints.

Respecto a lo de alumnos, si quiero usar correctamente
Código:
char *notas[alumnos];
int notasEnteras[alumnos];
debería de declararlos una vez que tenga alumnos definido no? Es decir, antes del for)

Muchas gracias y un saludo
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #5 en: 10 Abril 2014, 13:57 pm »

Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #6 en: 10 Abril 2014, 14:02 pm »

Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.

Código:
int v;
char *notas[v] = malloc(alumnos * sizeof (char));

Así?
En línea

David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #7 en: 10 Abril 2014, 18:26 pm »

Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.

Hice lo que me dijiste y el código me queda así:

Código:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;

do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

char *notas = malloc(alumnos * sizeof (char));
int notasEnteras[alumnos];

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

do{
notas[i] = malloc(TAMANIO * sizeof (char));
 
      printf("Nota alumno %d : ", i + 1);
        scanf("%[^\n]", notas[i]);
       
        while(getchar() != '\n');
       
        x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
   }


return EXIT_SUCCESS;
}

También puse los printf y todo va bien hasta que entra en el for, que no pasa de:
Código:
scanf("%[^\n]", notas[i]);

Aquí pongo los mensajes que me deja el compilador (los  que no he conseguido solucionar):
Citar
In function 'main':
57 13 [Warning] assignment makes integer from pointer without a cast [enabled by default]
60 10 [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast [enabled by default]
354 39 c:\program files (x86)\dev-cpp\mingw32\include\stdio.h expected 'char *' but argument is of type 'char'
64 10 [Warning] passing argument 1 of 'verificarEntrada' makes pointer from integer without a cast [enabled by default]
10 5 expected 'const char *' but argument is of type 'char'
67 5 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'
73 6 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'

No quiero la solución en código del problema si no una pista de lo que pudiese estar fallando.

Un saludo.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #8 en: 10 Abril 2014, 20:26 pm »


Todo el mal radica en cómo declaras notas y el char que usas.

Ya que usas array de longitud variable en:


Código
  1. int notasEnteras[alumnos];

no sé por qué no haces lo mismo con notas:

Código
  1. char *notas[alumnos];

Pero si lo quieres hacer con malloc, entonces:

Código
  1. char **notas;
  2. *notas=malloc(alumnos * sizeof (char));

¡¡¡¡ Saluditos! ..... !!!!


En línea

David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Ejercicio compila pero no se ejecuta
« Respuesta #9 en: 10 Abril 2014, 20:50 pm »

Todo el mal radica en cómo declaras notas y el char que usas.

Ya que usas array de longitud variable en:


Código
  1. int notasEnteras[alumnos];

no sé por qué no haces lo mismo con notas:

Código
  1. char *notas[alumnos];

Pero si lo quieres hacer con malloc, entonces:

Código
  1. char **notas;
  2. *notas=malloc(alumnos * sizeof (char));

¡¡¡¡ Saluditos! ..... !!!!




Funciona!!! Muchísimas gracias.
Aunque no comprendo muy bien lo de punteros a punteros, pero eso es cuestión de estudiarlo mejor.

Ya que me lo dijiste, ¿es mejor hacer
Código:
int notasEnteras[alumnos];
como un array dinámico? Sólo lo uso para almacenar enteros. (perdona mi ignorancia)

Un saludo
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compila bien, pero no ejecuta !! Solucionado
Java
Vingilot 4 3,947 Último mensaje 8 Enero 2008, 15:20 pm
por Vingilot
Como se compila y ejecuta un programa java en linux
Java
Dem0ny 2 9,252 Último mensaje 27 Noviembre 2008, 22:24 pm
por Amerikano|Cls
Problema en DevC++, compila pero no se ejecuta.
Programación C/C++
jairogon 9 33,815 Último mensaje 11 Julio 2010, 21:32 pm
por codeliber
compila y ejecuta bien, pero me muestra un caracter raro
Programación C/C++
pedroarcego 7 3,916 Último mensaje 7 Septiembre 2010, 11:28 am
por Garfield07
Compila pero no se ejecuta! Ayuda por favor.
Programación C/C++
durindemoria 7 3,323 Último mensaje 9 Diciembre 2015, 23:42 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines