• Sábado 14 de Diciembre de 2024, 19:32

Autor Tema:  invalid digit "8" in const octal  (Leído 1808 veces)

Garethsoul

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
invalid digit "8" in const octal
« en: Lunes 1 de Febrero de 2010, 07:00 »
0
Buenas de vuelta je tengo una pequeña duda al utilizar la funcion SWITCH tengo el siguiente codigo.
Código: C++
  1. /*13.6 Implementar una clase Fecha con miembros dato para mes, día y año. Cada objeto
  2. de esta clase representa una fecha, que almacena el día, mes y año como enteros.
  3. Se debe incluir un constructor por defecto, un constructor de copia, funciones de acceso,
  4. una función reiniciar(int d, int m, int a) para reiniciar la fecha de un objeto
  5. existente. Emplear una función de utilidad normalizar() para asegurar que los
  6. miembros dato están en el rango correcto 1<=año, 1<=mes<=12, 1<=día<=dias(mes)
  7. donde dias(mes) es otra función que devuelve el número de días de cada mes.*/
  8. #include <iostream>
  9. using namespace std;
  10.  
  11. class Fecha{
  12.     int d,m,a; // Dia Mes Anio
  13. public:
  14.     Fecha(int d1=0, int m1=0, int a1=0) : d(d1), m(m1), a(a1){};
  15.     Fecha(const Fecha &p) : d(p.d), m(p.m), a(p.a) {};  //constructor copia
  16.     void Reiniciar(){d=0;m=0;a=0;}; //funcion que reincia el obj a 0
  17.     bool Normalizar();  // Controla que los valores de las variables sean los adecuados
  18.     void imprimir();
  19.  
  20. };
  21. int Dias(int mes);
  22.  
  23. void Fecha::imprimir(){
  24.     cout<<d<<":"<<m<<":"<<a<<endl;
  25. }
  26. bool Fecha::Normalizar(){
  27.  
  28.     if(1<=a && 1<=m<=12 && 1<=d<=Dias(m))
  29.         return true;
  30.     return false;
  31. }
  32.  
  33. int main(){
  34.     Fecha d1(10,08,2009);
  35.     Fecha d2(d1);
  36.     d1.imprimir();
  37.     d2.imprimir();
  38.     d1.Reiniciar();
  39.     d1.imprimir();
  40.     d2.imprimir();
  41.     cout<<d1.Normalizar()<<endl;
  42.     cout<<d2.Normalizar()<<endl;
  43.  
  44.  
  45. system("pause");
  46. return 0;
  47. }
  48. int Dias(int mes){
  49.     switch(mes){
  50.     case 01: return 31; break;
  51.     case 02: return 28; break;
  52.     case 03: return 31; break;
  53.     case 04: return 30; break;
  54.     case 05: return 31; break;
  55.     case 06: return 30; break;
  56.     case 07: return 31; break;
  57.     case 08: return 31; break;
  58.     case 09: return 30; break;
  59.     case 10: return 31; break;
  60.     case 11: return 30; break;
  61.     case 12: return 31; break;
  62.     }
  63.  
  64.  
  65.  
  66. }
  67.  
  68.  

el problema se da en el switch
Código: C++
  1. int Dias(int mes){
  2.     switch(mes){
  3.     case 01: return 31; break;
  4.     case 02: return 28; break;
  5.     case 03: return 31; break;
  6.     case 04: return 30; break;
  7.     case 05: return 31; break;
  8.     case 06: return 30; break;
  9.     case 07: return 31; break;
  10.     case 08: return 31; break;
  11.     case 09: return 30; break;
  12.     case 10: return 31; break;
  13.     case 11: return 30; break;
  14.     case 12: return 31; break;
  15.     }
  16.  
  17.  
  18.  
  19. }
  20.  

me dice error en el 08 y en el 09  según lo que tengo entendido es debido a que como en octal se llega hasta el 7 osea de 0 a 7  el "08 y 09" no existirían y que debería de poner en vez de ellos 010 y 011 yo quería saber si había alguna forma de colocar el 08 y 09 sin que me de error...

por lo demás todo anda joya.


gracias desde ya.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: invalid digit "8" in const octal
« Respuesta #1 en: Lunes 1 de Febrero de 2010, 09:37 »
0
es simple, quita el "0" que tienes delante de los numeros.

en c, cualquier numero que empieza con 0 se considera octal. Tu solo quieres ver el valor en decimal, asi que simplemente, quita el 0 de delante, igual que si quisieras verlo en hexadecimal pondrias 0x o en binario 0b, en octal se pone solo un 0 delante.
Código: C++
  1.  
  2. case 1:
  3. case 2:
  4. ...
  5. case 8:
  6. case 9:
  7.  
  8.  

Garethsoul

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: invalid digit "8" in const octal
« Respuesta #2 en: Lunes 1 de Febrero de 2010, 15:09 »
0
si, esa solución ya la tenia, lo que yo quería saber era si se podía anular eso o algo por el estilo para que quede CON el 0.

Gracias igual  :)

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: invalid digit "8" in const octal
« Respuesta #3 en: Martes 2 de Febrero de 2010, 13:11 »
0
No se puede desactivar, es una característica del lenguaje.

Si quieres tener todos los números "igualicos", usa la notación hexadecimal:

0x01, 0x02, ... 0x09, 0x0a, 0x0b, 0x0c,... 0x0f, 0x10, ...
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: invalid digit "8" in const octal
« Respuesta #4 en: Martes 2 de Febrero de 2010, 13:14 »
0
Por cierto, ese switch se puede simplificar/mejorar con un simple if o mejor aún, con una tabla:

int diasMes[]={31,28,31...};

Y luego

int dias=diasMes[mes];
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Garethsoul

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: invalid digit "8" in const octal
« Respuesta #5 en: Martes 2 de Febrero de 2010, 15:45 »
0
okas mucha gracias.