Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prośba o sprawdzenie zadania domowego numer 2 rozdział 53

Ostatnio zmodyfikowano 2022-01-05 15:26
Autor Wiadomość
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-04 13:32:18
C/C++
#include <iostream>
#include <math.h>
using namespace std;

void compare( unsigned int & a, unsigned int & b, const int & abegin2 )
{
   
b -= 1;
   
for( int i = 31; i >= 0; i-- )
   
{
       
unsigned int abegin = abegin2;
       
if( b >= pow( 2, i ) )
       
{
           
a += abegin <<= i;
           
b -= pow( 2, i );
           
if( b <= 0 )
               
 return;
           
       
}
    }
}

int main()
{
   
unsigned int a, b;
   
cin >> a >> b;
   
compare( a, b, a );
   
cout << "a = " << a;
}
Ok poprawiłem ten oto program i uzyskałem coś takiego. Ogólnie rzeczywiście te tablice to był nietrafiony pomysł jako zastępstwo tych warunków. Ogólnie też mogłem szybciej się pozbyć tej drugiej pętli bo miałem taki pomysł, ale wtedy skupiłem się na błędnych wynikach bo zapomniałem o tym b-=1; przed pętlą for, i zapomniałęm aby tego spróbować. W razie jakichkolwiek zastrzeżeń do programu proszę śmiało pisać chętnie go ulepszę jeśli można go krócej zapisać.
P-179169
DejaVu
» 2022-01-04 13:49:26
No i teraz kod wygląda sensownie :)
Krótszy kod = łatwiej zrozumieć.
Krótszy kod = mniej błędów.
Krótszy kod = łatwiej i szybciej można go poprawić.

Czy działa poprawnie -> nie wypowiadam się, ale właśnie o to chodzi, aby redukować kod do niezbędnego minimum, zachowując jednocześnie czytelność na dobrym poziomie (czytaj: powinieneś jeszcze nazywać zmienne nieco lepiej, ale przy takich małych zadaniach to nie ma w sumie znaczenia).
P-179170
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-04 16:12:27
Ogólnie każda opinia jest dla mnie cenna zarówno dzięki panu jak i panu o nicku Pekfos zaczynam rozumieć podstawy programowania w C++ ten kurs jest moim pierwszym doświadczeniem w zakresie programowania zarówno C++  jaki i wogóle programowania i chce aby to ostanie zadanie w tym kursie było jak najlepiej zrobione.
P-179173
pekfos
» 2022-01-05 00:06:36
Wciąż masz niepotrzebne argumenty. Dlaczego wymagasz by podać jeden z argumentów dwa razy? Skopiuj go wewnątrz funkcji. Niepotrzebnie też przekazujesz argumenty przez referencję. Wartości przekazuj jako wartości, a coś co jest intuicyjnym wynikiem funkcji (wynik mnożenia) zwracaj przez return, nie przez argument. Wtedy znacznie prościej tych funkcji używać.
Dodam że tym trzecim argumentem strzelałeś sobie w stopę, ale chybiłeś o milimetr. Gdybyś go zapisał jako const unsigned int & abegin2, czyli z takim samym typem jak argument a, to program przestanie działać. Gdybyś pominął const, byłby za to błąd kompilacji. abegin2 to miała być kopia a na początku działania algorytmu, ale przez to że dałeś wszędzie referencje i gdyby typy były zgodne, abegin2 może być referencją na tą samą zmienną co a, więc będzie się zmieniać. Teraz działa bo dałeś referencję na zły typ i na stałą, co pozwala przekazać obiekt tymczasowy, w tym wypadku skonwertowaną na int kopię a.
Poza tym nie miałeś używać więcej operacji bitowych? Obliczanie potęgi dwójki to w sam raz zadanie dla nich. Zdecydowanie nie jest to zadanie dla pow(). To jest funkcja do obliczeń na liczbach zmiennoprzecinkowych, więc nie masz żadnej gwarancji że po skonwertowaniu na int dostaniesz poprawny wynik. Teraz używasz pow() w wersji z języka C, więc na typach double, co daje dość precyzji by przechowywać wszystkie potrzebne potęgi dwójki, ale nie starczyłoby jakbyś miał mnożyć dwie 64-bitowe liczby (sam format liczby da radę, ale nie wiadomo czy implementacja pow() sobie poradzi).
P-179174
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-05 00:15:09
Dobra postaram się to jeszcze poprawić. Racja można zrobić obliczanie potęg 2 poprzez operacje bitowe. Popracuje nad tym. Dziękuje za cenne uwagi. Poprawię to.

Po chwili namysłu rzeczywiście po cholere ja jak kretyn daje pow() skoro mozna 1
przesunąć o określona liczbe bitow w koncu to mnożenie razy 2^N gdzie N moze byc zmienna np i z pętli.I wlasnie referencja nie potrzebna tu. Ok czeka mnie troche poprawek.
Jeszcze raz dziekuje za pomoc.
P-179175
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-05 13:57:27
C/C++
#include <iostream>
using namespace std;

int compare( unsigned int a, unsigned int b )
{
   
unsigned int aCopy = a;
   
for( int i = 31; i >= 0; i-- )
   
{
       
if( b >= 1 << i )
       
{
           
a +=( aCopy << i );
           
b -=( 1 << i );
           
if( b <= 0 )
               
 return a;
           
       
}
    }
   
return a;
}

int main()
{
   
unsigned int a, b;
   
cin >> a >> b;
   
cout << "a = " << compare( a, b - 1 );
}
Oto poprawiony zgodnie z pańskimi zaleceniami program. Jeśli da się tutaj coś zrobić lepiej proszę śmiało pisać. Wiem że do sumowania i odejmowania można użyć odpowiednich funkcji(w tym jednej która była 1 zadaniem do tematu) i jeśli pan chce abym tak to rozwiązał również proszę śmiało pisać. Ogólnie dziękuje za cenne uwagi i pomoc.
P-179176
pekfos
» 2022-01-05 14:17:16
Coraz lepiej, ale dalej upierasz się by ta funkcja miała jakieś udziwnienie utrudniające użycie. Czemu drugi argument musi być mniejszy o 1 od mnożnika? Nie można przez to mnożyć przez zero. Do tego jeśli chcemy pomnożyć przez 2n, wymaga to n kroków zamiast jednego, bo składanie wyniku zaczynasz od "razy 1". Prościej zaczynać od zera. Zwracaj też uwagę na dobór typów, teraz zwracasz int, więc zbyt duży wynik nie będzie zwrócony poprawnie.
Sam algorytm można jeszcze uprościć. Test b >= 1 << i można zapisać z użyciem koniunkcji bitowej. Jeśli będziesz sprawdzać ustawienie konkretnego bitu, a nie liczbową wartość, nie byłoby potrzeby modyfikowania mnożnika.
P-179177
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-05 14:22:08
Zaraz to poprawie jeszcze
P-179178
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona