[C++], program na poziomie liceum


(grzes6y53) #1

sam, nie mając w liceum informatyki zacząłem się jej uczyć. powoli robię to co jest w podręczniku. napotkałem takie polecenie: napisz program, który dla podanych trzech liczb będących długościami odcinków bada, czy da się z nich zbudować trójkąt. jeśli tak to określa powstały trójkąt jako rozwartokątny, ostrokątny, równoramienny lub prostokatny. w programie wykorzystaj zdefiniowane przez siebie funkcje.

Napisałem, jednak trochę brakuje, a mianowicie tego, że jeśli z boków nie da się zbudować trójkąta, to żeby nie były sprawdzane pozostałe warunki.

#include 

#include 

using namespace std;



void trojkat_budowa (int a, int b, int c)

  {

  cout << "Podaj pierwszy bok trojkata.";

  cin >> a;

  cout << "Podaj drugi bok trojkata.";

  cin >> b;

  cout << "Podaj trzeci bok trojkata.";

  cin >> c;

  if 

  ((a+b>c) && (b+c>a) && (a+c>b))

  cout << "Dobrze, z podanych bokow mozna zbudowac trojkat." << endl;

  else

  cout << "Z podanych bokow nie mozna zbudowac trojkata."; 


  if 

  (((a*a)+(b*b)<(c*c)) || ((b*b)+(c*c)<(a*a)) || ((a*a)+(c*c)<(b*b)))

  cout << " Trojkat jest rozwartokatny.";

  if 

  (((a*a)+(b*b)>(c*c)) || ((b*b)+(c*c)>(a*a)) || ((a*a)+(c*c)>(b*b)))

  cout << " Trojkat jest ostrokatny.";

  if 

  (((a*a)+(b*b)==(c*c)) || ((b*b)+(c*c)==(a*a)) || ((a*a)+(c*c)==(b*b)))

  cout << " Trojkat jest prostokatny.";

  else

  cout << " Trojkat jest rownoramienny.";

  }  


int main()

{

    int a, b, c;

    trojkat_budowa(a, b, c);


cin.ignore();

getchar();

return 0;

}

Chciałbym, żeby to co stworzyłem było przekształcone w jak najmniejszym stopniu. Dziękuję.


(Frankfurterium) #2
  1. Jaki podręcznik każe ci tak formatować kod? Tak czy siak - krzywdzi cię. W internecie znajdziesz masę informacji o tworzeniu czytelnego kodu.

  2. Budowa jednej, wielkiej, wszystkorobiącej funkcji (twoja trojkat_budowa() ) nie jest najszczęśliwszym wyborem. Znacznie lepiej jest dzielić problem na szereg mniejszych ale bardziej wyspecjalizowanych podfunkcji. Właśnie w czymś takim zamknij kod dalszego sprawdzania i wywołuj tylko wtedy, kiedy if wykaże, że trójkąt jest możliwy do zbudowania.


(Wojtekbogocki) #3

Znaczy się szukasz warunku pt 'czy z tych boków da się zbudować trójkąt?' Oto i on:

a <= b + c

gdzie a to najdłuższy bok w trójkącie


(konrad147) #4

Tak jak mówił @Frankfurterium twój kod jest bardzo nieczytelny, a co do twojego problemu to może po prostu zagnieźdź ify które sprawdzają jaki jest trójkąt w ifie, który sprawdza czy to w ogóle trójkąt.

I jeszcze jedno, po co tworzysz funkcję, która ma przyjąć 3 argumenty skoro argumenty, z którymi ją wywołujesz są losowe, a wartości wczytujesz i tak dopiero w funkcji?


(Rolek0) #5
#include 

#include 

using namespace std;


int main()

{

	cout << "Podaj boki trojkata: ";

	int b[3];

	cin >> b[0] >> b[1] >> b[2];

	sort(&b[0], &b[2]);

	if(b[0] + b[1] < b[2])

	{

		cout << "To nie jest trojkat.";

		return 0;

	}

	cout << "Jest to trojkat ";

	int p = b[0] * b[0] + b[1] * b[1] - b[2] * b[2];

	if(p < 0)

		cout << "rozwartokatny.";

	else if(p > 0)

		cout << "ostrokatny.";

	else

		cout << "prostokatny.";

	return 0;

}

Jak chcesz się nauczyć programować w C++ to polecam: http://xion.org.pl/productions/texts/coding/megatutorial/, co prawda ma już swoje lata (void main() nie wszędzie działa, lepiej uzywać int main()) ale warto go przeczytać bo można się dużo nauczyć :slight_smile:


(grzes6y53) #6

podręcznik operonu

nieczytelny zapewne dlatego, że jak się uprę na jakąś opcję to chce ją wykorzystać i dlatego później wychodzi nieczytelnie. dzięki.