Buscador Elinv.

Búsqueda personalizada

miércoles, 6 de abril de 2011

Programa suma y resta de numeros binarios por Elinv.

---> Aquí te dejamos un código que hemos realizado en Visual C++ 2008 - expresamente a tu pedido

:arrow: Encontrarás como util, que te pide que ingreses los dos números, y que si ingresas letras o números no binarios, los ignora y te termina mostrando solo los valores binarios.

:arrow: En este caso es solamente la suma de dichos valores.

:arrow: No hemos realizado la resta, pues te dejamos ese desafío para vos, habida cuenta que tienes una referencia en este proyecto de suma.

:arrow: Te pediríamos a cambio si eres tan amable, si logras desarrollar la resta de los numeros binarios, que lo subas a este foro y lo compartas con todos.

:arrow: Si no logras realizarlo, luevo de varias intentonas, envianos un mail y con gusto te acercamos el código o las sugerencias al que estes haciendo.

:arrow: Bueno aquí va el código....
--------------------------------------------------------------------------


#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
//declaramos variable - matrices
char cadena[30],bufferuno[20],bufferdos[20],buffertotal[20];
//declaramos variabloes para los contadores
int i=0,n=0;
cout << "Funcion SUMA de numeros BINARIOS: ";
cout <<'\n';
cout << "-----------------------------------";
cout <<'\n';
//Se pide el primer numero y se asigna a la variable cadena
cout << "Introduce numero 1: "; cin >> cadena;
//Salto de linea
cout <<'\n';
//Se recorre la matriz
while(cadena[i]){
//Si es el '0' o el '1'
if((cadena[i] < 50)&&(cadena[i] > 47)){
//Se carga en la matriz del bufferuno
bufferuno[n]=cadena[i];
//Se aumenta el contador de esta matriz
n++;
}
//Se aumenta el contador de la matriz 'cadena'
i++;
}
//Ponemos contador a cero
i=0;
n=0;
//pedimos el siguiente número
cout << "\n Introduce numero 2: "; cin >> cadena;
cout <<'\n';
while(cadena[i]){
if((cadena[i]<50)&&(cadena[i]>47)){
bufferdos[n]=cadena[i];
n++;
}
i++;
}
cout <<'\n';
//Declaramos variables para establecer el largo de los binarios uno y dos
int uno=1,dos=1;
//Recorremos la matriz del bufferuno y bufferdos
for(i=1; i<=20; i++){
if ((bufferuno[i]=='0')||(bufferuno[i]=='1'))
uno++;
}
for(i=1; i<=20; i++){
if ((bufferdos[i]=='0')||(bufferdos[i]=='1'))
dos++;
}
//Buscamos el valor mas alto, y la diferencia entre ambos
int masalto=0;
int diferencia=0;
if(uno > dos){
masalto = uno-1;
diferencia=uno - dos;
}else if (dos > uno){
masalto=dos-1;
diferencia=dos - uno;
}else{
masalto=uno-1;
}
//Si existe diferencia de tamaños entre ambas matrices
//ajustamos los tamaños
if(diferencia != 0){
//declaramos una matriz provisoria
char provisorio[20];
//Para la formacion de esta matriz provisoria, recorremos hasta el valor
//mas alto de las matrices que contienen los números binarios ingresados
//por el operador
for(i=0; i<=masalto; i++){
//Si 'i' es menor a la diferencia <tener en cuenta que comienza el contador desde cero>
if (i < diferencia){
//El valor del elemento 'i' de provisorio es CERO
provisorio[i] = '0';
//Caso contrario, es decir si 'i' es igual o mayor a diferencia
}else{
//Si la matriz uno es mayor a la dos...
if (uno > dos){
//El elemento 'i' de la matriz provisorio es igual al
//elemento 'i' menos la diferencia de la matriz bufferdos
provisorio[i] = bufferdos[i-diferencia];;
//Si la matriz dos es mayor a la uno...
}else if(dos > uno){
//El elemento 'i' de la matriz provisorio es igual al
//elemento 'i' menos la diferencia de la matriz bufferuno
provisorio[i] = bufferuno[i-diferencia];
}}
}
//seguimos dentro del if DIFERENCIA distinto a CERO
//Reconstituimos el buffer que corresponda
for(i=0; i<=masalto; i++){
if (dos < uno){
bufferdos[i] = provisorio[i];
}else if(uno < dos){
bufferuno[i] = provisorio[i];
}
}}
//Termina el if DIFERENCIA distinto a CERO
//de esta manera cuando existe diferencia de tamaño entre los números binarios
//ingresados, se añaden al menor de ellos, tantos CEROS como se necesiten para
//hacer la comparación que logra la suma final.
//Se podría obtener el tamaño de la matriz, pero te muestra
//la dimensión de inicio
//cout << "Tamano de buffer uno y dos: " << sizeof (bufferdos) << endl;
//cout << '\n';
//Aquí comienza la rutina para la suma de los binarios
//variable de arrastre necesaria, para la premisa si se estan sumando dos UNO.
int arrastre = 0;
//vamos a la suma
for(i=masalto; i>=0; i--){
//Si el elemento 'i' de la primera matriz es igual a '0'
//y el elemento 'i' de la segunda matriz también...
if ((bufferuno[i] == '0')&&(bufferdos[i] == '0')){
//y la variable arrastre es igual a '0', entonces
//la nueva matriz que se esta formando 'buffertotal' con 'i+1' es CERO, sino es UNO
//la nueva matriz es 'i+1' por si los dos primeros elementos de las matrices que
//se suman son unos, con lo cual a esta matriz habría que agregarle un elemento
//al principio, para evitar esto, se lo dejamos disponible por si acaso.
if (arrastre == 0){buffertotal[i+1]='0';arrastre =0;}else{buffertotal[i+1]='1';arrastre = 0;}
//Si el elemento 'i' de la primera matriz es igual a '0'
//y el elemento 'i' de la segunda matriz es igual a '1'
}else if((bufferuno[i] == '0')&&(bufferdos[i] == '1')){
//y la variable arrastre es igual a '0', entonces
//la nueva matriz que se esta formando 'buffertotal' con 'i+1' es UNO, sino es cero
//la nueva matriz es 'i+1' por si los dos primeros elementos de las matrices que
//OBSERVAR: en este caso que si se otorga el valor CERO, la variable arrastre adquiere el valor UNO
//sino se mantiene en CERO
if (arrastre == 0){buffertotal[i+1]='1';arrastre =0;}else{buffertotal[i+1]='0';arrastre = 1;}
//Si el elemento 'i' de la primera matriz es igual a '1'
//y el elemento 'i' de la segunda matriz es igual a '0'
}else if((bufferuno[i] == '1')&&(bufferdos[i] == '0')){
//y la variable arrastre es igual a '0', entonces
//la nueva matriz que se esta formando 'buffertotal' con 'i+1' es UNO, sino es cero
//la nueva matriz es 'i+1' por si los dos primeros elementos de las matrices que
//OBSERVAR: en este caso que si se otorga el valor CERO, la variable arrastre adquiere el valor UNO
//sino se mantiene en CERO
if (arrastre == 0){buffertotal[i+1]='1';arrastre =0;}else{buffertotal[i+1]='0';arrastre = 1;}
//Si el elemento 'i' de la primera matriz es igual a '1'
//y el elemento 'i' de la segunda matriz es igual a '1'
}else if((bufferuno[i] == '1')&&(bufferdos[i] == '1')){
//El valor de la matriz es igual a CERO y la variable arrastre a UNO.
buffertotal[i+1]='0';
arrastre = 1;
//esta condicional es para el ultimo elemento del ciclo y primero de las matrices.
//Si al llegar a esta instancia el arrastre es UNO, al primer elemento de la matriz
//buffertotal, se le asigna el valor UNO, caso contrario quedará allí un caracter NULO
if ((i==0)&&(arrastre ==1)){
buffertotal[i]='1';
masalto++;
}
}}
//Aquí controlamos que no se impriman los valores nulos de la matriz generada para los totales.
cout << "La suma de los numeros ingresados es: ";
for(i=0; i<=masalto+1; i++){
if ((buffertotal[i]=='0')||(buffertotal[i]=='1'))
cout << buffertotal[i];
}
cout << '\n';
//Paramos el sistema para mostrar los sucesos.
system("PAUSE");
return EXIT_SUCCESS;
}
----------------------------------------------------

:arrow: Bueno como podes observar esta suficientemente documentado en aclaraciones.