Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DickGumshoe

#441
Cita de: BlackZeroX (Astaroth) en 26 Diciembre 2011, 18:46 PM
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.



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
#442
Lo que acabo de hacer es esto:

#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.

#443
Cita de: Ferno en 26 Diciembre 2011, 16:30 PM
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.

system("pause");
return 0;


Muchas gracias. Intentaré hacerlo de esa forma.

Muchísimas gracias.

Saludos.
#444
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.
#445
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:


#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.
#446
¡Hola!

Mi programa es el siguiente: tienes 100 euros, y apuestas una cantidad (como mínimo, 10 euros). Después, el ordenador piensa un número del 1 al 6, si introduces el correcto, lo que has apostado se multiplica por 6 y lo sumas a lo que tenías.

Ayer me estaba saliendo bien, pero estuve haciendo algunos cambios, y ahora no me sale la primera parte.

Ahora introduzco un número mayor que 10 y menos de 100 euros al principio, y me da como válido algunos resultados, otros no.

El programa es:

//Juego de apuestas que no sé por qué no funciona bien

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main (void){
   
int bolsa, apuesta, dado, apminima, opcion, n;

  srand(time(NULL));
 
  bolsa=100;
  apminima=10;
 
   
  printf("\a\nTienes %d euros. La apuesta minima son %d euros", bolsa,apminima);
  printf ("\n\nEscriba su apuesta");
  scanf("%d",&apuesta);
 
  do{
 
  do{
  printf ("\nEscriba su apuesta");
  scanf("%d",&apuesta);
  }
  while ((apminima>apuesta) || (apuesta>bolsa));
 
  bolsa=bolsa-apuesta;
 
  do{
  printf("Escriba el numero por el que apuesta");
  scanf("%d",&n);                   
  }
  while((n>6) || (n<1));
 
  dado=1+ rand()%6;
 
  if (dado==n) bolsa=bolsa+6*apuesta;
 
  printf("Apostaste por el numero %d y ha salido %d. Su bolsa tiene ahora %d euros", n,dado,bolsa);
 
  if(bolsa>=apminima){
 
  do{
  printf("Escriba 1 si quiere seguir jugando o 0 si quiere abandonar la partida");
  scanf("%d",&opcion);                 
  }
  while ((opcion!=0)&&(opcion!=1));
 
  }

}
  while((opcion==1)&&(bolsa>=apminima));
 
  printf("\nHasta la proxima");
  printf("\n");


   system("pause");


}


Muchas gracias.
#447
Me parece que es porque "unsigned amigos" (y el resto), va dentro de int main().
#448
Programación C/C++ / Re: ayuda Dev-c++
14 Noviembre 2011, 18:50 PM
Ehmm... ¿No te lo toma en cuenta? Yo pongo 3 y 3, y me lo suma bien; me da 6...
#449
Cita de: rir3760 en 14 Noviembre 2011, 02:50 AM
Tal vez si o tal vez no (depende del tipo de valor y de los objetos en cuestión). Ese es el problema: ya que no hay una forma realmente genérica para realizar el intercambio (al menos no en C estándar) lo mejor es utilizar una variable temporal y dejarle el resto al compilador.

Te recomendaría que no hicieras eso: "tasajear" código para "ver que pasa" y en base al resultado sacar conclusiones. Ello porque si cometes un error en C eso resulta en "comportamiento no definido", en buen cristiano cualquier cosa puede pasar, por ejemplo:

A) El programa revienta
B) Se quema la PC
C) Te deja la novia/amiga con privilegios/etc.
D) Lo peor: todo funciona de maravilla.

Es usualmente el ultimo caso el que da problemas: le das el programa a tu profesor/tutor/etc. y resulta que el bendito programa no funciona en su PC.

Mejor consigue un buen libro y aprende en base a el (y foros como este).

Un saludo

Bueno, eso lo hice pensando, solo que no era correcto, y por eso daba error. En realidad no metí eso por probar.

Muchas gracias a todos por haber resuelto mi duda ^^
#450
Cita de: BlackZeroX (Astaroth) en 13 Noviembre 2011, 20:56 PM
Con eso provocacias un OverFlow con valores grandes...



inline void swap(void* pv1, void* pv2) {
    *((int*)pv1) ^= *((int*)pv2);
    *((int*)pv2) ^= *((int*)pv1);
    *((int*)pv1) ^= *((int*)pv2);
}



o



#define swap(pv1,pv2) pv1 ^= pv2; pv2 ^= pv1; pv1 ^= pv2;



Dulces Lunas!¡.

Ya... Lo que pasa que el código del "xor" todavía no lo he dado (tengo 13 años y estoy estudiando con unos apuntes que hay en una web), así que por ahora no lo podré hacer así. Cuando llegue a esa parte, usaré el otro código.

Muchas gracias a todos.