Rysunek na polu w C++

0

Witam wszystkich,

potrzebuję pomocy, ponieważ zadano mi na jutro program do napisania, a nie za bardzo wiem, jak się za to wziąć.

Polecenia składa się z dwóch części.

podaję treść :

" Napisz program rysujący na ekranie monitora literę "X" za pomocą znaków * (gwiazdki) na polu o rozmiarze 10x10 .
Wykorzystaj możliwość zagnieżdżania pętli for. Jak wykonasz już program rysujący literę "X" zastanów się i wykonaj program który narysuje literę "Z" "

Jakbym mógł prosić by z literą X i Z był w większości ten sam program, żebym mógł zobaczyć co zostało zmienione i co trzeba zmienić aby pokazać nauczycielowi jak to zmieniłem :)

Nauczyciel podkreślił, iż ma być obowiązkowo pętla for.

Proszę o jakiś łatwy kod, ponieważ programowanie mam od kilku miesięcy, nie mogę wylecieć z nie wiadomo czym.

1

Masz X - Z sam sobie zrób ;)

 
#include <iostream>
int main()
{
   int i,j;

   using namespace std;
   for(i=1;i<=10;i++)
   {
      for(j=1;j<=10;j++)
      {
         if(i==j||11-i==j)
            cout<<"*";
         else
            cout<<" ";

      }
      cout<<endl;
   }
   return 0;
}

Mam dobry humor więc masz i Z:

#include <iostream>
int main()
{
   int i,j;

   using namespace std;
   for(i=1;i<=10;i++)
   {
      for(j=1;j<=10;j++)
      {
         if(i==1||i==10)
            cout<<"*";
         else if(11-i==j)
            cout<<"*";
         else
            cout<<" ";

      }
      cout<<endl;
   }
   return 0;
}
1

dla litery X gwiazdkę rysujesz jeśli x == y lub jeśli maxx - x == y
dla litery Z jeśli x == y lub y == 0 lub y ==maxy

jeśli rozwiązanie problemu ma być bardziej ogólne to można stworzyć dwuwymiarową tablicę bool, w której jest zakodowany znak (0 - puste, 1 - gwiazdka)

częścią rysującą będzie, tak jak masz to zrobić, zagnieżdżona pętla for
w wewnętrzej pętli iterujesz po współrzędnej x od 0 do maxx i rysujesz kolejne gwiazdki
w zewnętrznej natomiast iterujesz po oy od 0 do maxy i wypisujesz znak końca linii ('\n')

@Edit.
ktoś mnie wyprzedził

3
#include <iostream>
using namespace std;
 
int main()
  {
   int X[]={771,390,204,120,48,120,204,390,771,771};
   int Z[]={1023,387,193,96,48,24,12,518,771,1023};
 
   for(int y=0;y<10;++y,cout<<endl) for(int x=0,m=X[y];x<10;++x,m>>=1) cout<<" *"[m&1];
   cout<<endl;
   for(int y=0;y<10;++y,cout<<endl) for(int x=0,m=Z[y];x<10;++x,m>>=1) cout<<" *"[m&1];
   return 0;
  }
0

Chwila, mi się wydaje, że chyba chodziło nauczycielowi o program bez cout, ale mogę się mylić.
Robiliśmy raz na lekcji coś za pomocą tablicy, i chyba to on miał na myśli. Wkleję tutaj :)
Tzn nie znalazłem tamtego niestety, ale znalazłem coś z losowaniem pionków na polach, i obliczanie ich ciężaru.

#include<iostream>
#include<conio.h>
#include<ctime>
using namespace std;
int losowa(int nMin, int nMax) 
{ 	
	return rand() % (nMax - nMin + 1) + nMin;
} 
void main()
{
	srand (static_cast<unsigned int>(time(NULL)));
	int pole[8][8];
	for(int i=0;i<8;i++)
	{
		int j=0;
		for(j;j<8;j++)
		{
			pole[i][j]=0;
		}
	}
	int r1=0;
	int r2=0;
	for(int i=0;i<10;)
	{
		r1=losowa(0,7);
		r2=losowa(0,7);
		if(pole[r1][r2]==0)
		{
			pole[r1][r2]=losowa(1,6);
			i++;
		}
	}
	cout<<"-----------------"<<endl;
	for(int i=0;i<8;i++)
	{
		cout<<"|";
		for(int j=0;j<8;j++)
		{
			cout<<pole[i][j]<<"|";
		}
		cout<<endl;
		cout<<"-----------------"<<endl;
	}
	int max=0;
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			if(pole[i][j]>max)
			{
				max=pole[i][j];
			}
		}
	}
	cout<<"Najwiekszy ciezar to "<<max<<"."<<endl;
	cout<<"Posiadaja go pionki na polach: ";
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			if(pole[i][j]==max)
			{
				cout<<"["<<i<<"]"<<"["<<j<<"]"<<",";
			}
		}
	}
	getch();
}
1

Zadanie jest w zasadzie trywialne. Można to zrobić nie tylko rysując tą figurę, ale tworząc tabelkę kwadratową (albo operować, jakby ona była). W "puste" miejsca wypisujemy znak spacji, a w innym wypadku znak '*'. Można to byłoby zrobić w sposób mało rozumowy - sprawdzić i zapamiętać wszystkie pozycje pól z gwiazdkami i w nich wypisywać je, ale po co się tak męczyć? Kto myśli ten szybko dochodzi do celu ;). Zastanówmy się zatem nad tym jaki jeden warunek zrobić, aby narysować przekątną. Pola przekątnej () mają współrzędne sobie równe. Pierwsza gwiazdka na polu [0][0] kolejna [1][1] zatem, gdy x i y są sobie równe. (Tak bardzo upraszczając). Kolejnym warunkiem w naszym X jest 2. przekątna. [0][9] [1][8] (dla boku 10) zatem, wtedy, gdy suma x i y jest równa (10-1). Zatem nasz X możemy narysować tak:

#include <iostream>

using namespace std;
  
int main(void)
 {
 //rysujemy X
  const int bok=10;
  char tabela[bok][bok];
  for(int i=0;i<bok;i++)
   {
    for(int x=0;x<bok;x++)
     {
      cout<<(tabela[i][x] =(((x==i)||(i+x==(bok-1)))?'*':' '));
     }
    cout<<'\n';
   } 
  return 0;
 }

A co z Z? Przekątną Z już mamy, zatem teraz wystarczy warunek na kreskę górną i dolną... a ona jest wtedy, gdy nasza wysokość jest w wierszu skrajnym, zatem program może wyglądać tak:

#include <iostream>

using namespace std;
  
int main(void)
 {
 //rysujemy rozciągnięte Z (bo 10 x 10 Z nie przypomina)
  const int bok=10;
  char tabela[bok][bok];
  for(int i=0;i<bok;i++)
   {
    for(int x=0;x<bok;x++)
     {
      cout<<(tabela[i][x]=(((i==0||i==(bok-1))||(i+x==(bok-1)))?'*':' '));
     }
    cout<<'\n';
   } 
  return 0;
 }

Można to też zrobić w sposób wypisz 10 * potem wypisz 8 znaków spacji i gwiazdkę, 7 znaków spacji ... i tak do 0 zspacji i znów 10*, ale nie wydaje mi się, aby tamto rozwiązanie było czytelniejsze i ładniejsze. Poza tym to możemy sobie bez problemu wrzucić w jakąś tabelkę.
Edit: zostałem ubiegnięty.
Edit: To jak ma być w tabelce to tutaj będzie również zapisywane do tabeli, bo bez tabeli rozwiązanie już jest.

0

Przyznam, że nie rozumiem o czym piszesz i po co wkleiłeś ten kod?

0

Ponieważ nauczyciel wspomniał ten kod jako przykład, tzn nie ten kod, ale bardzo podobny, ten co wstawiłem jest rozwinięciem tego co on podał jako przykład mi do wykonania w/w zadania.

W każdym razie doceniam wszystkich starania, ja dopiero się uczę z symfonii c++, każdy dostaje po plusiku, zaraz zobaczę te wasze zadania w visualu i wystawię naj. odpowiedź.

0

Polecenie było

Napisz program rysujący na ekranie monitora literę "X" za pomocą znaków * (gwiazdki) na polu o rozmiarze 10x10 .

Nie ma mowy o tablicach, jest tylko rysowanie, chyba że czytać ze zrozumieniem nie potrafię ;) Następnym razem jak będziesz potrzebował pomocy to pisz dokładnie o co chodzi, bo wiesz nikt na tym forum nie siedzi z tobą na lekcjach i nie wie w jakim kontekście jest osadzone zadanie :D

0

Wiem wiem, dobra piszę ostatni post aby nie spamować.
Polecenie było podręcznikowe i on powiedział tylko przykład by mnie naprowadzić, że to to zadanie o tym i o tym, a ja wstawiłem podobne bo tamtego już nie mogłem znaleźć :)

Dziękuję za pomoc, do zamknięcia. :)

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