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

Wskaźniki. Temat: Wyświetl max ilość jedynek stojących obok siebie w zapisie binarnym wprowadzonej liczby.

Object Storage Arubacloud
0 głosów
689 wizyt
pytanie zadane 11 marca 2016 w C i C++ przez m_rij_v Użytkownik (660 p.)
Mój kod: http://cpp.sh/8le2s

Co w nim jest źle, skoro jak ktoś wpisuje np.: 203, za pomocą dynamicznego zapisywania danych w tabeli zamieniam to na binarny. Następnie chce utworzyć pętle która będzie mi sprawdzać te jedynki stojące obok siebie i w zapisie np.: 1000101110 powinna mi wyświetlić max: 3 jedynki....

Żeby nie było uczyłam się tych wskaźników od Pana Zelenta i Pana Cybulskiego i za chiny ludowe nie chce mi ten program wyjść.

3 odpowiedzi

0 głosów
odpowiedź 11 marca 2016 przez Krawiec91 Pasjonat (19,600 p.)
wybrane 11 marca 2016 przez m_rij_v
 
Najlepsza

Przede wszystkim, to dynamicznie przydzielasz pamięć na tablicę 0 - elementową.smiley (linia 12). Zmienna licznik jest zmienną globalną, więc dopóki w programie nie zmodyfikujesz jej wartości, ma ona wartość 0 (zero). W konsekwencji tego, modyfikujesz obszar pamięci, która nie został Ci przydzielony i program się wysypuje.

komentarz 11 marca 2016 przez m_rij_v Użytkownik (660 p.)
Ok. Zmieniłam ten licznik - wpisałam go w maina i w sumie nadal nic to nie zmieniło. Stwierdzam, że może faktycznie powinnam spojrzeć na to świeżym okiem, całkowicie z innej strony. Jakieś podpowiedzi jak napisać to łatwiej, aby wyglądało czytelniej , zajmowało mniej linii itp. ?
komentarz 11 marca 2016 przez Krawiec91 Pasjonat (19,600 p.)

Wpisanie go w main() też za wiele nie zmienia, dlatego że:
a) jeśli przekopiowałaś go "jak leci" do main(), na przykład tak:
 

int licznik;

To wtedy zmienna licznik staje się zmienną lokalną, jeśli nie jest zainicjalizowaną jakąś wartością, przyjmuje zupełnie przypadkową wartość, 5, -100 czy 358323.
b) jeśli zainicjalizujesz ją jakąś wartością, na przykład:
 

int licznik=5;

To też niewiele to daje, bo tak jak masz to umieszczone w tym momencie w kodzie, nie wiesz (według Twojej koncepcji na rozwiązanie tego problemu) ile pamięci potrzebne będzie, żeby liczbę dziesiętną zapisać binarnie. Do zapisania liczby 6, wystarczy tablica 3 - elementowa (110), a jeśli użytkownik wpisze np. 128 to wtedy potrzebna jest tablica 8 - elmentowa (1000 0000).

Co do tego, jakby to inaczej rozwiązać. To po pierwsze, nie jest do tego potrzebna tablica. Możesz w trakcie konwersji z dziesiętnego na binarny sprawdzać, czy wychodzi Ci 0 albo 1 w postaci binarnej.  Moja koncepcja pewnie w dużej części będzie się zbiegać z tym co pingwindyktator zaproponował. Potrzebne będą Ci dwie zmienne typu int, jedna do zapisania największej aktualnej ilości jedynek koło siebie (max) i druga w której będzie zliczana liczba jedynek obok siebie w trakcie konwersji (current). Obie zmienne zerujesz na początku.
Zaczynasz zamieniać z DEC na BIN, występuje jedynka, inkrementujesz zmienną current jeśli następną cyfrą jest znowu jedynka ponownie inkrementujesz. Gdy wystąpi zero, jeśli wartość zmiennej current jest większa od max, przypisujesz ją do max i zerujesz current. Jeśli nie jest większa od max, to tylko zerujesz current. I tak do końca konwersji. Outputem z tego programu będzie zmienna max.

0 głosów
odpowiedź 11 marca 2016 przez pingwindyktator Użytkownik (520 p.)

Co jest źle?

1. formatowanie kodu
2. nie używasz funkcji
3. zmienne globalne
4. new/delete
5. cały kod to jakieś wtf,

   cout<<"Podaj dodatnia liczbe calkowita: ";
   cin>> n;
   int *wskaznik;
   wskaznik = new int [licznik];

komentarz 11 marca 2016 przez m_rij_v Użytkownik (660 p.)
Ok. To usuwam wszystko i na czysto zacznę od nowa. Proszę o jakieś nakierowanie na ten o wiele łatwiejszy sposób.
komentarz 11 marca 2016 przez pingwindyktator Użytkownik (520 p.)
No i to jest dobry pomysł. Teraz powiedz o co konkretnie Ci chodzi - wczytujesz od użytkownika liczbę i chcesz wypisać NAJWIĘKSZĄ ilość jedynek w formacie binarnym tej liczby, które stoją obok siebie, tak? Jaki ma być output dla 111011111011?
komentarz 11 marca 2016 przez m_rij_v Użytkownik (660 p.)
max=5 dla Twojego przykładu. Dokładna treść wygląda tak :

Ułóż algorytm, który dla danej dodatniej liczby całkowitej n oblicza maksymalną liczbę kolejnych jedynek pojawiających się w zapisie binarnym tej liczby.

Specyfikacja Dane: dodatnia liczba całkowita n

Wynik: dodatnia liczba całkowita m – maksymalna liczba kolejnych jedynek w zapisie binarnym n

Przykład: dla n = 187 wynikiem jest m = 3, ponieważ 187 = (10111011)2
0 głosów
odpowiedź 11 marca 2016 przez pingwindyktator Użytkownik (520 p.)
int main () {
 int input;
 cin >> input;
 cout << hex << showbase << input << '\n';

 size_t max_ones = 0;
 size_t current_ones = 1;

 while (input > 0) {
  bool first_bit = (input & 1); // pobieramy ostatni bit liczby
  input >>= 1; // przesuwamy liczbe bitowo w prawo, zeby pobrac jej kolejny bit
  bool second_bit = (input & 1); // pobieramy kolejny bit

  if (first_bit & second_bit) { // jesli oba bity sa rowne 1
   ++current_ones; // zwiekszamy licznik znalezionych jedynek obok siebie
  } else { // jesli nie, to updatujemy max_ones
   if (current_ones > max_ones)
    max_ones = current_ones;

   current_ones = 1;
  }
 }

 cout << dec << max_ones;
}

 

rozwiązanie jest proste, masz liczbę powiedzmy 111001101 i bierzesz po kolei każdą dwójkę kolejnych bitów od końca, czyli: 10, 01, 11, 10, 00, 01, 11, 11, 10. Robiąc bitowy and na tych pobranych bitach ustalamy, że oba są równe 1. Jeśli oba są równe 1 i stoją obok siebie (a stoją, bo bierzemy kolejne bity) to zwiększamy licznik current_ones. Prawda, że proste?

 

Podobne pytania

0 głosów
0 odpowiedzi 205 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 325 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 476 wizyt
pytanie zadane 6 sierpnia 2020 w C i C++ przez Feszyn F Flora Początkujący (320 p.)

92,579 zapytań

141,432 odpowiedzi

319,662 komentarzy

61,963 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!

...