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

Porównanie liczb binarnych.

Object Storage Arubacloud
+1 głos
4,057 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez String Gaduła (4,520 p.)

Witam :)
Powiedzmy że mam taką tablicę;

string tablica[4] = {"1111", "1010", "1001","1011"}  // ( Wszystkie liczby binarne są tej samej długości )

I teraz chce stworzyć funkcję, która znajdzie mi liczbę najmniejszą.
Pomysł jest taki, żeby porównywać ze sobą kolejne indeksy wyrazów np. biorąc 2 pierwsze liczby, porównuje 1 = 1 - idziemy dalej.. 1 > 0 - i to porównanie świadczy już o tym że druga liczba będzie mniejsza od pierwszej. Prawda?
Ale jak to zapisać w kodzie?
za wartość minimalną podstawiam pierwszą liczbę, następnie w pętli:
for( int i=1, i<4; i++)
{  if( porownanie(string wartosc_minimalna, string tablica[i]) wartosc_minimalna = tablica[i] // kiedy funkcja porownanie zwróci prawde ( 2 wyraz mniejszy od 1) za wartosc minimalna podstawiam 2 liczbe.
}

a teraz to co nie chce mi wyjść czyli funkcja porownanie.
bool porownanie( string *a, string *b)
{
for(i=0; i< (*a).length();i++)
{ if ( (*a)[i] > (*b)[i] ) return true;
  if( (*a)[i] < (*b[i]) return false;
}
return false
}

A teraz proszę oo pomoc, gdyż nie chce mi to śmigać :D
Nie podoba mi się zapis (*a)[i] .. ale muszę jakoś porównać po kolei znaki tych moich stringów binarnych ;/
 

PS. Taki problem przy zadaniu maturalnym 4.3 z informatyki rozszerzonej 2015 :D

Tutaj też mam odpowiedź na całe zadanie: http://www.algorytm.edu.pl/rozwiazania-zadan-maturalnych/zad-4-2015-nf.html
Ale w ogóle nie rozumiem momentu gdy dlugosc liczb zgadza się i żeby porównać która z nich jest większa autor używa po prostu zwykłego operatora pomiędzy stringami ( haha )  mam na myśli dokładnie te dwie linijki 

if(liczba.size()==pomMax.size())
          if(liczba > pomMax)

1 odpowiedź

+1 głos
odpowiedź 30 grudnia 2015 przez Szykem2 Nałogowiec (29,510 p.)

Po pierwsze liczba najmniejsza zapisana binarnie ma najmniejszą długość. Czyli jeśli a.size()<b.size() to liczba a jest mniejsza od liczby b. Jeśli są równe to sprawdzasz podobnie do tego co napisałeś w pętli for a w ten sposób działa operator > w klasie string. Porównuje po kolei znaki w stringu i zwraca true jeśli pierwszy różniący się znak jest większy w pierwszej liczbie. W twojej funkcji nie trzeba przesyłać stringów przez adres, można przez referencję zapis będzie znacznie czytelniejszy (bez tych gwiazdek) chyba że musi być przez adres. Jako pierwsze właśnie sprawdziłbym długości stringów jak napisałem wcześniej. Może być tak że odwołujesz się do nieistniejącego elementu stringa b i wywala segfaulta czy inny wyjątek i jeszcze to 

if( (*a)[i] < (*b[i]) return false; 
//powinno być
if( (*a)[i] < (*b)[i]) return false; 

 

komentarz 30 grudnia 2015 przez String Gaduła (4,520 p.)
edycja 30 grudnia 2015 przez String
Czy dobrze rozumiem? Nie muszę tworzyć pętli, która porówna znaki w liczbach i na tej podstawie stwierdzi która jest więszka, tylko operator "<" w klasie string wykona takie coś sam? Poważnie? A ja cały czas kminię jak to zrobić..

Przez referencję tzn po prostu wpisać bool porownanie( string &a, string &b) ?
Przez adres program działa wtedy szybciej tak? Poza tym chciałem poćwiczyć właśnie wskaźniki :D
komentarz 30 grudnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Przez referencję to bool porownanie(string& a, string& b); Jeśli robiłbyś tak jak napisałeś to przesyłasz przez wartość czyli kopię a nie ten sam obiekt. Jeśli zamierzasz uczyć się c++ na poważnie to naucz się obchodzić ze wskaźnikami, żeby rozumieć taki kod ale jak już je opanujesz to naucz się smartpointerów. Nie musisz się przy nich przejmować dealokacją tylko ten obiekt robi wszystko za Ciebie. Przesyłanie przez referencję praktycznie nie różni się od przesyłania przez adres, są tak samo szybkie. Wolniejsze jest tylko przesyłanie przez wartość.

Podobne pytania

0 głosów
2 odpowiedzi 5,653 wizyt
pytanie zadane 9 lutego 2016 w C i C++ przez sadurszczak Nowicjusz (150 p.)
0 głosów
1 odpowiedź 220 wizyt
pytanie zadane 18 lutego 2017 w C i C++ przez JKluseczka Obywatel (1,430 p.)
0 głosów
2 odpowiedzi 1,920 wizyt
pytanie zadane 12 października 2016 w Rozwój zawodowy, nauka, praca przez Kapi2222 Obywatel (1,220 p.)

92,568 zapytań

141,420 odpowiedzi

319,617 komentarzy

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

...