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 - do-while

#471
¡Buenas!

Nunca dejará de sorprenderme la estupidez de los estadounidenses. Su mongolismo no tiene límites. A partir de ahora todos lo habitantes de New Jersey tendrán que comprarse una bola de cristal para saber si la persona a la que le envían el SMS está conduciendo o no. Hay que ser idiota...

¡Saludos!
#472
¡Buenas!

3 cosas:

Primero utiliza las etiquetas GeSHi para poner el código. Es el desplegable que hay al final de la primera fila de iconos en el modo de edición.

Segundo, pon los casos del switch en orden o te vas a volver loco tu, o nos vas a volver locos a nosotros buscando las etiquetas. Eso que tienes es un caos y no hay quién lo lea.

Tercero si el archivo tiene N bytes, no existe la posición N en un vector (la posición N es el elemento N+1), luego estás utilizando mal la condición de los for, ya que estás accediendo a una posición que no está dentro del vector.

Cambia eso y a ver que pasa.

¡Saludos!
#473
¡Buenas!

Lo primero que tienes que hacer es leer la información del archivo de texto. Necesitas saber manejar ficheros en modo texto.

Una vez que sepas abrir, cerrar y leer los datos del fichero, te hará falta manejar cadenas, ya que todos los campos de la clase/struct están en una cadena separada por guiones. Te recomiendo utilizar la función strtok (no se si la clase string tiene alguna función equivalente...)

Después de haber hecho todo lo anterior, solo te hace falta escoger el contenedor correcto de la STL e introducir los datos en el.

Toda la información para hacer lo arnterior la puedes encontrar en www.cplusplus.com

¡Saludos!
#474
Programación C/C++ / Re: Problema al compilar
28 Agosto 2013, 21:20 PM
Te faltan todos los subindices i

Si pones los errores que te da el compilador mucho mejor. Ahí te estará diciendo que falla.

Otra cosa que acabo de ver. Te falta devolver el valor de la función que hace el  producto. O quitas el devuelves un float o la declara con tipo de retorno void. De hecho en el prototipo dices que el valor de retorno es void y cuando implementas la función lo has puesto float. Creo que eso es todo...

¡Saludos!
#475
Programación C/C++ / Re: Problema al compilar
28 Agosto 2013, 20:23 PM
¡Buenas!

Así, a botepronto, no veo nada raro. De todas formas edita el post y mete el codigo entre las etiquetas correspondientes GeSHi, el desplegable que tendrás arriba a la derecha en el modo de edición, al final de la primera fila de iconos.

¡Saludos!
#476
¡Buenas!

Te veo un poco liada. En principio tienes las siguientes formas de declarar un vector:

tipo nombre[tamaño]; //vector sin inicializar
tipo nombre[tamaño] = {valor_1, valor_2, ... , valor_n}; //n < tamaño
tipo nombre[] = {valor_1, valor_2, ... , valor_n}; //vector de n elementos inicializado
tipo *nombre = {valor_1, valor_2, ... , valor_n};
char nombre[tamaño] = "una cadena con menos de tamaño-1 caracteres";
char nombre[] = "la cadena que tu quieras";
char *nombre= "la cadena que tu quieras";


Si utilizas un puntero o corchetes sin indicar un tamaño, el tamaño vendrá dado por la longitud de la lista de inicialización o si utilizas una cadena para inicialiar un vector de caracteres, por la longitud de dicha cadena. Si no inicializas el vector en el momento en el que lo declaras, solo tendrás un puntero a alguna parte de la memoria que no sabrás cual es. Si has utilizado la notación de corchetes este puntero no podrá modificarse, por lo que habrás conseguido tener un puntero que no te sirve para nada ( ;D) y si has utilizado la notación de puntero si que podrás apuntar a donde quieras, pero en principio no tendrás ningun valor almacenado ni el puntero apuntara a una zona de memoria en la que puedas almacenar información.

Si utilizas corchetes indicando un tamaño, tendras un conjunto de bytes en memoria donde puedas leer y escribir datos de forma segura, siempre y cuando no te salgas fuera de dicho tamaño. En el caso de las cadenas de caracteres recuerda que tienes un caracter adicional, '\0', que indica donde termina la cadena, por lo que como mucho podrás almacenar tamaño - 1 caracteres.

Si no te queda claro, avisa.

¡Saludos!
#477
¡Buenas!

Buf, que lío..., no porque el código esté mal (si te digo la verdad no lo he leído de forma detallada), sino porque utilizas muchas funciones para las conversiones. Si lo piensas detenidamente solo te hacen falta tres funciones para realizar cualquier conversión (realmente una sola función de conversión y dos funciones de apoyo).

Es largo para explicarlo paso por paso, así que te dejo un código para que veas la lógica:


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

//comprobamos que "representacion" sea un numero compuesto por cifras del primer parametro
int correcto(char *cifras, char *representacion, unsigned int base)
{
   char *posicion;
   int i;

   if(strlen(cifras) < 2 || base < 2 || base > strlen(cifras))
       return 0;

   for(i = 0 ; representacion[i] && (posicion = strchr(cifras , representacion[i])) && (posicion - cifras < base) ; i++);

   return !representacion[i];
}

//obtenemos el valor decimal de "representacion" que tendra que estar formado por cifras del primer parametro
unsigned long obtener_valor(char *cifras, char *representacion, unsigned int base)
{
   int i;
   unsigned long valor = 0;

   if(!correcto(cifras , representacion , base))
       return 0;

   for(i = 0 ; representacion[i] ; i++)
   {
       valor *= base;
       valor += strchr(cifras , representacion[i]) - cifras;
   }

   return valor;
}

//pasamos el numero "valor" a una representacion en la base "base"
char* obtener_representacion(char *cifras, unsigned long valor, unsigned int base)
{
   int i,j;
   static char representacion[33]; //hasta 32 bits
   char aux;

   for(i = 0 ; valor ; i++)
   {
       representacion[i] = cifras[valor % base];
       valor /= base;
   }

   representacion[i] = '\0';

   i--;

   for(j = 0 ; j < i ; j++,i--)
   {
       aux = representacion[i];
       representacion[i] = representacion[j];
       representacion[j] = aux;
   }

   return representacion;
}

//autoexplicativo...
char* cambiar_base(char *cifras, char *representacion, unsigned int base_inicial, unsigned long base_final)
{
   char aux;
   int i,j;
   unsigned long valor;

   if(!correcto(cifras,representacion,base_inicial))
       return NULL;

   if(base_final < 2 || base_final > strlen(cifras))
       return NULL;

   valor = obtener_valor(cifras,representacion, base_inicial);

   for(i = 0 ; valor ; i++)
   {
       representacion[i] = cifras[valor % base_final];
       valor /= base_final;
   }

   representacion[i] = '\0';

   i--;

   for(j = 0 ; j < i ; j++,i--)
   {
       aux = representacion[i];
       representacion[i] = representacion[j];
       representacion[j] = aux;
   }

   return representacion;
}

//cambiamos el conjunto de cifras del sistema numerico
char* intercambiar_cifras(char *cifras_antiguas, char *cifras_nuevas, char *representacion, unsigned int base)
{
   int i;

   if(!correcto(cifras_antiguas,representacion,base))
       return NULL;

   if(strlen(cifras_nuevas) < 2 || base < 2 || base > strlen(cifras_nuevas))
       return NULL;

   for(i = 0 ; representacion[i] ; i++)
       representacion[i] = cifras_nuevas[strchr(cifras_antiguas,representacion[i]) - cifras_antiguas];

   return representacion;
}

int main(int argc, char *argv[])
{
   unsigned long valor = 10023629;
   char cadena[50];// = "10023629";
   char cifras1[] = "0123456789ABCDEFGHIJKLMONPQRSTUVWXYZ";
   char cifras2[] = "1aH0KLy26Au3Uwq!·$%&/()=?¿[]{}-_.:,;";

   //convertimos el valor inicial en una representacion en base 6
   strcpy(cadena,obtener_representacion(CIFRAS,valor,6));

   printf("%s:6\n",cadena);

   //obtenemos el valor en decimal y lo mostramos
   printf("%lu:10\n",obtener_valor(cifras1,cadena,6));

   //realizamos distintas conversiones y vemos que todo va bien
   printf("%s:16\n",cambiar_base(cifras1,cadena,6,16));
   printf("%s:10\n",cambiar_base(cifras1,cadena,16,10));
   printf("%s:7\n",cambiar_base(cifras1,cadena,10,7));
   printf("%s:6\n",cambiar_base(cifras1,cadena,7,6));
   printf("%s:2\n",cambiar_base(cifras1,cadena,6,2));
   printf("%s:8\n",cambiar_base(cifras1,cadena,2,8));
   printf("%s:10\n",cambiar_base(cifras1,cadena,8,10));
   printf("%s:25\n",cambiar_base(cifras1,cadena,10,25));

   //y para terminar cambiamos las cifras del sistema numerico
   printf("%s\n",intercambiar_cifras(cifras1,cifras2,cadena,25));

   //y comprobamos que el numero sigue siendo el mismo:
   printf("%lu\n",obtener_valor(cifras2,cadena,25));

   return 0;
}


A parte de las funciones de comprobación, conversión y de cambio de base, he añadido una función que te convierte un unsigned long en una cadena que representa el número en la base que le indiques, y una segunda función que cambia la representación de las cifras de una base (esta última puede ser divertida...)

¡Saludos!

PD: Este código de aqui arriba tiene una pega muy grande. Tienes que estar acordandote en todo momento de cual ha sido la ultima base utilizada y del conjunto de cifras que has utilizado, por lo que te recomendaría utilizar un struct para guardar toda esa información. Por ejemplo:

struct BasesNumericas
{
   char *representacion;
   char *cifras;
   unsigned int base;
};


y podrías utilizarla como sigue:



int main(int argc, char *argv[])
{
   struct BasesNumericas datos;
   unsigned long valor = 10023629;
   char cadena[50];// = "10023629";
   char cifras1[] = "0123456789ABCDEFGHIJKLMONPQRSTUVWXYZ";
   char cifras2[] = "1aH0KLy26Au3Uwq!·$%&/()=?¿[]{}-_.:,;";

   //guardamos los datos que vamos a utilizar
   datos.representacion = cadena;
   datos.cifras=cifras1;
   //...

   //convertimos el valor inicial en una representacion en base 6
   strcpy(cadena,obtener_representacion(CIFRAS,valor,6));

   printf("%s:6\n",cadena);

   //obtenemos el valor en decimal y lo mostramos
   printf("%lu:10\n",obtener_valor(cifras1,cadena,6));

   //realizamos distintas conversiones y vemos que todo va bien
   //despues de cada una de las operaciones, o mejor despues de la ultima
   //guardamos en datos.base la ultima base utilizada.

   printf("%s:16\n",cambiar_base(cifras1,cadena,6,16));
   printf("%s:10\n",cambiar_base(cifras1,cadena,16,10));
   printf("%s:7\n",cambiar_base(cifras1,cadena,10,7));
   printf("%s:6\n",cambiar_base(cifras1,cadena,7,6));
   printf("%s:2\n",cambiar_base(cifras1,cadena,6,2));
   printf("%s:8\n",cambiar_base(cifras1,cadena,2,8));
   printf("%s:10\n",cambiar_base(cifras1,cadena,8,10));
   printf("%s:25\n",cambiar_base(cifras1,cadena,10,25));

   //y para terminar cambiamos las cifras del sistema numerico
   printf("%s\n",intercambiar_cifras(cifras1,cifras2,cadena,25));

   //nos apuntamos cual ha sido el ultimo conjunto de cifras usado
   datos.cifras=cifras2;

   //y comprobamos que el numero sigue siendo el mismo:
   printf("%lu\n",obtener_valor(cifras2,cadena,25));

   return 0;
}


¡Saludos!

Y ahora incluso podrías modificar las funciones para que reciban como parámetro un struct de estos, y ajustar los campos del struct dentro de las funciones de forma automática...

PD2: El código se puede hacer mas general todavía, si observamos que para construir el número no es necesario saber cual es la cifra que hay en una determinada posición, sino que lo que realmente importa es la posición que ocupa la cifra dentro del conjunto de cifras que estamos manejando.

Por lo tanto nos bastaría con tener una representación del numero en la que cada posición indique el indice de la cifra dentro de un conjunto de cifras, así se consigue hacer independiente la representación del número del conjunto de cifras que se utilizan.

Por ejemplo la cantidad 10 en base 3 con cifras decimales será 101, pero si en lugar de las cifras decimales utilizamos el conjunto de cifras {a,b,c} dicha representación será bab, por lo que internamente solo importa la posición de las cifras y el número se puede representar como una lista de indices enteros int indices[] = {1,0,1};. Así si tenemos un conjunto de cifras char cifras[] = {primera_cifra, segunda_cifra, tercera_cifra,...,'\0'};, para obtener la representación del número con este conjunto de cifras solo tendremos que hacer char representacion[] = {cifras[indice[0]],cifras[indice[1]],cifras[indice[2]],'\0'};, y nos podemos olvidar de pasar a las funciones los conjuntos de cifras que queremos utilizar.

Esta forma de hacer las cosas es mas general y mas abstracta, pero evita las limitaciones de trabajar con un conjunto determinado de cifras y te permite poder crear funciones "sencillas" para realizar las operaciones aritméticas básicas, ya que solo te hará falta controlar el indice de cada cifra, por lo que con operaciones de modulo y con una variable acumulador podrás realizarlas.

Ejemplo de suma en base 3:
[1][0][2] + [2][1][2]

2 + 2 = 4 --> 4/3 = 1 --> acumulador = 1, 4%3 = 1 ---> Acumulador = 1, ultimo índice = 1

0 + 1 + acumulador = 1 --> acumulador = 1/3 = 0, penúltimo índice = 1%3 = 1

1 + 2 + acumulador = 3 --> acumulador = 3/3 = 1, segundo índice = 3%3 = 0

0 + 0 + acumulador = 1 --> acumulador = 1 / 3 = 0, primero índice = 1%3 = 1

acumulador = 0. Hemos terminado. El conjunto de índice que representa la suma es {1,0,1,1}

Luego con las cifras {abc} la representación será babb, y con cifras decimales 1011

¡Saludos!
#478
¡Buenas!

Todo eso de les presionan es una patraña. Con la cantidad de dinero que maneja Google, si está mal en estados unidos, puede cambiar perfectamente la sede a otro país en el que no le "obliguen" a "ceder" datos al gobierno/agencia de seguridad correspondiente.

Si está espiando es porque quiere, y lo que va a conseguir, si la gente no es estupida (cada vez dudo mas de esto...) es que se dejen de usar sus productos. Yo mismo estoy esperando con ganas a que acaben de una vez una versión de Replicant que se pueda usar. Hasta entonces me tendré que conformar con Android, creo que es el único producto de Google que estoy utilizando en este momento, hasta que pueda tener un movil con FirefoxOS o, con un poco de suerte, ya con Replicant.

¡Saludos!
#479
Programación C/C++ / Re: tamaño de un arreglo
24 Agosto 2013, 22:26 PM
¡Buenas!

Tienes que tener cuidado con el tema del tamaño de los vectores. Si haces un sizeof del vector dentro de su alcance (o scope, como prefieras) te dará el tamaño total en bytes del vector. Pero si aplicas el sizeof al parámetro de una función, aunque se declare como un vector, solo te dará el tamaño de un puntero al tipo de dato que contenga el vector.

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

int tam_vector(int v[])
{
    return sizeof(v);
}

int main(int argc, char *argc[])
{
    int vector[10];

    printf("Tamaño dentro de scope: %d\n",sizeof(vector));
    printf(" Tamaño fuera de scope: %d\n",tam_vector(vector));

    while(getchar() != '\n');

    return 0;
}


¡Saludos!
#480
Foro Libre / Re: Vendo unos cuantos libros.
23 Agosto 2013, 11:44 AM
Cita de: topomanuel en 22 Agosto 2013, 23:15 PM
Que vergüenza... un informático rebajandose a vendedor de libros usados... jajajajajaaaa....

No se que le ves de malo al asunto, tal y como están las cosas de alguna manera se tiene que ganar la vida un informático...  :xD

¡Saludos!