zadania ze struktur

0

Witam, mam dwa takie zadanka do zrobienia i kompletnie nie wiem jak się do nich zabrać, ani od czego zacząć, możecie mnie jakoś naprowadzić?

Część A
Dość często potrzebujemy ustawiać lub sprawdzać wartości pojedynczych bitów w słowie typu int lub unsigned int. Zdefiniuj dwie funkcje: jedną do odczytywania wartości określonego bitu w słowie (funkcja ma zwracać wartość 0 lub 1), a drugą do ustawiania wartości określonego bitu (funkcja ma ustawić bit na 1 tylko wtedy, gdy parametr ma wartość różną od 0):
int jakiBit (char *tablica, unsigned int nrBitu);
void ustawBit (char *tablica, unsigned int nrBitu, int wartosc);
Przy programowaniu tych funkcji skorzystaj z operatorów bitowych. Na koniec przetestuj działanie obu funkcji.
Część B
Zdefiniuj unię, która będzie zawierała pole typu int oraz pole będące tablicą znakową char[sizeof(int)]. Następnie napisz krótki program testowy, który w nieskończonej pętli będzie wczytywał liczbę całkowitą typu int, umieszczał ją w unii a następnie wypisywał kolejne bity reprezentujące tą liczbę (korzystając tablicy znakowej w tej unii oraz z funkcji z poprzedniej części zadania). Sprawdź za pomocą tego programu, czy na twoim komputerze są zapisywane w systemie little-endian czy big-endian (uzasadnij swoją opinię).

Zdefiniuj strukturę z polami bitowymi do zapamiętywania godziny (5 bitów na godziny, 6 bitów na minuty i 6 bitów na sekundy). Napisz też funkcję, która podane wartości typu unsigned int reprezentujące określoną godzinę upakuje do pola bitowego:
godzina upakuj (int g, int m, int s);
Potem zdefiniuj strukturę opisująca rozmowę telefoniczną: numer dzwoniącego, numer odbierającego oraz godzina rozpoczęcia i zakończenia rozmowy (skorzystaj ze struktury godzina z polami bitowymi do pamiętania czasu).
typedef struct { /.../ } polaczenie;
Następnie napisz program, który dla wczyta ze standardowego wejścia liczbę całkowitą n>0 oznaczającą ilość rozmów, potem utworzy automatyczną n-elementową tablicę struktur i wczyta do niej informacje o n rozmowach telefonicznych prowadzonych w jakimś dniu za pośrednictwem pewnej centrali. Do sortowania użyj funkcji qsort() z biblioteki standardowej.
Na koniec program powinien najpierw wypisać połączenia od najdłuższego do najkrótszego a potem obliczyć i wypisać średnią długość połączeń telefonicznych w danym dniu (liczoną w sekundach z dokładnościa do 2 miejść po kropce dziesiętnej).

0

Co do pierwszego A:

Najpierw pobierz od użytkownika numer bitu (int numer) który ma pobrać. Teraz podnieś 2 do potęgi numer.
Jeżeli ktoś poda 4 bit, to 2^4 = 16
Liczba 16 zapisana w kodzie binarnym to 10000, a więc mamy jedynkę na piątym bicie. Dlatego albo nakazujesz użytkownikowi numerować bity od zera, albo od numer odejmujesz 1. Naszym porządanym efektem jest liczba 8, w kodzie binarnym: 1000. Tutaj mamy jedynkę na czwartym bicie.

Teraz najważniejsza część - iloczyn logiczny podanej liczby (int liczba) z numerem (w w/w przypadku jest to liczba 8). Iloczyn ten dla przykładowej int liczba=44 przebiega tak:

 101100 (48)
*  1000 (8)
=======
 001000 (8)

Otrzymaliśmy więc liczbę 8. W tym przypadku są dwie możliwości: albo dostaniemy 0, albo numer. Jeżeli dostaliśmy zero, to znaczy że na tym miejscu jest zero. Jeżeli numer, to znaczy że 1. Teraz tylko proste wyrażenie w stylu (tutaj C++):

(numer) ? 1 : 0

I otrzymujemy zero/jeden.

Z zapisywaniem bitu na danym miejscu jest bardzo podobnie, tyle że zamiast iloczynu logicznego wykonujesz sumę logiczną.

0

Co do części B:

typedef union {
int liczba;
char tab[sizeof(int)];
} unia;

int main()
{
unia u;
while (1)
{
scanf ("%d", &u.liczba);
//printf ("Liczba to: %d\n", u.liczba);
for (int i=0; i<sizeof(u.liczba); i++)
{
printf ("Bajt %d to: %d\n", i+1, u.tab[i]);
}
}
return 0;
}

Co do little-endian i big-endian to procesory intel i pochodne mają system little-endian czyli najmniej znaczący bajt na początku - a to znaczy ze liczba postaci Bajt1Bajt2Bajt3Bajt4 bedzie zapisana Bajt4Bajt3Bajt2Bajt1

0
int jakiBit (char *tablica, unsigned int nrBitu) { return tablica[nrBitu>>3]&(1<<(nrBitu&7))!=0; }
void ustawBit (char *tablica, unsigned int nrBitu, int wartosc) { if(wartosc) tablica[nrBitu>>3]|=(1<<(nrBitu&7)); else tablica[nrBitu>>3]&=~(1<<(nrBitu&7)); }

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