Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: arkangel2006 en 8 Marzo 2015, 07:22 am



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:

Código:

#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....

Código:

#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:
Código
  1. switch (opc)
  2. {
  3. case 1:
  4. {
  5.   void lectura_datos(float *apun_trabajadores[10]);
  6.   break;
  7. }
  8. case 2:
  9. {
  10.   void calcular_salarioTotal(float *apun_trabajadores[10]);
  11.   break;
  12. }
  13. case 3:
  14. {
  15.   void imprimir_datos(float *apun_trabajadores[10]);
  16.   break;
  17. }
  18. }
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:
Código
  1. switch (opc){
  2. case 1:
  3.   lectura_datos(apun_trabajadores);
  4.   break;
  5. case 2:
  6.   calcular_salarioTotal(apun_trabajadores);
  7.   break;
  8. case 3:
  9.   imprimir_datos(apun_trabajadores);
  10.   break;
  11. }

¿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