• Sábado 14 de Diciembre de 2024, 14:44

Autor Tema:  como hacer que este acumulador funcione  (Leído 3968 veces)

luchojimenez

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
como hacer que este acumulador funcione
« en: Martes 6 de Julio de 2010, 05:38 »
0
hay  un acumlador en la  funcion ingresar, que  he ppuesto apunto me  gustaria que me  explicaran donde  este  el error, por  que este acumulador  me guarda, datos erroneos, se  que tiene  que  ver  con el do/while, pero si le cambio a for entoces  las  entradads  de cadenas correspondiente al nombre no me funcionan,



Código: C++
  1.  
  2.  
  3. #include<iostream>
  4. #include<conio2.h>
  5. #include<cstdio>
  6. #include<string.h>
  7.  
  8. using namespace std;
  9. void ingresar();
  10. void portada();
  11. void rectangulo();
  12.  
  13. int h=0,n=0,j;
  14. struct empleado{
  15. char nombre[100];
  16. int up[30];
  17. }p[3];
  18.  
  19. int main()
  20. {
  21. int l=1;
  22. portada();
  23. rectangulo();
  24. do
  25. {
  26. l++;
  27.  
  28. ingresar();
  29. }while(l<=3);
  30. system("cls");
  31. gotoxy(17,2);cout<<"ESTADISTICAS GLOBALES"<<endl;
  32.  
  33. cout<<"total producido por todo los empleadosn"<<h<<"nn";
  34. system("pause");
  35. return 0;
  36. }
  37.  
  38. void ingresar()
  39. {
  40. system("cls");
  41. int i=0,k,j=0;
  42.  
  43.  
  44. system("color 70");
  45. gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;
  46. gotoxy(5,9);cout<<"Ingrese Su Nombre: ";
  47. do
  48. {
  49. j++;
  50. fgets(p[j].nombre,100,stdin);
  51. p[j].nombre[strlen(p[j].nombre)-1]='';
  52. fflush(stdin);
  53. while(i<4)
  54. {
  55. i++;
  56. cout<<"ningrese las unidades producidas/dias"<<endl;
  57. cin>>p[j].up[i];
  58. n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza
  59. }
  60.  
  61. system("cls");
  62.  
  63. k=n/4;
  64. h=h+n;
  65.  
  66. gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;
  67.  
  68. gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;
  69. gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;
  70.  
  71. }while(j<3);
  72.  
  73. gotoxy(17,15);system("pause");
  74.  
  75. }
  76.  
  77. void portada()
  78. {
  79.      system("color 0a");
  80.      gotoxy(17,2);cout<<"PROGRAMA ACTIVIDAD 1 UNIDAD 2"<<endl;
  81.      gotoxy(17,3);cout<<"CURSO C++ NIVEL 2"<<endl;
  82.      gotoxy(17,4);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;
  83.      gotoxy(17,8);cout<<"La fabrica de carton Ciudad de Paris desea obtener"<<endl;
  84.      gotoxy(17,9);cout<<"la informacion de sus n empleados del departamento"<<endl;
  85.      gotoxy(17,10);cout<<"de produccion para poder determinar al empleado mas"<<endl;
  86.      gotoxy(17,11);cout<<"sobresaliente del mes y darle un bono de productividad de $3000,"<<endl;
  87.      gotoxy(17,12);cout<<"Desarrollar un programa en C++ que lea el nombre del empleado y"<<endl;
  88.      gotoxy(17,13);cout<<"las unidades producidas durante el mes y calcular el promedio"<<endl;
  89.      gotoxy(17,14);cout<<"de produccion, total de dias arriba del promedio,"<<endl;
  90.      gotoxy(17,15);cout<<"cantidad producida mas alta y el dia mas productivo."<<endl;
  91.      gotoxy(17,16);cout<<"Mostrar en pantalla el nombre del empleado,"<<endl;
  92.      gotoxy(17,17);cout<<"la produccion por dia, el promedio de produccion,"<<endl;
  93.      gotoxy(17,18);cout<<"el total de días arriba del promedio,"<<endl;
  94.      gotoxy(17,19);cout<<"la cantidad producida mas alta y el dia mas productivo.nn"<<endl;
  95.      gotoxy(17,25);system("pause");
  96. }
  97. void rectangulo()
  98. {  
  99.     system("cls");
  100.     system("color 75");
  101.     int height, width, tmp, tmp2;
  102.      height=19;
  103.        
  104.      width=14;
  105.          
  106.      
  107.                                              
  108.       gotoxy(2,2);for(tmp=0; tmp!=(width+1); tmp++)cout << "***";          
  109.       gotoxy(0,2);for(tmp=0; tmp!=(height); tmp++) {cout << "nx*a";    
  110.       gotoxy(0,1);for(tmp2=0; tmp2!=(height+1); tmp2++) cout << "  ";    
  111.             cout << "x*a";}                                  
  112.       cout << "n|";                                      
  113.       for(tmp=0; tmp!=(width-5); tmp++) cout << "*l*u*";          
  114.      gotoxy(15,6);cout<<"FABRICA DE CARTON"<<endl;
  115.      gotoxy(18,7);cout<<"CIUDAD PARIS"<<endl;
  116.      gotoxy(19,9);cout<<"Powered by"<<endl;
  117.      gotoxy(12,15);cout<<"LUIS ALFONSO JIMENEZ MEJIA"<<endl;                                  
  118.      
  119.       cout << "nn";
  120.       gotoxy(17,26);system("PAUSE");
  121.      
  122. }
  123.  
  124.  
  125.  
  126.  

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: como hacer que este acumulador funcione
« Respuesta #1 en: Martes 6 de Julio de 2010, 20:09 »
0
La verdad no se cual sea el resultado a que quieras llegar, pero revisando el codigo, supongo que quieres el promedio de produccion por dia para cada empleado, en ese caso tu error me parece que estaria en la inicializacion a cero de los contadores/acumuladores, ya que no lo estas haciendo dentro del ciclo uno como deberia ser, sino afuera del ciclo uno, entonces cada vez que el ciclo uno regresa a preguntar los datos del siguiente empleado, tus contadores/acumuladores contienen los datos del empleado anterior, dandote entonces un resultado incorrecto.

La solucion entonces seria colocar la inicializacion a cero de esos contadores/acumuladores (no de todos, solo los que se encargan de los datos de cada empleado) dentro del ciclo uno.

Puesto en codigo, seria:

Código: C++
  1.  
  2.     do
  3.     {
  4.         j++;
  5.         fgets(p[j].nombre,100,stdin);
  6.         p[j].nombre[strlen(p[j].nombre)-1]='';
  7.         fflush(stdin);
  8.         // Estos son los contadores/acumuladores que deben de inicializarse
  9.         // en cada vuelta del ciclo uno para que no te acarreen los datos
  10.         // del ciclo anterior
  11.         i=0; n=0;
  12.         while(i<4)
  13.         {
  14.             i++;
  15.             cout<<"ningrese las unidades producidas/dias"<<endl;
  16.             cin>>p[j].up[i];
  17.             n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza
  18.         }
  19.  
  20.         system("cls");
  21.  
  22.         k=n/4;
  23.         h=h+n;
  24.  
  25.         gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;
  26.  
  27.         gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;
  28.         gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;
  29.  
  30.     }while(j<3);
  31.  
  32.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

luchojimenez

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: como hacer que este acumulador funcione
« Respuesta #2 en: Martes 6 de Julio de 2010, 21:59 »
0
entonces hermano al hacer el cambio que  ud me sugiere entonces las variable  de entrada  de la cadena apartir  de la segunda
iteracion no me deja  ingresar el nombre
Código: C++
  1.  
  2. #include<iostream>
  3. #include<conio2.h>
  4. #include<cstdio>
  5. #include<string.h>
  6.  
  7. using namespace std;
  8. void ingresar();
  9. void portada();
  10. void rectangulo();
  11.  
  12.  
  13. int h=0,j;
  14. struct empleado{
  15. char nombre[100];
  16. int up[30];
  17. }p[3];
  18.  
  19. int main()
  20. {
  21. int l=1;
  22. portada();
  23. rectangulo();
  24. do
  25. {
  26. l++;
  27.  
  28. ingresar();
  29. }while(l<=3);
  30. system("cls");
  31. gotoxy(17,2);cout<<"ESTADISTICAS GLOBALES"<<endl;
  32.  
  33. cout<<"total producido por todo los empleadosn"<<h<<"nn";
  34. system("pause");
  35. return 0;
  36. }
  37.  
  38. void ingresar()
  39. {
  40. system("cls");
  41. int k,j,n=0,i;
  42.  
  43.  
  44. system("color 70");
  45. gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;
  46. gotoxy(5,9);cout<<"Ingrese Su Nombre: ";
  47. for(j=1;j<3;j++)
  48. {
  49. j++;
  50. fgets(p[j].nombre,100,stdin);//entoces  no aprece esta variable  apartir de la segunda iteracion
  51. p[j].nombre[strlen(p[j].nombre)-1]='';
  52. fflush(stdin);
  53.  
  54.    
  55.  for(i=0;i<3;i++)
  56. {
  57. cout<<"nn   Ingrese las unidades producidas/dias"<<endl;
  58. cin>>p[j].up[i];
  59. n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza
  60. }
  61. k=n/3;
  62. h=h+n;
  63.  
  64.  
  65. system("cls");
  66. gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;
  67.  
  68. gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;
  69. gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;
  70.  
  71.  
  72.  
  73. gotoxy(17,15);system("pause");
  74. }
  75. }
  76.  
  77. void portada()
  78. {
  79.      system("color 0a");
  80.      gotoxy(17,2);cout<<"PROGRAMA ACTIVIDAD 1 UNIDAD 2"<<endl;
  81.      gotoxy(17,3);cout<<"CURSO C++ NIVEL 2"<<endl;
  82.      gotoxy(17,4);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;
  83.      gotoxy(17,8);cout<<"La fabrica de carton Ciudad de Paris desea obtener"<<endl;
  84.      gotoxy(17,9);cout<<"la informacion de sus n empleados del departamento"<<endl;
  85.      gotoxy(17,10);cout<<"de produccion para poder determinar al empleado mas"<<endl;
  86.      gotoxy(17,11);cout<<"sobresaliente del mes y darle un bono de productividad de $3000,"<<endl;
  87.      gotoxy(17,12);cout<<"Desarrollar un programa en C++ que lea el nombre del empleado y"<<endl;
  88.      gotoxy(17,13);cout<<"las unidades producidas durante el mes y calcular el promedio"<<endl;
  89.      gotoxy(17,14);cout<<"de produccion, total de dias arriba del promedio,"<<endl;
  90.      gotoxy(17,15);cout<<"cantidad producida mas alta y el dia mas productivo."<<endl;
  91.      gotoxy(17,16);cout<<"Mostrar en pantalla el nombre del empleado,"<<endl;
  92.      gotoxy(17,17);cout<<"la produccion por dia, el promedio de produccion,"<<endl;
  93.      gotoxy(17,18);cout<<"el total de días arriba del promedio,"<<endl;
  94.      gotoxy(17,19);cout<<"la cantidad producida mas alta y el dia mas productivo.nn"<<endl;
  95.      gotoxy(17,25);system("pause");
  96. }
  97. void rectangulo()
  98. {  
  99.     system("cls");
  100.     system("color 75");
  101.     int height, width, tmp, tmp2;
  102.      height=19;
  103.        
  104.      width=14;
  105.          
  106.      
  107.                                              
  108.       gotoxy(2,2);for(tmp=0; tmp!=(width+1); tmp++)cout << "***";          
  109.       gotoxy(0,2);for(tmp=0; tmp!=(height); tmp++) {cout << "nx*a";    
  110.       gotoxy(0,1);for(tmp2=0; tmp2!=(height+1); tmp2++) cout << "  ";    
  111.             cout << "x*a";}                                  
  112.       cout << "n|";                                      
  113.       for(tmp=0; tmp!=(width-5); tmp++) cout << "*l*u*";          
  114.      gotoxy(15,6);cout<<"FABRICA DE CARTON"<<endl;
  115.      gotoxy(18,7);cout<<"CIUDAD PARIS"<<endl;
  116.      gotoxy(19,9);cout<<"Powered by"<<endl;
  117.      gotoxy(12,15);cout<<"LUIS ALFONSO JIMENEZ MEJIA"<<endl;                                  
  118.      
  119.       cout << "nn";
  120.       gotoxy(17,26);system("PAUSE");
  121.      
  122. }
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: como hacer que este acumulador funcione
« Respuesta #3 en: Miércoles 7 de Julio de 2010, 20:15 »
0
Aclararemos algo, el problema que tienes con la lectura de variables no esta en que ciclo utilizas, ya que lo cambiaste de nuevo de while a for, puedes usar el que quieras (for, while o do..while), el problema en realidad esta en el buffer, que debido al pause que utilizas se "ensucia" y entonces se queda con un caracter guardado, por eso al regresar al inicio del ciclo fgets() lee ese caracter y no te deja capturar el siguiente nombre.

Bueno, a continuacion te dejo te nuevo la funcion ingresar() corregida de algunos errores que volviste a cometer de nuevo con comentarios para que sepas exactamente en que cosa estabas equivocado.

Código: C++
  1.  
  2. void ingresar()
  3. {
  4.     system("cls");
  5.     int k,j,n=0,i;
  6.  
  7.  
  8.     system("color 70");
  9.     gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;
  10.  
  11.     // los vectores comienzan en cero, no en uno
  12.     for(j=0;j<3;j++)
  13.     {
  14.         // Porque incrementas j, si estas usando for para incrementar
  15.         //j++;
  16.         gotoxy(5,9);cout<<"Ingrese Su Nombre: ";
  17.         fgets(p[j].nombre, 100,stdin);//entoces no aprece esta variable apartir de la segunda iteracion
  18.         // Si estas utilizando C++, recomiendo mejor la funcion getline en lugar
  19.         // de fgets para que no revuelvas C con C++, la siguiente linea te muestra
  20.         // como usarla
  21.         //cin.getline(p[j].nombre, 100);
  22.  
  23.         // De nuevo omites la inicializacion a cero del acumulador, si no lo haces
  24.         // arrastrara valores del empleado anterior, dando un promedio incorrecto
  25.         n = 0;
  26.         for(i=0;i<3;i++)
  27.         {
  28.             cout<<"nn Ingrese las unidades producidas/dias"<<endl;
  29.             cin>>p[j].up[i];
  30.             n = n + p[j].up[i];//este acumulador me ha dado dolores de cabeza
  31.         }
  32.         k=n/3;
  33.         h=h+n;
  34.  
  35.         system("cls");
  36.         gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;
  37.  
  38.         gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;
  39.         gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;
  40.  
  41.         // Esta linea es el verdadero problema, no el ciclo, ya que deja caracteres
  42.         // en el buffer, lo que debes hacer es limpiar buffer despues de utilizarla
  43.         gotoxy(17,15);system("pause");
  44.         // Limpia el buffer de entrada despues de usar pause
  45.         while(getchar() != 'n');
  46.     }
  47. }
  48.  
  49.  
  50.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================