Título: Error en codigo Ayuda!!!
Publicado por: arkangel2006 en 8 Marzo 2015, 07:22 am
Hola a me dejaron un trabajo de la escuela crear un programa en dev c++ y pues ya hice todo solo que tengo un pequeño problema tengo unos errores que no logro detectar.. les dejo el codigo y espero y puedan corregirmelo que ya me canse de investigar y por eso recurro a ustedes: #include<stdio.h> #include<iostream.h> void lectura_datos(float*apun_trabajadores[10]); void imprimir_datos(float*apun_trabajadores[10]); void calcular_salarioTotal(float*apun_trabajadores[10]); main() { float*apun_trabajadores[10]; int opc; do { printf("*******MENU*******\n"); printf("1.-LECTURA DE CLAVE Y SALARIO \n"); printf("2.-APLICAR DESCUENTOS \n"); printf("3.-IMPRIMIR TABLA \n"); printf("4.-SALIR DEL PROGRAMA \n"); printf("SELECCIONE LA OPCION DESEADA \n"); scanf("%d",&opc); switch(opc) { case 1: { lectura_datos(*apun_trabajadores[10]); break; } case 2: { calcular_salarioTotal(float*apun_trabajadores[10]); break; } case 3: { imprimir_datos(float*apun_trabajadores[10]); break; } } } while(opc!=4); } void lectura_datos(float*apun_trabajadores[10]) { int fila,columna;
for(fila=0;fila<10;fila++) apun_trabajadores[fila]=(float*)malloc(6*sizeof(float)); for(fila=0;fila<10;fila++) { printf("CLAVE DEL TRABAJADOR %d= ", fila); scanf("%f,(apun_trabajadores[fila]+0)); printf("SALARIO DEL TRABAJADOR %d= ", fila); scanf("%f",(apun_trabajadores[fila]+1)); } } void imprimir_datos(float*apun_trabajadores[10]) { int fila,columna; printf("LOS ELEMENTOS DEL ARREGLO SON \n"); printf("CLAVE\tSAL_B\tIMSS\tINAS\tHRS EXT\tTOTAL\t"); for(fila=0;fila<10;fila++) { printf("\n"); for (columna=0;columna<6;columna++) { printf("%.2f\t",*(apun_trabajadores[fila]+columna));
} } printf("\n"); } void calcular_salarioTotal(float*apun_trabajadores[10]) { int fila; float s_neto,descuento_inasistencia,bono_horaextra; for(fila=0;fila<10;fila++) { printf("DESCUENTO IMSS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+2)); printf("NUMERO DE FALTAS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+3)); printf("HORAS EXTRAS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+4));
printf("%.2f ",*(apun_trabajadores[fila]+1)); descuento_inasistencia=*(apun_trabajadores[fila]+1)/7* *(apun_trabajadores[fila]+3); bono_horaextra=(*(apun_trabajadores[fila]+1)/7)/4* *(apun_trabajadores[fila]+4); s_neto=*(apun_trabajadores[fila]+1)-*(apun_trabajadores[fila]+2)- descuento_inasistencia+bono_horaextra; *(apun_trabajadores[fila]+5)=s_neto; } }
y ademas tengo dos dudas preguntas que necesito que me despejen con claridad porfa.. ya que quiero queme quede bien claro todo :D ¿Por qué el arreglo bidimensional es declarado con un solo índice (solo se especifican las filas y no las columnas)? float *apun_trabajadores[10]; ¿Por qué se debe reservar espacio para las columnas? for(fila=0; fila<10; fila++) apun_trabajadores[fila]=(float*) malloc(6*sizeof(float));
Título: Re: Error en codigo Ayuda!!!
Publicado por: arkangel2006 en 8 Marzo 2015, 09:51 am
Me respondo a mi mismo ya arregle los errores, compila el programa pero sigo necesitando de su ayuda, ahora compila y ejecuta pero cuando tecleo la Opcion 1 y preciono ENTER simplemente regresa al menu y asi con las otras Opciones Este es el codigo corregido y "funcional" aun que con un problemita.... #include<stdio.h> #include<iostream> void lectura_datos(float*apun_trabajadores[10]); void imprimir_datos(float*apun_trabajadores[10]); void calcular_salarioTotal(float*apun_trabajadores[10]); main() { float*apun_trabajadores[10]; int opc; do { printf("*******MENU*******\n"); printf("1.-LECTURA DE CLAVE Y SALARIO \n"); printf("2.-APLICAR DESCUENTOS \n"); printf("3.-IMPRIMIR TABLA \n"); printf("4.-SALIR DEL PROGRAMA \n"); printf("SELECCIONE LA OPCION DESEADA \n"); scanf("%d",&opc); switch(opc) { case 1: { void lectura_datos(float*apun_trabajadores[10]); break; } case 2: { void calcular_salarioTotal(float*apun_trabajadores[10]); break; } case 3: { void imprimir_datos(float*apun_trabajadores[10]); break; } } } while(opc!=4); } void lectura_datos(float*apun_trabajadores[10]) { int fila, columna;
for(fila=0;fila<10;fila++) apun_trabajadores[fila]=(float*)malloc(6*sizeof(float)); for(fila=0;fila<10;fila++) { printf("CLAVE DEL TRABAJADOR %d= ", fila); scanf("%f",(apun_trabajadores[fila]+0)); printf("SALARIO DEL TRABAJADOR %d= ", fila); scanf("%f",(apun_trabajadores[fila]+1)); } } void imprimir_datos(float*apun_trabajadores[10]) { int fila,columna; printf("LOS ELEMENTOS DEL ARREGLO SON \n"); printf("CLAVE\tSAL_B\tIMSS\tINAS\tHRS EXT\tTOTAL\t"); for(fila=0;fila<10;fila++) { printf("\n"); for (columna=0;columna<6;columna++) { printf("%.2f\t",*(apun_trabajadores[fila]+columna));
} } printf("\n"); } void calcular_salarioTotal(float*apun_trabajadores[10]) { int fila; float s_neto,descuento_inasistencia,bono_horaextra; for(fila=0;fila<10;fila++) { printf("DESCUENTO IMSS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+2)); printf("NUMERO DE FALTAS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+3)); printf("HORAS EXTRAS %d= ",fila); scanf("%f",(apun_trabajadores[fila]+4));
printf("%.2f ",*(apun_trabajadores[fila]+1)); descuento_inasistencia=*(apun_trabajadores[fila]+1)/7* *(apun_trabajadores[fila]+3); bono_horaextra=(*(apun_trabajadores[fila]+1)/7)/4* *(apun_trabajadores[fila]+4); s_neto=*(apun_trabajadores[fila]+1)-*(apun_trabajadores[fila]+2)- descuento_inasistencia+bono_horaextra; *(apun_trabajadores[fila]+5)=s_neto; } }
y necesito que me aclaren estas dos preguntas dudas: ¿Por qué el arreglo bidimensional es declarado con un solo índice (solo se especifican las filas y no las columnas)? float *apun_trabajadores[10]; ¿Por qué se debe reservar espacio para las columnas? (malloc) for(fila=0; fila<10; fila++) apun_trabajadores[fila]=(float*) malloc(6*sizeof(float));
Título: Re: Error en codigo Ayuda!!!
Publicado por: rir3760 en 10 Marzo 2015, 04:02 am
ahora compila y ejecuta pero cuando tecleo la Opcion 1 y preciono ENTER simplemente regresa al menu y asi con las otras Opciones Eso sucede porque en la sentencia condicional switch: switch (opc) { case 1: { void lectura_datos(float *apun_trabajadores[10]); break; } case 2: { void calcular_salarioTotal(float *apun_trabajadores[10]); break; } case 3: { void imprimir_datos(float *apun_trabajadores[10]); break; } }
Lo que estas haciendo es declarar las funciones. Para llamar a (ejecutar, invocar) una función debes indicar el nombre de esta seguido de sus argumentos (delimitados por paréntesis), de esta forma: switch (opc){ case 1: lectura_datos(apun_trabajadores); break; case 2: calcular_salarioTotal(apun_trabajadores); break; case 3: imprimir_datos(apun_trabajadores); break; }
¿Por qué el arreglo bidimensional es declarado con un solo índice (solo se especifican las filas y no las columnas)? float *apun_trabajadores[10];
¿Por qué se debe reservar espacio para las columnas? (malloc) for(fila=0; fila<10; fila++) apun_trabajadores[fila]=(float*) malloc(6*sizeof(float)); Porque "apun_trabajadores" es un array de punteros, esto es, no almacena los valores directamente, en su lugar almacena las direcciones de las filas cada una con un tamaño fijo de seis elementos (las columnas) de tipo float. Por eso primero reservas la memoria necesaria para cada fila guardando esta (la dirección) en el array. En tu caso se puede utilizar un array de arrays (por ejemplo "float trab[10][6]") sin problemas, el porque se utiliza en su lugar un array de punteros mas reserva dinámica de memoria vía malloc se debe, supongo, al enunciado. Un saludo
|