Skocz do zawartości


Zdjęcie

[Inne] Przelicznik by Zgredekkman


  • Zaloguj się, aby dodać odpowiedź
17 odpowiedzi w tym temacie

#1 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 24 05 2010 - 15:44

Witam
Tym razem piszę nie z pytaniem, lecz by się pochwalić Dołączona grafika
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]

  • 0

#2 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 24 05 2010 - 17:52

Jeżeli mam być szczera, to powiem Ci, że jeszcze przed Tobą dłuuuga droga w tej nauce C++ :lol:
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

  • 0

#3 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 24 05 2010 - 18:43

Chcę podkreślić, że zrobiłem ten program główne do zastosowań własnych, ale postanowiłem, że sprawdzę co o nim sądzicie.
Widziałem w innych kodach to o czym mówisz, ale na razie postanowiłem iść zgodnie z podręcznikiem :D
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 :lol:
Poprawie te rzeczy gdy wprowadzę wersję 1.1 :D
Czekam na komentarze od innych.

Użytkownik Zgredekkman edytował ten post 24 05 2010 - 18:48

  • 0

#4 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 24 05 2010 - 18:53

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).

Przeanalizuj sobie ten poniżej kod, uruchom ten program i zobaczysz, co tak naprawdę się dzieje w Twoim programie, kiedy użyjesz int :D
#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

  • 0

#5 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 25 05 2010 - 07:19

Już zrozumiałem o co Ci chodzi, wiem co daje int, a co do tego znaku to znałem go ale jakoś mi nie wychodziło z nim zamknięcie ostatniej pętli for.
Może na przyszłość trochę poeksperymentuje ;) Dziękuję za uwagi i pozdrawiam.
  • 0

#6 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 25 05 2010 - 20:08

A możesz pokazać ten kod z operatorem modulo? Chodzi mi głównie o jego użycie
  • 0

#7 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 26 05 2010 - 16:29

Ja nie zrobiłem z operatorem modulo, w samym obliczaniu nie wprowadziłem zmian. Próbowałem coś z nim robić, ale mi nie wychodziło ;/
  • 0

#8 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 26 05 2010 - 18:25

To właśnie pokaż, w jaki sposób próbowałeś użyć tego operatora modulo ;)
  • 0

#9 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

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

  • 0

#10 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

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

  • 0

#11 izaw

izaw

    Początkujący

  • 97 postów

Napisano 29 05 2010 - 02:22

Chcesz recenzję?
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.

  • 0

#12 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 29 05 2010 - 11:32

Co do tego bitu 0 to sam nie wiem ;)
I jeszcze 1, wytłumaczy mi ktoś co znaczy (a & 1) ?

  • 0

#13 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 29 05 2010 - 11:33

2. Używanie funkcji system świadczy o złych nawykach programistycznych.

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?

@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

  • 0

#14 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 29 05 2010 - 11:51

To nie dla mnie ;p
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";
    }
}

  • 0

#15 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

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;
}

Ja dopiero jestem na 150 stronie symfonii

Symfonia to fajna, przyjemna książka dla początkujących, ale trzeba ją naprawdę uważnie czytać.

Użytkownik Katarina edytował ten post 29 05 2010 - 12:19

  • 0

#16 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 01 06 2010 - 10:08

Jeszcze nowszy kod, w którym także zastosowałem funkcje rekurencyjną i dodałem nową funkcję ;)
#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

  • 0

#17 Calipers

Calipers

    Nowy

  • 3 postów

Napisano 20 06 2010 - 00:51

Na przyszłość może się przydać.
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

  • 0

#18 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 25 06 2010 - 21:27

Skoro funkcja (dokładnie poniższa procedura) nie ma zwracać wartości to nie jest potrzebne return;

Wstawienie return nie jest błędem.

Następnie należy pamiętać, aby program podzielić na pliki nagłówkowe (pliki z rozszerzeniem *.h zawierają deklaracje) oraz pliki z definicjami( *.cpp)

Moim zdaniem przy takim prostym i krótkim programie to jest zbędne.

np. taką ścieżkę rozwoju: Pascal, C oraz naukę podstawowych algorytmów. Następnie C++/C# (.NET 4.0) może nawet Java.

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.

  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych