elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 02:57  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Programa algoritmo multiplicación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa algoritmo multiplicación  (Leído 640 veces)
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Programa algoritmo multiplicación
« en: 26 Diciembre 2011, 16:04 »

He hecho un programa que resuelve la multiplicación tal y como lo haríamos sin calculadora, es decir, por ejemplo:

 222
 x22
 ___
 444
444
____
4884

Mi código es el siguiente:

Código
#include <stdlib.h>
#include <stdio.h>
 
int main (void){
 
   int n1,n2,n3,n4,n5,a,b,c;
 
   printf("PRIMER NUMERO ");
   printf("introduce el primer numero");
   scanf("%d", &n1);
 
 
 
    printf("SEGUNDO NUMERO ");
 printf("introduce la primera cifra");
 
 scanf("%d", &n4);
 
     printf("introduce la segunda cifra");
   scanf("%d", &n5);
 
a=n5*n1;
b=n4*n1;
c=a*10+b;            
 
printf(" %d  \n", n1 );
printf(" x %d%d \n", n4, n5 );
printf("________ \n");
printf(" %d   \n", a );
printf("%d   \n", b);
printf("________ \n");
printf("%d", c);
 
 
system("pause");
 
}
 
 
 
 
 
 
 
 

Si os fijáis, he hecho que el programa pregunte al principio el primer número, pero que, al preguntar el segundo, lo pregunte separado, es decir, primera cifra, y segunda (el segundo número debe ser solo de dos cifras).

Mi problema es que no sé si se podrá hacer que, al escribir, por ejemplo "23" sepa que la primera cifra es 2, y la segunda; 3. Así creo que quedaría más completo y correcto, pero no sé si se puede hacer...

Muchas gracias.

Saludos.


« Última modificación: 26 Diciembre 2011, 16:21 por DickGumshoe » En línea
Ferno

Desconectado Desconectado

Mensajes: 282


Ver Perfil
Re: Programa algoritmo multiplicación
« Respuesta #1 en: 26 Diciembre 2011, 16:07 »

Bien!
¿Piensas mostrar el código o tienes algún problema en particular?


En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #2 en: 26 Diciembre 2011, 16:09 »

Lo siento, había escrito un mensaje completo con mi código y mi problema, pero veo que no ha salido bien...

En seguida lo edito.

Lo siento.
En línea
Ferno

Desconectado Desconectado

Mensajes: 282


Ver Perfil
Re: Programa algoritmo multiplicación
« Respuesta #3 en: 26 Diciembre 2011, 16:30 »

Si puedes. Una manera es leer el número como si fuese un string, y luego manejar el string como un arreglo, separando las cifras (sabes que array[0] será la primer cifra, y array[1] será la segunda cifra). Te doy la idea, trata de implementarla!

Otra cosa, al final del main debes retornar un valor, como bien declaraste, la función main devuelve un int.

Código
system("pause");
return 0;
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #4 en: 26 Diciembre 2011, 16:40 »

Si puedes. Una manera es leer el número como si fuese un string, y luego manejar el string como un arreglo, separando las cifras (sabes que array[0] será la primer cifra, y array[1] será la segunda cifra). Te doy la idea, trata de implementarla!

Otra cosa, al final del main debes retornar un valor, como bien declaraste, la función main devuelve un int.

Código
system("pause");
return 0;

Muchas gracias. Intentaré hacerlo de esa forma.

Muchísimas gracias.

Saludos.
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #5 en: 26 Diciembre 2011, 17:24 »

Lo que acabo de hacer es esto:

Código
#include <stdlib.h>
#include <stdio.h>
 
int main (void){
 
   int n1,n2,n3,n5,n6,a,b,c;
 
   printf("PRIMER NUMERO ");
   printf("introduce el primer numero");
   scanf("%d", &n1);
 
 
char n4[3];
 
    printf("SEGUNDO NUMERO ");
 printf("introduce la primera cifra");
 
 scanf("%d", &n4);
 
 
 
 
b=n4[0]*n1;
a=n4[1]*n1;
c=a*10+b;            
 
printf(" %d  \n", n1 );
printf(" x %d%d \n", n4[0], n4[1] );
printf("________ \n");
printf(" %d   \n", a );
printf("%d   \n", b);
printf("________ \n");
printf("%d", c);
 
 
system("pause");
return 0;
 
 
 
}
 
 
 
 

El resultados de las multiplicaciones da bien, pero no está bien hecho el algoritmo.

Cuando poner primer número 222 y segundo 22, debe hacer esto:

   222
   x22
   ___
   444
  444
  ____
  4884

Pero no; hace esto:

   222
  x  220
  _______
  0
  4884
  _______
  4884

No sabía usar las cadenas; ahora sé más o menos.
Tampoco sé porque lo que aprendo lo cojo de los apuntes de mi hermana(que, por cierto, está estudiando matemáticas, pero tiene informática obligatoriamente...).

Volviendo al tema... ¿Estoy usando bien las cadenas? ¿Me falta o me sobra algo?

Bueno, muchas gracias.

Saludos.

« Última modificación: 26 Diciembre 2011, 19:30 por DickGumshoe » En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #6 en: 26 Diciembre 2011, 18:46 »

Lo que pasa es que son caracteres... no numeros... revisate la tabla ASCII, por ejemplo, cuando escribes 4 el indice de n4[0] no sera un valor 4 sera SU VALOR EN ASCII...

Me desvele haciendote estas funciones para extraer un digito X de un numero tipo signed/unsigned int.

Código
 
int extracNumFromUInt(unsigned int iVal, unsigned int index);
int extracNumFromInt(int iVal, unsigned int index);
int getLengthOfUInt(unsigned int iVal);
int getLengthOfInt(int iVal);
 
/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/

int getLengthOfUInt(unsigned int iVal)
{
   int i = 1;
   while (iVal /= 10)
       i++;
   if (iVal % 10)
       i++;
   return i;
}
 
/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/

int getLengthOfInt(int iVal)
{
   return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
}
 
/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/

int extracNumFromInt(int iVal,          //  Numero Deseado.
                    unsigned int index //  El Indice es de Izquierda a Derecha...
                   )
{
   return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
                    index);
}
 
/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/

int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
                    unsigned int index    //  El Indice es de Izquierda a Derecha...
                   )
{
   int iSize = getLengthOfUInt(iVal);
   int iRet = iVal,
       i = 0;
 
   if (index > iSize)                  //  ¿Indice Erroneo?.
       return ~0;
   index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
   if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
   {
       for (i = 0; i < index; ++i)     //  Removemos
           iRet /= 10;
       for (i = 0; i < (index); ++i)   //  suplantamos por 0's
           iRet *= 10;
       iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
   }
   iSize = getLengthOfUInt(iRet);
   if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
       for (i = 1; i < index; ++i)
           iRet /= 10;                 //  Eliminamos...
   return iRet;                        //  Retornamos.
}
 
/// EntryPoint
int main(int argc, char *argv[])
{
   int i = 0;
   int iVal = -4898456;
 
   printf("%d\n", iVal);
 
   for (i = 0; i < getLengthOfInt(iVal); ++i )
       printf("%d\n", extracNumFromInt(iVal, i));
 
   getchar();
 
   return EXIT_SUCCESS;
}
 
 

Temibles Lunas!¡.
« Última modificación: 26 Diciembre 2011, 18:59 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #7 en: 26 Diciembre 2011, 19:37 »

Lo que pasa es que son caracteres... no numeros... revisate la tabla ASCII, por ejemplo, cuando escribes 4 el indice de n4[0] no sera un valor 4 sera SU VALOR EN ASCII...

Me desvele haciendote estas funciones para extraer un digito X de un numero tipo signed/unsigned int.

Código
 
int extracNumFromUInt(unsigned int iVal, unsigned int index);
int extracNumFromInt(int iVal, unsigned int index);
int getLengthOfUInt(unsigned int iVal);
int getLengthOfInt(int iVal);
 
/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/

int getLengthOfUInt(unsigned int iVal)
{
   int i = 1;
   while (iVal /= 10)
       i++;
   if (iVal % 10)
       i++;
   return i;
}
 
/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/

int getLengthOfInt(int iVal)
{
   return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
}
 
/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/

int extracNumFromInt(int iVal,          //  Numero Deseado.
                    unsigned int index //  El Indice es de Izquierda a Derecha...
                   )
{
   return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
                    index);
}
 
/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/

int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
                    unsigned int index    //  El Indice es de Izquierda a Derecha...
                   )
{
   int iSize = getLengthOfUInt(iVal);
   int iRet = iVal,
       i = 0;
 
   if (index > iSize)                  //  ¿Indice Erroneo?.
       return ~0;
   index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
   if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
   {
       for (i = 0; i < index; ++i)     //  Removemos
           iRet /= 10;
       for (i = 0; i < (index); ++i)   //  suplantamos por 0's
           iRet *= 10;
       iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
   }
   iSize = getLengthOfUInt(iRet);
   if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
       for (i = 1; i < index; ++i)
           iRet /= 10;                 //  Eliminamos...
   return iRet;                        //  Retornamos.
}
 
/// EntryPoint
int main(int argc, char *argv[])
{
   int i = 0;
   int iVal = -4898456;
 
   printf("%d\n", iVal);
 
   for (i = 0; i < getLengthOfInt(iVal); ++i )
       printf("%d\n", extracNumFromInt(iVal, i));
 
   getchar();
 
   return EXIT_SUCCESS;
}
 
 

Temibles Lunas!¡.

Perdón, pero... Soy muy principiante en C... Y no entiendo eso que acabas de hacer... No sé qué son los códigos ASCII, a pesar de que he estado mirando en Internet las cadenas (y no venía nada de eso...)

Muchas gracias.

Saludos
En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #8 en: 26 Diciembre 2011, 19:56 »

No me cites un tema de manera consecutiva se ve orrendo el hilo...

enserio buscaste?

https://encrypted.google.com/search?q=ascii&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-ES:official&client=firefox-a

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #9 en: 26 Diciembre 2011, 20:00 »

Lo que he mirado en internet son las cadenas. De los códigos ASCII he visto una tabla, pero tanto el valor en decimal como en decimal en los números 0, 1, 2, 3 y 4 son iguales. Y después me pone cosas como "delete, null", que no sé para qué valen...
En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #10 en: 26 Diciembre 2011, 21:43 »



Los numeros del 0 al 9 empiesan desde 48... es decir un cada indice te retorna el ascii..

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines