*
* zajmują miejsce w pamięci przez cały czas działania programu
* jak piszesz kod to zazwyczaj używa się do tych samych konstrukcji jak for takich samych zmiennych "i" na przykład .
Teraz jak będziesz chciał użyć w pętli zmiennej globalnej to może się okazać że tejzmiennej jjuż przypisales wartość i nadpisujac ja program zacznie się dziwnie zachowywać .
* dla każdego bardziej skomplikowanego kodu praktycznie zawsze zabraknie krótkich nazw zmiennych - a wymyślanie nowych jest niepraktyczne bo już się jest przyzwyczajonym do pewnej konwencji . Jak spojrzysz na kod to od razu wiesz do czego dana zmienna jest uży a bo zawsze jej do tego używasz . Praktycznie idzie tak całe struktury tworzyć - taki kod jest później też bardziej czytelny .
* nie wiem jak sobie wyobrażasz kod z setka unikalnych nazw zmiennych .
* łatwiej też zastosować dla kodu ze zmiennymi lokalnymi metodę kopiuj w klej ( wiem że to zła praktyka - ale kto tego nie robi żeby zaoszczędzić czas )
Nie trzeba, wystarczy tylko [krótko ]:
- starać się nie stosować
- mieć świadomość, że istnieją też zmienne lokalne
- dowiedzieć się [literatura] czym to [lokalne vs globalne] się różni.
- stosować świadomie - twój wybór.
- to, że w małych i prostych programach [np na SPOJ'a] nie ma różnicy, nie znaczy, że zmienne globalne są dobrą praktyką programistyczną - NIE nie są.
- SPOJ służy do uatrakcyjnienia nauki i utrwalania wiedzy informatycznej [algorytmicznej], ale mimo wielu zalet, ma też wady - np nie sprawdza "piękności" kodu - wystarczy "mu", że kod [nawet brzydki] daje poprawne odpowiedzi, na przygotowane testy.
- kod jest "czytany" nie tylko przez kompilator, który często potrafi "wypluć" bardziej czysty i optymalny program niż to się nawet śniło koderowi, ale także jest czytany przez człowieka, więc lepiej, by był ładny i czytelny.
Dwa fragmenty kodu w c++:
......
int i = 0;
int main()
{
...
for (;;)
{
cout << i << endl;
++i;
if (i > 9) break;
}
.....
int main(){
....
for (int i = 0; i < 10; ++i)
cout << i << endl;
......
// no comments
Ja nie potrafiłem odczytać tej twojej wizji z twojego kodu.
Większość zadań, można rozwiązać na wiele sposobów i dopiero teraz dostrzegłem inny [od mojej wersji] sposób - możliwe, że to była właśnie twoja wizja, której nie potrafiłeś poprawnie przekazać w swoim kodzie:
- obliczamy ile ciastek zje kolejny obżartuch.
- od tej ilości odejmujemy iość ciastek, które ewentualnie zostały w pudełku u poprzedniego obżartucha.
- obliczamy ilość pudełek, dla poprawionej ilości ciastek + ewentualną resztę ciastek w ostatnim pudełku
- dodajemy ilość pudełek do sumy
- if not last go to 1
- drukujemy obliczoną sumę pudełek
Jest to metoda bardziej "pracochłonna", ale i tak całą pracę wykonuje komputer [procesor].
Chyba łatwiej jednak jest wykorzystać jednego "zastępczego" obżartucha, który zjada wszystkie ciastka, i dopiero dla niego obliczyć potrzebną ilość pudełek.
PS
go to - użyłem tu tylko w psudokodzie , w normalnym kodzie należy użyć normalnej pętli.
Jeszcze raz dzięki za wskazówki. I co do mojej wizji - nic Ci nie ujmując to wydaje mi się, że rzeczywiście jej nie dostrzegłeś, bo to właśnie wskazówka od @mariusz193 pomogła mi poprawić kod.
Jeśli kogoś interesuje ja to zrobiłem tak:
1. Od liczby sekund w dobie odejmujemy kolejno w pętli czas jedzenia jednego ciastka przez obżartucha, a z każdą dekrementacją dodajemy 1 do licznika ciastek aż pozostały czas będzie mniejszy niż czas jedzenia ciastka;
2. Robimy tak z każdym obżartuchem sumując potem CAŁOŚĆ, a więc ich wszystkie zjedzone ciastka
3. Sumę dzielimy całkowicie przez liczbę ciastek w pudełku i wychodzi nam liczba potrzebnych pudełek
4. Sprawdzamy czy jest reszta - jeżeli tak, dodajemy 1 do liczby pudełek
5. Jeżeli ta reszta jest większa niż liczba ciastek w jednym pudełku (co w zasadzie nie powinno się zdarzyć, nie wiem czemu to uwzględniłem) to jeszcze raz dodajemy 1 do liczby pudełek.
I tyle. Wcześniejsza wizja była błędna ponieważ liczyłem pudełka dla każdego obżartucha osobno. Oczywiście pomijając błędy w kodzie co mogło pogarszać jego czytelność. Tak więc rzeczywiście jak mówisz to zadanie (jak pewnie wiele tutaj) można rozwiązać na kilka sposobów.
I to jest taki moment, gdy zaczynam się zastanawiać, czy ma to jakikolwiek sens, wkładania jakiegokolwiek większego wysiłku w "nadmierne" pomaganie początkującym?
Nic Ci nie ujmując, odnoszę wrażenie, że nie do końca zrozumiałeś [moich] podpowiedzi.
Więc może nie warto się wychylać i wystarczy tylko poczekać trochę dłużej, aż ktoś inny, [lepiej?] odpowie pytającemu? Miałem to "nieszczęście", że pisałem w tym samym czasie, co @mariusz193, a wystarczyło z podpowiedzią, poczekać trochę dłużej, a ewentualnie [mimo prośby pytającego] ograniczyć się tytlko do tego, co określa on [@mariusz193] jako zasadę?
W takim razie, wybacz, że niepotrzebnie zamąciłem Ci w głowie, i postaram się od teraz lepiej stosować do tej jednej prostej zasady.
programować każdy może (co widać po poziomie prezentowanych rozwiązań zadań)
i co więcej, prawie wszyscy są przekonani, że to potrafią, a jedynie przez złośliwość sędziego nie zalicza im rozwiązań
ja zaś nie mam ani ambicji, ani ochoty uczyć kogokolwiek czegokolwiek - co powinni zrozumieć wszyscy mający nauczycielkę za żonę
trochę lepiej lub trochę gorzej...., a po otrzymaniu AC, co niektórzy natychmiast myślą, że [lepiej] i że kogokolwiek interesuje ich [dziwny] sposób uzyskania go [AC].
Chyba, że znowu nie dostrzegam wizji. A [może?] wizja ta, to niewykorzystane moce CPU-SPOJA, ktore trzeba koniecznie spożytkować na dodatkową i niepotrzebną pracę. I wizja ta jest czymś zupełnie innym, niż:
PS
Wizja przecież ta sama [jakby ktoś miał wątpliwości], ale wykonanie już nie
PS 2
Mam tylo siostrę polonistkę [nie nauczycielkę], aktualnie zajmującą się w wolnym czasie redakcją techniczną [korekta] różnych wydawnictw [nie związanych z IT], na szczęście teraz już chroni mnie bariera czasoprzestrzeni, więc tylko mogę sobie wyobrazić twoją sytuację
Witam wszystkich, podpinam się pod temat. Rozwiązałem to zadanie poprawnie wysyłając ten kod:
#include <iostream>
using namespace std;
int n, m, ile;
double ile_pudelek2=0;
int suma=0, ile_pudelek=0, ile_zje=0;
int czas[10000];
int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
cin>>n>>m;
for(int j=1; j<=n; j++)
{
cin>>czas[j];
ile_zje=86400/czas[j];
suma+=ile_zje;
}
ile_pudelek=suma/m;
ile_pudelek2=(double)suma/m;
if( ile_pudelek2 > ile_pudelek)
cout<<ile_pudelek+1<<endl;
else
cout<<ile_pudelek<<endl;
ile_pudelek=0;
ile_pudelek2=0;
suma=0;
}
return 0;
}
Jednak nie podobało mi się w moim kodzie to, że za każdym razem tworzy się tak duża tablica mimo, że nie jest to potrzebne i wprowadziłem do mojego kodu następującą zmianę:
#include <iostream>
using namespace std;
int n, m, ile;
double ile_pudelek2=0;
int suma=0, ile_pudelek=0, ile_zje=0;
int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
cin>>n>>m;
int *czas;
czas = new int [n];
for(int j=1; j<=n; j++)
{
cin>>czas[j];
ile_zje=86400/czas[j];
suma+=ile_zje;
}
delete [] czas;
ile_pudelek=suma/m;
ile_pudelek2=(double)suma/m;
if( ile_pudelek2 > ile_pudelek)
cout<<ile_pudelek+1<<endl;
else
cout<<ile_pudelek<<endl;
ile_pudelek=0;
ile_pudelek2=0;
suma=0;
}
return 0;
}
Po tej zmianie dostaje komunikat o błędzie wykonania. Niestety nie mam pojęcia co jest nie tak i zwracam się z pytaniem do was. Błąd jest pewnie trywialny, ale moje oko osoby uczącej się programować nie wychwytuje go
Pozdrawiam
hej, zrobiłem trochę testów swojego kodu i dla moich zestawów danych działał ok, niestety(w sumie to bardziej stety ) sędzia znajduje jakiś błąd, jakby ktoś był w stanie przejrzeć mój kod i znaleźć błędy to byłbym mega wdzięczny. Wybaczcie ogólnie słabą jakość kodu ale wracam do programowania po dłuuuugim czasie i dopiero przypominam sobie jak to wszystko ma wyglądać:
sędzia zaakceptował ostatecznie program bez ingerencji w pętle, pozbyłem się tylko tablic i zastąpiłem je zmiennymi. @narbej , mógłbyś mi wytłumaczyć jaka jest różnica pomiędzy moim a twoim zapisem pętli?
@mariusz193 napisał, co powinieneś zrobić [poczytać podręcznik, literaturę]
Np:
dla N = 10
tab1 = new int[N];
tab1 jest indeksowana od zera, więc zawiera:
tab1[0],
tab1[1],
tab1[2],
tab1[3],
tab1[4],
tab1[5],
tab1[6],
tab1[7],
tab1[8],
tab1[9],
Skoro tak, to [poprawna] pętla też powinna "startować" od zera:
for (int i = 0; i < N; ++i){
.....
PS
Inna sprawa, że jak sam się przekonałeś i o czym też wspomniał @mariusz193 i wiele/kilka innych osób [w tym wątku], tablica/e są tu niepotrzebna/e ale z tablicami też można, ale należy się z nimi "zaprzyjaźnić" i nauczyć się z nimi "żyć".
PS 2
Błąd - niewielkie przekroczenie indeksu, [do tego dla bardzo małej tablicy] często nie spowoduje żadnego błędu i dlatego u Ciebie, przy normalnej kompilacji, wszystko wygląda ok, a w wynikowym programie indeksy nie są sprawdzane na przekroczenie zakresu. Na SPOJu jednak kompilacja nie jest "normalna" i dodawane jest [odpowiednia biblioteka] bardzo dokładne.sprawdzanie, czy nie wystąpiło przekroczenie indeksu.
PS 3
Dokładnie ten sam, wyżej opisany, problem występuje w obu waszych programach @grg1 i @mariusz_95
Też się dziwię, ale to tylko dlatego, że sedzia ma małą AI i IQ [iloraz inteligencji].
A serio, ilość linijek kodu nie jest dobrym miernikiem dobroci kodu i czymś czym powinieneś się przejmować i do czego bezwzględnie dążyć. Oczywiście jest ważne, aby kod był krótki i treściwy, łatwy do ogarnięcia jednym rzutem oka.
Muszę cię zmartwić, ja ten kod napisałem w 2 linijkach, mało czytelnie dla człowieka, ale wystarczająco dla sędziego. W formie bardziej czytelnej [dla człowieka] zajęło mi to 8 linijek w C++.
PS
Jeżeli interesują cIĘ TAKIE WYZWANIA [PISANIE JAK NAJKRÓTSZEGO KODU] TO TU JEST TAKIE MIEJSCE: http://www.spoj.com/SHORTEN/4
PS Sorry, włączył mi się niechcący capslock