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:około rok
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:około rok
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:około rok
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.