eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingzamiana liczbyRe: zamiana liczby
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!news.task.gda.pl!not-for-mail
    From: "Ireneusz Szpilewski" <i...@s...opole.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: zamiana liczby
    Date: Wed, 10 Apr 2013 23:23:21 +0200
    Organization: CI TASK http://www.task.gda.pl/
    Lines: 152
    Message-ID: <op.wvcgc7bbwyk85p@localhost>
    References: <kjsgog$lu7$1@node2.news.atman.pl> <op.wvaq0ku4wyk85p@localhost>
    <kk2b5u$k5s$1@node1.news.atman.pl>
    NNTP-Posting-Host: 178.252.26.75.internetia.net.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
    Content-Transfer-Encoding: Quoted-Printable
    X-Trace: news.task.gda.pl 1365628994 20922 178.252.26.75 (10 Apr 2013 21:23:14 GMT)
    X-Complaints-To: a...@n...task.gda.pl
    NNTP-Posting-Date: Wed, 10 Apr 2013 21:23:14 +0000 (UTC)
    User-Agent: Opera Mail/12.14 (Linux)
    Xref: news-archive.icm.edu.pl pl.comp.programming:202540
    [ ukryj nagłówki ]

    On Wed, 10 Apr 2013 02:19:10 +0200, Borneq <b...@a...hidden.pl>
    wrote:

    > Użytkownik "Ireneusz Szpilewski" <i...@s...opole.pl> napisał w
    > wiadomości news:op.wvaq0ku4wyk85p@localhost...
    >> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglanie,
    >> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako
    >> 1KB.
    >
    > Wystarczy dodać najpierw 512. Ale czy na pewno dzielić przez 1024 ?, dla
    > mnie znacznie wygodniejsze byłoby 1000

    Tu jest wersja z kB = 1000B zamiast KB = 1024B, dla prostoty tez zaokragla
    w dol:

    #include <stdio.h>

    /* zeruj wynik */
    void dec_zero(unsigned char dec[10])
    {
    int i;

    for(i = 0; i < 10; i++)
    dec[i] = 0;
    }

    /* pomnoz wynik razy 2 i dodaj carry (0 lub 1), *leftmost = najstarsza
    cyfra wyniku */
    void dec_double(unsigned char dec[10], int carry, int* leftmost)
    {
    int i;
    int digit;

    for(i = 0; i < *leftmost; i++)
    {
    digit = 2 * dec[i] + carry;

    if(digit > 9)
    {
    digit -= 10;
    carry = 1;
    }
    else
    {
    carry = 0;
    }

    dec[i] = digit;
    }

    if(carry)
    {
    dec[i] = 1;
    (*leftmost)++;
    }
    }

    /* wylicz wynik result[10] dla podanej liczby number[4] */
    /* i zwroc najstarsza cyfre wyniku (liczona od 1)) */
    int convert(const unsigned char number[4], unsigned char result[10])
    {
    int byte = 3;
    unsigned char mask = 0x80;
    int bit_is_set;
    int leftmost = 1;

    dec_zero(result);

    while(1)
    {
    bit_is_set = (number[byte] & mask) != 0;

    dec_double(result, bit_is_set, &leftmost);

    mask >>= 1;

    if(mask == 0)
    {
    if(byte == 0)
    break;

    mask = 0x80;
    byte--;
    }
    }

    return leftmost;
    }

    /* drukuj wynik */
    void dec_print(unsigned char dec[10], int leftmost, const char*
    power1000_names[4])
    {
    int power = (leftmost - 1) / 3;
    int count = leftmost - power * 3;
    int i;

    for(i = 1; i <= count; i++)
    {
    printf("%d", (int) dec[leftmost - i]);
    }

    printf(power1000_names[power]);
    }

    /* programik testujacy */
    int main()
    {
    unsigned char number[4] = {0, 0, 0, 0};
    unsigned char result[10];
    const char* power1000_names[4] = {"B", "kB", "MB", "GB"};

    while(1)
    {
    unsigned try_it;
    int leftmost;

    printf("liczba: ");
    scanf("%u", &try_it);

    /* katastrofa, jesli unsigned wiekszy niz 4 bajty: */
    *(unsigned*)number = try_it;

    leftmost = convert(number, result);
    printf("wynik = ");
    dec_print(result, leftmost, power1000_names);
    printf("\n\n");
    }

    return 0;
    }

    Irek
    --
    Using Opera's mail client: http://www.opera.com/mail/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: