ayuda con programa con arreglos porfa

Iniciado por ediy elctro, 29 Noviembre 2019, 04:11 AM

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

ediy elctro

tengo este programa, segun yo imprime los nombres y calificaciones de alumnos, suma y promedio, y solo me toma en cuente el ultimo dijito, y me imprime mal los nombres la suma y el promedio. cada que le pido ayuda a mi profesor no me dice nada y lo poco que he aprendido es de un libro pero al parecer tiene muchos errores,, si me podrian ayudar estare agradecido


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>

char alumno[4][2];
float calif[4][2];
int cont1, cont2;
char get_num();
float sum,prom;

main(){
   for(cont1=0;cont1<=3;cont1++){
      printf("nombre del alumno %d:",cont1+1);
      gets(alumno[cont1]);
      sum=0;
      
      
      for(cont2=0;cont2<=1;cont2++){
         printf("calificacion %d:",cont2+1);
         calif[cont1][cont2]=get_num();
         sum= calif[cont1][cont2]+ calif[cont1][cont2];
         prom=sum/2;
      }
            
   
   }
   printf("\nNum \talumno\tcalificacion 1\t calificacion\n");
      for(cont1=0;cont1<=3;cont1++){
      printf("\n%d \t%s\t\t%3.2f\t\t%3.2f \t  suma=%f \tpromedio=%f",cont1+1,alumno[cont1],calif[cont1][0],calif[cont1][1],sum,prom);}
   return 0;
}
char get_num(){
   char s[2];
   gets(s);
   return(atof(s));
}

K-YreX

Utiliza las etiquetas de Código GeSHi para poner el código. Tienes una lista desplegable que se llama "Código GeSHi" encima del cuadro de texto para elegir el lenguaje...

No sé exactamente qué entradas le das y qué salidas obtienes así que te comento cosas que puedes mejorar:
  • No utilices la cabecera <conio.h>. No es estándar por lo que hay sistemas operativos e IDEs que no pueden trabajar con ella.
  • Utiliza constantes para definir los tamaños. Así podrás en cualquier momento cambiar el tamaño del problema sin tener que tocar todo el código. Además veo que los nombres están compuestos de 2 caracteres.


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

    // Definicion de constantes
    #define NUMERO_ALUMNOS 4 // Sin = y sin ;
    #define SIZE_ALUMNO 20 // Nombres de 2 caracteres me parece un poco escaso pero si es tu caso, pues pones 2
    #define NUMERO_NOTAS 2 // El numero de filas no lo definimos porque parece que siempre sera el mismo que NUMERO_ALUMNOS


  • Utiliza las constantes para crear los arrays y para los bucles. Así al cambiar algún valor de las constantes, el programa se adaptará solo.

    int main(){
        char alumnos[NUMERO_ALUMNOS][SIZE_ALUMNO];
        float notas[NUMERO_ALUMNOS][NUMERO_NOTAS];
        //...
        for(int i = 0; i < NUMERO_ALUMNOS; ++i){
            //...
        }
    }


  • Para pedir cadenas de caracteres, utiliza la función fgets() mejor que gets().

    char alumnos[NUMERO_ALUMNOS][SIZE_ALUMNO];
    for(int i = 0; i < NUMERO_ALUMNOS; ++i){
        printf("Introduce el nombre %d: ", i+1);
        fgets(alumnos[i], SIZE_ALUMNOS, stdin);
    }


  • Para pedir las notas usas una función que parece que va a devolver un float pero acaba devolviendo un char. Creo que ahí tienes el problema. De todas maneras para pedir valores numéricos puedes usar scanf() de manera más sencilla.

    float notas[NUMERO_ALUMNOS][NUMERO_NOTAS];
    for(int i = 0; i < NUMERO_ALUMNOS; ++i){
        for(int j = 0; j < NUMERO_NOTAS; ++j){
            printf("Introduce la nota %d para el alumno %d: ", j+1, i+1);
            scanf("%f", &notas[i][j]);
        }
    }


  • Para calcular la suma, estás sumando 2 veces cada nota. Es mejor que primero pidas las notas y luego en un bucle calculas la media aunque no tienes dónde guardarla. Si guardas la primera media en <prom> y tienes 2 alumnos o más, el siguiente modificará el valor de <prom> y el siguiente y el siguiente y al final tendrá la media del último alumno sólo. Tendrías que calcular la media justo antes de mostrarla para poder utilizar la variable o sino crear otro array para guardar las medias de cada alumno.

    float medias[NUMERO_ALUMNOS] = {0}; // pone todas las posiciones a 0
    for(int i = 0; i < NUMERO_ALUMNOS; ++i){
        for(int j = 0; j < NUMERO_NOTAS; ++j)
            medias[i] += notas[i][j];
        medias[i] /= NUMERO_NOTAS;
    }


  • Si quieres mostrar la suma de las notas también debes hacer lo mismo que en el paso anterior. O bien calculas cada suma justo antes de mostrarla o creas otro array para las sumas. Esto te lo dejo a ti y si tienes problemas, coloca tu código en el mensaje (entre etiquetas) y a ser posible una explicación del problema para poder ayudarte.

  • Automatiza todo el proceso de mostrar los resultados con dos bucles para que puedas mostrar diferentes cantidades de notas y de alumnos. Inténtalo también y si tienes problemas pues lo mismo.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;