Ayuda con ejercicio novato

Iniciado por ascuasflame, 9 Enero 2018, 00:19 AM

0 Miembros y 1 Visitante están viendo este tema.

ascuasflame

Muy buenas,

El ejercicio en c++ es el siguiente:

1.Haz un programa que calcule el reparto del bote de un restaurante teniendo en cuenta que los repartidores obtienen un 30% de su parte del bote proporcionalmente a las horas trabajadas, mientras que los camareros obtienen de su parte el 100%. Desconocemos el numero de camareros y el de repartidores por ello se debe pedir al usuario cuantos hay de ellos. Claramente el bote se reparte de manera alícuota a las horas trabajadas, hay que pedirle al usuario cuantas horas trabaja cada empleado. Finalmente se debe mostrar el nombre del trabajador y lo que le corresponde de bote

Me está partiendo la cabeza y no sé cómo desarrollarlo.
Muchas gracias, espero vuestras respuestas, me ayudaría muchísimo.

ascuasflame

#1
Ya lo hice, el único problema es que no puedo establecer un numero infinito de camareros o repatidores porque despues es imposible guardarlos en un cin >>.

Aqui está:

[MOD] usar etiquetas GeSHi para publicar código.



Código (cpp) [Seleccionar]


#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int main()
{


/*
1.Haz un programa que calcule el reparto del bote de un restaurante teniendo en cuenta que los repartidores obtienen un 30% de su parte del bote proporcionalmente a las horas trabajadas,
mientras que los camareros obtienen de su parte el 100%. Desconocemos el numero de camareros y el de repartidores por ello se debe pedir al usuario cuantos hay de ellos. Claramente el bote
se reparte de manera alícuota a las horas trabajadas, hay que pedirle al usuario cuantas horas trabaja cada empleado. Finalmente se debe mostrar el nombre del trabajador y lo que le corresponde
de bote.
*/
int numcam, numrep, totalhoras;
float bote;
char a[50], b[50], c[50], d[50], e[50], f[50], g[50], h[50], i[50];
char z[50], x[50], w[50];
float zz, xx, ww ;
int aa, bb, cc, dd, ee, ff, gg, hh, ii ;
float recibeaa, recibebb, recibecc, recibedd, recibeee, recibeff, recibegg, recibehh, recibeii;
float dinerosinrestar1, dinerosinrestar2, dinerosinrestar3, newbote, loquetoca1,loquetoca2,loquetoca3, botefinal, horas;



cout << "Ingrese cantidad del bote: ", cin >> bote, cout << endl;
cout << "Ingrese numero de repartidores: ", cin >> numrep, cout << endl; //maximo 3
cout << "Ingrese numero de camareros: ", cin >> numcam, cout << endl; //maximo 9
cout << "Ingrese numero total de horas trabajadas: ", cin >> totalhoras, cout << endl;

//ahora vamos con los repartidores
switch (numrep){
case 1: cout << "Ingrese nombre del primer repartidor: ", cin >> z, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> zz, cout << endl;
break;
case 2:cout << "Ingrese nombre del primer repartidor: ", cin >> z, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> zz, cout << endl;
cout << "Ingrese nombre del segundo repartidor: ", cin >> x, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> xx, cout << endl;
break;
case 3:cout << "Ingrese nombre del primer repartidor: ", cin >> z, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> zz, cout << endl;
cout << "Ingrese nombre del segundo repartidor: ", cin >> x, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> xx, cout << endl;
cout << "Ingrese nombre del tercer repartidor: ", cin >> w, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ww, cout << endl;
break;
default: cout << "El máximo de repartidores es 3";
}

// camareros
switch (numcam){
case 1: cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl; break;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
break;
case 2:cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
break;
case 3:
cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
break;
case 4:cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
break;
case 5: cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
cout << "Ingrese nombre del quinto camarero: ", cin >> e, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ee, cout << endl;
break;
case 6: cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
cout << "Ingrese nombre del quinto camarero: ", cin >> e, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ee, cout << endl;
cout << "Ingrese nombre del sexto camarero: ", cin >> f, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ff, cout << endl;
break;
case 7:cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
cout << "Ingrese nombre del quinto camarero: ", cin >> e, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ee, cout << endl;
cout << "Ingrese nombre del sexto camarero: ", cin >> f, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ff, cout << endl;
cout << "Ingrese nombre del septimo camarero: ", cin >> g, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> gg, cout << endl;
break;
case 8:cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
cout << "Ingrese nombre del quinto camarero: ", cin >> e, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ee, cout << endl;
cout << "Ingrese nombre del sexto camarero: ", cin >> f, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ff, cout << endl;
cout << "Ingrese nombre del septimo camarero: ", cin >> g, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> gg, cout << endl;
cout << "Ingrese nombre del octavo camarero: ", cin >> h, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> hh, cout << endl;
break;
case 9:cout << "Ingrese nombre del primer camarero: ", cin >> a, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> aa, cout << endl;
cout << "Ingrese nombre del segundo camarero: ", cin >> b, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> bb, cout << endl;
cout << "Ingrese nombre del tercer camarero: ", cin >> c, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> cc, cout << endl;
cout << "Ingrese nombre del cuarto camarero: ", cin >> d, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> dd, cout << endl;
cout << "Ingrese nombre del quinto camarero: ", cin >> e, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ee, cout << endl;
cout << "Ingrese nombre del sexto camarero: ", cin >> f, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ff, cout << endl;
cout << "Ingrese nombre del septimo camarero: ", cin >> g, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> gg, cout << endl;
cout << "Ingrese nombre del octavo camarero: ", cin >> h, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> hh, cout << endl;
cout << "Ingrese nombre del noveno camarero: ", cin >> i, cout << endl;
cout << "Ingrese horas trabajadas:  ", cin >> ii, cout << endl;
break;
default: cout << "El número máximo es 9" << endl;
}
if (numrep == 1){
   loquetoca1 =  bote * 0.3;
   newbote = loquetoca1;
   botefinal = bote - newbote;
cout << z << " Recibe " << loquetoca1 << " €" << endl;
}
else if (numrep == 2){
loquetoca1 =  bote * 0.3;
loquetoca2 =  bote * 0.3;
newbote = loquetoca1 + loquetoca2;
botefinal = bote - newbote;
cout << z << " Recibe " << loquetoca1 << " €" << endl;
cout << x << " Recibe " << loquetoca2 << " €" << endl;
}
else if (numrep == 3){
loquetoca1 =  bote * 0.3;
loquetoca2 =  bote * 0.3;
loquetoca3 =  bote * 0.3;
newbote = loquetoca1 + loquetoca2 +loquetoca3;
botefinal = bote - newbote;
cout << z << " Recibe " << loquetoca1 << " €" << endl;
cout << x << " Recibe " << loquetoca2 << " €" << endl;
cout << w << " Recibe " << loquetoca3 << " €" << endl; }



if (numcam == 9){
    horas = aa + bb + cc + dd + ee + ff + gg + hh + ii;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
recibeee = (ee * botefinal) / horas;
recibeff = (ff * botefinal) / horas;
recibegg = (gg * botefinal) / horas;
recibehh = (hh * botefinal) / horas;
recibeii = (ii * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
cout << e << " Recibe " << recibeee << "€" << endl;
cout << f << " Recibe " << recibeff << "€" << endl;
cout << g << " Recibe " << recibegg << "€" << endl;
cout << h << " Recibe " << recibehh << "€" << endl;
cout << i << " Recibe " << recibeii << "€" << endl;
}
else if (numcam == 8){
    horas = aa + bb + cc + dd + ee + ff + gg + hh;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
recibeee = (ee * botefinal) / horas;
recibeff = (ff * botefinal) / horas;
recibegg = (gg * botefinal) / horas;
recibehh = (hh * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
cout << e << " Recibe " << recibeee << "€" << endl;
cout << f << " Recibe " << recibeff << "€" << endl;
cout << g << " Recibe " << recibegg << "€" << endl;
cout << h << " Recibe " << recibehh << "€" << endl;
}
else if (numcam == 7){
   horas = aa + bb + cc + dd + ee + ff + gg;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
recibeee = (ee * botefinal) / horas;
recibeff = (ff * botefinal) / horas;
recibegg = (gg * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
cout << e << " Recibe " << recibeee << "€" << endl;
cout << f << " Recibe " << recibeff << "€" << endl;
cout << g << " Recibe " << recibegg << "€" << endl;
}
else if (numcam == 6){
   horas = aa + bb + cc + dd + ee + ff;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
recibeee = (ee * botefinal) / horas;
recibeff = (ff * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
cout << e << " Recibe " << recibeee << "€" << endl;
cout << f << " Recibe " << recibeff << "€" << endl;
}
else if (numcam == 5){
   horas = aa + bb + cc + dd + ee;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
recibeee = (ee * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
cout << e << " Recibe " << recibeee << "€" << endl;
}
else if (numcam == 4){
      horas = aa + bb + cc + dd;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
recibedd = (dd * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
cout << d << " Recibe " << recibedd << "€" << endl;
}
else if (numcam == 3){
   horas = aa + bb + cc;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
recibecc = (cc * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
cout << c << " Recibe " << recibecc << "€" << endl;
}
else if (numcam == 2){
   horas = aa + bb;
recibeaa = (aa * botefinal) / horas;
recibebb = (bb * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
cout << b << " Recibe " << recibebb << "€" << endl;
}
else if (numcam == 1){
   horas = aa;
recibeaa = (aa * botefinal) / horas;
cout << a << " Recibe " << recibeaa << "€" << endl;
}

return 0;
}


MAFUS

Creo que te piden que hagas arrays dinámicos y estructuras. No creo, por el enunciado, que debas hacer decenas de variables diferentes.

dijsktra

#3
A ver, campeón, que te has liado mucho!
Piensa que no se trata de hacer una aplicación profesional, sino un sencillo algoritmo de cómputo de partes aliquotas con una pequeña variación según sea repartidor o camarero!

En mi solución el "nombre" del trabajador es un entero 1, 2... No aporta nada a la metáfora añadir identificadores de tipo string... si hubieras puesto algun caso de salida, lo habría hecho.

Ahí te va mi solución:

  • Si estás en un curso introductorio de programación, no hagas caso de los comentarios formales.
    Están ahí para controlar los valores del algoritmo. Pero eso es otro "subject".
  • Importante : He optado por soluciones enteras (int), no float... 100/30 (el inverso de 30/100) no es 3, sino un poco mas,  pero a este nivel de programación, los floats de C tampoco representan correctamente 100/30 . O sea que tambien es "impreciso" usar float. Eso hara que el redondeo de los pesos de los repartidores sea al alza (mira despues el ejemplo)
  • Basicamente, se distinguen repartidores de camareros por el identificador n<D y n>=D
#include <iostream>

using namespace std;


#define MAX 1000

/*
 P : T,W,D >= 0 ,
     \forall i : 0 <= i < (W+D) : HH[i]>= 0
     H = \sum i : 0 <= i < (W+D) : HH[i]
 Q : \forall i : 0 <= i < (W+D) : TT[i] = RATED_TIP(T,H,i,D)
     where
       RATED_TIP(T,H,i,D) ::= T*(HH[n]/H)*0.30^(i<D)));

 I : Q[(W+D)/n] and 0 <= n <= (W+D)
 O(n)
*/
void computeTip(const int T,const int H,
const int D, const int W,
               const int HH[], int TT[])
{
 for (int n=0; n<(W+D) ; n++)
   TT[n] = (T*HH[n])/(H*((n<D)?(100/30):1));
}
int main(int argc, char *args[])
{
 int T,D,W,H ;
 int HH[MAX];
 int TT[MAX];
 int n;
 cin >> T >> D >> W ; // Tip,Dispatchers,Waiters
 for (n=H=0; n < W+D ; n++)  { cin >> HH[n] ; H+=HH[n] ;}
 computeTip(T,H,D,W,HH,TT);
 for (n=0; n < W+D ; n++)  cout << n << " " << TT[n] << endl;  
}


Aqui van algunas muestras, siguiendo un protocolo de entrada, que es el que se suele seguir en os concursos de programación.

Primero, el bote a repartir , despues el numero de repartidores, despues el numero de camareros.
En el siguiente renglon, las horas de cada repartidor y en el siguiente renglón , las horas de cada camarero.


100 3 1
1 1 1
1


Resultado. Se han trabajado 4 horas. El camarero 1, al 100% de la parte aliquota (25), le da 25. Si los repartidores fueran al 100% también tendrían 25 cada uno, pero como van al 30%, se llevan 25*0.3=7.5 , que redodeado es 8.

0 8
1 8
2 8
3 25


Ahora los tres trabajadores trabajan cada 1 una hora y el camarero, nada...


18 3 1
1 1 1
0

El camarero, como no ha trabajado, no cobra. Si cada camarero estuviera al 100% de su parte aliquota
(6), cobraría 6, pero como esta al 30%, cobra 6*0.3=1.8, que redondeado queda dos...


0 2
1 2
2 2
3 0


Casos exactos. Sin redondeo. Ahora no hay camareros, solo 2 repartidores. Entonces no hay tercera linea de entrada

90 2 0
4 2


El segundo repartidor , si tuviese la parte aliqyita del bote cobraria 30. Cmo esta al 30% cobra 10. Logicamente el primer repartidor ha trabajado el doble, pues cobra el doble, 20.
0 20
1 10



Y ultimo caso!. Un  repartidor y dos camareros se erparten un bote de 100.

100 1 2
4
8 4



El prrimer camarero ha trabajado la mitad de las horas , al 100%, por lo que se queda 50. El segundo ha trabjado la mitad del primero, pues cobra la mitad, 25. El reartidor habria cobrado 25 también al 100%, pero como está al 30%, cobra 8... (redondeo de 7.5)

0 8
1 50
2 25


Ah! Se me olvidaba... Yo tampoco puedo recoger "infinitos" camareros con cin.. Pero hasta 1000, si podría...

Te pongo 30 repartidores y 30 camareros, con un bote de  15000... Pero te toca a ti, comprobar si está bien  ;D

15000 30 30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Es broma... Las anotaciones que pongo en la especificación comprueban que el algoritmo es correcto (salvo el error arrastrado por el redondeo)  para _cualquier_ valor de N...por grande que sea
0 5
1 10
2 16
3 21
4 26
5 32
6 37
7 43
8 48
9 53
10 59
11 64
12 69
13 75
14 80
15 86
16 91
17 96
18 102
19 107
20 112
21 118
22 123
23 129
24 134
25 139
26 145
27 150
28 155
29 161
30 483
31 467
32 451
33 435
34 419
35 403
36 387
37 370
38 354
39 338
40 322
41 306
42 290
43 274
44 258
45 241
46 225
47 209
48 193
49 177
50 161
51 145
52 129
53 112
54 96
55 80
56 64
57 48
58 32
59 16



Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)