Co zrobiłem żle/jak można uprościć program?

0

Hej! Jestem początkującym programistą (po 2 kółkach (zainteresowania) w gimnazjum ;p). Na tym kółku dostaliśmy adres strony, na której są zadania, i na którą uploadujemy swoje programy i strona sprawdza, czy są ok. No i dostaliśmy zadanie, którego tutaj nie mogę podać, ale powiem, że literka m to początkowa ilość many, k to koszt zaklęcia (które można wykonać raz na sekundę), a r to ile many regeneruje się przez sekundę. T to ilość przypadków testowych ( czyli ile razy będziemy wpisywać m,r,k ). Jeżeli zaklęcie można rzucać w nieskończoność, to to właśnie ma wypisać program. Przykład :
Dla danych wejściowych:
2
700 7 70
700 7 0
poprawną odpowiedzią jest:
11
NIESKONCZONOSC.
Jednak kiedy dodaję zadanie na stronę pisze, że jest niepoprawne. Co zrobiłem żle, lub ewentualnie co mogę zmienić, aby zadanie było uznane jako p[oprawne?

0

Może on ma dwie osobowości, ale nie widziałem u niego żadnej różdżki ;p

2
int t, m, r, k, a, b, c, d, e, f;

Nazywaj zmienne normalnie albo nie będziemy ci pomagać (foch).

0
Rev napisał(a):
int t, m, r, k, a, b, c, d, e, f;

Nazywaj zmienne normalnie albo nie będziemy ci pomagać (foch).

Co rozumiesz przez normalnie? t,m,r,k musi być, bo inaczej strona tego nie przyjmie. Resztę dawałem po prostu wg. alfabetu. Nie wiem jak mogę je inaczej nazwać...

3

Nazwa zmiennej może mieć więcej niż jedną literkę i to duuuużo więcej. Zmienne TRZEBA nazywać tak, żeby nazwa od razu wskazywała po co one tam w ogóle są.

2

t,m,r,k musi być, bo inaczej strona tego nie przyjmie.

Faktycznie niektórzy sędziowie działają na zasadzie dolinkowania części sprawdzającej i wywołują twoją część po nazwie symbolu, ale po pierwsze jest to cholernie niepopularne, a po drugie i tak chodzi o nazwę funkcji, a nie zmiennych lokalnych.

Nie wiem jak mogę je inaczej nazwać...

Nazwij je tak, żebym po przeczytaniu jej nazwy (a nie całego kodu) dowiedział się co będzie ona zawierać. Nie jest to najprostsze zadanie, ale jak zastanowisz się nad tym, jestem pewien, że coś wymyślisz. Jeszcze lepiej byłoby, gdybyś użył języka angielskiego, ale biorąc pod uwagę jego poziom wśród młodzieży, nie można oczekiwać cudów.

0
Rev napisał(a):

t,m,r,k musi być, bo inaczej strona tego nie przyjmie.

Faktycznie niektórzy sędziowie działają na zasadzie dolinkowania części sprawdzającej i wywołują twoją część po nazwie symbolu, ale po pierwsze jest to cholernie niepopularne, a po drugie i tak chodzi o nazwę funkcji, a nie zmiennych lokalnych.

Nie wiem jak mogę je inaczej nazwać...

Nazwij je tak, żebym po przeczytaniu jej nazwy (a nie całego kodu) dowiedział się co będzie ona zawierać. Nie jest to najprostsze zadanie, ale jak zastanowisz się nad tym, jestem pewien, że coś wymyślisz. Jeszcze lepiej byłoby, gdybyś użył języka angielskiego, ale biorąc pod uwagę jego poziom wśród młodzieży, nie można oczekiwać cudów.

Akurat Angielski znam bardzo dobrze, mam 6 i chodzę na dodatkowe lekcje, więc zaraz pozmieniam nazwy ;)

0

Coś tam wymodziłem, ale nie wiem czy dobrze ;p

0
#include <iostream>
using namespace std;

int main(void)
{ ios_base::sync_with_stdio(0);
    int t, m, r, k, division, act, sum, mult, div, total;



    cin >> t;
    for(int i = 0; i < t; i++)
    {


            cin >> m;

            cin >> r;

            cin >> k;
            if (k<1)
            {
                cout << "NIESKONCZONOSC" << endl;
            }
            else if (r>k)
            {
                cout << "NIESKONCZONOSC" << endl;
            }
            else
            {

                division = (m/k);
                act = (division*r)/k;
                sum = division+act;
                    if (division<r)
                    {
                        mult = division*r;
                        div = mult/k;
                        total = division + act + div;
                        cout << total << endl;
                    }
                    else
                    {
                        cout << sum << endl;
                    }


                }

    }

    return 0;
}
 
2

Nie chodzi o nazwanie ich po tym z jakiego działania matematycznego powstaje zmienna, bo to przecież widzę pięć znaków dalej w tej samej linii. Zmienne powinny mieć nazwy, które oddadzą ich sens w logice algorytmu.

#include <iostream>

using namespace std;

int main()
{
	int testCount;
	cin >> testCount;

	for(int i = 0; i < testCount; i++)
	{
		int baseMana, regeneration, castCost;
		cin >> baseMana >> regeneration >> castCost;

		if(regeneration > castCost || (regeneration == castCost && baseMana >= castCost))
			cout << "nieskonczonosc\n";
		else
		{
			int baseManaCastCount = baseMana / castCost;
			int baseManaLeftover = baseMana % castCost;

			int newManaCastCount = (regeneration * baseManaCastCount + baseManaLeftover) / castCost;

			int totalCastCount = baseManaCastCount + newManaCastCount;

			cout << totalCastCount << "\n";
		}
	}

	return 0;
}

Pisany "na oko", przydałoby się więcej przypadków testowych. Przyjąłem, że mana regeneruje się po rzucie każdego zaklęcia.

0
Rev napisał(a):

Nie chodzi o nazwanie ich po tym z jakiego działania matematycznego powstaje zmienna, bo to przecież widzę pięć znaków dalej w tej samej linii. Zmienne powinny mieć nazwy, które oddadzą ich sens w logice algorytmu.

#include <iostream>

using namespace std;

int main()
{
	int testCount;
	cin >> testCount;

	for(int i = 0; i < testCount; i++)
	{
		int baseMana, regeneration, castCost;
		cin >> baseMana >> regeneration >> castCost;

		if(regeneration > castCost || (regeneration == castCost && baseMana >= castCost))
			cout << "nieskonczonosc\n";
		else
		{
			int baseManaCastCount = baseMana / castCost;
			int baseManaLeftover = baseMana % castCost;

			int newManaCastCount = (regeneration * baseManaCastCount + baseManaLeftover) / castCost;

			int totalCastCount = baseManaCastCount + newManaCastCount;

			cout << totalCastCount << "\n";
		}
	}

	return 0;
}

Pisany "na oko", przydałoby się więcej przypadków testowych. Przyjąłem, że mana regeneruje się po rzucie każdego zaklęcia.

Wow... Większości z tego nie zrozumiałem, ale działa, prawie działa... Ja żeby sprawdzić, czy on działa daję sobie 4 przypadki testowe : 700 80 70, 700 7 70, 700 70 0, 700 35 70. I właśnie ten ostatni tu nie działa, bo wychodzi 15, a ma wyjść 20. Mi się u mnie to w końcu udało zrobić i tu też bym przerobił, jakbym coś z tego zrozumiał...

1

700 35 70. I właśnie ten ostatni tu nie działa, bo wychodzi 15, a ma wyjść 20.

Faktycznie, nie wziąłem pod uwagę tego, że podczas używania zregenerowanej many ona wciąż będzie się nam regenerować ;). Zaraz poprawię.

edit: jesteś pewien, że 20?

Z many bazowej rzucimy czar 10 razy, zostanie 0 many, a zregeneruje się 10 * 35 = 350.
Z 350 many rzucimy czar 5 razy, zostanie 0 many, a zregeneruje się 5 * 35 = 175.
Ze 175 many rzucimy czar 2 razy, zostanie 35 many, a zregeneruje się 2 * 35 = 70.
Ze 105 many rzucimy czar 1 raz, zostanie 35 many, a zregeneruje się 1 * 35 = 35.
Z 70 many rzucimy czar 1 raz, zostanie 0 many, zregeneruje się 35, ale to już za mało, żeby rzucić kolejny.

10 + 5 + 2 + 1 + 1 = 19.

#include <iostream>

using namespace std;

int main()
{
	int testCount;
	cin >> testCount;

	for(int i = 0; i < testCount; i++)
	{
		int mana, regeneration, cost;
		cin >> mana >> regeneration >> cost;

		if(regeneration > cost || (regeneration == cost && mana >= cost))
			cout << "nieskonczonosc\n";
		else
		{
			int totalCastCount = 0;

			while(mana >= cost)
			{
				int castCount = mana / cost;
				int manaLeftover = mana % cost;

				mana = regeneration * castCount + manaLeftover;

				totalCastCount += castCount;
			}

			cout << totalCastCount << "\n";
		}
	}

	return 0;
}
0

Hmm... Na stronie tego nie przyjęło (tak, pozmieniałem odpowiednie zmienne). Może muszę to jakoś uprościć, "do mojego poziomu" ;p W każdym razie bardzo dziękuję za pomoc!

2
NwmJakiNickDac napisał(a):

Hmm... Na stronie tego nie przyjęło (tak, pozmieniałem odpowiednie zmienne). Może muszę to jakoś uprościć, "do mojego poziomu" ;p W każdym razie bardzo dziękuję za pomoc!

void foo(int m, int r, int k) {
    if((k - r) > 0)
        std::cout<<m / (k - r)<<std::endl;
    else
        std::cout<<"NIESKONCZONOSC"<<std::endl;
}
0
Matematyk napisał(a):
NwmJakiNickDac napisał(a):

Hmm... Na stronie tego nie przyjęło (tak, pozmieniałem odpowiednie zmienne). Może muszę to jakoś uprościć, "do mojego poziomu" ;p W każdym razie bardzo dziękuję za pomoc!

void foo(int m, int r, int k) {
    if((k - r) > 0)
        std::cout<<m / (k - r)<<std::endl;
    else
        std::cout<<"NIESKONCZONOSC"<<std::endl;
}

DZIĘKUJĘ!!! Zmieniłem tylko trochę i poszło! Dałbym +, ale nie mam konta ;)

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