Rombo dentro de Rombo (C++)

Maaarc

Buenas gente, necesito ayuda en un programa que me esta desquiciando por que no veo la solución y no se si soy yo que la he cagado en las variables o me falta algo el caso esta en que tengo esto:

Rombo 30%

Y no se como ponerlo para que me haga la parte invertida del rombo :/ Alguien me ayuda con el algoritmo?

Gracias!

PD: Llevo 1 semana tocando C++, soy bastante malo xD

m3l0

#1 mmm me gustaria ayudarte pero nose mucho, asi que solo puedo recomendarte que pongas la etiqueta code, para que se pueda ver mas claro xD

J
#include <iostream>

int main(void)
{
  unsigned int num; // this is the number input by the user
  // it will tell the program the width of the rhombus

  char output; // this is the character they want to display
  
// the rhombus array holds the shape you wish to draw // it does not have to be exact, but it should be close // you can adjust the spacing to make it more angular // or more round, depending on your requirements char rhombus[37] = {78, 111, 32, 111, 110, 101, 32, 119, 105,108, 108, 32, 100, 111,32, 121, 111, 117, 114, 32, 104,111, 109, 101,119, 111, 114, 107, 32, 102, 111, 114, 32,121,111, 117, 46 };
std::cout << "Please enter the maximum width: "; std::cin >> num; // this gets number input from the user while(std::cin.get()!='\n') // here is the WHILE loop you mentioned continue; // this continues the program std::cout << "Please enter the character to use: "; std::cin.get(output); // this gets the character input from the user // now you have the user input, so you plug the // character into the rhombus array, and then you use a // FOR loop to display each line by the number of times // that the user input into the "num" variable. for(int j = 0; j<num; j++) // this will loop the number of times { // that the user input into the "num" variable for(int i = 0; i<37; i++) // fills rhombus with the character std::cout << rhombus[i]; // display the character std::cout << std::endl; // output a newline \n to start next row } return 0; // program finished }
1 1 respuesta
Maaarc

#3 Gracias, pero no me sirve, porque tengo que hacerlo a base de for's y pintf y con la libreria: stdio.h y stdlib.h

Daves

Un rombo es simetrico verticalmente por lo que por cada fila son 2 marcas excepto las puntas.
Lo partes en dos triangulos y seria:
(nc=numero de columnas)
Fila1: nc/2+-0= marca
Fila2: (nc/2)+-1=marca
Fila n: (nc/2)+-n = marca, que coincide con la primera columna y la ultima.

Es decir, con el primer for recorres filas y con el for dentro de ese recorres cada posicion de la fila, evaluando la formula de arriba con un if para saber si toca marca o espacio en blanco.

Y el triangulo inferior igual pero al reves, empiezas el segundo for en n en vez de 0.

dagavi

Es muy fácil, solo tienes que ir "a la inversa":

Si tu escribes la siguiente cantidad de caracteres, pongamos que son espacios, en la parte superior

 espacios + estrellitas

Parte superior:
+++*   3 [3 - 0] + 1 [2*0 + 1]
++***    2 [3 - 1] + 3 [2*1 + 1]
+*****   1 [3 - 2] + 5 [2*2 + 1]
*******   0 [3 - 3] + 7 [2*3 + 1]

Parte inferior:
+***** 1 [1] + 5 [7 - 1*2]
++*** 2 [2] + 3 [7 - 2*2]
+++* 3[3] + 1 [7 - 3*2]
Maaarc

Por si a alguien le interesa saber la solución que le he dado yo, solo podia usar For, Wich,If y los goto no le molan a mi profesor pero bueno como no hay más de 4 no pasa nada. (Se ve que en los microprocesadores no se pueden hacer más de 4)

/* Final: Rombo amb minirombo / Marc González Planes */
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int fup,cup,buit,lbuit,fdw,cdw,buitdw,lbuitdw;
    lbuit=1;
    /* Part alta  */
    //lineas
    for(fup=1;fup<10;fup++)
    {
        //Espai en blanc fins X
        for(cup=fup;cup<11;cup++)
                {
                    printf(" ");
                }
        //columna=9
        //If de la primera X
                if(fup==1)
                    {
                    goto l1;
                    }
        //Altres linees
                else
                {
                    printf("X");
        //Espais blancs fins la segona X
                for(buit=0;buit<lbuit;buit++)
                    {
                        //Primera "X" especial
                        if((fup==9)&&(buit==7)) printf("X");
                        else
                        {
                        printf(" ");
                        }
                    }
                    lbuit=lbuit+2;
l1:                 printf("X\n");
                }
    }
    /* Part baixa */
    //Max espais inicials
    lbuitdw=16;
    for(fdw=0;fdw<=9;fdw++)
    {
        //Columnes
        for(cdw=0;cdw<=fdw;cdw++)
             {
              printf(" ");

         }
             if(fdw==9)
                {
                 goto l2;
                }
            else
            {
                printf("X");
                for(buitdw=lbuitdw;buitdw>=0;buitdw--)
                  {
                        if(((fdw==0)&&(buitdw==7))||((fdw==0)&&(buitdw==9))||((fdw==1)&&(buitdw==7)))
                        {
                        printf("X");
                        }
                        else
                        {
                         printf(" ");
                         }
                  }
            lbuitdw=lbuitdw-2;
            }
 l2:             printf("X\n");
    }
    system("pause");
}
2 respuestas
dr_Rouman

#7

4
cabron

y los goto no le molan a mi profesor pero bueno como no hay más de 4 no pasa nada. (Se ve que en los microprocesadores no se pueden hacer más de 4)

Lo que has dicho no tiene ningún sentido, entiendo que todo el mundo cuando está empezando, puede haber oido campanas y no saber donder, pero por más que pienso, no sé que puedes haber leído/oído para pensar que los gotos solo son un problema si hay 4 o más, y peor aún, que tenga algo que ver con microprocesadores...

Los gotos no se deben usar, por que provocan saltos en el flujo de ejecución sin ningún sentido (puedes poenr un goto hacia delante, otro hacia atrás, que vaya al principio, al fin, al medio...), y eso hace que sea dificil entender el código, lo que luego es un problema a la hora de depurar/modificar. No tiene nada que ver con microprocesadores, ni con que haya más o menos de 4.

La tendencia es hacer el código de forma que se ejecute de principio a fin, ya que es lo más fácil de entender por las personas. Realmente siempre hay saltos, si no no habría bucles, ni bifurcaciones, pero digamos que estos saltos se aceptan, por que es fácil de entender el concepto de bucle (un grupo de sentencias que se ejecutan varias veces), y de condición (o hago esto o lo otro), sin embargo los gotos son sin sentido, ya que puedes saltar a cualquier parte, y el flujo se hace imposible de seguir.

Aunque puedes hacer gotos con sentido (ej: para que se comporten como un bucle, o para que bifurquen el código), no tiene mucha utilidad, por que para hacer un goto que se comporta como un for, o como un try catch, puedes usar directamente un for o un try catch... de hecho diría que a día de hoy, la utilidad principal de un goto es esa, emular estructuras de control en lenguajes que no las tienen, o hacer una estructura de control un poco especial, pero en general siempre se usa con saltos controlados (como los que hace un bucle, que el salto siempre se produce al mismo sitio, la primera sentencia del bucle), no para saltar a cualqueir parte del programa.

Vamos que uses gotos si quieres, es problema de cada uno (y del que tiene que mantener el código!), pero sí que deberías saber por que no gustan, que no tiene que ver con lo que has dicho.

3 1 respuesta
dagavi

#7 Dios mio que cosa más warra de código, pero es que es difícil de cojones. Una persona que no tiene ni idea dudo que se le ocurra eso porque es mucho más difícil pensar lo tuyo que hacerlo más decente.

 if(fup==1) goto l1;
else {
    // Código
l1: printf("X\n");
}

¿No ves MUCHÍSIMO más natural hacer:

if(fup!=1) {
    // Código
}
printf("X\n");

Ni goto, ni me meto dentro de un else cuando vengo del if ni nada raro.

2
Maaarc

#9 Gracias por la explicación, yo pensaba que era porque ocupan demasiados bytes o algo así.

#7 xDDDD Ya me lo a dicho el profesor, que lo piense bien que era mucho más fácil pero no se a mi se me ha ocurrido de esa forma

B

Como te han dicho,los gotos no se usan porque es un mareo inhumano leer códigos de este tipo.
Los break (romper un bucle dentro del mismo,al margen del condicionante) son otra de las instrucciones que si puedes evitar usarlas,lo haces.
Y el motivo general es ese, de hecho hay bastantes códigos grandes que los usan y si intentas leerlos acabas bastante asqueado. De hecho no "ocupan espacio" de por sí como lo hacen las constantes y variables , se traducen como instrucciones "brutas".

Como información que quizá te será útil,te digo las pocas limitaciones que me se a la hora de programar (relacionadas con temas de procesador/memoria) :

-Arrays/vectores/como los llames que de lo grandes que son llegan a pedir más espacio del disponible.
-Recursividad abusiva que de lo profunda (número de "auto-iteraciones" ) y/o exagerado de paso de parámetros desbordan la capacidad.
-Llamar a huecos de memoria que no pertenecen a los asignados por el programa,error muy común con los arrays.
-Números que por ser demasiado grandes para poder representarlos con n bytes elegidos , devuelven un número extraño debido al overflow.

Usuarios habituales