C Wypisz najmniejsze i największe wartości w następujących typach zmiennych

2012-12-19 18:28

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Witam,

zajmuję się programowaniem dopiero od tego roku. Większość problemów, z którymi się spotykam staram się rozwiązywać sam.
Napotkałem na problem (tak wiem - to problem pewnie tylko dla mnie), z którym nie mogę sobie poradzić.

Treść zadania:

Napisz program, który wylicza najmniejszą i największą wartość w następujących typach:
unsigned short int
signed short int
signed int
unsigned int
signed long int
unsigned long int

Uwaga: zwrot „program, który wylicza” należy rozumieć dosłownie, tzn. obliczenia powinny odbywać się w jakieś pętli a nie przez odczytanie stałych zdefiniowanych w systemie.

Odpowiedzi są oczywiste bez liczenia, ale jak to obliczyć w C?
Proszę o wskazówki.

Pozdrawiam

nie dubluj tematów! - robcio 2012-12-19 19:01

Pozostało 580 znaków

2012-12-19 18:38
Moderator

Rejestracja: 12 lat temu

Ostatnio: 26 minut temu

Lokalizacja: Wrocław

0

Może się mylę, ale chyba był tutaj taki temat niedawno.


Taką odpowiedź możesz wkleić do każdego wątku tutaj i pomylisz się w 10% przypadków ;P - msm 2012-12-19 23:06

Pozostało 580 znaków

2012-12-19 18:59

Rejestracja: 14 lat temu

Ostatnio: 1 minuta temu

0

Ja podam rozwiązanie, przy założeniu że liczby są w kodzie U2 (czyli takie jakie są używane w praktycznie każdej architekturze komputera):

a = 0
b = 1
while (a < b) {
 a++;
 b++;
}
print "Najmniejsza to: " + b
print "Największa to: " + a

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2012-12-19 19:31
Pokaż pozostałe 6 komentarzy
Ależ ja zdaje sobie sprawę z tego, że to w 99% przypadków działa. ;-) Chciałem tylko zwrócić uwagę, że coś, co w zasadzie wydaje się oczywiste to w C/C++ UB. Ten wątek na SO jest bardzo fajny, trafiłby tutaj, ale znów były dwa takie same wątki, więc napiszę to co tam: nie ma w zasadzie żadnej przenośnej i zgodnej ze standardem metody na znalezienie tych granic dla typu ze znakiem. - Endrju 2012-12-20 12:39
Cóż, właściwie jest, tylko skrajnie niewydajna – druga odpowiedź w wątku SO, z nagrodą 150 punktów. W skrócie: stworzyć tablicę wszystkich możliwych wartości danego typu i znaleźć minimum i maksimum. Ze względu na to, że liczby całkowite w komputerze mają określony dobry porządek (dobry – bo zbiór jest skończony), ta metoda na pewno zadziała. - rincewind 2012-12-20 12:51
W tamtym wątku OP pod tą druga odpowiedzią napisał, że nawet to nie zadziała. Chodzi o rzutowanej tej wygenerowanej kombinacji na konkretny typ, które wcale nie musi działać dobrze. - Endrju 2012-12-20 13:01
Hmm… Tego właśnie trochę nie rozumiem. Przecież nawet dla jakiegoś udziwnionego kodowania (typu tagowanie, etc.) można wygenerować zbiór wszystkich konfiguracji bitów (niech będzie to np. 36 bitów reprezentacji i 32-bitowe liczby), a następnie usunąć te, które nie reprezentują liczby danego typu. I tu znaleźć element najmniejszy i największy. Nie rozumiem, jak miałoby to nie zadziałać. - rincewind 2012-12-20 13:26
No bo podczas konwersji może stać się coś dziwnego, jeżeli wygenerujesz np. trap representation. To jest tak jak wcześniej - w 99% przypadków zadziała. - Endrju 2012-12-20 13:56

Pozostało 580 znaków

2012-12-19 19:00

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

Lokalizacja: Opole

0

Rozmiar niektórych typów fundamentalnych zależy od architektury na jaką kompilujemy program. Np możemy liczyć ,że int będzie miał co najmniej 2 bajty. Maksymalna wartość jaką może przechowywać 2 bajtowy int to 2^16- 1. Możesz użyć operatora sizeof ale nie wiem czy o to ci chodzi.


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
Prawdę mówiąc, nie widzę tutaj zastosowania dla operatora sizeof. - Patryk27 2012-12-19 19:03
czemu operator sizeof nie ma zastosowania? W treści zadania ma podane ,że ma obliczyć wielkość danych typów. sizeof jest makrem rozwijanym w czasie kompilacji. Zatem instrukcje maszynowe tego makra znajdą się w programie. Zatem zostanie spełniony warunek "Program który liczy rozmiar danych typów" - robcio 2012-12-19 19:08
@robcio: w treści zadania jest: "Napisz program, który wylicza najmniejszą i największą wartość w następujących typach (...)" gdzie tutaj masz napisane cokolwiek o ich wielkości w pamięci? - Patryk27 2012-12-19 19:10

Pozostało 580 znaków

2012-12-19 19:14
Moderator

Rejestracja: 12 lat temu

Ostatnio: 26 minut temu

Lokalizacja: Wrocław

0

Możesz popróbować z rzeczami w stylu (tutaj przykład dla Pascala, bo nie wiem jak działają wstawki assemblerowe w C++ :P):

{$ASMMODE INTEL}

Function getMax: LongWord; cdecl; assembler;
asm
 xor eax, eax
 sub eax, 1
end;

Begin
 Writeln(getMax());
End.

sposób jest zły dla typów unsigned - Wibowit 2012-12-19 19:30
@Wibowit: chyba zły dla typów ze znakiem? LongWord jest unsigned i z tego co zauważyłem, to działa dobrze. - Patryk27 2012-12-19 19:36
aj sorry, chodziło mi o signed :P mój kod działa i dla signed i dla unsigned - Wibowit 2012-12-19 19:54
i korzysta z pętli, tak jak to było zaznaczone w temacie - Wibowit 2012-12-19 19:54

Pozostało 580 znaków

2012-12-20 17:58

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Bardzo dziękuję za pomoc ;)

Kod (może się komuś przyda):

#include <stdio.h>
#include <stdlib.h>

int main()
{
        unsigned short usmin, usmax;
        short smin, smax;
        int imin, imax;
        unsigned uimin, uimax;
        long lmin, lmax;
        unsigned long ulmin, ulmax;

        for (usmax = 0, usmin = 1; usmax < usmin; usmax++, usmin++);
        printf ("unsigned short min: %hu max: %hu\n", usmin, usmax);

        for (smax = 0, smin = 1; smax < smin; smax++, smin++);
        printf ("short min: %hd max: %hd\n", smin, smax);

        for (imax = 0, imin = 1; imax < imin; imax++, imin++);
        printf ("int min: %d max: %d\n", imin, imax); 

        for (uimax = 0, uimin = 1; uimax < uimin; uimax++, uimin++);
        printf ("unisgned int min: %u max: %u\n", uimin, uimax);  

        for (lmax = 0, lmin = 1; lmax < lmin; lmax++, lmin++);
        printf ("long min: %ld max: %ld\n", lmin, lmax);  

        for (ulmax = 0, ulmin = 1; ulmax < ulmin; ulmax++, ulmin++);
        printf ("unisgned long min: %lu max: %lu\n", ulmin, ulmax);    

        system("pause");
}
edytowany 1x, ostatnio: adept_c, 2012-12-20 20:22

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0