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

question-closed [C++] Problem z pętlą "while" - tworzy się nieskończona pętla

Object Storage Arubacloud
0 głosów
867 wizyt
pytanie zadane 26 stycznia 2016 w C i C++ przez ThatKidMike Nowicjusz (150 p.)
zamknięte 26 stycznia 2016 przez ThatKidMike

Hej!

Tworzę swój własny skrypt na zamienianie liczb dziesiętnych na binarne (po wczytaniu z pliku i do pliku). Z tym, że nie chodzi mi o to, czy jest on poprawny.

Korzystam z funkcji while, który z nie do końca zrozumiałych mi powodów tworzy nieskończoną pętlę.

Podam to na przykładzie liczby 12 (bez względu na to, co się tam znajdzie, sytuacja zawsze jest taka sama)

 int z=0;
 string binarna=" ";
 while(12/2!=0)           
       {
           if(12%2==1)                                                
           {
               binarna.insert(z,"1");
           }
           else if(12/2+1==1)
           {
               binarna.insert(z,"1");
               break;
           }
           else if(12%2==0)
           {
               binarna.insert(z,"0");
           }

           12/2;                                                       
           z++;

       }

Mam nadzieję, że jest to nieco zrozumiałe. Jest to tylko fragment kodu sprawiający problemy. Wcześniejsze operacje zwracają poprawne wyniki.

W while'u sprawdza warunek - dopóki 12 podzielone na 2, nie będzie równe 0. Z tego, co zauważyłem warunek ten powinien działać poprawnie, gdyż C++ po ostatecznym podzieleniu 1/2 - do czego powinno dojść, gdyż wewnątrz while'a pojawia się operacja dzielenia 12 na 2 po każdym kroku - a C++ z dzielenia 1 przez 2, zwraca 0.

Fragmenty z "insert" służą wstawianiu do napisu (w tym również inkrementowane int z) - ale na tą chwilę nie jest to kluczowe, gdyż jeśli nie działa, to z pewnością znajdę inne rozwiązanie.

Na tą chwilę jestem bardzo początkującym i wszelkie algorytmy, takie jak zamiana z binarnych na dziesiętne, czy inne metody matematyczne, staram się tworzyć samemu. Na tym się niestety zatrzymałem i na razie nie wiem co dalej.

 

komentarz zamknięcia: Problem rozwiązany.

3 odpowiedzi

0 głosów
odpowiedź 26 stycznia 2016 przez radek024 Szeryf (77,160 p.)
wybrane 26 stycznia 2016 przez ThatKidMike
 
Najlepsza

Za każdym razem 12 dzieli się od nowa. W takim razie lepiej użyj pętli for(int i=12;i/2;i!=0){} .

komentarz 26 stycznia 2016 przez ThatKidMike Nowicjusz (150 p.)
Okej, rozumiem. Nie sądziłem, że pętla for może wyglądać w ten sposób. Sądziłem, że skoro w while'u widnieje sobie 12/2 - jako ostatni krok, to dalej będzie kontynuowało 6, 3, 2, 1.
komentarz 26 stycznia 2016 przez radek024 Szeryf (77,160 p.)
Jeżeli chciałbyś zrobić to w taki sposób, musiałbyś użyć dodatkowej zmiennej. Pętla for jest najlepszym wyjściem w tym wypadku ;)
komentarz 26 stycznia 2016 przez ThatKidMike Nowicjusz (150 p.)
Dzięki za odpowiedź. Rozumiem już na czym polegał problem i jeszcze się zastanowię z jakiej opcji skorzystać. :)
+1 głos
odpowiedź 26 stycznia 2016 przez Colossus Mądrala (6,410 p.)

 dopóki 12 podzielone na 2, nie będzie równe 0

12 podzielone na 2 zawsze nie będzie równe 0, co więcej, powiem Ci, że zawsze będzie się równało 6

komentarz 26 stycznia 2016 przez ThatKidMike Nowicjusz (150 p.)
Ale zauważ, że w pętli (nie wiem, czy poprawnie - stąd moje wątpliwości) 12 z każdym krokiem jest dzielone na 2. Po czym następuje dalsza część dopisywania zer i jedynek. W końcu powinno dotrzeć do momentu, w którym 1 będzie dzielone na 2 - wówczas C++ zwraca 0.

Jeśli coś pomieszałem i piszę głupoty, to prosiłbym o wytknięcie tego - aktualnie siedziałem nad tym jednym problemem tak długo, że rzeczywiście mogłem palnąć jakieś bzdury.
komentarz 26 stycznia 2016 przez Colossus Mądrala (6,410 p.)
int z=0;
int i=12;
string binarna=" ";
while(i/2!=0)           
      {
          if(i%2==1)                                                
          {
              binarna.insert(z,"1");
          }
          else if(i/2+1==1)
          {
              binarna.insert(z,"1");
              break;
          }
          else if(i%2==0)
          {
              binarna.insert(z,"0");
          }
 
          i/2;                                                       
          z++;
 
      }

 

+1 głos
odpowiedź 26 stycznia 2016 przez niezalogowany
Wykonuj dzielenie na zmiennej i zapisuj wynik do niej. Bo naraze to dzielisz 12 na 2 wynik to 6. 6 jest różne od 0, ale wyniku nigdzie nie zapisujesz. I tak za każdym obiegiem pętli.

Podobne pytania

0 głosów
1 odpowiedź 540 wizyt
pytanie zadane 6 maja 2020 w C i C++ przez Ladro Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 465 wizyt
0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 7 listopada 2020 w Mikrokontrolery przez xdmik23 Gaduła (3,000 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...