Rysowanie diamentu w C++

0

Wybaczcie że zalewam was takim prostym pytaniem, ale mam trudność z jednym ćwiczeniem. Mianowicie rysowaniem diamentu, a konkretnie czy jest jakiś sposób aby skrócić ten kod? Chodzi o narysowanie diamentu w polu 5x5. Wygląda to tak:

#include <iostream>
#include <string.h>

using namespace std;

int main()

{
int i,j;

for(i=1; i<=5; i++)
{


   for (j=1; j<=5; j++)

   {
       if((i==1 || i==5) && (j==3) || ((i==2 || i==4) && (j==2 || j==4) ) || ((i==3) && (j==1 || j==5) )     )

   cout<<"*";

   else
    cout<<" ";
   }

    cout<<endl;


}

Moje pytanie to: czy można w jakiś sposób skrócić ten warunek? Myślałem nad użyciem parzystości lub nieparzystości wierszy i kolumn, lecz nie wiem jak można wykluczyć skrajne miejsca i środek (bez wykluczenia ich powstaje szachownica).

1

Pomyśl o "diamencie" jako o kuli w przestrzeni z metryką miejską o środku w (2,2).

2

Masz tutaj znacząco przekombinowany kod:

enum TriangleDirection { Up, Down };

template<TriangleDirection Dir, typename Printer>
void printDiamondImpl(Printer p, int n, int width)
{
	auto recursive = [=]{ if(n > 2) printDiamondImpl<Dir>(p, n-2, width); };

	if(Dir == TriangleDirection::Up){
		recursive();
	}

	stringstream ss;
	string spaces((width - n) / 2, ' ');
	ss << spaces << string(n, '*') << spaces;
	p(ss.str());

	if(Dir == TriangleDirection::Down){
		recursive();
	}
}

void printDiamond(int n)
{
	auto printer = [](string const& s){ cout << s << endl; };

	printDiamondImpl<TriangleDirection::Up>(printer, n, n);
	printDiamondImpl<TriangleDirection::Down>(printer, n - 2, n);
}

Ale działa: http://melpon.org/wandbox/permlink/xc5cmbLE2GF9lB8V

1

Masz kod kq powyżej, to jeszcze Twój przykład przerobiony tak, żeby działał:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
	int i, j;

	for (i = 0; i < 5; i++) {
		for (j = 0; j < 5; j++) {
			/*
			 * Tutaj mamy typowe równanie kuli w przestrzeni z metryką miejską.
			 */
			if (abs(i - 2) + abs(j - 2) <= 2)
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}

	return (0);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1