Pętla for w połączeniu z if

0

Witam serdecznie,

chcę napisać program, który pobiera z pliku dwie liczby całkowite rozdzielone białymi znakami (pierwsza to wielkość pakietu danych w bajtach a druga wolna przestrzeń dyskowa w megabajtach). W kolejnych wierszach ma wypisać:

  1. ile pakietów danych się zmieści na dysku,
  2. numer pakietu i jego wielkość (jeśli pakiet mieści się na dysku),
  3. całkowity zajęty rozmiar.
    Pakiety od drugiego do piątego są dwa razy większe niż pakiet poprzedni, a od pakietu szóstego - trzy razy; w przypadku błędu program wypisuje ***

Metodą prób i błędów posuwam się do przodu jednak teraz utknąłem:) Dane z pliku ładuję, objętość pierwszego pakietu to moja zmienna start, objętość dysku to moja zmienna dysk.

Problemy mam trzy - wszystkie dot. wklejonego fragmentu kodu:
https://4programmers.net/Pastebin/5548

  1. Jak zwiększyć mnożnik od szóstego pakietu? Poprzez if zagnieżdżone w for? Czy może nie tędy droga?
  2. Jak określić kończący warunek dla i skoro jego wartość znam dopiero później (jak już widzę poprzez break ile pakietów weszło)? Póki co wpisałem sztucznie 1000.
  3. Analogicznie jak w pierwszej linii komunikatu wyjściowego podać liczbę i (pakietów) skoro wiem to dopiero na końcu?

Zdaję sobie sprawę, że ten kod można napisać na wiele sposobów o wiele lepiej/sprawniej/prościej.
Jestem jednak dopiero na początku swojej przygody z Javą i dlatego proszę zarówno o wyrozumiałość jak i wskazówki w zakresie moich pytań.

Dziękuję i pozdrawiam,
Arek

0
arhetyp napisał(a):
  1. Jak zwiększyć mnożnik od szóstego pakietu? Poprzez if zagnieżdżone w for? Czy może nie tędy droga?
  2. Jak określić kończący warunek dla i skoro jego wartość znam dopiero później (jak już widzę poprzez break ile pakietów weszło)? Póki co wpisałem sztucznie 1000.
  3. Analogicznie jak w pierwszej linii komunikatu wyjściowego podać liczbę i (pakietów) skoro wiem to dopiero na końcu?
  1. if + Zmienna
  2. if + Zmienna
  3. Zmienna
0
CeKa napisał(a):
arhetyp napisał(a):
  1. Jak zwiększyć mnożnik od szóstego pakietu? Poprzez if zagnieżdżone w for? Czy może nie tędy droga?
  2. Jak określić kończący warunek dla i skoro jego wartość znam dopiero później (jak już widzę poprzez break ile pakietów weszło)? Póki co wpisałem sztucznie 1000.
  3. Analogicznie jak w pierwszej linii komunikatu wyjściowego podać liczbę i (pakietów) skoro wiem to dopiero na końcu?
  1. if + Zmienna
  2. if + Zmienna
  3. Zmienna

a o jakieś szczegóły mogę prosić?:)

1
int final MEGABITE = 1048576;
...
int sizeOfFirstPackage = ...
int freeSpace = odczytane * MEGABITE;
int sizeOfNextPackage = sizeOfFirstPackage;
int usedSpace = 0;
int nr = 0;
while(usedSpace + sizeOfNextPackage <= freeSpace){
   usedSpace+=sizeOfNextPackage;
   if(nr < 5){
       sizeOfNextPackage*=2;
   }
   else{
       sizeOfNextPackage*=3;
   }
   nr++;
}
0

A za pomocą for również tak zgrabnie można to zapisać czy generalnie przy konieczności użycia if stosuje się raczej while?

Pozdrawiam,
Arek

1

Wybrałem while nie z powodu ifa, ale dlatego, że przed pętlą nie jest znana ilość kroków. Pętla for jest tu bardzo nienaturalna, ale można jej użyć. Działanie pętli można wtedy przerwać polecenie break.

0

Przetestowałem zaproponowane while w miarę swoich niskich (póki co niestety niskich) możliwości i mam trzy pytania:

  1. mnożnik *2 jest dopiero od drugiego pakietu, pierwszy ma wartość podaną startowo w pliku - dodawałem jeszcze jedno if dla nr == 1, do istniejącego dodałem nr > 1 jednak bez oczekiwanego rezultatu.
  2. Jak już chcę uzyskać finalną sumę used space otrzymuję niepoprawną sumę 390300 - dlaczego nie sumuje poprawnie?

1 200
2 400
3 800
4 1600
5 3200
6 9600
7 28800
8 86400
9 259200
10 777600
390300

  1. Pytanie ostatnie pozostaje aktualne z pierwotnego posta - jak w pierwszej linii pokazać nr skoro znam tę wartość dopiero później - można jakoś zmienić kolejność wyświetlania?

Pozdrawiam,
Arek

1
  1. Mój kod tak właśnie działa, mnożnik 2 jest od drugiego pakietu.
    2, Wynik sumowania jest poprawny (200+400+800+1600+3200+9600+28800+86400+259200=390200) - pewnie źle wyświetlasz.
  2. Wykonaj moją pętlę dwa razy, pierwszy przebieg niczego nie wypisuje, tylko liczy ile pakietów się zmieści. http://ideone.com/bVWd0y
0
bogdans napisał(a):
  1. Mój kod tak właśnie działa, mnożnik 2 jest od drugiego pakietu.
    2, Wynik sumowania jest poprawny (200+400+800+1600+3200+9600+28800+86400+259200=390200) - pewnie źle wyświetlasz.
  2. Wykonaj moją pętlę dwa razy, pierwszy przebieg niczego nie wypisuje, tylko liczy ile pakietów się zmieści. http://ideone.com/bVWd0y

Bardzo Ci dziękuję.

Mam jeszcze zatem dla pełnego zrozumienia 3 pytania:

  1. Dlaczego przy drugim cyklu pętli System.out.println nie jest na końcu - tzn. skąd kompilator wie jaki pokazać nextPackage skoro dopiero niżej wskazujemy mu warunki jego wyświetlania?
 while(usedSpace + nextPackage <= dysk*MEGABITE){
                    System.out.println(nr+" "+nextPackage);
                    usedSpace+=nextPackage;
                    if(nr < 5){
                    	nextPackage*=2;
                    }
                    else{
                    	nextPackage*=3;
                    }
                    nr++;
  1. Dlaczego przy wyświetlaniu ilości pakietów musimy pomniejszyć nr o 1(nr - 1)?
    Ten jeden, którego nie chcemy policzyć to co to jest?

  2. Początkowo w inicjacji dla nr wskazywałeś zero, teraz 1. Skąd ta różnica?

Pozdrawiam,
Arek

0
  1. Nie rozumiem zwrotu

dopiero niżej wskazujemy mu warunki jego wyświetlania

        while(usedSpace + sizeOfNextPackage <= freeSpace){ //już w tym wierszu wskazujemy warunki wyświetlania
            System.out.println(nr+" "+sizeOfNextPackage);
  1. Każde wykonanie kodu pętli następuje gdy jest miejsce na kolejny pakiet. Wykonanie to zwiększa nr o jeden. Ale nr na starcie ma wartość 1, zatem na końcu ma wartość 1+ilość pakietów na które jest miejsce.
  2. Początkowo był błąd. Powinno być
        int nr = 1;
        while(...){
            usedSpace+=sizeOfNextPackage;
            if(nr < 5){

lub

        int nr = 0;
        while(...){
            usedSpace+=sizeOfNextPackage;
            if(nr < 4){

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