Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ascuasflame en 9 Enero 2018, 00:19 AM

Título: Ayuda con ejercicio novato
Publicado por: ascuasflame en 9 Enero 2018, 00:19 AM
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.
Título: hecho
Publicado por: ascuasflame en 9 Enero 2018, 04:57 AM
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;
}

Título: Re: Ayuda con ejercicio novato
Publicado por: MAFUS en 9 Enero 2018, 14:28 PM
Creo que te piden que hagas arrays dinámicos y estructuras. No creo, por el enunciado, que debas hacer decenas de variables diferentes.
Título: Re: Ayuda con ejercicio novato
Publicado por: dijsktra en 3 Febrero 2018, 15:52 PM
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:
#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