ZAD 2: Napisz program który wczyta długość boku sześciokąta 'n' i wyświetli go w konsoli przykład:
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
ZAD 2: Napisz program który wczyta długość boku sześciokąta 'n' i wyświetli go w konsoli przykład:
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
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.
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.
#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;
}
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
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();
}
#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;
}
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.
n
- masz ten sam co u ciebie; y
- pion; x
- poziom; Tu nie potrzeba żadnego komentarza wszystko się dzieje w jednym wierszu w którym jest wyliczany znak który należy wyświetlić w danym miejscu prostokąta.
@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;
Ł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.
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
@furious programming
Chyba działa
string StringOfChar(char znak, int n)
{
string exit;
for (int i = 0; i < n; i++)
{
exit += znak;
}
return exit;
}
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.
ShalomShalom