Lampki symbolizujące literę w systemie dwójkowym

0

Cześć
Mam problem z zadaniem. bardzo proszę o pomoc.Chodzi o to, że mam podany kod początkowy:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

const int BITS_IN_BYTE = 8;

void print_bulb(int bit);

int main(void)
{
    // TODO
}

void print_bulb(int bit)
{
    if (bit == 0)
    {
        // Dark emoji
        printf("\U000026AB");
    }
    else if (bit == 1)
    {
        // Light emoji
        printf("\U0001F7E1");
    }
}

I mam napisać taki, żeby po podaniu hasła, najpierw zmienić litery (albo spacje) w ich numer w ASCII.
Potem ten numer mam zapisać za pomocą lampek, w systemie dwójkowym, gdzie 1 oznacza zapaloną a 0 zgaszoną lampkę. Po jednej literze w rzędzie. Żeby powstał taki kod, z którego po kolei będzie można odszyfrować hasło. Jeśli niejasno tłumaczę, to proszę pytać, jestem osobą początkującą i uczę się sama. Nie jest to raczej trudne zadanie, znalazłam je w kursie CS50 na edx. Bardzo dziękuję za pomoc, myślałam nad tym już parę godzin i ciągle źle się świecą te lampki. Pozdrawiam.

2

@Natalia Sylwester:

W tym kodzie nie świecą żadne lampki ani dobre, ani złe, bo main() jest pusty.

JESLI rzeczywiście masz jakikolwiek własny kod (w co wątpię), TO PODAJ.

2
Natalia Sylwester napisał(a):

Nie jest to raczej trudne zadanie, znalazłam je w kursie CS50 na edx

Nie zgodzę się z tym do końca bo jest to zadanie złożone z wielu punktów które dla początkującego mogą być bardziej lub mniej tricky. Są to kolejno

  1. Wczytanie Stringa w C
  2. Zamiana chara na liczbę (akurat w C banalne, bo char jest liczbą)
  3. zamiana inta na "stringa binarnego", np false/true
  4. zastosowanie tej konwersji dla wszystkich charów w stringu za pomocą pętli (W rezultacie mamy tablicę "stringów binarnych")
  5. wyświetlenie tego wszystkiego na ekran

Oczywiście punkty można mieszać i łączyć w ramach uproszczenia, ale IMHO tak powinien wyglądać kod produkcyjny na coś conajmniej 32 bitowego. Ty jak widzę nie masz żadnego z tych punktów. Więc dołączam się do pytania @ZrobieDobrze - co w zasadzie zrobiłes zrobiłaś przez te kilka godzin ?

0

@KamilAdam:

"łatwe" tutaj znaczy "łatwe w opinii zlecajacego, niech ktoś to zrobi za frajer"
NIE ZNACZY "łatwe, więc popracuję i zrobię to sam"

0

Co? Myślałam, że jest łatwe, bo to chyba kurs dla początkujących. Przez przypadek usunęłam mój kod. Muszę napisać to co miałam i wyślę, ok?

0

Napisałam coś takiego:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

const int BITS_IN_BYTE = 8;

void print_bulb(int bit);

int main(void)
{
    string a = "HI!";

    for(int b=0; b<strlen(a); b++){
        int c = a[b];
        int dwojkowy[BITS_IN_BYTE]={0,0,0,0,0,0,0,0};
        for(int d=0; d<7; d++){do{
            dwojkowy[7-d]=c%2;
            c=c/2;
        }while(c>0);}
        for(int n=7; n>=0; n--){
            print_bulb(dwojkowy[7-n]);
        }
        printf("\n");
    }
}

void print_bulb(int bit)
{
    if (bit == 0)
    {
        // Dark emoji
        printf("\U000026AB");
    }
    else if (bit == 1)
    {
        // Light emoji
        printf("\U0001F7E1");
    }
}

Ale oczywiście mam jakieś błędy. Mogę nad tym jeszcze myśleć i myśleć, ale zawsze mi źle wychodzi. Przez to się zastanawiam, czy się w sumie do tego nadaję... Dziękuję za komentarze, możliwe że robię jakieś głupie błędy.

3
        for(int d=0; d < 7; d++){
            if(c > 0) {
              dwojkowy[7 - d] = c % 2;
              c = c / 2;
            };
        }

tam nie może być do-while bo konsumujesz cały znak w od razu dla pierwszego bitu i nic nie zostaje dla kolejnych bitów

BTW używanie znaków z dalekiego UTF źle mi się wyświetla w konsoli więc sobie zmieniłem funkcję wyświetlania na

void print_bulb(int bit) {
    printf(bit ? "X" : "_");
}

i wyszystko smiga

_X__X___
_X__X__X
__X____X
0

Super! Bardzo dziękuję

0

Weź sobie jakieś Arduino weź, to wtedy naprawdę możesz mieć lampki. Super zabawa.

0

To oczywiście nie jest uwaga do @Natalia Sylwester - tak to zrobili w tym cs50

W pierwszej chwili myślałem, że tu jest pomieszany string z C i C++...

   string a = "HI!";

   for(int b=0; b<strlen(a); b++){

Jakoś nie jestem przekonany, że taki typedef to dobry pomysł...

0
int dwojkowy[BITS_IN_BYTE]={0,0,0,0,0,0,0,0};

clang to skompiluje z ostrzeżeniem a gcc rzuci błędem kompilacji. W kodzie ta tablica będzie zainicjowana w pętli for przed późniejszym użyciem więc te klamry z zerami są niepotrzebne.

Raczej nie potrzebujesz VLA, rozmiar tablicy ustawiasz stałą równą 8 a dalej w kodzie lecą na sztywno 7-mki. Brak tu trochę konsekwencji, ta zmienna sugeruje że można sobie zmieniać liczbę bitów a dalej w kodzie jest sztywniak i wszystko się podstępnie posypie. Jak już parametryzujesz to trzeba to zrobić konkretnie i do końca bo robisz sobie niezłą minę.

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