Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: valrojo en 15 Noviembre 2019, 21:22 pm



Título: Ayuda con este trozo de código
Publicado por: valrojo en 15 Noviembre 2019, 21:22 pm
Realizar un programa que lea de teclado un número entero 'n' entre 4 y 300, par y nos muestre un
cuadrado de lado 'n' formado por:
Asteriscos (*) en la parte inferior de la diagonal secundaria,
Guiones (-) en la diagonal secundaria, y
Cruces (+) por encima de la diagonal secundaria.
Si se introduce un número incorrecto, el programa volverá a pedir de nuevo un número hasta que
se introduzca un número correcto.

Tiene que dar como resultado:
+++-
++-*
+-**
-***
Mi resultado:
-***
+-**
++-*
+++-

#include <iostream>
using namespace std;

int main ()
{
    int lado;
    
    cout << "Este programa muestra un cuadro con -, + y * " << endl;

    do
    {
        cout << "Dame valor del lado del cuadro (par entre 4 y 300): ";
        cin >> lado;
        
        if (lado < 4 || lado > 300 || lado % 2 != 0)
            cout << "Valor incorrecto. " << endl;
    }
    while(lado < 4 || lado > 300 || lado % 2 != 0);
    
    for (int i = 0; i < lado; i++)
    {
        for (int x = 0; x < lado; x++)
        {
            if(x < i)
                cout << "+";
            else if (x > i)
                cout << "*";
            else
                cout << "-";
        }
        cout << endl;
    }

    return 0;
}


Título: Re: Ayuda con este trozo de código
Publicado por: K-YreX en 16 Noviembre 2019, 01:49 am
Para próximas consultas, coloca el código entre etiquetas de Código GeSHi.

La parte del filtro está todo bien. La única mejora que se me ocurre es guardar las condiciones en una variable de tipo <bool> para no tener que realizar las comprobaciones dos veces (una en el <if> y otra en el <while>).
Código
  1. int lado;
  2. bool ladoValido;
  3. do{
  4.    cout << "Dame valor del numero (par entre 4 y 300): ";
  5.    cin >> lado;
  6.  
  7.    ladoValido = (lado < 4 || lado > 300 || lado % 2 != 0);
  8.    if(!ladoValido)
  9.        //...
  10. }  while(!ladoValido);

Ahora imagina que <lado> vale 4. El resultado se vería algo así:
Código:
+ + + -
+ + - *
+ - * *
- * * *
Ahora tienes que encontrar una relación entre ese dibujo y el valor de <lado>. Por ejemplo:
Código:
Fila 0: (lado - 1) veces el símbolo '+' y un '-'
Fila 1: (lado - 2) veces el símbolo '+', un '-' y un '*'
Fila 2: (lado - 3) veces el símbolo '+', un '-' y dos veces el '*'
Fila 3: (lado - 4) veces el símbolo '+', un '-' y tres veces el '*'
Ahora hay que intentar generalizarlo para poder hacer un programa que se adapte.
La parte del '+' ya la tenemos: para la fila i, (lado - i - 1) veces el símbolo '+'.
La parte del '-' también porque siempre es, un símbolo '-' cuando se completan los '+'. Es decir, para cada fila i, un '-' en la posición (lado - i).
La parte del '*' podemos verlo como desde (lado - i) hasta (lado - 1).

Entonces quedaría algo así:
Código:
INICIO
    PARA i := 0 HASTA lado - 1 HACER // para cada fila
        PARA j := 0 HASTA lado - i - 2 HACER
            MOSTRAR '+'
        FIN PARA
        MOSTRAR '-'
        PARA k := j HASTA lado - 1 HACER // al terminar el PARA anterior, j vale (lado-i)
            MOSTRAR '*'
        FIN PARA
    FIN PARA
FIN

Intenta codificar ese pseudocódigo en C++ y si tienes problemas puedes poner tu código para que te ayudemos pero recuerda, entre etiquetas de Código GeSHi.


Título: Re: Ayuda con este trozo de código
Publicado por: valrojo en 16 Noviembre 2019, 10:20 am
    
Código
  1.    for(int i = 0; i < lado - 1; i++)
  2.    {
  3.        for(j = 0; j < lado - i - 1; j++)
  4.           cout << "+";
  5.  
  6.        cout << "-";
  7.  
  8.        for (int k = j; k < lado - 1; k++)
  9.            cout << "*";
  10.  
  11.        cout << endl;
  12.    }
  13.  

Para lado 4:

+++-
++-*
+-**

No veo el porqué de salirme una fila menos :(



Ya está:
Código
  1.    for(int i = 0; i < lado; i++) //El error era a lado restarle 1
  2.    {
  3.        for(j = 0; j < lado - i - 1; j++)
  4.            cout << "+";
  5.  
  6.        cout << "-";
  7.  
  8.        for (int k = j; k < lado - 1; k++)
  9.            cout << "*";
  10.  
  11.        cout << endl;
  12.    }
  13.  

Muchas gracias por la ayuda, soy nuevo en esto y me cuestan ver este tipo de fallos :)

MOD: No hacer triple post. Usa el boton modificar.