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
Prośba o sprawdzenie zadania domowego numer 2 rozdział 53
» 2022-01-02 16:18:05
C/C++
#include <iostream>
using namespace std;

int licznik = 0; //te zmienne są tylko do testów stąd sa globalne
int petlaIle = 0;

int add( int a, int b )
{
   
if( b == 0 )
       
 return a;
   
   
return add( a ^ b,( a & b ) << 1 );
}

void compare( int & a, int & b, const int & abegin2, int & mnoznik )
{
   
int tmp = 16;
   
while( mnoznik <= b )
   
{
       
petlaIle++;
       
int abegin = abegin2;
       
if(( b - mnoznik ) >= 16384 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 14;
           
mnoznik += 16384;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 8192 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 13;
           
mnoznik += 8192;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 4096 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 12;
           
mnoznik += 4096;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 2048 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 11;
           
mnoznik += 2048;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 1024 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 10;
           
mnoznik += 1024;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 512 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 9;
           
mnoznik += 512;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 256 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 8;
           
mnoznik += 256;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 128 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 7;
           
mnoznik += 128;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 64 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 6;
           
mnoznik += 64;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 32 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 5;
           
mnoznik += 32;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 16 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 4;
           
mnoznik += 16;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 8 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 3;
           
mnoznik += 8;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 4 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 2;
           
mnoznik += 4;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 2 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a += abegin <<= 1;
           
mnoznik += 2;
           
if( b == mnoznik )
               
 return;
           
       
}
       
if(( b - mnoznik ) >= 1 )
       
{
           
licznik++;
           
int abegin = abegin2;
           
a = add( a, abegin );
           
mnoznik += 1;
           
if( b == mnoznik )
               
 return;
           
       
}
    }
}

int main()
{
   
int a;
   
int b;
   
int mnoznik = 1;
   
cin >> a;
   
cin >> b;
   
const int abegin2 = a;
   
compare( a, b, abegin2, mnoznik );
   
cout << "a = " << a << "\n";
   
cout << "licznik = " << licznik << "\n";
   
cout << "petla = " << petlaIle << "\n";
}
Dzień dobry
Chciałbym się zapytać czy ten program spełnia założenia zadania domowego numer 2 do lekcji 53.
Ogólnie spędziłem z tym kursem miło trochę czasu i jestem wdzięczny że taki fajny kurs istnieje.
Ogólnie pytam bo chciałbym pójść dalej z materiałem do kursu programowania obiektowego na tej stronie i chcę mieć pewność że rozumiem dobrze ten temat.

update.
Jutro zrobie zamiast tych warunków pętle z jednym warunkiem ale ogolnie chce wiedziec czy ide w dobrym kierunku.
P-179156
DejaVu
» 2022-01-02 20:20:58
Wielokrotne kopiowanie tego samego kodu, w którym różnią Ci się tylko liczby nie jest najlepszym pomysłem. W każdym razie: jeżeli kod działa Ci zgodnie z założeniami, to cel osiągnąłeś (choć już sama funkcja add wygląda jakby skądś była skopiowana i raczej obstawiam małe szanse na to, że rozumiesz co ona robi).

/edit:
A no tak... funkcja jest skopiowana z kursu :) pekfos zaszalał :P

/edit:
Jeżeli rozumiesz co Twój kod robi i działa (zwraca oczekiwane wyniki) to uznaj to za sukces i idź do następnego rozdziału. Ogólnie rzecz biorąc jeżeli masz opanowany względnie dobrze materiał do tej lekcji, to programowanie obiektowe na podstawowym powinieneś szybko ogarnąć i możesz zacząć próbować pisać proste gry 2D (czy cokolwiek innego co sobie zaplanowałeś).
P-179159
pekfos
» 2022-01-02 20:29:36
Kod jest bardzo przekombinowany. Mnożenie razy 0 daje błędny wynik, razy 1 zawiesza program, razy sto milionów wielokrotnie przekracza ilość iteracji określoną w zadaniu. Kierunek jest dobry, bo masz w kodzie kluczowe elementy. Jedyne co zostało to zapisać to jako poprawny algorytm.
P-179160
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-02 21:45:58
Ogolnie tak dopiero po kilku godzinach od napisania pytania na to wpadlem ze mozna to znacznie prosciej zrobić i wiem mniej wiecej jak tylko trzeba było pomyśleć ze spokojem. Jutro poprawiona wersja powinna byc gotowa. mnozenia razy 1 nie testowalem a program wiem ze dziala dla mnozeń ponizej 16384 lub 2^14 maksymalnie. Z góry dziękuje za poświecony mi czas.
P-179161
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-02 21:51:02
Co do tego co sobie zaplanowałem na późnisj to kurs podstaw programowania obiektowego a później wyprawa z opus magnum C++11.
Ale najpierw to trzeba porządnie zrobić.
P-179162
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-03 15:57:39
C/C++
#include <iostream>
using namespace std;

int licznik = 0; //te zmienne są tylko do testów stąd sa globalne
int petlaIle = 0;

int add( unsigned int a, unsigned int b )
{
   
if( b == 0 )
       
 return a;
   
   
return add( a ^ b,( a & b ) << 1 );
}

void compare( unsigned int & a, unsigned int & b, const int & abegin2, unsigned int tab1[ ], unsigned int tab2[ ] )
{
   
b -= 1;
   
for( int i = 0; i <= 30; i++ )
   
{
       
petlaIle++;
       
int abegin = abegin2;
       
if( b >= tab1[ i ] + 1 )
       
{
           
licznik++;
           
a += abegin <<= tab2[ i ];
           
b -=( tab1[ i ] );
           
if( b <= 0 )
               
 return;
           
       
}
    }
   
//cout << abegin;
   
while( b >= 1 )
   
{
       
licznik++;
       
a += abegin2;
       
b -= 1;
       
if( b <= 0 )
           
 return;
       
   
}
   
   
}

int main()
{
   
unsigned int a;
   
unsigned int b;
   
unsigned int tab1[ 31 ] = { 2147483648, 1073741824, 536870912, 268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2 };
   
unsigned int tab2[ 31 ] = { 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
   
cin >> a;
   
cin >> b;
   
const int abegin2 = a;
   
compare( a, b, abegin2, tab1, tab2 );
   
cout << "a = " << a << "\n";
   
cout << "licznik = " << licznik << "\n";
   
cout << "petla = " << petlaIle << "\n";
}
Witam z powrotem oto poprawiony program. Jakby coś było nie tak lub da się to zrobić lepiej z moją wiedzą z kursu jestem otwarty na wszelkie sugestie. Jeszcze raz dziękuje za poświęcony mi czas. Ogólnie ja sobie wypisałem te liczby do tablic z 2 pętli for i skopiowałem to co stworzyły i je usunąłem aby program lepiej działał i nie program musiał tego wykonywać za każdym razem.
P-179165
pekfos
» 2022-01-03 22:24:10
Czemu ta funkcja ma 5 argumentów? Mnożenie dotyczy dwóch liczb. Po co też masz tablicę z kolejnymi liczbami całkowitymi oraz z kolejnymi potęgami dwójki? Te stałe można łatwo obliczyć, a twierdzenie że program działa lepiej, jeśli nie musi tego robić, zakłada że faktycznie wykonałeś pomiary. Tu bym obstawiał że ta optymalizacja przyniosła przeciwny efekt.
Dwie pętle sugerują że nie do końca wiesz co robisz. Jeśli pierwsza jest poprawna, druga nigdy nie powinna mieć nic do roboty. Pamiętaj że to lekcja o operacjach bitowych, na razie tylko zamieniłeś mnożenie przez jedną stałą, przesunięciem o drugą stałą.  Dodawanie jest dozwolone w zadaniu żeby złożyć wynik. Pozostałe dodawanie i odejmowanie jest tu zbędne, spróbuj je usunąć.
P-179167
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-01-03 23:47:02
Ok dziekuje za cenne uwagi postaram sie ten zoptymalizować i poprawic.
P-179168
« 1 » 2 3
  Strona 1 z 3 Następna strona