Programa NIF

Iniciado por LGG, 2 Mayo 2015, 20:23 PM

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

LGG

Este es el enunciado del ejercicio:

Crea una clase Nif que se usará para mantener DNIs con su correspondiente letra. Los atributos de la clase serán el número de DNI (entero largo) y la letra que le corresponde.
La clase dispondrá de los siguientes métodos:
- Inicializador que reciba el número de DNI y establezca automáticamente la letra que le corresponde.
- Accedentes y mutador para el número de DNI (ajustando automáticamente la letra).
- Leer() : que pida el número de DNI (ajustando automáticamente la letra).
- Método que nos permita mostrar el NIF (DNI, un guión y la letra en mayúsculas; por ejemplo: 395469-F).
La letra se calculará con un método auxiliar (privado) de la siguiente forma:
se obtiene el resto de la división entera del número de DNI entre 23 y
se usa la siguiente tabla para obtener la letra correspondiente:

0 - T 12 - N
1 - R 13 - J
2 - W 14 - Z
3 - A 15 - S
4 - G 16 - Q
5 - M 17 - V
6 - Y 18 - H
7 - F 19 - L
8 - P 20 - C
9 - D 21 - K
10 - X 22 - E
11 - B




Me lo han pedido en forma de proyecto, como no puedo adjuntar archivos comprimidos (que yo sepa) os los copio aquí:



1r archivo.
Guardado como: "main.cpp"

Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <iostream>
#include "Nif.h"

using namespace std;

int main(){

Nif p
;
char l, resp;
long int d;

p.setDni(d);
p.setLetra(l);

do{
   p.Leer(d);
   
   p.Letra(d,l);

   p.show();
   
   cout<<endl;
   cout<<"Quieres introducir otro numero? si<s> no<n>"<<endl;
   cin>>resp;
}while(resp=='s');
   
system("pause");
return 0;
}





2o archivo.
Guardado como: "Nif.h"


Código (cpp) [Seleccionar]
#ifndef NIF_H
#define NIF_H
#include <iostream>

using namespace std;

class Nif
{
private:
   long int dni;
   char letra;
   
public:
 
  Nif(){dni=0; letra='nada';}
  Nif(long int d, char l){dni=d; letra=l;}
  ~Nif(){cout<<"Destructor invocado.\n";};
 
  void setDni(long int d){dni=d;}
  void setLetra(char l){letra=l;}
 
  long int getDni()const {return dni;}
  char getLetra()const {return letra;}
 
  void Leer(long int d);
  void Letra(long int d, char l);
  void show();

};

#endif






3r archivo.
Guardado como: "Nif.cpp"



Código (cpp) [Seleccionar]
#include "Nif.h"


using namespace std;


void Nif::Leer(long int dni){  
  cout<<endl;
  cout<<"Introduzca el numero del DNI(8 car):  "<<endl;
  cin>>dni;
 
}

void Nif::Letra(long int dni, char letra){
int resto;
resto=dni%23;
switch(resto){
    case 0:
    letra=='T';
    break;
    case 1:
       letra=='R';
    break;
    case 2:
       letra=='W';
    break;
case 3:
       letra=='A';
    break;
case 4:
       letra=='G';
    break;
case 5:
       letra=='M';
    break;
case 6:
       letra=='Y';
    break;
case 7:
       letra=='F';
    break;
case 8:
       letra=='P';
    break;
case 9:
       letra=='D';
    break;
case 10:
       letra=='X';
    break;
case 11:
       letra=='B';
    break;
case 12:
       letra=='N';
    break;
case 13:
       letra=='J';
    break;
case 14:
       letra=='Z';
    break;
case 15:
       letra=='S';
    break;
case 16:
       letra=='Q';
    break;
case 17:
       letra=='V';
    break;
case 18:
       letra=='H';
    break;
case 19:
       letra=='L';
    break;
case 20:
       letra=='C';
    break;
case 21:
       letra=='K';
    break;
case 22:
       letra=='E';
    break;
   }
}

void Nif::show(){
cout<<"-------------------------------------------"<<endl;
   cout<<endl;
   cout<<"La letra correspondiente a tu DNI es: <"<<getLetra()<<endl;
   cout<<endl;
   cout <<"El NIF es: " <<getDni()<<"-"<<getLetra()<<endl;
cout<<endl;
   cout<<"-------------------------------------------"<<endl;
   cout<<endl;
}






El programa me compila pero a la hora de escribir (en la función "show") no me sale el numero del dni ni la letra bien...no sé donde esta el problema! Podrían ayudarme por favor????


Gracias,



LGG

Mod: los códigos deben ir en etiquetas GeSHi

ivancea96

La función setLetra es absurda, ya que la letra ha de estar siempre acorde al DNI.

En el switch, pusiste "letra=='W'". Eso es el operador para comparar. El operador para asignar es "=".

No pongas el nombre del parámetro de esa función ("letra") igual al nombre del campo de la clase, "letra" también.

LGG

Ya he modificado todo lo que me has dicho.. y aun no me sale bien.

De momento el código me ha quedado así:


1r archivo
Guardado como: "main.cpp"


#include <stdlib.h>
#include <iostream>
#include "Nif.h"

using namespace std;

int main(){

    Nif p
    ;
    char l, resp;
    long int d;

    p.setDni(d);

do{
    p.Leer(d);
   
    p.letra_dni(d,l);

    p.show();
   
    cout<<endl;
    cout<<"Quieres introducir otro numero? si<s> no<n>"<<endl;
    cin>>resp;

}while(resp=='s');
   
system("pause");
return 0;
}


2o archivo
Guardado como: "Nif.h"


#ifndef NIF_H
#define NIF_H
#include <iostream>

using namespace std;

class Nif
{
private:
   long int dni;
   char letra;
   
public:
   
   Nif(){dni=0; letra='nada';}
   Nif(long int d, char l){dni=d; letra=l;}
   ~Nif(){cout<<"Destructor invocado.\n";};
   
   void setDni(long int d){dni=d;}
     
   long int getDni()const {return dni;}
   char getLetra()const {return letra;}
   
   void Leer(long int d);
   void letra_dni(long int d, char l);
   void show();

};

#endif


3r archivo
Guardado como: "Nif.cpp"


#include "Nif.h"


using namespace std;


void Nif::Leer(long int dni){ 
   cout<<endl;
   cout<<"Introduzca el numero del DNI(8 car):  "<<endl;
   cin>>dni;
   
}

void Nif::letra_dni(long int dni, char letra){
int resto;
resto=dni%23;
switch(resto){
    case 0:
        letra='T';
    break;
    case 1:
        letra='R';
    break;
    case 2:
        letra='W';
    break;
case 3:
        letra='A';
    break;
case 4:
        letra='G';
    break;
case 5:
        letra='M';
    break;
case 6:
        letra='Y';
    break;
case 7:
        letra='F';
    break;
case 8:
        letra='P';
    break;
case 9:
        letra='D';
    break;
case 10:
        letra='X';
    break;
case 11:
        letra='B';
    break;
case 12:
        letra='N';
    break;
case 13:
        letra='J';
    break;
case 14:
        letra='Z';
    break;
case 15:
        letra='S';
    break;
case 16:
        letra='Q';
    break;
case 17:
        letra='V';
    break;
case 18:
        letra='H';
    break;
case 19:
        letra='L';
    break;
case 20:
        letra='C';
    break;
case 21:
        letra='K';
    break;
case 22:
        letra='E';
    break;
    }
}

void Nif::show(){
    cout<<"-------------------------------------------"<<endl;
    cout<<endl;
    cout<<"La letra correspondiente a tu DNI es: <"<<getLetra()<<endl;
    cout<<endl;
    cout<<"El NIF es: " <<getDni()<<"-"<<getLetra()<<endl;
    cout<<endl;
    cout<<"-------------------------------------------"<<endl;
    cout<<endl;
}



Supongo que siguen habiendo cosas mal... como verás estoy empezando con la programación y hay cosas (básicas) que se me escapan aún... gracias por la ayuda, y a ver si pueden ayudarme a acabar este ejercicio, porqué me está dando guerra la verdad..


LGG

ivancea96

Vamos a ver. No puede haber ningún método ni constructor al que le pases la letra. La letra se calcula sola siempre.
Luego, siempre que le pongas un nuevo DNI, tienes que volver a calcular la letra. Siempre.

Modifica los métodos para cumplir esas reglas, y vuelve a ver los errores.

LGG

Muchas gracias, ya lo he arreglado y me ha salido bien!!!

He cambiado un par de cosas más, éste es el resultado del código:


#include <stdlib.h>
#include <iostream>
#include "Nif.h"

using namespace std;

int main(){

    Nif p
    ;
    char resp;

do{
   
    p.Leer();

    p.show();
   
    cout<<endl;
    cout<<"Quieres introducir otro numero? si<s> no<n>"<<endl;
    cin>>resp;
   
}while(resp=='s');
   
system("pause");
return 0;
}





#ifndef NIF_H
#define NIF_H
#include <iostream>

using namespace std;

class Nif
{
private:
    long int dni;
    char letra;
    void letra_dni();
   
public:
   
    Nif(){dni=0;}
    Nif(long int d){dni=d;letra_dni();}
    ~Nif(){cout<<"Destructor invocado.\n";};
   
    void setDni(long int d){dni=d;letra_dni();}
    long int getDni()const {return dni;}
   
    void Leer();
    void show();

};

#endif



#include "Nif.h"


using namespace std;


void Nif::Leer(){ 
   cout<<endl;
   cout<<"Introduzca el numero del DNI(8 car):  "<<endl;
   cin>>dni;
   
   letra_dni();
}

void Nif::letra_dni(){
int resto;
resto=dni%23;

switch(resto){
    case 0:
    letra='T';
    break;
    case 1:
        letra='R';
    break;
    case 2:
        letra='W';
    break;
case 3:
        letra='A';
    break;
       case 4:
        letra='G';
    break;
        case 5:
        letra='M';
    break;
        case 6:
        letra='Y';
    break;
case 7:
        letra='F';
    break;
case 8:
        letra='P';
    break;
case 9:
        letra='D';
    break;
case 10:
        letra='X';
    break;
case 11:
        letra='B';
    break;
case 12:
        letra='N';
    break;
case 13:
        letra='J';
    break;
case 14:
        letra='Z';
    break;
case 15:
        letra='S';
    break;
case 16:
        letra='Q';
    break;
case 17:
        letra='V';
    break;
case 18:
        letra='H';
    break;
case 19:
        letra='L';
    break;
case 20:
        letra='C';
    break;
case 21:
        letra='K';
    break;
case 22:
        letra='E';
    break;
    }
}

void Nif::show(){
    cout<<"-------------------------------------------"<<endl;
    cout<<endl;
    cout<<"La letra correspondiente a tu DNI es: "<<letra<<endl;
    cout<<endl;
    cout<<"El NIF es: " <<dni<<"-"<<letra<<endl;
    cout<<endl;
    cout<<"-------------------------------------------"<<endl;
    cout<<endl;
}