Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.

Iniciado por NOB2014, 6 Enero 2014, 21:45 PM

0 Miembros y 2 Visitantes están viendo este tema.

leosansan

Cita de: dato000 en  7 Enero 2014, 13:31 PM
Pues justamente llegue a un punto bastante parecido al del post, y estuve intentando lo de los acentos en C:

printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:", 163, INT_MAX);

Una cosa, esta al reves, primero deberia ir la variable tipo ASCII (163 ---> ù) y luego la que contiene el valor máximo de una variable tipo entera (INT_MAX---> #define INT_MAX 0x7FFF/0x7FFFFFFF ---> 2.247.483.647)

Ahora, lo de los acentos, pues bueno. No me funciono...[/size]
...............................................................................

Curiosamente, a pesar de estar mal ordenados los dos valores, me funcinó. No obstante gracias por la observación, ya lo corregi. Y una muestra de que sí funciona lo de los acentos y la ñ:


;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!



amchacon

Cita de: leosansan en  7 Enero 2014, 13:18 PM
Me he levantado, muy de madrugada, y estoy "pijito". ;)

Esta vez te sobra en la frase lo de "pero menor que 3 mil millones". Es suficiente que sea mayor de 2.247.483.647, y digo bien mayor que no igual, para que se produzca desbordamiento.
La única forma de detectar el desbordamiento es ver si sale negativo (ya que vuelve al valor mínimo). Si le ponemos un número muy grande, es posible que el número llege a los positivos de nuevo.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

dato000

Ha de ser el compilador o el hecho de que yo lo trabajo desde linux, por ello no me funcionan las variables de acento:


Extraño, puede que el compilador entienda el uso de la variable de limite.

Estuve tratando de usar tu código con punteros, pero no he podido dar con el clavo, tengo un problema, si, ya se que es copia, pero siganme la corriente, porque trato de aprender el uso de punteros para este caso:


/*
 Escribir una función que tenga como entrada una cadena y devuelva un número real.
 La cadena contiene los carateres de un número real en formato decimal (por ejemplo,
 la cadena "25.56" se ha de convertir en el correspondiente valor real).
 */

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

int main()
{

char numero[101],ch=0;
char *p_numero;
int ok=0, i=0;
long long int num=0;

do{
system("clear");
ok=0;
printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:  ", INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);

                           num = atoll (numero);
p_numero = &numero[0]; // p_numero = numero;

while((ch = getchar()) != EOF && ch != '\n');

//for(i=0;numero[i]; i++)
while(*p_numero)
{

if((strlen (p_numero)>11) )
{
ok=1;
printf("\nTe has pasado en numero de cifras. \n");
getchar();
break;
}

else if((*p_numero <=47 || *p_numero >=58) )
{
ok=1;
printf("\n Solo debes ingresar numeros. \n");
getchar();
break;
}

else if((num> INT_MAX) )
{
ok=1;
printf("\n Te has pasado en tamanyo.\n");
getchar();
break;
}
                                           }

   }  while(ok == 1);

   printf("\n El número en la variable es: %s\n", numero);
   return 0;

}


Y tengo unos problemas que sinceramente no se como corregir, es decir, se cuál es el problema pero no se como solucionarlos, ayudenme con estos datos por favor mi gente:


num = atoll (numero);
Creo que no hay forma de pasarle el argumento de puntero, cierto?


while((ch = getchar()) != EOF && ch != '\n');
Realmente no entiendo porque es así, funciona, pero no se la razón, podrian explicarme un poco  :rolleyes: :rolleyes:


long long int num=0;
Nuevamente, no entiendo, podrian extender un poco sobre el tema, no me termino de convencer y quede enredado con tanta repetición de la repetidera.


#include <string.h>
if((strlen (p_numero)>11) )

Esta es más una anotación, que me confirma que el compilador en windows es mucho más amable que uno en linux, al parecer debes tener más de un compilador que pasa por alto el uso de librerias estandar. O eso creo yo, por eso es que te pasa por alto ese tipo de "warnings" en el uso del programa.


fflush(stdout);
Ummmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm porqué???


scanf ("%101[^\n]s",numero);
Eso es usando expresiones regulares??? porque 101 digitos??



NOB2014

Hola.-
A ver qué les parece.-

- Si el numero tiene más de 10 cifras, entonces no cabe.
- Si el numero tiene menos de 10 cifras, entonces cabe.
- Si el número tiene 10 cifras y es mayor a 2.147.483.648  no cabe. 

Las 2 primeras son simples de verificar como si se ingresa 0, Enter sin haber ingresado nada o si se ingresó algo distinto a un número.-
La última lo haría de esta manera, sólo que tengo que elevar el resultado a la potencia correspondiente y desconozco como se hace, luego verifico si num es igual o menor a INT_MAX y estaría concluido (me parece).- 


#include <stdio.h>

int main(void){

char a[] = {2,1,4,7,4,8,3,6,4,9};
int i = 0;
unsigned int num=0;

while(i<=9){
num = num + a[i];
i++;
}

return 0;
}


Saludos
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

dato000




NOB2014

Hola.-
Simplemente es una práctica y una consulta para saber si mi idea tenía algún error y de hecho lo tiene, si se ingresa 10 cifras verificar que la primera sea =< a 2 porque si se ingresa 4294967296 tampoco cabe en un int sin signo.-
Cuando termine el código lo posteo para que algún recién iniciado como yo lo analice.-

Saludos
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

dato000

Pues en tu código lo que esta haciendo es hacer una sumatoria con todos los digitos, no una conversión de cadena a int. De todas maneras sigue, yo también estoy haciendo mi investigación.



leosansan

Cita de: dato000 en  7 Enero 2014, 15:08 PM
Pues en tu código lo que esta haciendo es hacer una sumatoria con todos los digitos, no una conversión de cadena a int. De todas maneras sigue, yo también estoy haciendo mi investigación.

Totalmente de acuerdo amigo dato000.

En principio lo que parece es querer usar la cadena a[],


#include <stdio.h>

int main(void){

char a[] = {2,1,4,7,4,8,3,6,4,9};
........................................................
}


donde está el INT_MAX. Lo cual me lleva a la lógica de comparar los dígitos de la cadena número con los de la cadena a[]. ¡Y vaya si funciona!, aunque me ha quedado un poco, como decirlo, poco compacto. Vamos, que lo tendría que mirar mejor para afinarlo, pero menos da una piedra. ;) ;) ;)

Aquí mi propuesta a lo que en principio pareces plantear. Si no es así ya nos lo comunicas:


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

int main(){
char numero[101] = "",a[] = {2,1,4,7,4,8,3,6,4,7}
;
int ok=0, i=0,flag=0,ch=0;
long long int num=0;
do{
//system("CLS");
ok=0;
printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);
while((ch = getchar()) != EOF && ch != '\n');
num = atoll (numero);
   if((strlen (numero)>10) ){
       ok=1;
       printf("\nTe has pasado en n%cmero de cifras. \n",163);
       break;
     }
     else if((numero[i] <=47 || numero[i] >=58) ){
       ok=1;
       printf("\n Solo debe ingresar n%cmeros. \n",163);
       break;
     }
     /*else if((num> INT_MAX) ){
       ok=1;
       printf("\n Te has pasado en tama%co.\n",164);
       break;*/
       else {
         for (i=0;numero[i];i++){
           if ((int)(numero[i]-48)<(int)(a[i])){
             printf ("\nEl numero es %s menor que %d \n",numero,INT_MAX);
             flag=1;
             break;
             }
           else if (numero[i]-48==(int)(a[i]) )
             continue;
           else {
             printf ("\nEl numero es %s mayor que %d \n",numero,INT_MAX);
             flag=1;
             ok=1;
             break;
           }
         }
       if (flag==0)
           printf ("\n\nEl numero es %s igual que %d \n",numero,INT_MAX);
       }
   putchar ('\n');
   system ("pause");
}while(ok == 1);
printf("\n %s\n", numero);
return 0;
}


El código, caso da que el número justito tenga diez cifras, diferencia si es menor, mayor o igual al INT_MAx. ;) ;) ;)

¡¡¡¡ Saluditos! ..... !!!!


P.D: Claro que también podemos usar las funciones de la librería string.h, stcmp  o strncmp, pero no tendría tanta gracia.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

int main(){
char numero[101] = "",ch=0,a[] = {"2147483647"};
int ok=0, i=0,flag=0;
long long int num=0;
do{
//system("CLS");
ok=0;
printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);
while((ch = getchar()) != EOF && ch != '\n');
num = atoll (numero);
   if((strlen (numero)>10) ){
       ok=1;
       printf("\nTe has pasado en n%cmero de cifras. \n",163);
       break;
     }
     else if((numero[i] <=47 || numero[i] >=58) ){
       ok=1;
       printf("\n Solo debe ingresar n%cmeros. \n",163);
       break;
     }
     else {
       flag=strcmp   (numero,a);
       if (flag==0)
         printf ("\n\nEl numero es %s igual que %d\n ",numero,INT_MAX);
       else if (flag<0)
         printf ("\nEl numero es %s menor que %d \n",numero,INT_MAX);
       else if (flag>0){
         printf ("\nEl numero es %s mayor que %d \n",numero,INT_MAX);
         ok=1;
       }
     }
   putchar ('\n');
   system ("pause");
}while(ok == 1);
printf("\n %s\n", numero);
return 0;
}

NOB2014

Hola.
Bueno al fin puedo demostrar con este programa lo quería lograr.-

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

void charAint(const char[], int* ,int);
void intAbinario(int, int*);


int main(){
char numeroChar[11] = "";
unsigned int ok=0, i=0, longitud=0, numero, *ptrNumero = &numero;


do{
system("CLS");
ok=0;
printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:", INT_MAX);
fflush(stdout);
fgets(numeroChar, 12, stdin);
longitud = strlen(numeroChar);
numeroChar[longitud-1] = '\0';
if(numeroChar[0] == '\0' || numeroChar[0] == '0'){
ok=1;
printf("\n El numero ingresado debe ser mayor a cero\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
}
else{
for(i=0;numeroChar[i] != '\0'; i++){
if(numeroChar[i] <=47 || numeroChar[i] >=58){
ok=1;
printf("\n Debe ingresar solo numeros\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
break;
}
}
if(ok==0){
i=0;
if(longitud-1 == 10 && numeroChar[0] >= 2){
i=1;
}
else{
charAint(numeroChar, ptrNumero, longitud);
if(*ptrNumero > INT_MAX){
i=1;
}
}
if(i == 1){
ok=1;
*ptrNumero = 0;
printf("\n El numero ingresado supero el maximo permitido\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
}
}
}
}while(ok == 1);

intAbinario(numero, ptrNumero);

return 0;
}

void charAint(const char numeroChar[], int *ptrNumero, int longitud){
unsigned auxiliar=0, i=0;

while(i < longitud-1){
auxiliar = numeroChar[i]-48;
*ptrNumero=10* *ptrNumero+auxiliar;
i++;
}
}

void intAbinario(int numero, int *ptrNumero){
char binario[33] = "";
unsigned int i=0, j=0, k=0, temp=0;
do{
binario[i] = '0' + numero%2;
numero = numero/2;
i++;
}while (numero != 0);

binario[i] = '\0';

for (j = 0, k = strlen(binario)-1; j < k; j++, k--){
temp = binario[j];
binario[j] = binario[k];
binario[k] = temp;
}
printf("\n\n En decimal %u --> en binario = %s\n\n", *ptrNumero, binario);
}


No acepta los siguientes ingresos:
- 0  o vacio
- s25 o 25s
- número mayor a INT_MAX

En cuanto a la función charAint se que existe atoi pero en este caso es para practicar con punteros y funciones.-
Espero sugerencias para optimizarlo, muchas gracias a todos los que participaron para ayudarme a lograrlo.-

Saludos
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

Nada más probarlo surge una incongruencia. Te pongo una salida del código:

Citar

Introduce el numero que deseas convertir a binario
máximo [2147483647]...:12345

El numero ingresado supero el máximo permitido

Pulse una tecla para intentarlo nuevamente...

Introduce el numero que deseas convertir a binario
maximo [2147483647]...:1234567890

El numero ingresado supero el máximo permitido

Pulse una tecla para intentarlo nuevamente...

Introduce el numero que deseas convertir a binario
máximo [2147483647]...:

El error está, por un lado en que no inicializas la variable numero a cero[ y por otro en la condición/b]:

Código (cpp) [Seleccionar]

if(ok==0){
i=0;
if(longitud-1 == 10 && numeroChar[0] >= 2){
i=1;
}


que debería ser:

Citar
if(ok==0){
            i=0;
            if(longitud-1 == 11 && numeroChar[0] >= 2){
               i=1;
            }

No obstante, no sé el por qué del uso  de punteros. No lo entiendo con la de alternativas que te hemos propuesto. Podías haberlo indicado desde el principio y nos hubiéramos ahorrado trabajo.;) ;) ;)




Saluditos! ..... !!!!