Wyświetlanie sześciokąta w zależności od długości boku?

0

ZAD 2: Napisz program który wczyta długość boku sześciokąta 'n' i wyświetli go w konsoli przykład:user image

Jak to zrobić, przecież nie będę couatem dla każdego osobno, macie pomysł?

PS: Sory, ale nie wiem jak wstawia się u Was obrazki. -> Już wiem:P

0

co za problem, pętelka po numerze linii i po kolejnym znaku lub spacji i tyle.
Wystarczy dobrze wyznaczyć wzory na poszczególne zakresy.

0

@MarekR22

Jak pętelka po numerze linii:P Podaj przykład np. dla tego o boku 2 i o boku 4, mam wypisywać w pętli zawartość każdego couta? Zresztą zaraz postaram się coś napisać:P Ale raczej mi nie wyjdzie.

0

Jak dotąd mam taki kod:

#include<iostream>
#include<conio.h>

using namespace std;

int main()
{

	int bok = 0;
	cout << "Wprowadz dlugosc boku: ";
	cin >> bok;

	for (int i = 0; i < bok; i++) cout << " ";
	for (int i = 0; i < bok; i++) cout << "#";

	cout << endl;

	for (int i = 0; i < 2*bok - 1; i++) 
	{
		cout << " ";

		if (i == bok - 2) cout << "#";
		else if (i == 2 * bok-2) cout << "#";
	}
	
	cout << endl;

	for (int i = 0; i < bok; i++) cout << " ";
	for (int i = 0; i < bok; i++) cout << "#";


	_getch();
}

Tzn. rysuje pierwszą i ostatnią linię, i jedną pośrodku, ale nie mam pomysłu na te linie właśnie pośrodku.

0
#include <iostream>
using namespace std;

void print(int spaces, bool newline = false, int chars = 1)
{
    for (int i = 0; i < spaces; ++i) cout << " ";
    for (int i = 0; i < chars; ++i) cout << "#";
    if (newline) cout << endl;
}

int main() 
{
	const int SIZE = 3;
	print(SIZE-1, true, SIZE);
	int i;
	for (i = 0; i < SIZE - 1; ++i)
	{
		print(SIZE-2-i);
		print(SIZE+2*i, true);
	}
	for (i = i - 2; i >= 0; --i)
	{
		print(SIZE-2-i);
		print(SIZE+2*i, true);
	}
	print(SIZE-1, true, SIZE);
	
	return 0;
}
0

linii masz 2*n-1. Pierwsze i ostatnią linię traktujesz w specjalny sposób, czyli masz 2*n-3 linii konsolowych do rysowania pośrodku.
jedne to boki rozwarte drugie to boki otwarte, wiec najlepiej rozbić to na dwie pętle.

0

mozna to zrobic jeszcze inaczej. Jezeli poda dlugosc boku 4 to odjac 1 zeby wyszlo 3. Dlaczego 3? Bo jezeli wezmiemy poczatek i bedziemy rysowac w ktoras strone to 3 wystarczy by narysowac szesciokat o boku 4

0

Dobra wszystko teraz działa, poradziłem sobie:

#include<iostream>
#include<conio.h>

using namespace std;

int main()
{

	int bok = 0;
	cout << "Wprowadz dlugosc boku: ";
	cin >> bok;

	for (int i = 0; i < bok; i++) cout << " ";
	for (int i = 0; i < bok; i++) cout << "#";

	cout << endl;

	for (int j = 2; j <= bok; j++)
	{
		for (int i = 0; i <= 2 * bok + bok -4; i++)
		{
			cout << " ";

			if (i == bok - j) cout << "#";
			else if (i == 2 * bok - 4 + j) cout << "#";
		}
		cout << endl;
	}
	
	for (int j =  bok-1; j >=2 ; j--)
	{
		for (int i = 0; i < 2 * bok + bok -4; i++)
		{
			cout << " ";

			if (i == bok - j) cout << "#";
			else if (i == 2 * bok - 4 + j) cout << "#";
		}
		cout << endl;
	}


	for (int i = 0; i < bok; i++) cout << " ";
	for (int i = 0; i < bok; i++) cout << "#";


	_getch();
}
1
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
  {
   unsigned n=0;
   cout<<"Wprowadz dlugosc boku: ";
   cin>>n;
   if(n--)
     {
      unsigned Y=n*2,X=n*3;
      char tb[]=" #";
      for(unsigned yp=0,yq=Y,y=0;yp<=Y;y=min(++yp,--yq),cout<<endl) for(unsigned xp=0,xq=X,x=0;xp<=X;x=min(++xp,--xq)) cout<<tb[((x+y==n)||((!y)&&(x>n)))];
     }
   return 0;   
  }
2

@_13th_Dragon

Doceniam twoją pomoc, ale jeśli naprawdę chcesz mi pomagać, to albo komentuj swój kod, dobieraj nazwy zmiennych tak żebym wiedział o co tu chodzi, albo po prostu krótko opisuj co robi kod, bo teraz to nawet nie wiem co i jak. A jeśli chcesz się pochwalić swoją wiedzą, to spoko, może kiedyś też taką posiądę i zrozumiem twój kod.

0

@SPOJowiecaa - nie potrzebujesz warunków w pętli, dlatego że wszystko możesz wyświetlić za pomocą dwóch skrajnych printf i dwóch pętli; Niestety nie programuję w C++ więc kodu w nim nie podam, ale w Pascalu czytelny i łatwy do zrozumienia dla Ciebie kod może wyglądać tak:

procedure DrawHexagon(const ASize: Integer);
var
  intLoop: Integer;
begin
  WriteLn(StringOfChar(' ', ASize - 1), StringOfChar('#', ASize));

  for intLoop := 0 to ASize - 2 do
    WriteLn(StringOfChar(' ', ASize - intLoop - 2), '#', StringOfChar(' ', ASize + intLoop * 2), '#');

  for intLoop := ASize - 3 downto 0 do
    WriteLn(StringOfChar(' ', ASize - intLoop - 2), '#', StringOfChar(' ', ASize + intLoop * 2), '#');

  WriteLn(StringOfChar(' ', ASize - 1), StringOfChar('#', ASize));
end;

http://ideone.com/PxChgv

Łatwo go przepisać na C++, tyle że ja nie znam odpowiednika pascalowskiej funkcji StringOfChar, która zwraca łańcuch zbudowany z tych samych znaków i o określonej długości; Więc to sobie wyszukaj, ewentualnie napisz swój własny odpowiednik.

0
furious programming napisał(a):

tyle że ja nie znam odpowiednika pascalowskiej funkcji StringOfChar, która zwraca łańcuch zbudowany z tych samych znaków i o określonej długości;

Jeden z konstruktorów stringa, pozwala na to:

cout << string(10, ' ') << "10 spacji przed napisem";

Próbowałem sam stworzyć funkcję, ale coś mi nie wychodziło kopiowanie do string, co innego z tablicą charów:P

@Edit

@furious programming

Chyba działa

string StringOfChar(char znak, int n)
{
	string exit;
	for (int i = 0; i < n; i++)
	{
		exit += znak;
	}
	return exit;
}
0

Skoro jeden z konstruktorów stringa pozwala na to, to nie musisz pisać własnego odpowiednika; Zobacz na kod, który podał @MarekR22 - http://ideone.com/X5VsfR - tam jest właśnie pokazane użycie takiego konstruktora; To praktycznie to samo co podałem, tyle że z dodatkowym warunkiem, no i we właściwym języku.

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