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 - MAFUS

#391
En printf usa %+d en vez de solo %d.
#392
Hace unos días me encontré que existía la siguiente notación para definir un array:
#include <stdio.h>

int main() {
   char c[] = {[0 ... 26]'='};
   int d[] = {[0 ... 4]1, [8 ... 12]2};

   printf("\n%s\n", c);
   for(int i=0; i<sizeof(d)/sizeof(d[0]); ++i)
       printf(" %d", d[i]);
   printf("\n%s\n", c);
}
#393
NULL es un define de 0.
Lo que debes pasar a la función que reciba tu vector es el número de elementos que tiene.
En vez de pasar mayor, que no sirve de nada pues ese dato lo puedes sacar una vez dentro de la función, pásale el número de elementos, así podrás hacer un for desde 0 hasta ese máximo.
#394
Programación C/C++ / Re: serie chingona
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:

#include <stdio.h>

int main() {
   int n;
   int i;
   int k;
   int numerador;
   int denominador;
   int repeticiones;

   printf("> ");
   scanf("%d", &n);
   printf("S =");

   numerador = 1;
   denominador = 1;
   i = 0;
   k = 0;
   while(denominador>0) {
       // Calculo las veces que se repite el numerador
       repeticiones = 2 + numerador%2;

       printf(" %d/%d ", numerador, denominador);

       // Calculo el próximo denominador
       if(k<n-1)
           denominador += 2;
       else if(k>n-1)
           denominador -= 2;
       ++k;

       // Control del bucle de las repeticiones
       if(++i==repeticiones) {
           ++numerador;
           i=0;
       }

       // Escribo el signo
       if(denominador>0) {
           if(numerador%2)
               putchar('+');
           else
               putchar('-');
       }
   }
}
#395
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.
#396
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.
#397
Para hacerla recursiva sería:
int buscar_c(char *cad, char c) {
   if(*cad=='\0')
       return 0;
   return (*cad==c)+buscar_c(cad+1,c);
}


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.
#398
Buena respuesta. Me quito el sombrero.
#399
Programación C/C++ / Re: Ayuda
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.
#400
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
#include <stdio.h>

void rombo(unsigned altura) {
    static unsigned h; // Height, altura
    static unsigned w; // Width, ancho
    static unsigned i; // Iteration, el escalon actual

    if(altura) {
        if(altura%2 == 0) // Para que quede bien cuadrado
            ++altura;     // altura debe ser impar
        h = altura;
        w = 1;
        i = 0;
    }

    if(i<h) { // Mientras el reglón no ha llegado a la altura del rombo
        int j;
        for(j=0; j<=h/2-w/2; ++j) // Calculo los espacios por escalon
            putchar(' ');         //    y los imprimo
        for(j=0; j<w; ++j) // Imprimo
            putchar('*');  //    los asteriscos
        putchar('\n'); // Al siguiente reglón
        if(i<h/2) w += 2; // Calculo los asteriscos que
        else w -= 2;      //    habrá en el siguiente reglon
        ++i; // Voy al siguiente reglón
        rombo(0); // Llamo de nuevo a rombo indicando que siga con los datos que hay (0)
    }
}

int main() {
    rombo(6);
}