Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: pablombf en 9 Enero 2018, 23:54 pm



Título: Duda sobre structs!!!
Publicado por: pablombf en 9 Enero 2018, 23:54 pm
Si tengo un struct definido, ej:
          
Código
  1. struct Notas {
  2.  
  3.        // Estructura interna de un dato de tipo Notas
  4.       int codigoAlumno;
  5.       int cualitativa1;
  6.       int cuantitativa1;
  7.       int cualitativa2;
  8.       int cuantitativa2;
  9. };

y una funcion en la que se implican dos variables del struct:


Código
  1. suspendido=1;
  2. aprobado=0;
  3. void convocatoria1 (const Notas& n, int& cualitativa, int& cuantitativa){
  4.    if (n.cualitativa1==suspendido){
  5.        cualitativa=n.cualitativa1;
  6.  
  7.    }
  8.    else{
  9.        cualitativa=n.cualitativa1;
  10.        cuantitativa=n.cuantitativa1;
  11.    }
  12. }

En el caso de que este suspendido me devuelve la variable por referencia  "cualitativa",
pero como hago para que no me devuelva la variable "cuantitativa"?
Porque si en el main, meto la funcion en un bucle :



Código
  1. int main(){
  2.  
  3.    int convo1cuali=0;
  4.    int convo1cuanti=0;
  5.    Notas vector[14];
  6.  
  7.     int j=0;
  8.    while(j<14){
  9.  
  10.        convocatoria1(vector[j],convo1cuali,convo1cuanti);
  11.        cout<<convo1cuali<<" "<<convo1cuanti<<endl;
  12.        j++;
  13.    }
  14.    return 0;
  15. }

La cuantitativa en el caso de estar suspendido(que no se tiene que mostrar), en vez de no mostrarse, saca por pantalla el valor de la cuantitativa de j-1 del bucle.

Tienen idea de como se podria arreglar?, gracias de antemano




Título: Re: Duda sobre structs!!!
Publicado por: Serapis en 10 Enero 2018, 03:23 am
Una forma extraña de invocar una función. Pasas un estructura a una función, para luego devolver también sus dos elementos por referencia... no le veo el sentido, salvo que sea simplemente practicar... (aunque mala práctica).

Tu dilema se resuelve en evaluar tras la llamada el resultado...
Tu tienes:

Código:
Convocactoria1(array(j), cuali, cuanti)
mensaje cuali + cuanti

Pués evaluando a su regreso harías algo como:
Código:
Convocactoria1(array(j), cuali, cuanti)
Si (cuali = aprobado) luego
    mensaje cuali + cuanti
sino  //esto es, suspendido
    mensaje cuali  // omitimos cuanti, según tu propuesta de que no debe mostrarse.
fin si

Luego en la función preguntas por un valor, y tanto si es suspendido como aprobado, en ambos casos repites la línea... si debe ser así, esa línea basta ponerla fuera del condicional si, sí o sí, se va a consigar, o corrige eliminando la que no proceda...
Te lo marco en negrita.

void convocatoria1 (const Notas& n, int& cualitativa, int& cuantitativa){
    if (n.cualitativa1==suspendido){
        cualitativa=n.cualitativa1;    }
    else{
        cualitativa=n.cualitativa1;
        cuantitativa=n.cuantitativa1;    }
}
Es decir quizás quisieras hacer algo como esto (copio y pego y corijo in situ):
Código:
void convocatoria1 (const Notas& n, int& cualitativa, int& cuantitativa){
    cualitativa=n.cualitativa1;
 
    if (n.cualitativa1==aprobado){
        cuantitativa=n.cuantitativa1;    }
}