• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak to zrobić lepiej c++

+1 głos
336 wizyt
pytanie zadane 2 sierpnia w C i C++ przez H1rund0 Nowicjusz (170 p.)

Cześć,

Przerabiam ostatnio książkę z zadaniami dla języka python, ale w c++. Aktualnie jestem na zadaniu nr 5, które 

brzmi następująco: 

„Masz takie wyrażenie: (((a1+a2)*a3)-a4)/a5 (elementy od a1 do a5 są typu zmiennoprzecinkowego: float). Pobierz z klawiatury każdą ze zmiennych a1 do a5, oblicz wartość wyrażenia i wyświetl wynik. Zwróć uwagę na wartość zmiennej a5. W przypadku, gdy jej wartość będzie równa 0, nie wykonuj działania, tylko poinformuj o tym.”

Fragmenty z książki: Tomasz Jaśniewski. „Python. Zbiór zadań z rozwiązaniami”. 

#include <iostream>

using namespace std;

float a [5];
float suma;

int main()
{
for(int i = 0; i<4;i++)
	{

		cout<<"Podaj liczbę a"<<i+1<<": ";
		cin>> a[i];a

	}
	cout<<"Podaj liczbę a5: ";
	cin>> a[4];
if(a[4]<=0)
	{
		while(a[4]==0)
		{
			cout<<"Podaj liczbę większą niż 0";
			cin>> a[4];
		}
	}
suma = (((a[0]+a[1])*a[2])-a[3])/a[4];	
cout<<suma;
}

Problemy które rozwiązałem na około to jest pobranie liczby nr 5 poza pętlą, żeby móc zrobić while który sprawdzi czy liczba jest większa od zera. Wygląda to dla mnie koślawo i myślę, że można by to zapisać lepiej, no ale nie wiem jak. Każde rady na wagę złota.

2 odpowiedzi

0 głosów
odpowiedź 2 sierpnia przez WojAbuk Gaduła (3,780 p.)
Nie używaj zmiennych globalnych bez potrzeby, using namespace std; też nie jest zalecane, choć przy prostych problemach nie robi różnicy. Co do twojego pytania, to najbardziej eleganckie jest wczytanie wszystkich zmiennych w pętli, a następnie warunkiem sprawdzić, czy a5 jest równe 0. Warto też podzielić kod na funkcje i by funkcja main zwracała wartość. Ogólnie w C/C++ obowiązuje konwencja, że w przypadku zakończenia programu sukcesem zwracamy 0, a w przeciwnym wypadku kod błędu.
0 głosów
odpowiedź 25 sierpnia przez Jacek0325 Obywatel (1,420 p.)

Hej,

Gratuluję pracy nad zadaniami z książki.

Na wstępie - jeśli poprawisz literówkę w linii 14, to program powinien się kompilować - pewnie domyślasz się, o jaką chodzi:

cin>> a[i];a

myślę, że można by to zapisać lepiej, no ale nie wiem jak.

Pomyślmy więc, co można poprawić. Tak jak napisał WojAbuk, dobrze jest wczytać najpierw wszystkie zmienne - proponuję poprawić pętlę for, żeby to zrobiła.

A potem? Zgodnie z treścią zadania są dwie drogi - albo a[4]==0 i dostajemy stosowną informację, albo a[4]!=0 i dostajemy wynik. A zatem if … else … będzie ok, już bez tej pętli while w środku.

Poniższy kod mam nadzieję ułatwi Ci sprawę - jak widzisz, zrezygnowałem w nim ze zmiennych globalnych i dodałem zwracanie wartości (tak jak WojAbuk podpowiadał):

#include <iostream>

using namespace std;

int main()
{
	float a[5];
	float suma;

	//tutaj pętla for wczytująca zmienne
	
	if(a[4]==0) {
		//tutaj jedna możliwość
	}
	else {
		//tutaj druga
	}

	return 0;
}

Jak widzę, myślałeś też nad opcją, żeby wczytywać zmienną a[4] w pętli - aż użytkownik poda różną od 0. Treść zadania moim zdaniem nie wymaga tego, ale gdybyś chciał tak zrobić i miał kłopot - daj znać!

1
komentarz 30 sierpnia przez H1rund0 Nowicjusz (170 p.)

Witaj,

Dziękuję za konstruktywną odpowiedź, miło mi. Po odpowiedzi WojAbuk wróciłem do zadania i wykonałem je według jego mam nadzieje wizji w tamtym czasie. 

#include <iostream>

using namespace std;

float petla(float a[])
{
	for(int i = 0; i<5;i++)
	{
		cout<<"Podaj liczbe "<<i + 1<<" : ";
		cin>>a[i];
	}
	if(a[4]==0){
		while(a[4]==0){
			cout<<"Podaj ponownie piątą liczbę: ";
			cin>>a[4];
		}
	}
return 0;
}

int main(){
	float a[5];
	petla(a);
	float suma = (((a[0]+a[1])*a[2])-a[3])/a[4];
	cout<<"Wynik tego zadania wynosi: "<< suma;
	return 0;
}

Program działa i pewnie będę go sobie rozwijał jak znajdę coś ciekawego w Opus. Ewentualnie podejmę się jakiegoś wyzwania od ciebie lub innych forum-owiczów. 

komentarz 7 września przez Jacek0325 Obywatel (1,420 p.)

Fajnie to rozwiązałeś smiley U mnie też działa, natomiast idealnie nie jest - powiem może, co bym w kodzie poprawił:

W linii 5:

float petla(float a[])

funkcja petla jest typu float, co oznacza, że tam, gdzie jest wywołana, zwraca wartość typu float - w naszym przykładzie zwraca po prostu 0, bo tak jest poproszona w linii 18:

return 0;

To powoduje, że w funkcji main(), w linii 23:

petla(a);

po prostu pojawia się wartość 0, a tak to nie powinno działać.

Jest proste rozwiązanie - zamienić funkcję petla na procedurę, żeby nic nie zwracała - czyli zamiast typu float dać void i usunąć z niej instrukcję return 0;

Druga rzecz - nazwa zmiennej suma jest trochę nietrafiona, bo to co do niej trafia de facto nie jest sumą (nie jest to wynik dodawania).

I trzecia rzecz, że fragment między liniami 12-16 można zapisać trochę lepiej, prościej - jeśli jesteś ciekawy jak, daj znać.

Podobne pytania

+1 głos
1 odpowiedź 1,255 wizyt
pytanie zadane 6 listopada 2015 w C i C++ przez Baakoma Użytkownik (780 p.)
0 głosów
1 odpowiedź 978 wizyt
pytanie zadane 5 czerwca 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 1,258 wizyt
pytanie zadane 16 sierpnia 2016 w C i C++ przez Informatyk# Obywatel (1,060 p.)

93,790 zapytań

142,754 odpowiedzi

323,429 komentarzy

63,396 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...