elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [47] 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 ... 161
461  Programación / Programación C/C++ / Re: serie chingona en: 24 Mayo 2018, 19:42 pm
Sorry, es en C, pero creo que podrás seguirlo, es sencillo. Se basa en que con numeradores impares éstos se repiten 3 veces seguidas, con impares solo 2. De igual forma todos los numeradores impares hacen la fracción positiva, los pares la hacen negativa. La serie dura mientras el denominador sea positivo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int n;
  5.    int i;
  6.    int k;
  7.    int numerador;
  8.    int denominador;
  9.    int repeticiones;
  10.  
  11.    printf("> ");
  12.    scanf("%d", &n);
  13.    printf("S =");
  14.  
  15.    numerador = 1;
  16.    denominador = 1;
  17.    i = 0;
  18.    k = 0;
  19.    while(denominador>0) {
  20.        // Calculo las veces que se repite el numerador
  21.        repeticiones = 2 + numerador%2;
  22.  
  23.        printf(" %d/%d ", numerador, denominador);
  24.  
  25.        // Calculo el próximo denominador
  26.        if(k<n-1)
  27.            denominador += 2;
  28.        else if(k>n-1)
  29.            denominador -= 2;
  30.        ++k;
  31.  
  32.        // Control del bucle de las repeticiones
  33.        if(++i==repeticiones) {
  34.            ++numerador;
  35.            i=0;
  36.        }
  37.  
  38.        // Escribo el signo
  39.        if(denominador>0) {
  40.            if(numerador%2)
  41.                putchar('+');
  42.            else
  43.                putchar('-');
  44.        }
  45.    }
  46. }
462  Programación / Programación C/C++ / Re: Arboles Binarios en C en: 24 Mayo 2018, 01:20 am
Buf, creo que te has metido en algo serio. Si no sabes cómo hacer aparecer >>> para cada vez que un usuario deba entrar datos, todo el apartado de la calculadora se te hace muy grande.
Cómo muestra de algo parecido:
https://github.com/btmills/calculator

Puedes ver que no es tan sencillo.
463  Programación / Programación C/C++ / Re: Duda con mi código, compila pero el resultado es erróneo en: 23 Mayo 2018, 23:19 pm
Cómo te había explicado una operación booleana en C se evalúa a 1 si el resultado es true y 0 si el resultado es false. El código aprovecha este hecho en el trozo de código *cad==c, es decir, si el carácter actual de la cadena es igual a carácter c devolverá 1, caso contrario 0.
Este resultado se suma a lo que devuelva la siguiente llamada a buscar_c apuntando al siguiente carácter de la cadena. Y todo esto es lo que retornará la función.
Por recursividad los resultados se irán acumulando y cuando hayan retornado todas las funciones la última entregará el resultado esperado.

-------------------- Fuera del tema ---------------------------
Por otra parte es importante recalcar el cad+1 en vez de ++cad en el argumento de buscar_c. Esto es debido a que además de incrementar cad en 1 en otra parte se hace uso del valor de esa variable. Uno no sabe qué operando evaluará antes C en una operación matemática. Si hubiera sido ++cad, al evaluar *cad==c lo haría con el siguiente carácter al que nos interesa y el programa fallaría y por eso he optado por no modificar dicha variable. Pero todo esto tiene que ver con los puntos de secuencia, algo de lo que tendrás oportunidad de aprender más adelante.
464  Programación / Programación C/C++ / Re: Duda con mi código, compila pero el resultado es erróneo en: 23 Mayo 2018, 20:15 pm
Para hacerla recursiva sería:
Código
  1. int buscar_c(char *cad, char c) {
  2.    if(*cad=='\0')
  3.        return 0;
  4.    return (*cad==c)+buscar_c(cad+1,c);
  5. }

El else tuyo no tiene sentido.
Éste código funciona para las implementaciones que consideren 1 como resultado de un true, que son todas las que conozco.
465  Programación / Programación C/C++ / Re: [C] Array unidimensional en: 23 Mayo 2018, 14:00 pm
Buena respuesta. Me quito el sombrero.
466  Programación / Programación C/C++ / Re: Ayuda en: 22 Mayo 2018, 18:51 pm
Esto con un manual o tutorial básico de C++ lo aprenderás en dos horas. Suele estar en las primeras páginas y con ejercicios.
467  Programación / Programación C/C++ / Re: metodo de recursividad en: 20 Mayo 2018, 18:58 pm
Para que te funcione de forma recursiva se debe guardar el estado de unas cuantas cosas, podrías pasarlas por los argumentos pero eso implicaría complicar la firma de tu función de forma innecesaria, ya que C dispone de herramientas para eso: las variables estáticas.

Esta podría ser una solución elegante
Código
  1. #include <stdio.h>
  2.  
  3. void rombo(unsigned altura) {
  4.    static unsigned h; // Height, altura
  5.    static unsigned w; // Width, ancho
  6.    static unsigned i; // Iteration, el escalon actual
  7.  
  8.    if(altura) {
  9.        if(altura%2 == 0) // Para que quede bien cuadrado
  10.            ++altura;     // altura debe ser impar
  11.        h = altura;
  12.        w = 1;
  13.        i = 0;
  14.    }
  15.  
  16.    if(i<h) { // Mientras el reglón no ha llegado a la altura del rombo
  17.        int j;
  18.        for(j=0; j<=h/2-w/2; ++j) // Calculo los espacios por escalon
  19.            putchar(' ');         //    y los imprimo
  20.        for(j=0; j<w; ++j) // Imprimo
  21.            putchar('*');  //    los asteriscos
  22.        putchar('\n'); // Al siguiente reglón
  23.        if(i<h/2) w += 2; // Calculo los asteriscos que
  24.        else w -= 2;      //    habrá en el siguiente reglon
  25.        ++i; // Voy al siguiente reglón
  26.        rombo(0); // Llamo de nuevo a rombo indicando que siga con los datos que hay (0)
  27.    }
  28. }
  29.  
  30. int main() {
  31.    rombo(6);
  32. }
468  Programación / Programación C/C++ / Re: Confusión: arreglo de arreglo de strings (o con punteros) en: 18 Mayo 2018, 19:22 pm
Seguramente usar el depurador y situar breakpoints cerca de dónde posiblemente esté el fallo. Pero yo no uso. En mi caso hago que la aplicación escriba en stderr, que no pasa por ningún buffer y escribe directamente en la pantalla. Voy situándolos cerca de dónde creo que podría estar el fallo. Y si con eso no lo resuelvo empiezo desde el main para ir recorriendo las llamadas a funciones y llegar hasta el fallo. ¡

La verdad, me da pereza aprender a usar el depurador, ya lo hago yo con stderr, jajaja.
469  Programación / Programación C/C++ / Re: Confusión: arreglo de arreglo de strings (o con punteros) en: 18 Mayo 2018, 17:49 pm
Si lo haces con arrays de punteros
Código:
char* miArray[5]
deberás usar *alloc para conseguir dimensionar memoria antes de guardar una cadena en ella. Y cuando acabes con esas cadenas destruirlas con free. A lo mejor se te rompe por eso.

En cambio si todo son arrays ya tienes la memoria dimensionada, pero a diferencia de los punteros dimensionados con *alloc su ámbito empieza en la función que los declaró, ten presente eso.

Sea como sea a la hora de entregar palabras recuerda que tanto punteros como arrays se comportan como punteros y una función que espere un char* muy amablemente va a acoger un array:
Tanto si has hecho
Código:
char* miArray[AGENTE][PALABRAS]
cómo
Código:
char miArray[AGENTE][PALABRAS][LETRAS]
puedes pasar a la función que espera un char*
Código:
MiFuncion(miArray[nAgente][nPalabra])
470  Programación / Programación C/C++ / Re: Arbol recursivo en: 17 Mayo 2018, 16:01 pm
Mira, es muy fácil:

El dato tiene una estructura clásica de árbol binario
Código:
typedef struct _nodo {
    int dato;
    struct _nodo *izq;
    struct _nodo *der;
} Nodo;

Y a partir de aquí se lee la función
Código:
void mostrarArbol(Nodo * arbol, unsigned contador){
No estaba puesto, pero considero unsgined a contador pues lo normal es que la raíz sea 0 y vaya ascendiendo a cada nivel, por tanto los números negativos no son aptos para este menester.
mostrarArbol recibe el puntero a un tipo Nodo para no andar todos los datos de cada estructura, contador indicará la profundidad del nivel a que se encuentra (esto lo saco de más adelante como veremos).

Código:
    if(arbol == NULL){
        return;
    }
Este es la condición de fin de recursividad. Ésta se detendrá al llegar a un nodo vacío, es decir, cuándo se esté fuera del árbol.

Código:
    else{
        mostrarArbol(arbol->der, contador+1);
Pero si la nodo forma parte del árbol se seguirá por su rama derecha. No hay que preocuparse por si está vacía, ya que hemos visto anteriormente que la función se encarga de terminar la búsqueda si eso pasa. Además se le indica a la función que el siguiente nivel será uno mas que éste, con contador+1. No se ha usado contador++ porque se quiere retener, para la actual instancia de la función, del valor que guarda.

Código:
        for(int i=0; i<contador; i++){
            cout << "   ";
        }
        cout << arbol->dato << endl;
Y por esto es por lo que se necesita el dato de contador: a cada nivel se le representa su profundidad con un espacio. Al final de los espacios se coloca el dato que hay en el nodo. Así la representación es más visual.
Código:
        mostrarArbol(arbol->izq, contador + 1);
    }
}
Se procede a realizar con la rama izquierda lo que se hacía con la derecha.
Páginas: 1 ... 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [47] 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines