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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Impresion de BASURA, rara
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Impresion de BASURA, rara  (Leído 2,693 veces)
n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
[C] Impresion de BASURA, rara
« en: 8 Agosto 2016, 02:08 am »

Buenas noches, estoy trabajando con el IDE CodeBlocks y me resulto un problema.

Estaba por terminar el trabajo práctico, agregue dos funciones sencillas, el programa andaba a la perfección, cuando termino de agregarlas corro el programa y empieza a imprimir basura, revisé todo 20 veces, anulé lo agregado, no toque otra cosa mientras lo agregaba y ahora no me deja de imprimir basura.

Cerré el programa, volví a abrirlo, copié el código en un nuevo proyecto y aún así continúa haciendolo. No le encuentro la lógica, pienso que es un error del IDE en sí pero no sé como solucionarlo.

¿Alguna idea?

Dejo el código por las dudas, lo agregado fue todo lo relacionado a las notas maxima y minima, ya sea los "for" en el main y las funciones.

Citar
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void carga(float al[], int x);
int ausentes(float al[], int x);
int presentes(float al[], int x);
int promociones(float al[], int x);
int aprobados(float al[], int x);
int desaprobados(float al[], int x);
float promedio(float al[], int x);
float max(float al[], int x);
float min(float al[], int x);

int main()
{
    int j, cantmax=0, cantmin=0;
    float alumnos[5], notamax=0, notamin=0;

    carga(alumnos,5);

    for(j=1;j<5;j++){
        printf("Alumno %d\t Nota %.2f\n",j,alumnos[j]);
    }

    printf("Cantidad de AUSENTES: %d\n",ausentes(alumnos,5));
    printf("Cantidad de PRESENTES: %d\n",presentes(alumnos,5));
    printf("Cantidad de PROMOCIONADOS: %d (Nota mayor o igual a 7)\n",promociones(alumnos,5));
    printf("Cantidad de APROBADOS: %d (Nota entre 4 y 7)\n",aprobados(alumnos,5));
    printf("Cantidad de DESAPROBADOS: %d\n", desaprobados(alumnos,5));
    printf("PROMEDIO: %.2f\n", promedio(alumnos,5));

    notamax=max(alumnos,5);
    notamin=min(alumnos,5);
    for(j=0;j<5;j++){
        if(alumnos[j]=notamax)
            cantmax+=1;
    }
    for(j=0;j<5;j++){
        if(alumnos[j]=notamin)
            cantmin+=1;
    }
    printf("NOTA MAXIMA: %.2f\tCantidad de alumnos con nota maxima:%d",notamax,cantmax);
    printf("NOTA MINIMA: %.2f\tCantidad de alumnos con nota minima:%d",notamin,cantmin);

    return 0;
}


void carga(float al[], int x){   //CARGA DE NOTAS

    int i, trunca=0;
    float nota=0, verif, resul=0;
    bool vof=false;
    al
  • ;

    while(nota>=0){
        nroal:
        printf("\nIngrese la nota a inscribir ");
        scanf("%f", &nota);
        printf("\nIngrese el numero de alumno a modificar ");
        scanf("%d", &i);

        if(nota>=1){            //PURGA DE NOTA INVALIDA Y CORRECCION DE DECIMALES
            while(nota>10){
                printf("\nNota erronea, vuelva a ingresar ");
                scanf("%f", &nota);
            }
            trunca=nota;
            resul=nota-trunca;
            if(resul>0 && resul<0.25){
                nota=trunca+0.25;}
            if(resul>0.25 && resul<0.5){
                nota=trunca+0.5;}
            if(resul>0.5 && resul<0.75){
                nota=trunca+0.75;}
            if(resul>0.75 && resul<=0.99){
                nota=trunca+1;}
            resul=0;
            trunca=0;

            }
            else if(nota<0){    //NOTA NEGATIVA
                break;
            }

        while(i>x || i<0){             //VERIFICACION ALUMNO
            printf("\nError en el numero de alumno, vuelva a ingresar ");
            scanf("%d", &i);
        }
        verif=al;
        if(verif>=1){           //VERIFICACION DE CARGA DE NOTA
            printf("\nEl alumno ya tiene inscripta la nota: %.2f", verif);
                goto nroal;
            }else{

        al=nota;}

    }
}

int ausentes(float al[], int x){    //CONTADOR DE AUSENTES
    int i, contador=0;

    for(i=1;i<x;i++){
        if(al<1)
            contador+=1;
    }
    return contador;
    }

int presentes(float al[], int x){   //CONTADOR DE PRESENTES
    int i, contador=0;

    for(i=1;i<x;i++){
        if(al>0.1)
            contador+=1;
    }
    return contador;
    }

int promociones(float al[], int x){ //CONTADOR DE PROMOCIONES
    int i, contador=0;

    for(i=1;i<x;i++){
        if(al>=7)
            contador+=1;
    }
    return contador;
    }

int aprobados(float al[], int x){   //CONTADOR DE APROBADOS
    int i, contador=0;

    for(i=1;i<5;i++){
        if(al>=4 && al<7)
            contador+=1;
    }
    return contador;

    }

int desaprobados(float al[], int x){    //CONTADOR DE DESAPROBADOS
    int i, contador=0;

    for(i=1;i<5;i++){
        if(al>0.1 && al<4)
            contador+=1;
    }
    return contador;
}

float promedio(float al[], int x){  //CALCULA PROMEDIO
    int i;
    float suma=0;

    for(i=1;i<5;i++){
        suma+=al;
    }
    return (suma/4);
    }


float max(float al[], int x){
    int i;
    float maxima=0;

    for(i=1;i<5;i++){
        if(al>maxima)
            maxima=al;
    }
    return maxima;
    }

float min(float al[], int x){
    int i;
    float minima=11;

    for(i=1;i<5;i++){
        if(al>0.1 && al<minima)
            minima=al;
    }
    return minima;
}

LA IMPRESIÓN DE BASURA SE DA EN: "//VERIFICACION DE CARGA DE NOTA". Esa parte no fue modificada desde que andaba.

¿Por qué en ese apartado?, pues cuando ingresaba una nota a un alumno que ya tenía cargada la nota, me saltaba error, mostraba la nota que ya estaba ingresada y volvia a pedir nota para otro alumno.
Ahora a la primera que quiero cargar una nota para el alumno 1, que no tiene nada me dice que ya tiene una nota registrada que es 0.000565657....

EDITADO: La BASURA la imprime en TODAS las cargas de nota.


« Última modificación: 8 Agosto 2016, 02:14 am por n-utz » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C] Impresion de BASURA, rara
« Respuesta #1 en: 8 Agosto 2016, 02:27 am »

Es mucho código y no das muchosdatos.

En primer lugar, dónde ves la basura? Justo después de la funcion cargar? La función cargar rellena el aray? Si es así, ya tienes la función problemática aislada.

Luego, son varios while, e if dentro de la funcion. ¿Puedes asegurar que todos y cada uno de los valores del array van a salir siempre con un valor?

No puedo ver bien el código de la función. Cuando pongas código, colócalo entre etiquetas GeSHi. Si lo quieres poner manualmente, rodealo con la etiqueta:
Código:
[code=c]
Y:
Citar
[/code]


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Impresion de BASURA, rara
« Respuesta #2 en: 8 Agosto 2016, 02:34 am »

Misma observacion es mucho codigo.

NO recomiendo para nada el uso de GOTO ya que no es nada estrucuturado.

Saludos!
En línea

n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
Re: [C] Impresion de BASURA, rara
« Respuesta #3 en: 8 Agosto 2016, 02:37 am »

Mira, si sucede todo en la funcion CARGAR, no todos las posiciones saldrán con valor, si no las que yo elija, ingreso por teclado la nota y después la posición del array en la cuál se guardara.

La basura surge, en el muestreo del array en el "main", una vez que lo cargo, al imprimirlo me imprime cualquier numero.

Lo que pasa que es mi funcion "principal" si la anulo el programa no hace nada, pero esa es la problematica si.

Lo raro es que cuando agregue las funciones que agregué a lo ultimo NO toque nada de esa función, por eso no puedo encontrar el error, porque lógicamente no habría.

Te pongo el código devuelta, igualmente si lo había puesto con el código GeSHi.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. void carga(float al[], int x);
  6. int ausentes(float al[], int x);
  7. int presentes(float al[], int x);
  8. int promociones(float al[], int x);
  9. int aprobados(float al[], int x);
  10. int desaprobados(float al[], int x);
  11. float promedio(float al[], int x);
  12. float max(float al[], int x);
  13. float min(float al[], int x);
  14.  
  15. int main()
  16. {
  17.    int j, cantmax=0, cantmin=0;
  18.    float alumnos[5], notamax=0, notamin=0;
  19.  
  20.    carga(alumnos,5);
  21.  
  22.    for(j=1;j<5;j++){
  23.        printf("Alumno %d\t Nota %.2f\n",j,alumnos[j]);
  24.    }
  25.  
  26.    printf("Cantidad de AUSENTES: %d\n",ausentes(alumnos,5));
  27.    printf("Cantidad de PRESENTES: %d\n",presentes(alumnos,5));
  28.    printf("Cantidad de PROMOCIONADOS: %d (Nota mayor o igual a 7)\n",promociones(alumnos,5));
  29.    printf("Cantidad de APROBADOS: %d (Nota entre 4 y 7)\n",aprobados(alumnos,5));
  30.    printf("Cantidad de DESAPROBADOS: %d\n", desaprobados(alumnos,5));
  31.    printf("PROMEDIO: %.2f\n", promedio(alumnos,5));
  32.  
  33.    notamax=max(alumnos,5);
  34.    notamin=min(alumnos,5);
  35.    for(j=1;j<5;j++){
  36.        if(alumnos[j]=notamax)
  37.            cantmax+=1;
  38.    }
  39.    for(j=1;j<5;j++){
  40.        if(alumnos[j]=notamin)
  41.            cantmin+=1;
  42.    }
  43.    printf("NOTA MAXIMA: %.2f\tCantidad de alumnos con nota maxima:%d\n",notamax,cantmax);
  44.    printf("NOTA MINIMA: %.2f\tCantidad de alumnos con nota minima:%d\n",notamin,cantmin);
  45.  
  46.    return 0;
  47. }
  48.  
  49.  
  50. void carga(float al[], int x){   //CARGA DE NOTAS
  51.  
  52.    int i, trunca=0;
  53.    float nota=0, verif, resul=0;
  54.    bool vof=false;
  55.    al[x];
  56.  
  57.    while(nota>=0){
  58.        nroal:
  59.        printf("\nIngrese la nota a inscribir ");
  60.        scanf("%f", &nota);
  61.        printf("\nIngrese el numero de alumno a modificar ");
  62.        scanf("%d", &i);
  63.  
  64.        if(nota>=1){            //PURGA DE NOTA INVALIDA Y CORRECCION DE DECIMALES
  65.            while(nota>10){
  66.                printf("\nNota erronea, vuelva a ingresar ");
  67.                scanf("%f", &nota);
  68.            }
  69.            trunca=nota;
  70.            resul=nota-trunca;
  71.            if(resul>0 && resul<0.25){
  72.                nota=trunca+0.25;}
  73.            if(resul>0.25 && resul<0.5){
  74.                nota=trunca+0.5;}
  75.            if(resul>0.5 && resul<0.75){
  76.                nota=trunca+0.75;}
  77.            if(resul>0.75 && resul<=0.99){
  78.                nota=trunca+1;}
  79.            resul=0;
  80.            trunca=0;
  81.  
  82.            }
  83.            else if(nota<0){    //NOTA NEGATIVA
  84.                break;
  85.            }
  86.  
  87.        while(i>x || i<0){             //VERIFICACION ALUMNO
  88.            printf("\nError en el numero de alumno, vuelva a ingresar ");
  89.            scanf("%d", &i);
  90.        }
  91.        verif=al[i];
  92.        if(verif>=1){           //VERIFICACION DE CARGA DE NOTA
  93.            printf("\nEl alumno ya tiene inscripta la nota: %.2f", verif);
  94.                goto nroal;
  95.            }else{
  96.        al[i]=nota;}
  97.  
  98.    }
  99. }
  100.  
  101. float max(float al[], int x){
  102.    int i;
  103.    float maxima=0;
  104.  
  105.    for(i=1;i<5;i++){
  106.        if(al[i]>maxima)
  107.            maxima=al[i];
  108.    }
  109.    return maxima;
  110.    }
  111.  
  112. float min(float al[], int x){
  113.    int i;
  114.    float minima=11;
  115.  
  116.    for(i=1;i<5;i++){
  117.        if(al[i]>0.1 && al[i]<minima)
  118.            minima=al[i];
  119.    }
  120.    return minima;
  121. }

Miren acorté el código A, la función main (razones obvias), la función "problemática" y las funciones que agregué a partir de las cuáles empezó el problema.

Con respecto a lo del GOTO, sé que no es recomendable, pero este trabajo práctico como se darán cuenta es algo largo y lo estoy haciendo a las apuradas, lo usé para salir del apuro.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C] Impresion de BASURA, rara
« Respuesta #4 en: 8 Agosto 2016, 02:53 am »

Código
  1. al[x];
Esa línea no solo no hace nada, sino que accede a una posicion que no existe.

Luego. Dices qeu solo le metes datos a lo que quieres. Si no le asignas datos a una posicion del array nunca, entonces tendrá basura, que es lo que tenía la memoria en ese momento. no se inicializa a 0 ni nada parecido.

Si lo vas a mostrar, deberías inicializarlo todo a 0, por ejemplo. O -1, o lo que quieras.
En línea

n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
Re: [C] Impresion de BASURA, rara
« Respuesta #5 en: 8 Agosto 2016, 03:44 am »

Gracias Ivancea!! No era más que el problema de no inicializar el array en 0, simplemente por el hecho de que viene cargados de 0, me confié y ese era el problema.

Muchas gracias por todo!

PD: Acabo de entregar el TP ::)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cosa rara
Software
zapa I 1 2,830 Último mensaje 26 Diciembre 2005, 03:16 am
por jorson
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines