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
Ir a la versión completa