Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Symfonia C++ - Rozwiązania Ćwiczeń


Rekomendowane odpowiedzi

Opublikowano

wiem, że trochę późno (6 miesięcy?) ale napiszę.

char obj;
	char *wch1;
	char * wch2;
	double *wd;

	wch1 = &obj;
	wch2 = wch1;

	wd = (double *)obj;
	wd = reinterpret_cast<double*>(obj);
Powyższy kod nie działa poza ciałem funkcji, ponieważ poza ciałem funkcji nie może być żadnych operacji poza inicjalizacjami obiektów.

	char obj;
	char *wch1 = &obj;
	char * wch2 = wch1;
	double *wd = reinterpret_cast<double*>(obj);
już działa.

 

Co do drugiego to nie wiem jakie były założenia w zadaniu, później może dokładnie to przepatrzę.

  • Odpowiedzi 53
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

12. Struktury, unie i pola bitowe

 

 

I. Czym się różni struktura od klasy?


W klasie domniemanie składniki są prywatne, a w strukturze publiczne.



II. Można powiedzieć, że w klasie czy strukturze poszczególne składniki umieszczane są obok siebie. A jak umieszczane są w unii?


Umieszczane są na sobie.



III. Dokończ poprawnie następujące stwierdzenie. Rozmiar unii wynika:
a) - z ilości jej składników,
B) - z wielkości największego składnika,
c) - z ilości składników publicznych.


B) - z wielkości największego składnika.



IV. Mamy unię, której składnikiem jest obiekt typu char i obiekt typu double. Jeśli w obiekcie tej unii przechowywana jest właśnie wartość typu char, to czy można wówczas włożyć do tego obiektu wartość typu double?


Tak.



V. Tworzymy obiekt jakiejś unii, a chielibyśmy od razu nadać mu wartość(inicjalizacja). Jakiego typu musi być to wartość?


Wartość musi być typu pierwszego od góry obiektu unii.



VI. Jaka jest składnia wyrażenia odnoszącego się do składnika unii - w przypadku unii zwykłej, a jaka w przypadku unii anonimowej?


Zwykła - nazwaunii.nazwaobiektu lub wskaznik_na_unie->nazwaobiektu
Anonimowa - nazwaobiektu



VII. Czy w przypadku unii anonimowej są jakieś ograniczenia co do typu, lub co do nazwy składników? Jeśli tak, to jakie?


W danym zakresie lokalnym nie może być takich samych nazw obiektów, gdyż nastąpiła by redefinicja.



VIII. Jak stworzyć obiekt typu unii, która nie ma nazwy?


Nie tworzymy wtedy obiektu, bo mamy już stworzony i po prostu nie możemy tworzyć kilku egzemplarzy unii.



IX. Czy do tego, by unia była anonimowa wystarczy, by nie miała nazwy?


Nie, nie może też pokazywać na nią żaden wskaźnik.



X. Czy można zdefiniować obiekty typu pola bitowego?


Nie.



XI. Wybierz poprawne warianty poniższego zdania. Pole bitowe może być typu:
a) signed int
B) double
c) long int
d) bool
e) unsigned int
f) enum
g) signed short
h) char


a), c), d), e), f), g), h)



XII. Który składnik w definicji pola bitowego można opuścić?
a) typ
B) nazwę
c) rozmiar(ile bitów)


Można opuścić nazwę.



XIII. Jeśli jakieś pole bitowe ma rozmiar zero bitów - co to oznacza?


Oznacza to, że chcemy aby następne pole bitowe było w kolejnym słowie.



XIV. Co to znaczy, że rozmieszczenie pól bitowych w słowie zależne jest od implementacji?


Zależne jest od której strony słowa kompilator zaczyna uzupelniać bity, oraz kiedy je urywa.



XV. Wybierz poprawne zakończenia następującego zdania. Pole bitowe:
a) może być typu bool
B) może być static
c) może mieć egzemplarz obiektu zdefiniowany globalnie
d) musi być składnikiem klasy/struktury
e) nie musi mieć nazwy, bo można na nie pokazać wskaźnikiem


a), c), d)



XVI. Napisz prosty program, który zapyta użytkownika o datę(np. urodzenia) żądając wprowadzenia jej jako jednej długiej liczby w postaci DDMMRRRR, gdzie DD oznacza dwucyfrowy numer dnia w miesiącu, MM dwucyfrowy numer miesiąca, a RRRR numer roku. Program ma przyjąć tę liczbę z klawiatury jako wartość typu long, a następnie wypisać na ekranie w postaci dziesiątkowej następujace jej fragmenty
- fragment o nazwie niebieski, na który składają się bity 0, 1, 2, 3, 4, 5
- fragment o nazwie zielony, na który składają się bity od 10 do 14(włącznie)
- fragment o nazwie czerwony, na który składają się bity 16,17,18.

W programie nie można ani raz użyć operacji bitowej koniunkcji ani przesunięcia bitowego. Jeśli posłużysz się unią, to niech NIE będzie ona anonimowa.

 


#include <iostream>
using namespace std;

int main()
{
  struct ZiemniakPodzielony
  {
    unsigned long niebieski : 6;
    unsigned long           : 4;
    unsigned long zielony   : 5;
    unsigned long           : 1;
    unsigned long czerwony  : 3;
  };

  union Ziemniak
  {
    long data;
    ZiemniakPodzielony ziemniakPodzielony; 
  };

  Ziemniak ziemniak;

  cout << "Podaj date urodzenia w formacie DDMMRRRR: " << endl;
  cin >> ziemniak.data;

  cout << "Niebieski: " << ziemniak.ziemniakPodzielony.niebieski << endl
       << "Zielony: " << ziemniak.ziemniakPodzielony.zielony << endl
       << "Czerwony: " << ziemniak.ziemniakPodzielony.czerwony << endl;

}

 

 

G8loSX2.png
  • 9 miesięcy temu...
Opublikowano

XLVI. Mamy następujące obiekty

int obiekt = 100;

int *intw;

const int *Cintw;

int * const intCw = &obiekt;

const int * const CintCw = &obiekt;

Jak widzisz nazwy są wybrane tak, by przypominały o typie obiektu. Np. Cintw – to skrót od const int wskaźnik.

Które z poniższych instrukcji zostaną przez kompilator odrzucone jako błędne i dlaczego?

a) intw = Cintw;

B) intw = intCw;

c) intw = CintCw;

d) Cintw = intw;

e) Cintw = intCw;

f) Cintw = CintCw;

g) CinCtw = intw;

h) CintCw = Cintw;

i) CintCw = intCw;

Które z powyższych przypisań można przeprowadzić dzięki operacji rzutowania, a które są niemożliwe nawet za pomocą rzutowania?

Poprawne: b, d, e, f. Za pomocą rzutowania: a), g), h), i)

A zobacz co jest napisane na stronie 284. Do stałego wskaźnika nie można wpisać nic, więc g,h,i za pomocą rzutowania odpada. Za to w c bez problemu można wpisać static_cast'em.

Może się mylę, jednak proszę o sprawdzenie tych odpowiedzi.

Pozdrawiam.

  • 1 rok później...
Opublikowano

Witam

(też jestem "ogórek" jeśli chodzi o C++) ;)

 

Moje wątpliwości  dotyczą zad XXV z działu Tablice.Kolejność zapisywania elementów tablicy trójwymiarowej tab[4][2][2] w pamięci komputera.

U mnie wychodzi, że to będzie raczej tak:

tab[0][0][0]

tab[0][0][1]

tab[0][1][1]

tab[1][0][0]

tab[1][0][1] itd

 

 

Myślę, że widać to po kolejności inicjalizacji poszczególnych elementów przy inicjalizacji zbiorczej.Najpierw inicjalizowany jest element [0][0][0], poźniej [0][0][1] itd

Jeśli zainicjalizujesz tablicę np w ten sposób char tab[4][2][2] = {'a','b','c','d','e','f','g'};

 

 

 

to okazuje się, że np litera 'e' jest wartością elementu tab[1][0][0], a nie co by wynikało z  Twojej sugestii [0][0][1].

 

 

Poszedłem jeszcze trochę dalej i zrobiłem program  ze wskaźnikiem, który wskazuje na adresy komórek pamięci poszczególnych elementów tablicy. 

#include <iostream>
using namespace std;
 
void pokaz_adres_wsk(int tab[4][2][2]);
//*********************************************************************************************************************************************
int main()
{
 
 
 
 
   
// inicjalizujemy tablice trojwymiarowa kolejnymy liczbami naturalnymi
int tab[4][2][2] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
 
pokaz_adres_wsk(tab);                   //wysyłamy do funkcji tablicę
}
 
//************************************************************************************************************************************************
void pokaz_adres_wsk(int tab[4][2][2])
{
 
    int *wsk;
for(int i = 0, j = 0, k = 0;;k++)
{
    if(k == 2)
     {
       k = 0;
       j++;
     }
    if(j == 2)
    {
        j = 0;
        i++;
    }
    if(i == 4)
    break;
 
 
 
    wsk = &tab[j][k];
 
    cout<<"element tablicy tab["<<i<<"]["<<j<<"]["<<k<<"] ma adres: "<<reinterpret_cast<unsigned int>(wsk)<<", a wartosc = "<<(*wsk)<<endl;
 
 
}
 
 
 
}
 

Tak na marginesie to wielkie dzięki z odpowiedzi Approx.Bardzo mi pomogłeś.

Kontynuujesz drugi tom?

 

Pozdrawiam 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...