elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar una cadena de caracteres a int. C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar una cadena de caracteres a int. C++  (Leído 1,759 veces)
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Pasar una cadena de caracteres a int. C++
« en: 18 Agosto 2015, 19:38 pm »

Buenas a todos, aquí sigo, peleando con las cadenas de caracteres.
Veréis, se me plantea el siguiente ejercicio: (no puedo usar ninguna función predefinida que haga el trabajo de cadena_a_int)

Código
  1. /*15) Función para producir el valor numérico correspondiente a una cadena de dígitos; p.e.
  2. para la cadena “-234” debe producir el número -234. La función comprobará si todos los
  3. caracteres son dígitos y devolverá el parámetro ok a true o false según haya podido
  4. producir el valor o no.
  5. void cadena_a_int(const TCadena cad, int& num, bool& ok)*/

Pero el programa que he escrito no me funciona, no se por qué, agrego al código explicando algunas cosillas con comentarios a ver si veis lo que pasa.

Código
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. typedef char TCadena[];
  6.  
  7. //---------------------------
  8.  
  9. void cadena_a_int(const TCadena cad, int& num, bool& ok);
  10.  
  11. int  longitud (const TCadena cad);
  12.  
  13. //---------------------------
  14.  
  15. int main (){
  16.    int num=0;
  17.    char cad[]={99};
  18.    bool ok;
  19.    cadena_a_int(cad, num, ok);
  20.    cout<<num;
  21.  
  22.    return 0;
  23. }
  24.  
  25. //---------------------------
  26.  
  27. void cadena_a_int(const TCadena cad, int& num, bool& ok){
  28.    int  pos=longitud(cad)-1;
  29.    int i=0;
  30.    ok=true;
  31.    bool error=false;           //CONTROLA MAS ADELANTE QUE SE ENCUENTRE ALGUN CARACTER QUE NO SEA NUMERO
  32.    bool negativo=false;           //CONTROLA MAS ADELANTE QUE SI HEMOS ENCONTRADO EN PRIMER LUGAR UN '-' SE MULTIPLIQUE NUM*-1
  33.    if(cad[0]=='-') negativo=true;           //CONTROL PARA NUMEROS NEGATIVOS
  34.    while(cad[pos]>=0 && !error){           //MIENTRAS LA POSICION ES MAYOR O IGUAL QUE 0 Y NO HAY ERROR
  35.        if(cad[pos]>=0 && cad[pos]<=9){           //SI LO QUE TENEMOS ES UN NUMERO, ENTONCES NUM+X*10^i= NUM
  36.            num+=cad[pos]*pow(10,i);
  37.            cout<<cad[pos];           //ESTOY COMPROBANDO SI SE EJECUTA EL BUCLE... POR LO VISTO NO SE EJECUTA...
  38.            ++i;
  39.        }else{
  40.        error=true;
  41.        ok=false;
  42.        }//end else
  43.        --pos;
  44.    }//end while
  45.  
  46.    if(negativo) num*-1;          // PARA NUMEROS NEGATIVOS, NUM*-1
  47. }
  48.  
  49. int longitud (const TCadena cad){
  50.    int l=0;
  51.    while(cad[l]!='\0') ++l;
  52.    return l;
  53. }
  54.  


« Última modificación: 18 Agosto 2015, 19:42 pm por seryioo » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #1 en: 18 Agosto 2015, 21:59 pm »

tienes varios errores... como confundir numeros con caracteres

Código:
cad[pos]>=0 && cad[pos]<=9
eso está mal, ya que '0' no es lo mismo que 0... '0' es igual a 48
para resumir el codigo yo recomendaría hacer lo siguiente


Código
  1. num = 0
  2. for(i=0;i<largo-1;i--){
  3.  
  4.  num *= 10;
  5.  if(palabra[i] <'0' || palabra[i] >'9')
  6.    //error
  7.    break;
  8.  num += palabra[i]-'0';
  9. }
  10. if(palabra[i]=='-'){
  11.  num *= -1;
  12. }else{
  13.  num *= 10;
  14.  num += palabra[i]-'0';
  15.  
  16.  


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #2 en: 18 Agosto 2015, 23:37 pm »

No entiendo por qué pones '' si estás comparando 2 números, el que está dentro de la cadena y el 0 por ejemplo. ¿Qué diferencia hay entre ponerlos o no?

Código
  1.  if(palabra[i] <'0' || palabra[i] >'9')

Si pones '5', por ejemplo, lo que se mira es el codigo ASCII no?
Me he hecho un lío. Entonces, cuándo pongo '0' y cuando pongo 0?
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #3 en: 18 Agosto 2015, 23:40 pm »

si, colocarlo en comillas simples hace que se vea como ascii


si haces int x = 0; x tendrá 0 por valor... si haces int x  = '0'; x tendrá por valor 48 que es el valor ascii de el simbolo '0'
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #4 en: 19 Agosto 2015, 11:22 am »

Otra cosa más, por qué restas aquí el ASCII de '0' ?

Código
  1. num += palabra[i]-'0'

Es que si no lo pongo me pasa lo siguente:

« Última modificación: 19 Agosto 2015, 11:39 am por seryioo » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #5 en: 19 Agosto 2015, 14:33 pm »

repito algo que ya dije

si, colocarlo en comillas simples hace que se vea como ascii


si haces int x = 0; x tendrá 0 por valor... si haces int x  = '0'; x tendrá por valor 48 que es el valor ascii de el simbolo '0'

si tienes "51"

entonces cad[0] = '5', sabemos que '5' es igual a 53, así que le resto el primer caracter ascii de numero (48 que es representado por '0') para dejarlo como '5'-'0', es decir 53-48 que es 5
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Pasar una cadena de caracteres a int. C++
« Respuesta #6 en: 19 Agosto 2015, 18:18 pm »

Muchas gracias, duda resuelta. Es algo que no sabía.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Obtener caracteres de una Cadena VB.NET
.NET (C#, VB.NET, ASP)
NetStorm 7 17,634 Último mensaje 29 Diciembre 2009, 02:06 am
por NetStorm
cadena de caracteres
Programación C/C++
Ander123 1 2,391 Último mensaje 6 Septiembre 2012, 14:15 pm
por avesudra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines