Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: n-utz en 8 Agosto 2016, 00:27 am



Título: [C] Pasar Array como parámetro a funcion INT o FLOAT
Publicado por: n-utz en 8 Agosto 2016, 00:27 am
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.

Código:
#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;
    }


Título: Re: [C] Pasar Array como parámetro a funcion INT o FLOAT
Publicado por: ivancea96 en 8 Agosto 2016, 00:39 am
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
  1. for(i=0; i<max; i++)


Título: Re: [C] Pasar Array como parámetro a funcion INT o FLOAT
Publicado por: n-utz en 8 Agosto 2016, 00:42 am
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.


Título: Re: [C] Pasar Array como parámetro a funcion INT o FLOAT
Publicado por: 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:
Código
  1.  
  2. int main(){
  3.  
  4. int aus;
  5.  
  6. aus = ausentes(alumnos,5);
  7.  
  8. }
  9.  
  10. int ausentes(float al, int x){
  11.    int i, contador=0;
  12.  
  13.    for(i=0;i<x;i++){
  14.        printf("Alumno %d: %.2f\n", i, al[i]);
  15.        if(al[i]==0){
  16.            contador+=1;
  17.        }
  18.    }
  19.    printf("%d", contador);
  20.    return contador;
  21.    }
  22.  


Título: Re: [C] Pasar Array como parámetro a funcion INT o FLOAT
Publicado por: n-utz en 8 Agosto 2016, 00:47 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:
Código
  1.  
  2. int main(){
  3.  
  4. int aus;
  5.  
  6. aus = ausentes(alumnos,5);
  7.  
  8. }
  9.  
  10. int ausentes(float al, int x){
  11.    int i, contador=0;
  12.  
  13.    for(i=0;i<x;i++){
  14.        printf("Alumno %d: %.2f\n", i, al[i]);
  15.        if(al[i]==0){
  16.            contador+=1;
  17.        }
  18.    }
  19.    printf("%d", contador);
  20.    return contador;
  21.    }
  22.  

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!