Grupy krwi - operacje bitowe

Grupy krwi - operacje bitowe
0

Cześć mam problem z tym zadaniem:

Załóżmy, że grupy krwi kodowane są bitowo w następujący sposób
A+ = 101, AB- = 110, 0+ = 001, B- = 010, itd.
Napisz program, który wykorzystując operacje bitowe dla zadanej grupy krwi wyznaczy
wszystkie grupy krwi, których posiadacz może byd dawcą dla posiadacza grupy zadanej.
Program powinien wczytywad i wypisywad dane w formacie tekstowym a pamiętać
i przetwarzać w formie bitowej.

Tabela grup krwi:
http://speedy.sh/cCqtJ/zad.pdf

Otóż nie widzę powiązania między kodami bitowymi, a grupami krwi. Widzę, że są one
numerowane od 0 do 7 patrząc od lewej po nagłówku w tabeli ale nic poza tym.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Otóż nie widzę powiązania między kodami bitowymi, a grupami krwi.

Dla mnie to wygląda na coś w rodzaju:
czy A + czy B + czy z plusem

Np.:
A+ = 101
czy A = 1
czy B = 0
czy z plusem = 1

B- = 010
czy A = 0
czy B = 1
czy z plusem = 0

itd.

Btw,
Zdanie:

to zadanie zostanie sprawdzone pod kontem wykorzystania operacji bitowych

Nie ma sensu, bo konto to coś innego, niż kąt.


edytowany 3x, ostatnio: Patryk27
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:11 miesięcy
1

Nudziło mi się, a zadanie mi się spodobało.

Kopiuj
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

bool qualifies(int donor_idx, int recipient_idx)
{
    return (~(donor_idx & ~recipient_idx) & 7) == 7;
}

int main()
{
    const size_t count = 8;
    string types[count] = { "0-", "0+", "B-", "B+", "A-", "A+", "AB-", "AB+" };

    string donor;
    cout << "Dawca: ";
    cin >> donor;

    size_t donor_idx = find(types, types + count, donor) - types;
    if(donor_idx >= count)
        cout << "Nie ma takiej grupy";
    else
    {
        cout << "Biorcy:";

        for(int recipient_idx = 0; recipient_idx < count; recipient_idx++)
            if(qualifies(donor_idx, recipient_idx))
                cout << "\n" << types[recipient_idx];
    }

    cout << "\n";
}
edytowany 3x, ostatnio: Rev
AN
  • Rejestracja:około 12 lat
  • Ostatnio:około 12 lat
  • Postów:36
0
Kopiuj
size_t donor_idx = count - distance(find(types, types + count, donor), types + count);

da ten sam wynik co:size_t donor_idx=find(types,types+count,donor)-types;

Kopiuj
Czemu tak zrobiłeś?

qualifies wg mnie powinno zwracać
```cpp
return recipient_idx|donor_idx==recipient_idx;
RE
Masz rację z wyszukiwaniem, faktycznie wystarczy odjąć wskaźniki. Natomiast nie zgadzam się co do samego wyrażenia.
AN
  • Rejestracja:około 12 lat
  • Ostatnio:około 12 lat
  • Postów:36
0
Rev napisał(a):

Natomiast nie zgadzam się co do samego wyrażenia.
A możesz się nie zgadazac, grunt że wikipedia się ze mną zgadza.

Kopiuj
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
  {
   const char *types[]={"0Rh-", "0Rh+", "BRh-", "BRh+", "ARh-", "ARh+", "ABRh-", "ABRh+" };
   const size_t count=sizeof(types)/sizeof(*types);
   cout<<setw(6)<<"D.\B.";
   for(size_t x=0;x<count;++x) cout<<setw(6)<<types[x];
   cout<<endl;
   for(size_t y=count-1;y<count;--y)
     {
      cout<<setw(6)<<types[y];
      for(size_t x=0;x<count;++x)
        {
         cout<<setw(3)<<(((y|x)==y)?'X':' ')<<"   ";
        }
      cout<<endl;
     }
   return 0;
  }
edytowany 1x, ostatnio: antimonium
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:11 miesięcy
0

Ah, przy zamienionej kolejności faktycznie będzie poprawnie.

ps. zbanowani użytkownicy głosu nie mają :>.

Zobacz pozostałe 9 komentarzy
Endrju
No oczywiście, to się zgadza. Lekarze pewnie tez umieją się na wzajem odczytywać. ;-)
AN
Znam z pierwszej ręki - tylko siebie potrafią odczytać a i to nie zawsze. (lekarze - obaj rodzice oraz dwie babci) Czyli bardziej pasuje do waszego stylu ;P
Endrju
Niby tak, ale to normalne, że umieją czytać też staranne pismo. :-P (Tak samo jak pisałem wyżej)
AN
Dla mnie jest strawny każdy kod, dla ciebie nie. Wiec kogo lepiej nauczono?
Endrju
To nie jest kwestia nauki, to kwestia gustu. Składnia to składnia, jeżeli ją znam (to kwestia nauki) to odczytam cokolwiek. Co nie oznacza, że nie może mnie przy tym zemdlić. Ty masz odporniejszy żołądek. :-P
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:11 miesięcy
0

Nawiasów brakowało: return (recipient_idx | donor_idx) == recipient_idx;. Ale jest ok, przekombinowałem. Wychodziłem niepotrzebnie od całej tabelki prawdy zamiast zauważyć prostą zależność.

AN
Aha, no bo ja wychodziłem z prostej praktycznej zasady dla lekarzy polowych: - jak dawca da coś "zbędnego" to biorcy kaput.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)