[C] Pasar Array como parámetro a funcion INT o FLOAT

Iniciado por n-utz, 8 Agosto 2016, 00:27 AM

0 Miembros y 1 Visitante están viendo este tema.

n-utz

Buenas noches, verán me encuentro con un problema, estoy terminando un tp para la facultad, y me encuentro con que debo pasar un array a una funcion INT para que cuente los "ausentes", los "0", y me devuelva la cantidad de estos.

El tema es el siguiente, en el mismo programa tengo el pasaje de este mismo vector a una funcion VOID y me la devuelve a main sin problemas, cuando me la devuelve la quiero enviar así como está a la funcion INT, pero se envía con basura.

Les paso a poner el código: OBVIAR LA FUNCION VOID.

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

void carga(float al[], int x);
void ausentes(float al[], int x);

int main()
{
   int j, aus;
   float alumnos[5];

   carga(alumnos,5);

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

   ausentes(alumnos,5);

   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;}

   }
}

int ausentes(float al, int x){
   int i, contador=0;

   for(i=1;i<=x;i++){
       printf("Alumno %d: %.2f\n", i, al[i]);
   }

   for(i=1;i<=x;i++){
       if(al[i]<1){
           contador+=1;
       }
   }
   printf("%d", contador);
   return contador;
   }

ivancea96

Los bucles están mal. SI el array es de 5 elementos, tienes que recorrer desde 0 hasta 4, no desde 1 hasta 5. Si accedes al índice 5, estás accediendo a un elemento inexistente, y puede desde tirar error, hasta corromper la memoria.

Los for serían:
Código (cpp) [Seleccionar]
for(i=0; i<max; i++)

n-utz

#2
Era eso, las vacaciones me hicieron mal. Gracias!!

PD: Ademas de tanto intentar, vi que el codigo que esta arriba tiene varias cosas mal. No lo usen como ejemplo para pasaje de parametros, cualquier cosa manden MP.

AlbertoBSD

No se como te enseñaron a usar los arreglos pero si es un arreglo de 5 elementos debes de procesar solo los datos del indice 0 al 4

Cuenta conmigo

Indice 0 y llevamos 1
Indice 1 y llevamos 2
Indice 2 y llevamos 3
Indice 3 y llevamos 4
Indice 4 y llevamos 5


Deberia de ser algo asi, El detalle que al momento de escribir en el espacio alumnos[5], realmente estas escribiendo en el espacio designado para otra de las variables, se llama bufferoverflow y se da cuando escribes fuera de los limites de un arreglo.


Deberia de quedar algo asi:


int main(){

int aus;

aus = ausentes(alumnos,5);

}

int ausentes(float al, int x){
   int i, contador=0;

   for(i=0;i<x;i++){
       printf("Alumno %d: %.2f\n", i, al[i]);
       if(al[i]==0){
           contador+=1;
       }
   }
   printf("%d", contador);
   return contador;
   }
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

Cita de: AlbertoBSD en  8 Agosto 2016, 00:45 AM
No se como te enseñaron a usar los arreglos pero si es un arreglo de 5 elementos debes de procesar solo los datos del indice 0 al 4

Cuenta conmigo

Indice 0 y llevamos 1
Indice 1 y llevamos 2
Indice 2 y llevamos 3
Indice 3 y llevamos 4
Indice 4 y llevamos 5


Deberia de ser algo asi, El detalle que al momento de escribir en el espacio alumnos[5], realmente estas escribiendo en el espacio designado para otra de las variables, se llama bufferoverflow y se da cuando escribes fuera de los limites de un arreglo.


Deberia de quedar algo asi:


int main(){

int aus;

aus = ausentes(alumnos,5);

}

int ausentes(float al, int x){
   int i, contador=0;

   for(i=0;i<x;i++){
       printf("Alumno %d: %.2f\n", i, al[i]);
       if(al[i]==0){
           contador+=1;
       }
   }
   printf("%d", contador);
   return contador;
   }


Perfecto, si me lo han ensenado asi, lo que pasa que me desconcerte yo. Al ser "Alumnos" y el numero de indice ser el numero de alumno, quise obviar el elemento 0, como verán, pero me olvide de que el ultimo elemento seria el 4.

Gracias che!