Sv Community El Salvador

Soporte y Tecnología => Programación => C/C++ => Mensaje iniciado por: robincracker en febrero 04, 2012, 06:13:04 pm

Título: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 04, 2012, 06:13:04 pm
Código: [Seleccionar]
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>

using namespace std;

int main()
{

    char bin1[10];
    char* b1=0;
    char bin2[10];
    char* b2=0;
    int a,b;
    cout<<"Escriba el primer numero: ";
    gets(bin1);
    cout<<"Escriba el segundo numero: ";
    gets(bin2);
    a=strlen(bin1);
    b=strlen(bin2);
    //Comparar longitud    de las cadenas
    if(a>b)
    {
        cout<<"El numero mayor es: "<<bin1;
    }
    else if(a<b)
    {
        cout<<"El numero mayor es: "<<bin2;
    }
    //si ambas cadenas tienen el mismo tamaño.aqui se determina el mayor
    else
    {
    b1 = bin1;
    b2 = bin2;
while (*b1 != '\0' or *b1>*b2 or *b2<*b1)
{

    b1++;
b2++;
}
    if (*b1 > *b2)
{
cout<<"El mayor es : "<<bin1;
}
else if (*b1 < *b2)
{
cout<<"El mayor es : "<<bin2;
}
else
{cout<<"Son iguales";}
    }


}

Estoy tratando de crear un algoritmo para comparar dos numeros binarios y determine cual de ellos es el mayor, he he estado leyendo pero aun asi no lo consigo  :shock:,se que al codigo le falta bastantes mejoras pero la idea general del algoritmo es la siguiente.

-Si los dos numeros ingresados tiene diferente logitud de digitos.ej 1111 y 111 el mayor sera aquel que tenga mayor cantidad de digitos binarios(por eso utlizo strlen para contar la cantidad de caracteres de ambas cadenas).aun que claro si ingreso 0000111 dara por mayor a 111

-sii tengo dos numeros con igual cantida de digitos binarios ej 101 y 110 tendria que comparar digito a digito del mas significativo al menos significativo hasta que llegue al fin de la cadena y donde un caracter sea mayor que el otro alli se detenga la comparacion,para el caso seria hasta la segunda comparacion donde 1>0,por lo tanto el mayor seria 110. y alli el problema,aun no tengo bien claro los conceptos de estructuras de datos,esta parte solo la copie de por alli e internet
Código: [Seleccionar]
    if (*b1 > *b2)
{
cout<<"El mayor es : "<<bin1;
}
else if (*b1 < *b2)
{
cout<<"El mayor es : "<<bin2;
}
else
parece que va recorriendo caracter a caracter de cada cadena,pero al final siempre me tira que ambas cadenas son iguales.me podria alguien orientar sobre que tengo que ir  a leer para comparar caracteres de una cadena que sea numerica. se que hay una funcion que hace todo strcmp(o algo asi) pero no es mi idea hacerlo de esa forma puesto que no aprenderia mayor cosa

Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: rdoggsv en febrero 04, 2012, 06:46:59 pm
Man porque no haces un for que recorra cada posición de menor a mayor y que si es uno lo multiplique por la potencia de 2 y que lo sume a un total?

Sent from my E15i using Tapatalk
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: spion en febrero 04, 2012, 06:54:36 pm
Para mi forma de ver lo que deberias de hacer ahi es una funcion que evalue con la clase Math.max los dos datos que le das y que te retorne el mayor de ellos  :thumbsup:
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: haarp35 en febrero 04, 2012, 08:39:24 pm
Man porque no haces un for que recorra cada posición de menor a mayor y que si es uno lo multiplique por la potencia de 2 y que lo sume a un total?

Sent from my E15i using Tapatalk


en resumen que los pases a base 10 seria bueno y luego los compares acordate que cada posicion de un numero binario lo podes pasar a entero rapido si le aplicas el peso es decir multiplicas el dato por su posicion Ej: posicion uno lo elevas a cero ( 2^0 ) la siguiente posicion la elevas a 2 (2^1) la siguiente a 4 (2^2), la siguiente a 8 (2^3) y asi sucesivamente podrias hacerlo con un arreglo y recorrerlo sumando el resultado

corriganme si me equivoque xD
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 05, 2012, 12:05:07 pm
gracias por las sugerencias,en realidad es parte de una tarea que me han dejado. lo del valor posicional de cada digito seria una salida bastante rapida al problema. aun que lastima no me lo permitan de esa manera, transcribo lo que repondio el  docente cuando le preguntaron lo mismo
Citar
Claro que sí. Pueden tratar el dato de entrada como les parezca más apropiado.

No hay restricciones. Lo importante es que el programa sepa identificar cual de los dos números binarios introducidos es el mayor.

Si convierten primero los números binarios a decimal para compararlos, demostrarán falta de creatividad.
el problema es que no se como comparar cada posicion de las dos cadenas y decir cual de los dos es mayor.

usando el depurador de codeblock cuando ingreso pe 111 y 110 sucede lo que se muestra en el video adjunto. compara hasta el final de las dos cadenas y cuando quedan vacias logicamente las dos no tienen nada y por eso me sale que son iguales  :dumb:

Para mi forma de ver lo que deberias de hacer ahi es una funcion que evalue con la clase Math.max los dos datos que le das y que te retorne el mayor de ellos  :thumbsup:
ya casi me estoy frustrando por que no me salio como pensaba y ya llevo uan semana con eso,a as no haber con una funcion lo hare,aun que habria que ver de que forma hace la funcion esa comparacion quiza pueda sacar algo
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: rdoggsv en febrero 05, 2012, 02:50:43 pm
Por si te decidís hacerlo de la manera no "creativa" y sencillo pasándolos a decimales, estuve trabajando con esto y me parece que todo funciona bien.

Citar
rdoggsv@skynet ~/cplusplus
$ g++ compare.cpp -o compare.exe

rdoggsv@skynet ~/cplusplus
$ ./compare.exe
Por favor digite 1er numero: 10
Por favor digite 2ndo numero: 101010
Voy a comparar : 2 con 42
Resultado : 0b10/0d2 es menor que 0b101010/0d42

rdoggsv@skynet ~/cplusplus
$ ./compare.exe
Por favor digite 1er numero: 110
Por favor digite 2ndo numero: 0000111
Voy a comparar : 6 con 7
Resultado : 0b110/0d6 es menor que 0b0000111/0d7

rdoggsv@skynet ~/cplusplus
$ ./compare.exe
Por favor digite 1er numero: 10
Por favor digite 2ndo numero: 10
Voy a comparar : 2 con 2
Resultado : Ambos numeros son iguales

rdoggsv@skynet ~/cplusplus
$ ./compare.exe
Por favor digite 1er numero: 0110
Por favor digite 2ndo numero: 0011
Voy a comparar : 6 con 3
Resultado : 0b0110/0d6 es mayor que 0b0011/0d3

Código: [Seleccionar]
//Compare two binary numbers
#include <iostream>
#include <math.h>
#include <String>
using namespace std;

int int_compare(int, int);
bool bin_verify(string, string);
int bin_to_int(string);

int main () {
  string binary1, binary2;
  int number1, number2;
  int result;

  cout << "Por favor digite 1er numero: ";
  cin >> binary1;
  cout << "Por favor digite 2ndo numero: ";
  cin >> binary2;
 
  if(bin_verify(binary1, binary2)){
  number1 = bin_to_int(binary1);
  number2 = bin_to_int(binary2);
 
  cout << "Voy a comparar : " << number1 << " con " << number2 << endl;
 
  result = int_compare(number1, number2);
  if(result == 0){
  cout << "Resultado : Ambos numeros son iguales" << endl;
  }else if(result == 1){
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es mayor que 0b" << binary2 << "/0d" << number2;
  }else if(result == 2){
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es menor que 0b" << binary2 << "/0d" << number2;
  }else{
  cout << "ERROR *** No se ha logrado calcular";
  }
  }else{
  cout << endl << "ERROR *** Numeros no son binarios";
  return 1;
  }
 
  return 0;
}

int int_compare(int a, int b){
if( a == b ){
return 0;
}else if( a > b ){
return 1;
}else if( a < b){
return 2;
}else{
return -1;
}
}

bool bin_verify(string a, string b){
bool verified = true;

for( int i=0; i < a.length(); i++){
if(a[i] != '1' && a[i] != '0'){
verified = false;
}
}

for( int i=0; i < b.length(); i++){
if(b[i] != '1' && b[i] != '0'){
verified = false;
}
}

return verified;
}

int bin_to_int(string a){
int bin_size = a.length()-1;
float result = 0;

//cout << "Binary size " << bin_size << endl;

for(int bin_pos = bin_size ; bin_pos >= 0; bin_pos--){
if(a[bin_pos] == '1' ){
result += pow(2, bin_size-bin_pos);
}
}

return (int)result;
}

Disculpa la pasta de código, pero tengo siglos de no trabajar con c++ desde que estaba en la U, y la verdad que iba a puro prueba y error  :yao_ming:
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 05, 2012, 03:38:37 pm
Gracias por tu invaluable ayuda,apenas estoy llevando los primeros cursos de programacion y esta es una tarea de matematica discreta..lo importante es tener diferentes perspectivas de como abordar un problema ;) he aprendido mas de lo que creen con lo que me han aportado todos uds.
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: Jaru en febrero 05, 2012, 07:13:06 pm
"falta de creatividad" :haha: que ponga problemas con salidas no tan obvias mejor
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: rdoggsv en febrero 06, 2012, 09:56:06 am
"falta de creatividad" :haha: que ponga problemas con salidas no tan obvias mejor

Si man la verdad asaber que les están enseñando en la materia o simplemente el catedrático es bien maje, si a mi me dan papel y lapiz, y me dicen haga un algoritmo, o el procedimiento para calcular cuál de los dos es mayor, mentalmente los podes pasar a decimal y decidir cual es mayor, o simplemente verlos y hacer un calculo rápido si es que son bien diferentes.

Pero luego hay unos catedráticos que piden el procedimiento de como lo hiciste, entonces vendría y le pondría todas las potencias de 2 y sacaría los decimales para decirle cual es mayor/menor.

Pero quizás quiere algo más creativo como que lo pasen primero a hexa, y como a mil bases más, y al final llegue a decimal y le diga cuál es mayor?

Contanos robincracker que tema están viendo en mate discreta y tal vez logramos entender porque el tipo dice que sería falta de creatividad, tal vez es algún método diferente el que les están enseñando y en realidad el tipo lo único que quería es que lo hicieran así.
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 06, 2012, 11:31:08 pm
Bien en realidad no es que estemos estudiando programacion en esa materia ,mas bien esa tarea vino a cuenta por que se vieron algunas propiedades de los numeros binarios(que si el digito menos significativo es 1,entonces el equivalente en base diez seria impar y mas cosa que no vienen al caso) y en uno de los ejercicios de la guia aparecia uno que pedia :dados dos numeros binarios como determinar ¿cual de los dos es mayor?.aun que veo que ese ejercicio lo saco de este libro
http://www.macalester.edu/~hutchinson/book/alberts.pdf
(pag 13 ejercicio 9) pero alli esta mas delimitado el problema por que ya menciona sin convertirlo a base 10.
para el caso el problema con que me encontre es cuando los dos numeros base 2 tienen la misma cantidad de digitos ej 1111 y 1110 pensaba en que una forma es comparar digito a digito  las dos cadenas y en la posicion donde un digito fuera mayor que el otro dejar de iterar y obtener el mayor.para el caso 1=1,siguiente iteracion,nuevamente 1=1,de nuevo 1=1,otra vez, ahora 1>0, por lo que 1111 es mayor que 1110 que es lo mismo que hacemos cuando comparamos 15 y 14 en decimal,como las decenas son iguales,vemos las unidades y como 5>4, 15>14.

otro caso podria ser 110 y 101 solo habrian dos iteraciones del digito mas significativo(1=1) y la segunda (1>0) y luego el mayor seria 110.
Pero ya cuando lo paso a codigo es donde no me funciona el asunto y en parte es por que aun no dominio la parte de arreglos,punteros y en general estructura de datos. incluso pense que con la funcion strcmp me saldria facil,pero ayer que probe me di cuenta que con estos dos numeros(base 2) 11 y 101,me daba que el mayor es 11!
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: rdoggsv en febrero 07, 2012, 12:06:53 am
hey man ya ves que algo tenía de oculto el ejercicio, lo que pasa que tu catedratico cuando se lo robo, se le olvido ponerlo bien.

Entonces esta hasta más fácil, lo que tenes que hacer es quitar todos los 0 que esten antes de un 1. Digamos si tenes 111000 y 0001110, a l segunda le quitas todos los ceros que van en el origen y te queda 111000 y 1110, entonces es bien fácil decir que el que tiene más digitos es el mayor, porque tiene un 1 en una posición más significativa. Y todos los que estan antes de el no pueden llegar a sumar lo que el da, por lo tango la que tiene más digitoss siempre es mayor.

Y luego si tienen la misma longitud, haces lo que tu dices, los vas comparando posición por posición, y si son diferentes, haces una pausa y verificas cual de los 2 era 1, si el del primero o el del segundo, y ahí vas a tener tu mayor.
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 07, 2012, 12:37:48 am
mientras escribia la respuesta y leyendo tu respuesta me di cuenta que al aprecer mi problema estaba en esta parte

   while (*b1 != '\0' or *b1>*b2 or *b2<*b1)
   {

    b1++;
   b2++;
   }


lo acabo de retocar y ahora lo he dejado asi

Código: [Seleccionar]
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>

using namespace std;

int main()
{

    char bin1[10];
    char* b1=0;
    char bin2[10];
    char* b2=0;
    int a,b;
    cout<<"Escriba el primer numero: ";
    gets(bin1);
    cout<<"Escriba el segundo numero: ";
    gets(bin2);
    a=strlen(bin1);
    b=strlen(bin2);
    //Comparar longitud    de las cadenas
    if(a>b)
    {
        cout<<"El numero mayor es: "<<bin1;
    }
    else if(a<b)
    {
        cout<<"El numero mayor es: "<<bin2;
    }
    //si ambas cadenas tienen el mismo tamaño.aqui se determina el mayor
    else
    {
    b1 = bin1;
    b2 = bin2;
while (*b1 != '\0' and *b1==*b2)
{

    b1++;
b2++;
}
    if (*b1 > *b2)
{
cout<<"El mayor es : "<<bin1;
}
else if (*b1 < *b2)
{
cout<<"El mayor es : "<<bin2;
}
else
{cout<<"Son iguales";}
    }


}
y al parecer ya funciona como se debe.salvo que ahora cuando no son iguales,como la comparacion la hago pro el tamaño de la cadena(y no comparando  los valores numericos)alli ya me sale el problema que cuenta lso ceros cuando no son significativos,seguire leyendo haber que puedo hacer con eso,no se si la funcion atoi me pueda servir,solo espero que no sea muy complicado XD

Gracias pro tu ayuda me fue de utilidad,poco se de c++,pero buscando informacion de lo que no conozco es como voy aprendiendo
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: Jaru en febrero 07, 2012, 01:40:54 am
pues resulta que no tenia sueño y me puse a hacer esto (bien virgulilla me sentí)

http://jsfiddle.net/NEugY/5/embedded/result/ (http://jsfiddle.net/NEugY/5/embedded/result/)


aqui el código

http://jsfiddle.net/NEugY/5/ (http://jsfiddle.net/NEugY/5/)
Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: rdoggsv en febrero 07, 2012, 10:19:35 am
Mira esta nueva versión hace lo que te describí, tal vez te sirve, Hey me falto poner el caso en el que son iguales, tenes que agregar un IF para un return 0, ahí ese te queda de tarea  :D

Citar
rdoggsv@skynet ~/cplusplus
$ ./compare_bin.exe
Por favor digite 1er numero: 111000
Por favor digite 2ndo numero: 01111000
Voy a comparar : 56 con 120
Con una longitud de 6 y 7
Resultado : 0b111000/0d56 es menor que 0b01111000/0d120
rdoggsv@skynet ~/cplusplus
$ ./compare_bin.exe
Por favor digite 1er numero: 01111000
Por favor digite 2ndo numero: 111000
Voy a comparar : 120 con 56
Con una longitud de 7 y 6
Resultado : 0b01111000/0d120 es mayor que 0b111000/0d56
rdoggsv@skynet ~/cplusplus
$ ./compare_bin.exe
Por favor digite 1er numero: 111000
Por favor digite 2ndo numero: 000111
Voy a comparar : 56 con 7
Con una longitud de 6 y 3
Resultado : 0b111000/0d56 es mayor que 0b000111/0d7
rdoggsv@skynet ~/cplusplus
$ ./compare_bin.exe
Por favor digite 1er numero: 111000
Por favor digite 2ndo numero: 110111
Voy a comparar : 56 con 55
Con una longitud de 6 y 6
Resultado : 0b111000/0d56 es mayor que 0b110111/0d55

Código: [Seleccionar]
//Compare two binary numbers
#include <iostream>
#include <math.h>
#include <String>
using namespace std;

int int_compare(string, string);
int count_zeros(string);
bool bin_verify(string, string);
int bin_to_int(string);
int bin_compare(string, string);

int main () {
  string binary1, binary2;
  int number1, number2, sizebin1, sizebin2;
  int result;

  cout << "Por favor digite 1er numero: ";
  cin >> binary1;
  cout << "Por favor digite 2ndo numero: ";
  cin >> binary2;
 
  if(bin_verify(binary1, binary2)){
  number1 = bin_to_int(binary1);
  number2 = bin_to_int(binary2);
 
  cout << "Voy a comparar : " << number1 << " con " << number2 << endl;
 
  sizebin1 = binary1.length()-count_zeros(binary1);
  sizebin2 = binary2.length()-count_zeros(binary2);
 
  cout << "Con una longitud de " << sizebin1 << " y " << sizebin2 << endl;
 
  //result = int_compare(binary1, binary2);
 
  if(sizebin1 == sizebin2){
 
  result = bin_compare(binary1, binary2);
 
  if(result == 1){
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es mayor que 0b" << binary2 << "/0d" << number2;
  }else if(result == 2){
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es menor que 0b" << binary2 << "/0d" << number2;
 
 
  }else if(sizebin1 > sizebin2){
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es mayor que 0b" << binary2 << "/0d" << number2;
  }else{
  cout << "Resultado : 0b" << binary1 << "/0d" << number1 << " es menor que 0b" << binary2 << "/0d" << number2;
  }
  }else{
  cout << endl << "ERROR *** Numeros no son binarios";
  return 1;
  }
 
  return 0;
}

int int_compare(int a, int b){
if( a == b ){
return 0;
}else if( a > b ){
return 1;
}else if( a < b){
return 2;
}else{
return -1;
}
}

int bin_compare(string a, string b){

for(int i=0; i<a.length(); i++){
if(a[i] != b[i]){
if(a[i]=='1'){
return 1;
}else{
return 2;
}
}
}
return 0;
}

bool bin_verify(string a, string b){
bool verified = true;

for( int i=0; i < a.length(); i++){
if(a[i] != '1' && a[i] != '0'){
verified = false;
}
}

for( int i=0; i < b.length(); i++){
if(b[i] != '1' && b[i] != '0'){
verified = false;
}
}

return verified;
}

int bin_to_int(string a){
int bin_size = a.length()-1;
float result = 0;

//cout << "Binary size " << bin_size << endl;

for(int bin_pos = bin_size ; bin_pos >= 0; bin_pos--){
if(a[bin_pos] == '1' ){
result += pow(2, bin_size-bin_pos);
}
}

return (int)result;
}

int count_zeros(string a){
int result = 0;

for(int i=0; i<a.length(); i++){
if(a[i] == '0'){
result++;
}else{
break;
}
}

return result;
}

Título: Re: [Ayuda]Comparar dos numeros binarios y encontrar el mayor
Publicado por: robincracker en febrero 08, 2012, 09:58:39 pm
Muchas gracias a ambos,me han aclarado varias dudas que tenia.