May 14

Gracias al mal diseño de la clase anterior se nos pide que rehagamos gran parte del código para mejorar la limpieza del código implementado. Para ello en este segundo bloque vamos a ver como se usa:

  1. Herencia.
  2. Polimorfismo dinámico
  3. Contenedores de Objetos de la librería STL
  4. Excepciones

Para ello nos dan el siguiente enunciado:
Herencia:

Los tres tipos de investigadores de un proyecto (becario, Contratado y Fijo) se van a implementar en clases independientes. Los becarios son investigadores que van a disponer de una beca que durará un número determinado de meses y su salario será una cantidad fija al mes. Los contratados son investigadores vinculados al proyecto durante un número determinado de días, y su salario será en función de los días trabajadosLos investigadores fijos tendrán como sueldo un porcentaje del presupuesto global del proyecto.

Polimorfismo dinámico:

La clase ListaInvestigadores tendrá que gestionar un número variable de investigadores que podrán ser o bien becarios, contratados o fijos. La función toString y calcularSalario serán especificas para cada clase. La funcionalidad de listar investigadores y una nueva para listar el salario de todos los investigadores tendrán que usar la ligadura dinámica.

STL:

Para implementar la clase ListaInvestigadores sustituir se debe (supongo que quiere decir “Se debe substituir”) el aarray dinámico de punteros a objetos de tipo investigador por un vector de la STL. Para conseguir la requerida ligadura dinámica del apartado anterior el tipo base de la clase contenedor tiene que ser un puntero a la clase Investigador ( que va a poder apuntar a los objetos de la clase Becario, Contratado o fijo). Realizar todos los cambios oportunos para mantener las mismas funcionalidades requeridas en el proyecto del Bloque I, añadiendo una nueva para listar el salario de todos los investigadores.
Excepciones:
Todos  los  errores  que  anteriormente  se  mostraban  por  consola  y  hacían  que  el programa se detuviera, deben ser gestionados mediante excepciones.

Como ya es costumbre en la próxima semana iré enlazando todas las clases que compondrán nuestro código en los siguientes enlaces:

Clase Fecha. ( se mantiene igual no cambia nada)

Clase Investigador (Cambios la semana que viene)

Clase ListaInvestigadores (Cambios la semana que viene)

Clase Proyecto ( supongo que haré algunos cambios)

Main ( algoritmo Principal) Queda pendiente cambiar el logo de Snupi en el menú por el de superman

Tagged with:
Abr 19

Como colofón de esta masillada de código os brindo el algoritmo principal de este código:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
/*
 * File:   main.cpp
 * Author: Jonathan Gándara Alonso
 *
 * Created on 1 de abril de 2010, 1:48
 */


/*Implementación de la clase decha
Bloque uno de prácticas

*/


#include <iostream>
#include <cstring>
#include "fecha.h"
#include "investigador.h"
#include "listaInvestigadores.h"
#include "proyecto.h"
#include <stdlib.h>
#include <cstdlib>

using namespace std;

void limpiaPantalla(){

        for ( int i = 0; i<100 ;i++){
                cout << endl<< endl<< endl;
        }
}

void leeCadena(string &cadenaComodin){
    char cadena[85];

    cout.flush();


    do{
    if(cin.fail() ) cin.clear();
    cin.getline(cadena, 85);

    }while( cadena[0] == '\0');
    cadenaComodin = cadena;

}


Investigador::Categoria leeCategoria(){

        char op = '0';

        string erro = "";

        Investigador::Categoria selec;

            do{

                limpiaPantalla();
                cout <<"Inserte 1 si el investigador es Fijo"<<endl;
                cout <<"Inserte 2 si el investigador es Contratado"<<endl;
                cout <<"Inserte 3 si el investigador es Becario"<<endl;

                 cin >> op;

                switch ( op){

                    case '1':   selec = Investigador::fijo;

                                break;
                    case '2':   selec = Investigador::contratado;

                                break;
                    case '3':   selec = Investigador::becario;

                                break;
                    default:    erro = "Escoja una de las opciones del menú";

                                break;


                }

            }while(op != '1' &&op != '2' && op != '3');


            return selec;
}

int leeNumero(){
        char c[4];
        cin >> c;
        return atoi(c);

}

double leeNumeroD(){
        char c[100];
        cin >> c;
        return atoi(c);

}

void modificaProyecto(Proyecto &p){


        string errorM ="";
        char opcion ='0';

        do{ limpiaPantalla();

            cout << errorM <<endl<<endl;

            cout<< "Datos actuales del Proyecto"<<endl;

            cout << p.toString()<< endl<< endl<< endl;

            cout << "Seleccione una opción del menú" <<endl<<endl;

            cout << "1 -> Cambiar el nombre del proyecto"<<endl;

            cout << "2 -> Cambiar la descripción del proyecto"<<endl;

            cout << "3 -> Cambiar fecha de Inicio"<<endl;

            cout << "4 -> Cambiar fecha de Fin "<<endl;

            cout << "5 -> Cambiar importe del presupuesto"<<endl;

            cout << "v -> Volver al menú principal"<<endl;

            cin >> opcion;

            limpiaPantalla();
            //Variables comodín
                string cadenaComodin="";
                int dia,mes,anho;
                Fecha fechaComodin(0,0,0);
                double presu=0;
            // fin de variables comodín

            switch(opcion){

                    case '1':       cout<< "Nombre actual: "<<p.getNombre()<<endl<<endl<< "Inserte un nombre nuevo para el proyecto"<<endl<<endl;
                                    leeCadena(cadenaComodin);
                                    p.setNombre(cadenaComodin);


                                break;

                    case '2':       cout<< "Descripción actual: "<<p.getDescripcion()<<endl<<endl<< "Inserte una descripción nueva para el proyecto"<<endl<<endl;
                                    leeCadena(cadenaComodin);
                                    p.setDescripcion(cadenaComodin);


                                break;

                    case '3':       cout<< "La fecha de inicio actual es: "<<p.getInicio().toString()<<endl<<endl<< "Inserte una nueva fecha"<<endl<<endl;
                                    cout<< "Inserte el día: ";
                                    dia = leeNumero();
                                    cout<<endl;
                                    cout<< "Inserte el mes: ";
                                    mes = leeNumero();
                                    cout<<endl;
                                    cout<< "Inserte el año: ";
                                    anho = leeNumero();
                                    cout<<endl;
                                    fechaComodin.modifica(dia,mes,anho);
                                    p.setInicio(fechaComodin);


                                break;
                    case '4':       cout<< "La fecha de fin actual es: "<<p.getFin().toString()<<endl<<endl<< "Inserte una nueva fecha"<<endl<<endl;
                                    cout<< "Inserte el día: ";
                                    dia = leeNumero();
                                    cout<<endl;
                                    cout<< "Inserte el mes: ";
                                    mes = leeNumero();
                                    cout<<endl;
                                    cout<< "Inserte el año: ";
                                    anho = leeNumero();
                                    cout<<endl;
                                    fechaComodin.modifica(dia,mes,anho);
                                    p.setFin(fechaComodin);


                                break;
                    case '5':       cout<< "Presupuesto actual: "<<p.getPresupuesto()<<endl<<endl<< "Inserte un  nuevo presupuesto para el proyecto"<<endl<<endl;
                                    presu = leeNumeroD();
                                    p.setPresupuesto(presu);


                                break;

                    default:
                                errorM = "La selección no es correcta, escoge un elemento del menú";


            }

        }while(opcion != 'v');
}



void altaInvestigador(Proyecto &p){

        string errorM ="";
        char opcion ='0';



        do{ limpiaPantalla();

            cout << errorM <<endl<<endl;

            cout << "Seleccione una opción del menú" <<endl<<endl;

            cout << "1 -> Dar de alta un investigador normal"<<endl;

            cout << "2 -> Alta de Investigador PRINCIPAL del Proyecto"<<endl;

            cout << "v -> Volver atrás"<<endl;

            cin >> opcion;


                switch(opcion){
                    case '1':// variables necesarias:
                                    {//estes corchetes son solo para restringir el ámbito de las variables
                                        int d,m,a;
                                        string nom ="",ape="";
                                        Investigador::Categoria cat;
                                        double salar =0;


                                    cout << "Introduzca el día de incorporación al proyecto del Investigador" <<endl<<endl;
                                    d = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el mes de incorporación al proyecto del Investigador" <<endl<<endl;
                                    m = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el año de incorporación al proyecto del Investigador" <<endl<<endl;
                                    a = leeNumero();
                                    cout<< endl;

                                    Fecha fec(d,m,a);

                                    cout << "Introduzca el nombre del Investigador" <<endl<<endl;
                                    leeCadena(nom);

                                    cout<< endl;

                                    cout << "Introduzca el los apellidos del Investigador" <<endl<<endl;
                                    leeCadena(ape);
                                    cout<< endl;

                                    // Submenú de selección de categoría

                                    cat = leeCategoria();// ya enera la petición de datos

                                    cout << "Introduzca el salario deseado en Euros" <<endl<<endl;
                                    salar = leeNumeroD();
                                    cout<< endl;

                                    Investigador *temp = new(nothrow) Investigador(nom, ape,fec, cat, salar );

                                    // añado el investigador al proyecto.....


                                    //p.investigadores.insertar(temp);

                                    p.investigadores.insertar(temp);

                                    }
                                break;

                    case '2':// variables necesarias:
                                    {//estes corchetes son solo para restringir el ámbito de las variables
                                        int d,m,a;
                                        string nom ="",ape="";
                                        Investigador::Categoria cat;
                                        double salar =0;


                                    cout << "Introduzca el día de incorporación al proyecto del Investigador" <<endl<<endl;
                                    d = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el mes de incorporación al proyecto del Investigador" <<endl<<endl;
                                    m = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el año de incorporación al proyecto del Investigador" <<endl<<endl;
                                    a = leeNumero();
                                    cout<< endl;

                                    Fecha fec(d,m,a);

                                    cout << "Introduzca el nombre del Investigador" <<endl<<endl;
                                    leeCadena(nom);

                                    cout<< endl;

                                    cout << "Introduzca el los apellidos del Investigador" <<endl<<endl;
                                    leeCadena(ape);
                                    cout<< endl;

                                    // Submenú de selección de categoría

                                    cat = leeCategoria();// ya enera la petición de datos

                                    cout << "Introduzca el salario deseado en Euros" <<endl<<endl;
                                    salar = leeNumeroD();
                                    cout<< endl;

                                    Investigador temp(nom, ape,fec, cat, salar );

                                    // añado el investigador al proyecto.....
                                        p.setInvPPal( temp);

                                    }
                                break;

                    default:
                                errorM = "La selección no es correcta, escoge un elemento del menú";


                }
        }while(opcion != 'v');

}


void bajaInvestigador(Proyecto &p){
    limpiaPantalla();
        if ( p.investigadores.size() > 0){
            int i =-1;
            do{
                cout << "Existen en total de "<< p.investigadores.size() << " investigadores en el Proyecto"<<endl<< "¿Cuál desea eliminar?"<<endl;

                cout << "Inserte 0 para salir" <<endl;

                i = leeNumero();

                if ( i > 0 && i < p.investigadores.size()+1){

                    cout << " ha seleccionado al investigador "<<endl;

                    Investigador *temp = p.investigadores.get(i);
                    cout << *temp;
                    char op='n';
                    cout<< endl<< "¿Desea eliminar al investigador citado? s/n"<<endl;

                    cin>>op;

                        if ( op =='s'){

                                p.investigadores.eliminar(i);

                                cout << "El investigador ha sido eliminado";
                                i=-1;
                        }

                }else{
                        i=0;// autoseleccionamos la opción de salir si ya se han eliminado todos los investigadores.
                }
            }while(i<1 && i> p.investigadores.size());
        }else{

                cout <<" No se pueden eliminar investigadores porque no existe ninguno dado de alta"<<endl;
        }

}


void modificaInv(Proyecto &p){
    cout << "1.- Modificar el investigador PRINCIPAL" << endl;
    cout << "2.- Modificar uno de los investigadores" << endl;
    cout << "s.- Volver al menú principal"<<endl;
    char opcion;
    cin >> opcion;

    string error = "";

    do{
        limpiaPantalla();
        cout<< error <<endl;
            error ="";
            switch ( opcion){
                case '1':{// para definir el ámbito de las variables
                            Investigador temp = p.getInvestigadorPrincipal();
                            cout << "========= Los datos del investigador principal son: ========="<<endl;
                            cout << temp;
                            cout << "========= Los datos del investigador principal son: ========="<<endl;

                            int d,m,a;
                                        string nom ="",ape="";
                                        Investigador::Categoria cat;
                                        double salar =0;


                                    cout << "Introduzca el día de incorporación al proyecto del Investigador" <<endl<<endl;
                                    d = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el mes de incorporación al proyecto del Investigador" <<endl<<endl;
                                    m = leeNumero();
                                    cout<< endl;

                                    cout << "Introduzca el año de incorporación al proyecto del Investigador" <<endl<<endl;
                                    a = leeNumero();
                                    cout<< endl;

                                    Fecha fec(d,m,a);

                                    cout << "Introduzca el nombre del Investigador" <<endl<<endl;
                                    leeCadena(nom);

                                    cout<< endl;

                                    cout << "Introduzca el los apellidos del Investigador" <<endl<<endl;
                                    leeCadena(ape);
                                    cout<< endl;

                                    // Submenú de selección de categoría

                                    cat = leeCategoria();// ya enera la petición de datos

                                    cout << "Introduzca el salario deseado en Euros" <<endl<<endl;
                                    salar = leeNumeroD();
                                    cout<< endl;

                                    Investigador temp2(nom, ape,fec, cat, salar );

                                    p.setInvPPal(temp2);

                        }

                        break;

                case '2':

                        break;

                default:    error ="Inserte una Opción válida";
                        break;

            }

    }while(opcion != 's');

}


void pintacabecera(){

cout<< "´´´´´´´´o7øø7´´´´´´´´´´´´´´´´´"<< endl;
cout<< "´´´´´$¶7´´´´´¶¶1´´´´´´´´´´´´´´ "<< endl;
cout<< "´´´ø¶´´´´´´´´´´1ø¶¶¶¶¶¶ø´´´´´´ "<< endl;
cout<< "´´øø´´´´´´´´´´´´´´´´´´´´¶1´´´´ "<< endl;
cout<< "´´¶´¶¶´´´´´´´´´¶´´´´´´´´´¶o´´´ "<< endl;
cout<< "´¶´¶¶¶¶ø1´´´´´o¶´´´´´´´´´´¶´´´ "<< endl;
cout<< "´¶´¶¶¶¶¶ø1´´´´´´´´´´´´´´´´¶´¶´ "<< endl;
cout<< "´¶´¶¶¶¶¶¶7´´´´´´´´´´´´´´´¢¶¶¶´ "<< endl;
cout<< "´´¶´¶¶¶¶¶1´´´´´´´´´´´´´¶¶7´´´´ "<< endl;
cout<< "´´´o1¢¶¶1¶´´´´´´´7ø$¶$7´´´´´´´ "<< endl;
cout<< "´´´´´´´´´7$´´´øø7´´´´´´´´´´´´´ "<< endl;
cout<< "´´´´´´´´´´´o¶¶¶¶´´´´´´´´´´´´´´ "<< endl;
cout<< "´´´´´´´´´´´¶´´´´$´´´´´´´´´´´´´ "<< endl;
cout<< "´´´´´´´´´´o¢´´7´´¶ø´´´´´´´´´´´ "<< endl;
cout<< "´´´´´´´´´7øø´´¶´´´$¢´´´´´´´´´´ "<< endl;
cout<< "´´´´´´ø´´¶´¶´´7¢´´´¶´´´´´´´´´´ "<< endl;
cout<< "´´´´´´o¶7¶1¶´´´¶´´¶´´1o´´´´´´´ "<< endl;
cout<< "´´´´´´¶´´1´´$7¶´7ø´¢o´$¢´´´´´´ "<< endl;
cout<< "´´´´´´¶´´´´¶1o´´´¶ø´´´¶´´´´´´´ "<< endl;
cout<< "´´´´´´´¶´´´1´1o´´´´´7¶1´´´´´´´´"<< endl;
cout<< "´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´"<< endl;
cout<< "http://melasuda.org ´´´´´´´´´´´"<< endl;
cout<< "´´Jonathan Gándara Alonso´´´´´´"<< endl;


}


int main()
{

// Primero creamos un proyecto

Fecha fechaIni(16,04,2010);
Fecha fechaFin(30,06,2010);

Proyecto unicoP("Emigrantes de Ourense", fechaIni, fechaFin, 10000);
limpiaPantalla();

// Iniciamos el menú con las opciones requeridas


char opcion = '0';
string error ="";

do{
    limpiaPantalla();
    pintacabecera();

    cout << error<<endl<<endl<<endl;

    error ="";

    cout << unicoP.toString()<< endl<< endl<< endl;

    cout << "Seleccione una opción del menú" <<endl<<endl;

    cout << "1 -> Modificar los datos del Proyecto"<<endl;

    cout << "2 -> Alta de un investigador"<<endl;

    cout << "3 -> Baja de un investigador"<<endl;

    cout << "4 -> Eliminar al investigador más reciente "<<endl;

    cout << "5 -> Listar todos los investigadores"<<endl;

    cout << "6 -> Modificar los datos de un investigador"<<endl;

    cout << "S -> Salir del Programa"<<endl;

    cin >> opcion;

    limpiaPantalla();

    // leemos la opción:

    switch(opcion){

          case '1':       modificaProyecto(unicoP);


                        break;

          case '2':       altaInvestigador(unicoP);


                        break;

          case '3':         bajaInvestigador(unicoP);
                        break;

          case '4':         unicoP.investigadores--;
                        break;

          case '5':         unicoP.investigadores.listaTodos();
                        break;

          case '6':         modificaInv(unicoP);

                        break;

          default:      error = "La selección no es correcta, escoge un elemento del menú";

                        break;

          }

}while(opcion != 's');




    return 0;
}
Tagged with:
preload preload preload