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 - Miky Gonzalez

#81
Hola, tengo un pequeño problema que no soluciono:
Tengo (por ejemplo) la siguiente funcion: funcion main(int argc, char **argv).
Y tengo por ejemplo: si (argv[1] == "argumento1"); se escribio un argumento.
Pero como puedo hacer para buscar por ejemplo si se ha contenido en la lista de argumentos el argumento -e por ejemplo para especificar algo, es decir podria hacer: prog.exe a -e; u otro ejemplo prog.exe -e a.
Es decir que sepa si se ha especificado el argumento buscandolo.. intente con strcmp pero nose como hacer para buscar en todos los posibles argumentos que haya puesto
#82
Un generador de todas la posibles combinaciones dadas desde los parametros (de momento no) de las letras que estan en la variable caracteres (a..z)
Ejemplo (suponiendo que son la a, b, c):
a     aa     ba     ca
b     ab     bb     cb
c     ac     bc      cc

Y asi hasta el numero de longitud definido (siempre empieza de 1: a, b, c): Entonces si defino el numero de longitud a 3 acabaria en ccc: a .... ccc
#83
Estoy haciendo un codigo que llevaba bien hasta que me estanque en esto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void uso(char *);
int main(int argc, char **argv) {
unsigned short int tmp[5] = {0, 0, 0, 0, 0};
char caracteres[39] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z'};
if (argc > 4 || argc < 3) uso(argv[0]);
if (argv[1] == NULL) { printf("ERR ARG:1: Se debe especificar nombre de archivo\n"); uso(argv[0]); }
if (atoi(argv[2]) == 0) { printf("ERR ARG:2: Debe especificarse un numero (longitud de cadena)\n"); uso(argv[0]); }
FILE *file;
    file = fopen(argv[1], "w");
    if (file == NULL) { printf("ERR ARG:1: Ocurrio un problema al abrir/crear el archivo\n"); uso(argv[0]); }
    // GENERADOR DEL DICCIONARIO
for (tmp[0] = 1; tmp[0] <= atoi(argv[2]); tmp[0]++) {
for (tmp[4] = tmp[0]; tmp[4] >= 0; tmp[4]--) {
for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
printf("%c", caracteres[tmp[1]-1]);
if (tmp[0] == 1) printf("\n");
fputc(caracteres[tmp[1]-1], file);
if (tmp[0] == 1) fputc('\n', file);
}
for (tmp[2] = tmp[4]; tmp[2] > 1; tmp[2]--) {
for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
printf("%c", caracteres[tmp[1]-1]);
fputc(caracteres[tmp[1]-1], file);
} printf("\n");
}
}
}
    fclose(file);
    return 0;
}
void uso(char *name) {
printf("Uso: %s archivo longitud [caracteres]\n", name); exit(0);
}


En la sección generador del diccionario solo hace bien la primera parte, me he liado mucho porque llevo como 40 minutos y no logro una solucion lo que quiero que haga:
z
..
a
zz
..
aa
..
zzz
..
aaa

Todas las combinaciones posibles dadas desde los parametros. El codigo creo que todo esta bien menos el algoritmo de generacion del diccionario. ¿Alguna solucion?. Gracias por leer.
#84
Cita de: do-while en 30 Junio 2012, 13:19 PM
Por ejemplo, creas un struct con un vector de unsigned char (0 - 255) para almacenar el valor del numero, y oto campo char (-128, 127) con valores -1 y 1 para el signo. Y defines por tu cuenta la suma, resta, multiplicacion y division de elementos de este tipo. Tendrias que fijar una base para representar los numeros de forma interna, y despues de cada operacion asegurarte de que el resultado se traduce a dicha base... por ejemplo, poniendo entre parentesis el signo y entre corchetes, del byte menos significativo al mas significativo, en base 16, podrias hacer:

(1)[12][15] + (1)[10] = (1)[22][15] = (1)[6 + 16][15] = (1) [6][16] = (1)[6][0][1]


Entendi ya un poco, creo que me costara implementarlo porque no quiero tirar de librerias externas, pero es una solucion bastante buena pero complicada de hacer; Muchas gracias. Mientras, solucion temporal:

double factorial(short int numero) {
    int pred = 0;
    double tmp = numero;
    for (pred = --numero; pred > 1; --pred)
        tmp *= pred;
    return tmp;
}


Y llamarlo: printf("Factorial de 87: %.20lg", factorial(87));
Dandonos como salida: Factorial de 87: 2.1077572983795269087e+132

La exactitud viene marcada por el numero de decimales que coja (en este caso 20).
#85
Muchas gracias por la respuesta a todos, me sirvieron para fomentar el estudio de C. Creo que tengo un mente una solucion, cuando termine posteare la funcion para calcular factorial de numeros mas grandes.


Cita de: $Edu$ en 30 Junio 2012, 01:59 AM
Hacelo recursivamente, busca sobre funciones recursivas con ejemplos de factorial de un numero.

Factorial(n) {
if (n = 1) return 1;

return Factorial(n) * Factorial(n - 1);
}

Algo asi seria, cuando busques entenderas mejor.

Si, se lo que es hacer una funcion recursiva y demas pero el tamaño al que llega es el mismo. Por si acaso no sabia algo lo probe y sigue siendo lo mismo, pero gracias por la respuesta.

Cita de: BlackZeroX (Astaroth) en 30 Junio 2012, 03:31 AM

unsigned long long


Ya lo probe, y sigue igual pero gracias de todas formas.

Cita de: do-while en 30 Junio 2012, 09:24 AM

Tienes dos opciones. Utilizar una libreria para manejar enteros arbitrariamente grandes (huge int, creo que se llaman...), o crearte tu tu propio tipo de dato entero para que no tenga limites, por ejemplo, utilizando vectores.


No se exactamente como hacer que no tenga limites utilizando vectores... un nuevo tipo de datos se declara como typedef, en que me puede ayudar? :S
#86
Bueno, sera eso lo que tenga que hacer, muchas gracias por la ayuda, aunque se me ocurrio ahora mismo otra manera:

Hacer la funcion como ld (long double) y las variables al estilo:
unsigned long double factorial(short int numero) {
    int pred = 0;
    unsigned long double tmp = numero;
    for (pred = --numero; pred > 1; --pred)
        tmp *= pred;
    return tmp;
}

Despues se me ocurre llamarlas/almacenarlas directamente como uld (unsigned long double) o escribirlas en pantalla: printf("%lld", factorial(x));
#87
Hola, buenas... soy Mike Gonzalez. Estoy haciendo una calculadora por consola, mas bien el modulo de calcular y despues hare la GUI en VB6.
Tengo una funcion hecha que me permite calcular el factorial de un numero:

unsigned long int factorial(short int numero) {
   int pred = 0;
   unsigned long int tmp = numero;
   for (pred = --numero; pred > 1; --pred)
       tmp *= pred;
   return tmp;
}


Las declaraciones son unsigned porque se supone que asi gano mas memoria de calculo (en el almacenamiento de variables). Mi pregunta es que solo me permite calcular hasta el factorial de 25 (a partir de ahi da resultados negativos :S).
Alguna solucion de mejorar el codigo y/o permitirme calcular numeros mas elevados (las calculadoras normales llegan al 69).

Gracias de antemano.