Programación General > C/C++

 como hacer que este acumulador funcione

(1/1)

luchojimenez:
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++ ---  #include<iostream>#include<conio2.h>#include<cstdio>#include<string.h> using namespace std;void ingresar();void portada();void rectangulo(); int h=0,n=0,j;struct empleado{char nombre[100];int up[30];}p[3]; int main(){int l=1;portada();rectangulo();do{l++; ingresar();}while(l<=3);system("cls");gotoxy(17,2);cout<<"ESTADISTICAS GLOBALES"<<endl; cout<<"total producido por todo los empleadosn"<<h<<"nn";system("pause");return 0;} void ingresar(){system("cls");int i=0,k,j=0;  system("color 70");gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;gotoxy(5,9);cout<<"Ingrese Su Nombre: ";do{j++;fgets(p[j].nombre,100,stdin);p[j].nombre[strlen(p[j].nombre)-1]='';fflush(stdin);while(i<4){i++;cout<<"ningrese las unidades producidas/dias"<<endl;cin>>p[j].up[i];n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza} system("cls"); k=n/4;h=h+n; gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl; gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl; }while(j<3); gotoxy(17,15);system("pause"); } void portada(){     system("color 0a");     gotoxy(17,2);cout<<"PROGRAMA ACTIVIDAD 1 UNIDAD 2"<<endl;     gotoxy(17,3);cout<<"CURSO C++ NIVEL 2"<<endl;     gotoxy(17,4);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;     gotoxy(17,8);cout<<"La fabrica de carton Ciudad de Paris desea obtener"<<endl;     gotoxy(17,9);cout<<"la informacion de sus n empleados del departamento"<<endl;     gotoxy(17,10);cout<<"de produccion para poder determinar al empleado mas"<<endl;     gotoxy(17,11);cout<<"sobresaliente del mes y darle un bono de productividad de $3000,"<<endl;     gotoxy(17,12);cout<<"Desarrollar un programa en C++ que lea el nombre del empleado y"<<endl;     gotoxy(17,13);cout<<"las unidades producidas durante el mes y calcular el promedio"<<endl;     gotoxy(17,14);cout<<"de produccion, total de dias arriba del promedio,"<<endl;     gotoxy(17,15);cout<<"cantidad producida mas alta y el dia mas productivo."<<endl;     gotoxy(17,16);cout<<"Mostrar en pantalla el nombre del empleado,"<<endl;     gotoxy(17,17);cout<<"la produccion por dia, el promedio de produccion,"<<endl;     gotoxy(17,18);cout<<"el total de días arriba del promedio,"<<endl;     gotoxy(17,19);cout<<"la cantidad producida mas alta y el dia mas productivo.nn"<<endl;     gotoxy(17,25);system("pause");}void rectangulo(){       system("cls");    system("color 75");    int height, width, tmp, tmp2;     height=19;            width=14;                                                                  gotoxy(2,2);for(tmp=0; tmp!=(width+1); tmp++)cout << "***";                gotoxy(0,2);for(tmp=0; tmp!=(height); tmp++) {cout << "nx*a";           gotoxy(0,1);for(tmp2=0; tmp2!=(height+1); tmp2++) cout << "  ";                cout << "x*a";}                                        cout << "n|";                                             for(tmp=0; tmp!=(width-5); tmp++) cout << "*l*u*";               gotoxy(15,6);cout<<"FABRICA DE CARTON"<<endl;     gotoxy(18,7);cout<<"CIUDAD PARIS"<<endl;      gotoxy(19,9);cout<<"Powered by"<<endl;     gotoxy(12,15);cout<<"LUIS ALFONSO JIMENEZ MEJIA"<<endl;                                               cout << "nn";       gotoxy(17,26);system("PAUSE");      }    

ProfesorX:
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++ ---     do    {        j++;        fgets(p[j].nombre,100,stdin);        p[j].nombre[strlen(p[j].nombre)-1]='';        fflush(stdin);        // Estos son los contadores/acumuladores que deben de inicializarse        // en cada vuelta del ciclo uno para que no te acarreen los datos        // del ciclo anterior        i=0; n=0;        while(i<4)        {            i++;            cout<<"ningrese las unidades producidas/dias"<<endl;            cin>>p[j].up[i];            n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza        }         system("cls");         k=n/4;        h=h+n;         gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;         gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;        gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;     }while(j<3);  
Saludos :)

luchojimenez:
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++ --- #include<iostream>#include<conio2.h>#include<cstdio>#include<string.h> using namespace std;void ingresar();void portada();void rectangulo();  int h=0,j;struct empleado{char nombre[100];int up[30];}p[3]; int main(){int l=1;portada();rectangulo();do{l++; ingresar();}while(l<=3);system("cls");gotoxy(17,2);cout<<"ESTADISTICAS GLOBALES"<<endl; cout<<"total producido por todo los empleadosn"<<h<<"nn";system("pause");return 0;} void ingresar(){system("cls");int k,j,n=0,i;  system("color 70");gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;gotoxy(5,9);cout<<"Ingrese Su Nombre: ";for(j=1;j<3;j++){j++;fgets(p[j].nombre,100,stdin);//entoces  no aprece esta variable  apartir de la segunda iteracionp[j].nombre[strlen(p[j].nombre)-1]='';fflush(stdin);     for(i=0;i<3;i++){cout<<"nn   Ingrese las unidades producidas/dias"<<endl;cin>>p[j].up[i];n=n + p[j].up[i];//este  acumulador me  ha dado dolores de cabeza}k=n/3;h=h+n;  system("cls");gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl; gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;   gotoxy(17,15);system("pause");}} void portada(){     system("color 0a");     gotoxy(17,2);cout<<"PROGRAMA ACTIVIDAD 1 UNIDAD 2"<<endl;     gotoxy(17,3);cout<<"CURSO C++ NIVEL 2"<<endl;     gotoxy(17,4);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;     gotoxy(17,8);cout<<"La fabrica de carton Ciudad de Paris desea obtener"<<endl;     gotoxy(17,9);cout<<"la informacion de sus n empleados del departamento"<<endl;     gotoxy(17,10);cout<<"de produccion para poder determinar al empleado mas"<<endl;     gotoxy(17,11);cout<<"sobresaliente del mes y darle un bono de productividad de $3000,"<<endl;     gotoxy(17,12);cout<<"Desarrollar un programa en C++ que lea el nombre del empleado y"<<endl;     gotoxy(17,13);cout<<"las unidades producidas durante el mes y calcular el promedio"<<endl;     gotoxy(17,14);cout<<"de produccion, total de dias arriba del promedio,"<<endl;     gotoxy(17,15);cout<<"cantidad producida mas alta y el dia mas productivo."<<endl;     gotoxy(17,16);cout<<"Mostrar en pantalla el nombre del empleado,"<<endl;     gotoxy(17,17);cout<<"la produccion por dia, el promedio de produccion,"<<endl;     gotoxy(17,18);cout<<"el total de días arriba del promedio,"<<endl;     gotoxy(17,19);cout<<"la cantidad producida mas alta y el dia mas productivo.nn"<<endl;     gotoxy(17,25);system("pause");}void rectangulo(){       system("cls");    system("color 75");    int height, width, tmp, tmp2;     height=19;            width=14;                                                                  gotoxy(2,2);for(tmp=0; tmp!=(width+1); tmp++)cout << "***";                gotoxy(0,2);for(tmp=0; tmp!=(height); tmp++) {cout << "nx*a";           gotoxy(0,1);for(tmp2=0; tmp2!=(height+1); tmp2++) cout << "  ";                cout << "x*a";}                                        cout << "n|";                                             for(tmp=0; tmp!=(width-5); tmp++) cout << "*l*u*";               gotoxy(15,6);cout<<"FABRICA DE CARTON"<<endl;     gotoxy(18,7);cout<<"CIUDAD PARIS"<<endl;      gotoxy(19,9);cout<<"Powered by"<<endl;     gotoxy(12,15);cout<<"LUIS ALFONSO JIMENEZ MEJIA"<<endl;                                               cout << "nn";       gotoxy(17,26);system("PAUSE");      }      

ProfesorX:
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++ --- void ingresar(){    system("cls");    int k,j,n=0,i;      system("color 70");    gotoxy(15,2);cout<<"POWERED BY LUIS ALFONSO JIMENEZ MEJIA"<<endl;     // los vectores comienzan en cero, no en uno    for(j=0;j<3;j++)    {        // Porque incrementas j, si estas usando for para incrementar        //j++;        gotoxy(5,9);cout<<"Ingrese Su Nombre: ";        fgets(p[j].nombre, 100,stdin);//entoces no aprece esta variable apartir de la segunda iteracion        // Si estas utilizando C++, recomiendo mejor la funcion getline en lugar        // de fgets para que no revuelvas C con C++, la siguiente linea te muestra        // como usarla        //cin.getline(p[j].nombre, 100);         // De nuevo omites la inicializacion a cero del acumulador, si no lo haces        // arrastrara valores del empleado anterior, dando un promedio incorrecto        n = 0;        for(i=0;i<3;i++)        {            cout<<"nn Ingrese las unidades producidas/dias"<<endl;            cin>>p[j].up[i];            n = n + p[j].up[i];//este acumulador me ha dado dolores de cabeza        }        k=n/3;        h=h+n;         system("cls");        gotoxy(17,2);cout<<"ESTADISTICAS DEL EMPLEADO: "<<p[j].nombre<<endl;         gotoxy(17,5);cout<<"Producion total mes : "<<n<<endl;        gotoxy(17,6);cout<<"Promedio produccion diaria: "<<k<<endl;         // Esta linea es el verdadero problema, no el ciclo, ya que deja caracteres        // en el buffer, lo que debes hacer es limpiar buffer despues de utilizarla        gotoxy(17,15);system("pause");        // Limpia el buffer de entrada despues de usar pause        while(getchar() != 'n');    }}   
Saludos :)

Navegación

[0] Índice de Mensajes

Ir a la versión completa