Ayuda con este trozo de código

Iniciado por valrojo, 15 Noviembre 2019, 21:22 PM

0 Miembros y 1 Visitante están viendo este tema.

valrojo

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;
}

K-YreX

#1
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 (cpp) [Seleccionar]

int lado;
bool ladoValido;
do{
   cout << "Dame valor del numero (par entre 4 y 300): ";
   cin >> lado;

   ladoValido = (lado < 4 || lado > 300 || lado % 2 != 0);
   if(!ladoValido)
       //...
}  while(!ladoValido);


Ahora imagina que <lado> vale 4. El resultado se vería algo así:

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

Ahora tienes que encontrar una relación entre ese dibujo y el valor de <lado>. Por ejemplo:

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í:

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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

valrojo

#2
    
Código (cpp) [Seleccionar]

   for(int i = 0; i < lado - 1; i++)
   {
       for(j = 0; j < lado - i - 1; j++)
          cout << "+";
           
       cout << "-";
       
       for (int k = j; k < lado - 1; k++)
           cout << "*";

       cout << endl;
   }


Para lado 4:

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

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




Ya está:
Código (cpp) [Seleccionar]

    for(int i = 0; i < lado; i++) //El error era a lado restarle 1
    {
        for(j = 0; j < lado - i - 1; j++)
            cout << "+";
           
        cout << "-";
       
        for (int k = j; k < lado - 1; k++)
            cout << "*";
           
        cout << endl;
    }


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.