Ayuda urgente con c

Iniciado por imoralesh, 28 Marzo 2016, 05:45 AM

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

imoralesh

Buenas noches, podrían ayudarme con el siguiente código? al compilar me envía un error en el case 2.
134   4 [Error] switch jumps into scope of identifier with variably modified type

/* Programa: calificacionesEscuela.c
Descripción: Programa que determina el mayor y menor promedio de un grupo escolar.
Versión 1.2
Mejoras: Se utilizan estructuras y arreglos para la obtención y almacenamientos de los datos. */


/* Directivas de preprocesador */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

/* NOTA: Vamos a tener una variable de tipo estructura que va a contener los datos del alumno, esto es:

struct grupo
{
char nombreAlum[15];
float calfLen;
float calfMat;
float calfCie;
}a[],b[];

Vamos a solicitar cada calificación y nombre del alumno a traves de un for dependiendo de la cantidad
de alumnos que defina el usuario y guardaremos cada calificacion en la estructura correspondiente, esto es:

grupo a:
grupo.nombreAlum;
grupo.calfLen;
grupo.calfMat;
grupo.calfCie;

*/

/* Función principal */
main()
{
/* Declaración de variable, estructuras y arreglos */
struct grupo
{
char nomAlum[15];
float calfLen;
float calfMat;
float calfCie;
float prom1;
};

char mejorAlum[15];
int totalAlum, n, opc;
float prom2=0;

/* Ciclo para repetir el menú mientras la opción no sea salir */
do
{
/* Bienvenida del programa */
system("cls");
printf("\n******* Departamento de Control Escolar *******");
printf("\n\n*****Programa de control de calificaciones*****");

/* Impresión del menú */
printf("\n\n\tSeleccione el grupo a evaluar");
printf("\n\t1. Grupo A\n\t2. Grupo B\n\t3. Salir");
printf("\n\tGrupo seleccionado: ");

/* Instrucción que lee na variable de tipo carácter */
scanf("%d",opc);

switch(opc)
{
case 1:
printf("\n\tIngresa el numero de alumnos a calificar: ");
scanf("%d",&totalAlum);

/* Declaramos la estructura del grupo a */
struct grupo a[totalAlum];

/* Estructura repetitiva para obtener el nombre y calificaciones del alumno */
for(n=0, a[n].prom1=0; n<totalAlum; n++)
{
printf("\n\n\tIngresa el nombre del alumno: ");
scanf("%s",&a[n].nomAlum);
printf("\n\tIngresa las calificaciones de Lenguaje, Matematicas y Ciencias: ");
scanf("%f,%f,%f",&a[n].calfLen,&a[n].calfMat,&a[n].calfCie);

/* Calculamos el promedio del alumno */
a[n].prom1=(a[n].calfLen+a[n].calfMat+a[n].calfCie)/3;
printf("\n\tEl promedio de %s es: %.2f\n",a[n].nomAlum,a[n].prom1);

/* Determinamos mediante una estructura selectiva cual es el mayor promedio */
if(a[n].prom1>prom2)
{
prom2=a[n].prom1;
mejorAlum[15]=a[n].nomAlum[15];
}

}

/* Mostramos en pantalla el mejor promedio del grupo */
printf("\n\tEl mejor promedio del grupo %c es: %s con %.2f\n",opc,mejorAlum[15],prom2);
system("pause");
break;

case 2:
printf("\n\tIngresa el numero de alumnos a calificar: ");
scanf("%d",&totalAlum);

/* Declaramos la estructura del grupo a */
struct grupo b[totalAlum];

/* Estructura repetitiva para obtener el nombre y calificaciones del alumno */
for(n=0, b[n].prom1=0; n<totalAlum; n++)
{
printf("\n\n\tIngresa el nombre del alumno: ");
scanf("%s",&b[n].nomAlum);
printf("\n\tIngresa las calificaciones de Lenguaje, Matematicas y Ciencias: ");
scanf("%f,%f,%f",&b[n].calfLen,&b[n].calfMat,&b[n].calfCie);

/* Calculamos el promedio del alumno */
b[n].prom1=(b[n].calfLen+b[n].calfMat+b[n].calfCie)/3;
printf("\n\tEl promedio de %s es: %.2f\n",b[n].nomAlum,b[n].prom1);

/* Determinamos mediante una estructura selectiva cual es el mayor promedio */
if(b[n].prom1>prom2)
{
prom2=b[n].prom1;
mejorAlum[15]=b[n].nomAlum[15];
}

}

/* Mostramos en pantalla el mejor promedio del grupo */
printf("\n\tEl mejor promedio del grupo %c es: %s con %.2f\n",opc,b[n].nomAlum,prom2);
system("pause");
break;

case 3:
printf("\n\n\tAdios.\n\n");
system("pause");
break;

default:
printf("\n\nOpcion invalida\n\n");
system("pause");
}

}while (opc!=3);
}

crack81

Hola no he revisado todo tu codigo pero estas lineas estan mal


struct grupo a[totalAlum];

struct grupo b[totalAlum];

No puedes crear arreglos dinamicos de esta manera, tienes dos opciones o especificarle un valor en tiempo de compilacion ejemplo:

struct grupo b[10];


La otra opcion es usar punteros y la funcion malloc para reservar memoria en el heap y poder crear tu arreglo dinamico, el cual puede varia su tamaño en tiempo de ejecucion.

Ejemplo:

struct grupo *b=malloc(totalAlum*sizeof(struct grupo));

Recordando de liberar la  memoria del arreglo usando la funcion free:

free(b);

Si tienes dudas avisas.
Salutos....



Si C/C++ es el padre de los lenguajes entonces ASM es dios.

imoralesh

Te agradezco crack, efectivamente tuve que declarar el tamaño del arreglo antes de...
muchas gracias por la ayuda...
un abrazo!