[Inne] Przelicznik by Zgredekkman
#1
Napisano 24 05 2010 - 15:44
Tym razem piszę nie z pytaniem, lecz by się pochwalić
Ostatnio zastanawiałem się co mogę napisać by mi się to przydało.
Wpadłem na pomysł przelicznika. Na razie jest on w wersji 1.0
i przelicza tylko z systemu dziesiątkowego na dwójkowy, lecz
w przyszłości planuję rozszerzyć go o inne przydatne przeliczenia/funkcje.
Tak więc proszę o komentowanie i informowanie mnie w razie jakichkolwiek
błędów itp.
Link do pobrania programu:
[hide]Przelicznik by Zgredekkman v1.0[/hide]
Kod:
[hide]Przelicznik by Zgredekkman v1.0[/hide]
#2
Napisano 24 05 2010 - 17:52
1. Sprawdzanie, czy liczba jest parzysta, może odbywać się za pomocą operatora modulo (czyli znaku %). Zapis a%b oznacza resztę z dzielenia liczby a przez b
2. Polecam zainteresować się, czym jest standardowa przestrzeń nazw. W swoim programie używasz zapisów typu std::cout << czy std::cin >>. To nie jest błąd, ale można uprościć sobie życie, wpisując po dyrektywie #include taką linijkę:
using namespace std;. Od tej chwili wystarczy w programie pisać cin >> albo cout << (bez tego std:: )
3. Wyprowadzanie bitów od najmłodszego do najstarszego nie jest dobrym pomysłem. Polecam przyjrzeć się tablicom: do kolejnych komórek wpisujesz reszty z dzielenia, a potem wyświetlasz zawartość tablicy od ostatniej komórki do pierwszej.
4. Kolejna porada, która upraszcza życie programisty. Zamiast:
bit=bit+1;Można używać:
bit++;5. Spodziewasz się, że liczba, którą poda użytkownik, będzie typu double. W sumie wystarczy założenie, że użytkownik poda liczbę całkowitą. Jeżeli upierasz się przy typie double, powinieneś przekonwertować ją na typ int (program utnie część ułamkową).
Użytkownik Katarina edytował ten post 24 05 2010 - 18:04
#3
Napisano 24 05 2010 - 18:43
Widziałem w innych kodach to o czym mówisz, ale na razie postanowiłem iść zgodnie z podręcznikiem
A co do twojej ostatniej uwagi to jak dawałem zmienną liczba do typu int to program nie działał prawidłowo (nie wiem czemu).Edit. Działa
A co do tej długiej drogi to podchodzę do tego spokojnie, bo mam dopiero 13 lat
Poprawie te rzeczy gdy wprowadzę wersję 1.1
Czekam na komentarze od innych.
Użytkownik Zgredekkman edytował ten post 24 05 2010 - 18:48
#4
Napisano 24 05 2010 - 18:53
Przeanalizuj sobie ten poniżej kod, uruchom ten program i zobaczysz, co tak naprawdę się dzieje w Twoim programie, kiedy użyjesz intA co do twojej ostatniej uwagi to jak dawałem zmienną liczba do typu int to program nie działał prawidłowo (nie wiem czemu).
#include <iostream>#include <windows.h>#include <ctime>int main(){int liczba,a;int b; std::cout << "Podaj liczbe calkowita w zapisie dziesiatkowym\n"; std::cin >> liczba; a=liczba/2; b=liczba/2; std::cout << a << " " << b << std::endl; if(a!=<img src='http://www.forum.tweaks.pl/public/style_emoticons/<#EMO_DIR#>/wink.png' class='bbc_emoticon' alt=':D' /> { std::cout << "\nBit numer 0 - 1"; } else { std::cout << "\nBit numer 0 - 0"; } for(int bit=1;a!=0.5;bit=bit+1) { a=b; a=a/2; b=b/2; if(a!=<img src='http://www.forum.tweaks.pl/public/style_emoticons/<#EMO_DIR#>/biggrin.gif' class='bbc_emoticon' alt=':lol:' /> { std::cout << "\nBit numer " << bit << " - 1"; } else { std::cout << "\nBit numer " << bit << " - 0\n"; } std::cout << a << " " << b << std::endl; Sleep(500); } std::cout << "\n\n"; system("pause");}Podpowiem, że tu trzeba zwrócić uwagę na warunki pętli for i naprawdę warto się zainteresować tym znakiem %
Użytkownik Katarina edytował ten post 24 05 2010 - 18:59
#5
Napisano 25 05 2010 - 07:19
Może na przyszłość trochę poeksperymentuje Dziękuję za uwagi i pozdrawiam.
#6
Napisano 25 05 2010 - 20:08
#7
Napisano 26 05 2010 - 16:29
#8
Napisano 26 05 2010 - 18:25
#9
Napisano 27 05 2010 - 21:03
#include <iostream> using namespace std; int konw(); int main() { int wybor; menu: cout << "Menu:\n1.Dziesiatkowy->Dwojkowy\n2.Wyjscie\n"; cin >> wybor; switch(wybor) { case 1: konw(); goto menu; break; case 2: system("pause"); } } int konw() { int a; cout << "Podaj liczbe calkowita w zapisie dziesiatkowym\n"; cin >> a; if(a%2) { a=a/2; cout << "\nBit numer 0 - 1"; } else { a=a/2; cout << "\nBit numer 0 - 0"; } int bit; for(bit=1;a!=1;bit++) { if(a%2) { a=a/2; cout << "\nBit numer " << bit << " - 1"; } else { a=a/2; cout << "\nBit numer " << bit << " - 0"; } } cout << "\nBit numer " << bit << " - 1"; cout << "\n\n"; return 0; }Pokombinowałem i takie coś mi wyszło
Użytkownik Zgredekkman edytował ten post 27 05 2010 - 21:30
#10
Napisano 28 05 2010 - 23:26
konw(); goto menu; break;Ała, ta druga linijka mnie boli wniosek: programiści nie używają instrukcji goto. Lepiej zastąp to pętlą while - jeżeli użytkownik poda liczbę inną niż 1, to blok w pętli się nie realizuje i program kończy swoje działanie.
A powiedz mi, czemu bit 0 ma swój "kawałek kodu" przed pętlą for?
Użytkownik Katarina edytował ten post 28 05 2010 - 23:27
#11
Napisano 29 05 2010 - 02:22
1. Popracuj nad formatowaniem kodu. W większych programach pogubisz się dokumentnie.
2. Używanie funkcji system świadczy o złych nawykach programistycznych.
3. Fatalna konstrukcja programu. Jak podała @Katarina, powinna być pętla, z której wyjście następuje po wybraniu odpowiedniej opcji.
4. Sprawdź co się stanie jak wpiszesz na wejście coś innego niż 1 lub 2. Co się dzieje? Jak to poprawić? Musisz pozwolić pomylić się użytkownikowi.
5. Ta funkcja konw, to trochę do wiwatu. Dodatkowo po co zwracasz wartość jeżeli z niej nie korzystasz?
Funkcja konw.
6. Po co oddzielasz bit zerowy (+ @Katarina). Twój program strasznie dużo wypluwa. Powinien wypisać liczbę po konwersji. A teraz wypisuje bity w odwrotnej kolejności. Czyli zamiast ułatwiać życie - komplikuje.
7. Zamiast a % 2 lepiej używać a & 1. Jest prostsze szczególnie dla dużych liczb.
8. Jeżeli w każdej ścieżce wykonujesz to samo (a = a / 2), to po co rozwlekasz kod? Wyciągnij przed instrukcję if.
9. Zamiast pisać a = a / 2 użyj operatora /=. Prostsze, krótsze, czytelniejsze.
10. Po poprawieniu pętli for zbyteczne stanie się wypisywanie bitu po pętli. To powinna robić pętla!
11. Sprawdź co się będzie działo dla wejścia 1 lub 0. Oj będzie się działo.
#12
Napisano 29 05 2010 - 11:32
I jeszcze 1, wytłumaczy mi ktoś co znaczy (a & 1) ?
#13
Napisano 29 05 2010 - 11:33
Ja z chęcią posłucham wyjaśnienia do tego, bo mnie w liceum uczyli, żeby używać system("pause") zamiast getchar() (korzystaliśmy z dev-c++) - chociaż trzeba przyznać, że to zadziała tylko na Windowsie. Ale czy są jeszcze jakieś minusy?2. Używanie funkcji system świadczy o złych nawykach programistycznych.
@zgredekkman:
to jest iloczyn bitowy. Operator koniunkcji: http://pl.wikipedia.org/wiki/Koniunkcja_(matematyka)
Użytkownik Katarina edytował ten post 29 05 2010 - 11:35
#14
Napisano 29 05 2010 - 11:51
Ja dopiero jestem na 150 stronie symfonii
A to kod z poprawkami:
#include <iostream> using namespace std; int konw(); //****************************************************************************** int main() { int wybor,i; while(i++) { cout << "Menu:\n1.Dziesiatkowy->Dwojkowy\n2.Wyjscie\n"; cin >> wybor; switch(wybor) { case 1: konw(); break; case 2: i=0; break; default: cout << "Brak takiej opcji\n\n"; break; } } } //****************************************************************************** int konw() { int a, bit; cout << "Podaj liczbe calkowita w zapisie dziesiatkowym\n"; cin >> a; if(a>1) { for(bit=0;a!=1;bit++) { if(a%2) { a=a/2; cout << "\nBit numer " << bit << " - 1"; } else { a=a/2; cout << "\nBit numer " << bit << " - 0"; } } cout << "\nBit numer " << bit << " - 1"; cout << "\n\n"; } else { cout << "\nMusisz podac liczbe wieksza niz 1\n\n"; } }
#15
Napisano 29 05 2010 - 12:06
int wybor,i; while(i++)A co to jest za zapis? W chwili deklaracji w zmiennej "i" znajdują się śmieci. Ponadto, pętla while charakteryzuje się tym, że na początku jest sprawdzany warunek - zmienna "i" musi mieć nadaną wartość początkową.
Druga sprawa - kompletnie nie rozumiem tej drugiej linijki - jaki cel chciałeś osiągnąć?
Ponadto, taka uwaga techniczna: i++ to nie jest to samo co ++i. Jeżeli zmienna "i" miała nadaną wartość 0, to w pętli while w tym pierwszym przypadku tak naprawdę jest sprawdzana wartość zmiennej "i". Natomiast w drugim przypadku "i" jest zwiększane o 1, dopiero później jest wykonywana operacja porównania. Dzieje się to z tego, że realizacja inkrementacji i++ w C++ wygląda mniej więcej tak:
Typ operator++(Typ& a, int zmienna) { Typ b=a; a=a+1; return b; }
Symfonia to fajna, przyjemna książka dla początkujących, ale trzeba ją naprawdę uważnie czytać.Ja dopiero jestem na 150 stronie symfonii
Użytkownik Katarina edytował ten post 29 05 2010 - 12:19
#16
Napisano 01 06 2010 - 10:08
#include <iostream> using namespace std; void dztdw(int liczba); void dztos(int liczba); //****************************************************************************** int main() { int wybor,i=1,liczba; while(i) { cout << "Menu:\n1.Dziesiatkowy->Dwojkowy\n2.Dziesiatkowy->Osemkowy\n3.Wyjscie\n"; cin >> wybor; switch(wybor) { case 1: cout << "Podaj liczbe w zapisie dziesiatkowym:\n"; cin >> liczba; cout << endl << liczba << " to w zapisie dwojkowym: "; dztdw(liczba); cout << endl << endl; break; case 2: cout << "Podaj liczbe w zapisie dziesiatkowym:\n"; cin >> liczba; cout << endl << liczba << " to w zapisie osemkowym: "; dztos(liczba); cout << endl << endl; break; case 3: i=0; break; default: cout << "Brak takiej opcji\n\n"; break; } } } //****************************************************************************** void dztdw(int liczba) { int reszta = liczba % 2; if(liczba > 1) { dztdw(liczba/2); } cout << reszta; return; } //****************************************************************************** void dztos(int liczba) { int reszta = liczba % 8; if(liczba > 7) { dztos(liczba/8); } cout << reszta; return; }
Użytkownik Zgredekkman edytował ten post 02 06 2010 - 20:55
#17
Napisano 20 06 2010 - 00:51
int main( void ) { return 0; //po to, aby OS wiedział, że program poprawnie się wykonał. }Skoro funkcja (dokładnie poniższa procedura) nie ma zwracać wartości to nie jest potrzebne return; jak np. w poniższym kodzie:
void dztos(int liczba) { int reszta = liczba % 8; if(liczba > 7) { dztos(liczba/8); } cout << reszta; return; }Następnie należy pamiętać, aby program podzielić na pliki nagłówkowe (pliki z rozszerzeniem *.h zawierają deklaracje) oraz pliki z definicjami( *.cpp).
Jak na 13 latka to podziwiam zainteresowanie językiem programowania. Poleciłbym na początek coś proceduralnego np. taką ścieżkę rozwoju: Pascal, C oraz naukę podstawowych algorytmów. Następnie C++/C# (.NET 4.0) może nawet Java.
Użytkownik Calipers edytował ten post 20 06 2010 - 01:03
#18
Napisano 25 06 2010 - 21:27
Wstawienie return nie jest błędem.Skoro funkcja (dokładnie poniższa procedura) nie ma zwracać wartości to nie jest potrzebne return;
Moim zdaniem przy takim prostym i krótkim programie to jest zbędne.Następnie należy pamiętać, aby program podzielić na pliki nagłówkowe (pliki z rozszerzeniem *.h zawierają deklaracje) oraz pliki z definicjami( *.cpp)
Pascala dzisiaj się używa głównie w celach edukacyjnych, lepiej od razu zaczynać od C (potem przesiadka na C++ strukturalne nie jest trudną rzeczą), a gdy się opanuje C(++) w zakresie strukturalnym, to warto się zainteresować C++ obiektowym.np. taką ścieżkę rozwoju: Pascal, C oraz naukę podstawowych algorytmów. Następnie C++/C# (.NET 4.0) może nawet Java.
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych