Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Juancho25 en 20 Octubre 2012, 22:31 pm



Título: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 20 Octubre 2012, 22:31 pm
Tengo un problema al momento de programar para que sólo acepte 8 dígitos en un código de barras, tengo entendido que es con un strlen(.. pero me marca un error.

Lo que tiene que hacer este programa es que ingrese un código de barras y lo guarde pero sólo tiene que aceptar 8 dígitos, ni más ni menos, y tampoco letras.

Tengo este código pero me marca error:

Código:
if (strlen(Datos[c].CodigoBarras)=8) // Aquí necesito ayuda
{
cout<<"Correcto.";
}
else
{
cout<<"Incorrecto. Sólo se permiten 8 dígitos.";
}

Espero me puedan ayudar.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Pablo Videla en 20 Octubre 2012, 22:41 pm
Tengo un problema al momento de programar para que sólo acepte 8 dígitos en un código de barras, tengo entendido que es con un strlen(.. pero me marca un error.

Lo que tiene que hacer este programa es que ingrese un código de barras y lo guarde pero sólo tiene que aceptar 8 dígitos, ni más ni menos, y tampoco letras.

Tengo este código pero me marca error:

Espero me puedan ayudar.

No sé C ni C++ , pero viendo la sintaxis asumo que esta es la solución.

Código
  1. if (strlen(Datos[c].CodigoBarras)==8) /* no es "=" es  "=="  ya que es comparacion  y ahi lo estabas asignando*/
  2.         {
  3.            cout<<"Correcto.";
  4.         }
  5.         else
  6.         {
  7.            cout<<"Incorrecto. Sólo se permiten 8 dígitos.";
  8.         }

Puedo estar equivocado, porque algunas sintaxis son diferentes en otros lenguajes, avisame si estoy mal, saludos.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 20 Octubre 2012, 22:47 pm
No sé C ni C++ , pero viendo la sintaxis asumo que esta es la solución.

Código:
if (strlen(Datos[c].CodigoBarras)==8) /* no es "=" es  "=="  ya que es comparacion  y ahi lo estabas asignando*/
         {
            cout<<"Correcto.";
         }
         else
         {
            cout<<"Incorrecto. Sólo se permiten 8 dígitos.";
         }

Puedo estar equivocado, porque algunas sintaxis son diferentes en otros lenguajes, avisame si estoy mal, saludos.


Agregué eso que me dijiste y me sigue apareciendo equivocado, el error me lo marca en la palabra "Datos" y dice: "un argumento de tipo 'int' no es compatible con un parámetro de tipo 'const char'".


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: avesudra en 20 Octubre 2012, 23:02 pm
El operador de comparación es tal y como dice DonVidela , si no estarias asignando , por otro lado , el array Datos  a que apunta ¿a una estructura? Pon el código entero porque si nó ...


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Pablo Videla en 21 Octubre 2012, 00:48 am
Como dice avesudra, pon el codigo completo para que podamos ayudarte de manera más eficiente.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 21 Octubre 2012, 01:44 am
El código es una estructura pero lleva muchas más cosas como agregar registro, editar, borrar, etc, y el problema me aparece nadamás en esa parte, por lo que omití lo demás que no influye en el código.

Código:
include <iostream>

int c=0;

struct dato {
int CodigoBarras;
} Datos[10];

void main (){

cout<<"\t\tIngresa el Codigo de Barras\n";
flushall();
cin>>Datos[c-1].CodigoBarras;

if (strlen(Datos[c].CodigoBarras)==8) // Aquí necesito ayuda
{
cout<<"Correcto.";
}
else
{
cout<<"Incorrecto. Sólo se permiten 8 dígitos.";
}
}


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Pablo Videla en 21 Octubre 2012, 01:56 am
Bueno aca no te puedo ayudar, puesto que no se que es Datos, para mi sería un arreglo que trabajo con C# , JAVA, PHP.

Citar
Agregué eso que me dijiste y me sigue apareciendo equivocado, el error me lo marca en la palabra "Datos" y dice: "un argumento de tipo 'int' no es compatible con un parámetro de tipo 'const char'".

Si te fijas tienes Datos[10] y alega que el 10 que pusiste es un argumento de tipo entero, que no es compatible con una constante char, eso quiere decir que eso que tienes ahí (Porque no se si es un arreglo de objetos o no  se en este lenguaje)  espera algo como Datos['10'] , ahora como te dije antes, no conozco el lenguaje no se que será eso.

Cualquiera me puede corregir acá y te puede aportar más, pero espero darte algunas pistas. 

Saludos


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: xiruko en 21 Octubre 2012, 02:11 am
Citar
Código
  1. if (strlen(Datos[c].CodigoBarras)==8) // Aquí necesito ayuda
Datos[c].CodigoBarras es un numero entero, y tu lo estas pasando como argumento a una funcion que espera un puntero a caracter. no se si lo sabras, pero strlen() devuelve la longitud de la cadena pasada como parametro, por lo que pasarle un entero como parametro no tiene mucho sentido.

si lo que quieres hacer es tratar a un codigo de barras como un array de enteros, entonces tienes que hacerte alguna funcion que te diga el total de digitos que tiene el numero. ademas seria mas facil declarar el codigo de barras asi:
Código
  1. int CodigoBarras[10];

si quieres trabajar el codigo de barras como una cadena para usar strlen(), entonces debes declararlo como tal:
Código
  1. char CodigoBarras[10];

espero que te ayude, un saludo!


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 21 Octubre 2012, 07:08 am
Lo que hice fue cambiar la variable "CodigoBarras" de int a char y me funcionó ya que no contaba con que strlen() no funciona con enteros.

Ya con eso sí me acepta que sean ocho dígitos, ni más ni menos, pero acepta puros números y puras letras o mixto, y ese es otro problema que olvidé mencionar, el código de barras sólo tiene que aceptar números y no letras.

Espero que me haya explicado, y perdonen tantas preguntas mías, soy algo nuevo en esto del c++.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: leosansan en 21 Octubre 2012, 13:42 pm
Tengo un problema al momento de programar para que sólo acepte 8 dígitos en un código de barras, tengo entendido que es con un strlen(.. pero me marca un error.

Lo que tiene que hacer este programa es que ingrese un código de barras y lo guarde pero sólo tiene que aceptar 8 dígitos, ni más ni menos, y tampoco letras.

Tengo este código pero me marca error:

Estas usando una función para char propiamente, y tu variable "Datos[c].CodigoBarras" es un numero entero. Lo que podrías hacer es calcular previamente los dígitos de dicho número y luego aplicar la condición a la variable contador si es 8 o no..
Para contar los dígitos de "VDatos[c].CodigoBarras" te valdría el siguiente código, cambiando "n" por "Datos[c].CodigoBarras":

Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.    int n,contador=0;
  6.    cin>>n;
  7.    while(n>0){
  8.        contador++;
  9.        n=n/10;}
  10.    cout<<contador<<endl;
  11.    return 0;
  12. }
  13.  


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 23 Octubre 2012, 03:38 am
Estas usando una función para char propiamente, y tu variable "Datos[c].CodigoBarras" es un numero entero. Lo que podrías hacer es calcular previamente los dígitos de dicho número y luego aplicar la condición a la variable contador si es 8 o no..
Para contar los dígitos de "VDatos[c].CodigoBarras" te valdría el siguiente código, cambiando "n" por "Datos[c].CodigoBarras":

Código:
#include<iostream>
using namespace std;

int main() {
    int n,contador=0;
    cin>>n;
    while(n>0){
        contador++;
        n=n/10;}
    cout<<contador<<endl;
    return 0;
}


Muchas gracias leosansan, me funcionó perfecto ya que si convertía el int a char me traería problemas con otras cosas en mi código y sin convertirlo de int a otro tipo me pareció perfecto, sólo una pregunta, ¿para qué se usa el n=n/10;? Todo lo entendí pero eso no muy bien, necesito comprenderlo bien ya que soy algo nuevo en el c++.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: BlackZeroX en 23 Octubre 2012, 04:49 am
es muy simple... de hecho no hay que convertir a nada solo aplicar lógica PARA ESTE CASO QUE ya tiene establecido una longitud de 8...

Código
  1.  
  2. if (abs(Datos[c].CodigoBarras) <= 99999999) {
  3.    puts("Existen 8 o menos dígitos");
  4. } else {
  5.    puts("Hay mas de 8 dígitos");
  6. }
  7.  
  8.  

Dulces Lunas!¡.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: leosansan en 23 Octubre 2012, 06:19 am
Muchas gracias leosansan, me funcionó perfecto ya que si convertía el int a char me traería problemas con otras cosas en mi código y sin convertirlo de int a otro tipo me pareció perfecto, sólo una pregunta, ¿para qué se usa el n=n/10;? Todo lo entendí pero eso no muy bien, necesito comprenderlo bien ya que soy algo nuevo en el c++.
Cada vez que haces n/10 divides entre 10 de forma entera, con lo que te "comes" un dígito del número inicial, al tiempo que "contador" se incrementa contando así los dígitos.
Saludos!.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: Juancho25 en 2 Noviembre 2012, 06:23 am
Si gracias a todos por sus respuestas, ya solucioné ese problema, sólo que tengo otro, aparte de aceptar sólo 8 dígitos, necesito que sólo sean números y no letras, ¿saben como le puedo hacer con eso?.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: leosansan en 2 Noviembre 2012, 13:15 pm
Citar
http://www.cplusplus.com/reference/clibrary/cctype/isdigit/


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: BatchianoISpyxolo en 2 Noviembre 2012, 13:17 pm
http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

Eso o hacerte una funcioncica con un array (porque creo que no hay el tipo conjunto predefinido en c++). Así no tendrías que incluir otra librería :P


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: leosansan en 2 Noviembre 2012, 14:47 pm
ya solucioné ese problema, sólo que tengo otro, aparte de aceptar sólo 8 dígitos, necesito que sólo sean números y no letras, ¿saben como le puedo hacer con eso?.
Citar
Una opción sería tomar N como cadena y convertirla a entero, para después contar el número de dígitos:
Código
  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4.  
  5. int main() {
  6.    char N[20];
  7.    int n,contador=0;
  8.    while (contador!=8)
  9.    {
  10.        cout<<"Introduzca 8 digitos: ";
  11.        cin>> N;
  12.        n = atoi (N);
  13.        cout<<n<<endl;
  14.        contador=0;
  15.            while(n>0){
  16.            contador++;
  17.            n=n/10;
  18.    }
  19.        cout<<contador<<endl;
  20.        }
  21.  
  22.    return 0;
  23. }
Saludos!.


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: xiruko en 2 Noviembre 2012, 14:59 pm
Código
  1. char cadena[9];
  2. int i;
  3.  
  4. fgets(cadena, 8, stdin);
  5. for (i=0; i<8; i++) {
  6.    if (cadena[i] < '0' || cadena[i] > '9') {
  7.        printf("ERROR: Ingresa solo numeros!\n");
  8.        break;
  9.    }
  10. }

con fgets() el usuario podria introducir mas digitos pero solo se aceptarian 8, y luego con el for irias comprobando que cada uno de ellos fuera un numero. si no lo es, te salta el error y luego sale del for. tendrias que implementar algo asi dentro de un while con su respectiva variable de control para repetir este proceso hasta que el usuario introdujese un numero valido.

un saludo!


Título: Re: ¿Cómo determinar que sólo acepte 8 dígitos?
Publicado por: rir3760 en 2 Noviembre 2012, 15:56 pm
ya solucioné ese problema, sólo que tengo otro, aparte de aceptar sólo 8 dígitos, necesito que sólo sean números y no letras, ¿saben como le puedo hacer con eso?.
Solo tienes que seguir la recomendación de BlackZeroX (Astaroth): leer el numero y verificar su valor (99,000,000 <= x <= 99,999,999).

Un saludo