Witam
Jestem nowy i jest to moje pierwsze(nie licząc zadania próbnego) zadanie. Dopiero zaczynam uczyć się c++ i potrzebuje pomocy w rozwiązaniu tego zadania. Problem polega na tym, że po wprowadzeniu pierwszej instrukcji wszystko dział prawidłowo, ale dla drugiej instrukcji wyświetla wynik 0. Nie wiem na czym polega problem, i jak mowie dopiero zaczynam, wiec być może jest to jakiś oczywisty błąd.
Będę wdzięczny za każda rade
Z góry dziękuje za pomoc.
#include <iostream>
using namespace std;
int testy;
int obzartuchy;
int ciastka;
int wynik;
int main()
{
cin>>testy;
for(int i=1; i<=testy; i++)
{
cin>>obzartuchy>>ciastka;
int czas[obzartuchy];
for(int a=1; a<=obzartuchy; a++)
{
cin>>czas[a-1];
}
for(int b=1; b<=obzartuchy;b++)
{
wynik=3600/czas[b-2]*24+3600/czas[b-1]*24;
}
while(wynik%10!=0)
wynik++;
cout<<wynik/ciastka<<endl;
}
return 0;
}
Moim zdaniem powinieneś od nowa przemyśleć algorytm, bo obecny wydaje mi się błędny. Swoją drogą przenieś deklarację zmiennych z wyjątkiem testy do pętli for albo przynajmniej je zeruj co obrót pętli, bo obecnie zostają w nich wartości z poprzedniego co może mieć wpływ na wyniki końcowe. Inna sprawa że przydało by się nadać nim wartość początkową, bo obecnie jest losowa co też może mieć wpływ na wyniki.
Hej, rzuci ktoś mądry okiem na to? Generalnie działa, tylko mam taki problem, że gdzieś coś pomieszałem z pętlą, bo po wypisaniu na ekran wyniku z pierwszego testu wyniki z drugiego dodaje do tego pierwszego, a nie liczy ich od nowa. Proszę o wskazówki.
include
include
using namespace std;
int main()
{
float suma=0;
int t;//Podaj liczbê tesów do wykonania
int n;//ilu ob¿artuchów
int d=86400;//liczba sekund w dobie
float czas[100000];//czas zjadanie jednego ciastka
long m;//ile ciastek w jednym pudelku
float wynik;
cin>>t;
for(int i=1; i<=t; i++)
{
cin>>n>>m;
for(int k=1; k<=n; k++)
{
cin>>czas[k];
czas[k]=floor(d/czas[k]);
suma=suma+czas[k];
cout<}
wynik=suma/m;
cout<
}
return 0;
}
Hmm ja nie jestem orłem, nie sprawdzałem działania twojego kodu, bo jest z nim na pewno coś nie tak na końcu, ale jak użyjesz floor to dostaniesz wynik zaokrąglony w dół, a Ty potrzebujesz ewentualnie zaokrąglić w górę - ceil, zgodnie z treścią zadania. Dodatkowym problemem jest pewnie to, że nie czyścisz tablicy na koniec danego testu i prawdopodobnie pozostają w niej śmieci z poprzedniego testu. Możesz sprawdzić moje wskazówki, ale zaznaczam, jak już napisałem, że nie jestem orłem.
Hej, dzieki wielkie za pomoc. Błąd okazał się błachy i faktycznie chodziło o 'czyszczenie' tablicy na koncu, czyli innymi słowy o przwrócenie sumie wartości 0. Co do użycia floor się nie zgodzę, bo w zadaniu jest napisane również, że obżartuchy nie mogą rozpocząc kolejnego ciastka jeśli nie ma pewności, ze je skończą w ciągu dobry, dlatego też użyłem floor, żeby tego uniknąć.
#include <iostream>
using namespace std;
int main()
{
unsigned short test, ilu;
unsigned long long ciastek;
cin>>test;
for (int i=0;i<test; i++)
{
cin>> ilu >> ciastek;
unsigned short suma=0,sekund;
for (int i=0; i<ilu;i++)
{
cin>> sekund;
suma+=(86400/sekund);
}
suma/=ciastek;
if (suma%ciastek<=0,5)
suma++;
cout<< suma<< endl;
}
return 0;
}
Witam co z tym kodem jest nie tak u mnie na VS 2012 dobrze działa jak również na ideone.
- Strukturę programu - wcięcia w kodzie.
- Typy zmiennych
- Nazwy zmiennych
- Na początek pisz prosto,
- Nie używaj tej samej zmiennej do kilku rzeczy [oczywiście nie mam na myśli zmiennej i - ta jest ok. suma [lepiej sumaZjedzonychCiastek. Więc nie suma /= ciastek tylko: ilePudelek = sumaZjedzonychCiastek / ciastekWpudelku. A potem if (sumaZjedzonychCiastek % ciastekWpudelku != 0 ) ilePudelek++
Jeżeli będziesz pisał tak jak teraz, nie tylko Ty ale i nikt inny nie będzie widział, albo będzie trudno znaleźć błąd - czy już go teraz widzisz?
include
using namespace std;
int ile_razy;
int main()
{
cin>>ile_razy;
for(int b=0; b {
int N=0,M=0,t=0,suma_ciastek=0,suma_pudelek=0, t_ciastko=0,grubas=0; //N ilosc grubasow, M ilosc ciastek
t=60*60*24; //wynik w "s"
cin>>N>>M;
t_ciastko= new int[N];
grubas= new int[N];
for(int i=0; i<N; i++)
{
cin>>t_ciastko[i];
grubas[i]=t/t_ciastko[i]; //ilosc ciastek jakie zje
suma_ciastek+=grubas[i];
suma_pudelek=suma_ciastek/M;
}
if(suma_ciastek%M!=0)
suma_pudelek++;
cout<<suma_pudelek;
}
return 0;
}
Problem wyglada tak. Działac dziala, zadneg bledu nie wywala, u mnie wyniki mam dobre jak sprawdzam, ale testu przejsc nie chce. Na poczatku myslalem ze moze chodzi o zaokraglanie,bo zawsze zaokragla w dol, no ale jednak nie.
delete[]
Nie zapominaj o tym. Deklarowanie zmiennych globalnych jest uważane za złą praktykę, a w tak małych programach nie ułatwia w żaden sposób pisania. Najlepiej deklarować zmienne w miejscu gdzie są potrzebne.
Po co ci te ułamki? Żeby zrozumieć co tam napisałeś musiałem przeformatować u siebie kod do jakiejś bardziej czytelnej formy.
Popracuj nad kodem. Nad czytaniem poleceń też (uczestników jest 2-3?).
Najlepiej usuń to wszystko, przeczytaj parę razy polecenie i napisz to od nowa
Sam korzystam i sam zalecam taką metodę - kartkę, ołówek, http://www.wolframalpha.com/20 <-- kalkulator, geogebra <- rysowanie punktów i figur itd. Niestety błąd jaki tu popełniasz, najłatwiej zobaczyć, testując na danych przykładowych z zadania, testując <- "podając" dane z pliku, a nie z "ręki". Możesz to robić u siebie - przekierowując wejście lub na ideone.com wklejając i kod i dane wejściowe, a potem porównując swoje wyjście [na ideone.com] z poprawnym wyjściem podanym w zadaniu.
Każdy inny sposób testowania, nie pokaże CI tego paskudnego błędu, a wiem co mówię, bo znalazłem, poprawiłem i zaliczyłem, po raz enty, twoim poprawionym kodem, to zadanie.
Dobra, dziei, bede probowal. Ale mam jeszcze jedno pytanie. W poleceniu jest napisane zeby wyniki podawalo po wprowadzeniu wszystkiego. Wiec wynik trzeba gdzies zapisac a potem to gdzies wyswietlic. No ale wywala mi blad : Błąd wykonania (SIGSEGV). No i moje pytanie brzmi co to znaczy. Z tego co czytalem to jest cos z miejscem w pamieci czy cos, no ale mój angielski niestety nie jest na takim poziomie zeby zrozumiec o co dokladnie chodzi.
Naprawdę? Przecież, w tej wersji, którą podałeś tu na forum tego błędu nie było. Błąd SIGSEGV jest powodowany tym, że program "wychodzi" poza dozwolony obszar pamięci. Tak naprawdę nie musiałeś nic tablicować, lecz liczyć na "bieżąco" i na bieżąco podawać wynik. Wczytujesz dane do jednego testu, piszesz odpowiedź, wczytujesz drugi test, wypisujesz odpowiedź i td.
PS
Żeby oszczędzić sobie dalszych odpowiedzi a Tobie pytań. Dopisz po prostu, w odpowiednim miejscu ..... << endl;