[C] Impresion de BASURA, rara

Iniciado por n-utz, 8 Agosto 2016, 02:08 AM

0 Miembros y 2 Visitantes están viendo este tema.

n-utz

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.

ivancea96

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: [code=c]
Y:
Citar[/code]

AlbertoBSD

Misma observacion es mucho codigo.

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

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

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.

#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=1;j<5;j++){
       if(alumnos[j]=notamax)
           cantmax+=1;
   }
   for(j=1;j<5;j++){
       if(alumnos[j]=notamin)
           cantmin+=1;
   }
   printf("NOTA MAXIMA: %.2f\tCantidad de alumnos con nota maxima:%d\n",notamax,cantmax);
   printf("NOTA MINIMA: %.2f\tCantidad de alumnos con nota minima:%d\n",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[x];

   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[i];
       if(verif>=1){           //VERIFICACION DE CARGA DE NOTA
           printf("\nEl alumno ya tiene inscripta la nota: %.2f", verif);
               goto nroal;
           }else{
       al[i]=nota;}

   }
}

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

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

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

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


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.

ivancea96

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.

n-utz

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 ::)