• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SPOJ - System pozycyjny

Object Storage Arubacloud
0 głosów
312 wizyt
pytanie zadane 3 maja 2022 w C i C++ przez Paweł110 Nowicjusz (140 p.)

Witam,

proszę o podpowiedź w celu zaliczenia programu konwertującego liczby z systemu dziesiętnego na system 16 i 11tkowy. Zadanie ze SPOJ Systemy pozycyjne. Za długo schodzi mi z tym zadaniem, więc pewnie źle zrozumiałem zadanie i brak odpowiedniej wiedzy. Używam tablicy do przechowywania wyników poszczególnych działań. Na koniec odwracam kolejność znaków z tablicy i wyświetlam. Program działa poprawnie (sprawdzałem obliczenia z kalkulatorami i wyniki są takie same) jednak w zły sposób. Odpowiedz odrzucona, więc pomyślałem, że może przechowywane mają być kody ASCII. To tez wydało mi się bez sensu (bo wyświetlany i tak będzie tekst ) ale spróbowałem i także bez powodzenia. Nie potrafię inaczej przełożyć wyników na ekran. Kod jest w dwóch funkcjach void. Do wyświetlenia znaku z tablicy, w której jest kod ASCII używam na końcu :

cout<<(char)tablica[k];

. Jeżeli trzeba to wkleję cały kod.

 

komentarz 3 maja 2022 przez j23 Mędrzec (194,920 p.)
Nie rozumiem, dlaczego założyłeś, że bez kodu będziemy wiedzieli, co w nim jest nie tak.
komentarz 3 maja 2022 przez Paweł110 Nowicjusz (140 p.)

Jestem tutaj nowy i w instrukcji napisano, że nie zalecane było od razu wklejać kod tylko postarać się wytłumaczyć problem. Sądziłem, że mam złe założenia co do napisania programu. Oto kod.

#include <iostream>

using namespace std;
void fszesnastkowy(int a);
void fjedenastkowy(int a);
int main()
{
    int t,a;
    cin>>t;
    if(t>=1 && t<=10000)
       {
           for(int i=0; i<=t; i++)
        {
            cin>>a;
            fszesnastkowy(a); cout<<" "; fjedenastkowy(a); cout<<endl;
        }
       }

    return 0;
}
void fszesnastkowy(int a)
{
    int modulo,calosci;
    int tablica[100];
    calosci=a;
    modulo=a%16;

    int i=0;

    for(;calosci>=16; i++)
      {
        if(modulo==0){tablica[i]=48;}
        if(modulo==1){tablica[i]=49;}
        if(modulo==2){tablica[i]=50;}
        if(modulo==3){tablica[i]=51;}
        if(modulo==4){tablica[i]=52;}
        if(modulo==5){tablica[i]=53;}
        if(modulo==6){tablica[i]=54;}
        if(modulo==7){tablica[i]=55;}
        if(modulo==8){tablica[i]=56;}
        if(modulo==9){tablica[i]=57;}
        if(modulo==10){tablica[i]=65;}
        if(modulo==11){tablica[i]=66;}
        if(modulo==12){tablica[i]=67;}
        if(modulo==13){tablica[i]=68;}
        if(modulo==14){tablica[i]=69;}
        if(modulo==15){tablica[i]=70;}

        calosci=calosci/16;
        modulo=calosci%16;
      }
        if(modulo==1){tablica[i]=49;}
        if(modulo==2){tablica[i]=50;}
        if(modulo==3){tablica[i]=51;}
        if(modulo==4){tablica[i]=52;}
        if(modulo==5){tablica[i]=53;}
        if(modulo==6){tablica[i]=54;}
        if(modulo==7){tablica[i]=55;}
        if(modulo==8){tablica[i]=56;}
        if(modulo==9){tablica[i]=57;}
        if(modulo==10){tablica[i]=65;}
        if(modulo==11){tablica[i]=66;}
        if(modulo==12){tablica[i]=67;}
        if(modulo==13){tablica[i]=68;}
        if(modulo==14){tablica[i]=69;}
        if(modulo==15){tablica[i]=70;}


        for(int k=i; k>=0; k--)
        {
            cout<<(char)tablica[k];
        }


}
void fjedenastkowy(int a)
{
    int modulo,calosci;
    int tablica[100];
    calosci=a;
    modulo=a%11;

    int i=0;

    for(;calosci>=11; i++)
      {
        if(modulo==0){tablica[i]=48;}
        if(modulo==1){tablica[i]=49;}
        if(modulo==2){tablica[i]=50;}
        if(modulo==3){tablica[i]=51;}
        if(modulo==4){tablica[i]=52;}
        if(modulo==5){tablica[i]=53;}
        if(modulo==6){tablica[i]=54;}
        if(modulo==7){tablica[i]=55;}
        if(modulo==8){tablica[i]=56;}
        if(modulo==9){tablica[i]=57;}
        if(modulo==10){tablica[i]=65;}

        calosci=calosci/11;
        modulo=calosci%11;
      }
        if(modulo==1){tablica[i]=49;}
        if(modulo==2){tablica[i]=50;}
        if(modulo==3){tablica[i]=51;}
        if(modulo==4){tablica[i]=52;}
        if(modulo==5){tablica[i]=53;}
        if(modulo==6){tablica[i]=54;}
        if(modulo==7){tablica[i]=55;}
        if(modulo==8){tablica[i]=56;}
        if(modulo==9){tablica[i]=57;}
        if(modulo==10){tablica[i]=65;}

        for(int k=i; k>=0; k--)
        {
            cout<<(char)tablica[k];
        }


}

 

komentarz 3 maja 2022 przez Paweł110 Nowicjusz (140 p.)
O nie! Dopiero zauważyłem. Przeglądałem i kombinowałem z tym kodem ze 20 razy i nie widziałem, że wykonuje pętle o 1 raz za dużo. Wybaczcie. Temat można skasować, gdyż nic nie wnosi.
komentarz 3 maja 2022 przez j23 Mędrzec (194,920 p.)
     if(modulo==0){tablica[i]=48;}
        if(modulo==1){tablica[i]=49;}
        if(modulo==2){tablica[i]=50;}
        if(modulo==3){tablica[i]=51;}
        if(modulo==4){tablica[i]=52;}
        if(modulo==5){tablica[i]=53;}
        if(modulo==6){tablica[i]=54;}
        if(modulo==7){tablica[i]=55;}
        if(modulo==8){tablica[i]=56;}
        if(modulo==9){tablica[i]=57;}
        if(modulo==10){tablica[i]=65;}

Mały hint poprawiający czytelność:

const char * symbols = "0123456789ABCDEF";
...

tablica[i] = symbols[modulo];

Mniej kodu, brak magicznych liczb. Prawda, że czytelniej?

komentarz 3 maja 2022 przez Paweł110 Nowicjusz (140 p.)
Genialny kod. Dziękuję. Nawet potrafiłem to zaimplementować, ale nie wiem czy do końca dobrze rozumiem.

const - jest bo jest ale nie wiem w jakim celu. Domyślam się, że jakieś określenie zmiennej na stałe? Proszę o wyjaśnienie

char*symbols- rozumiem, że deklarujesz dynamiczną tablicę znaków (która stricte nie jest dynamiczna przez "const" ?) - dlatego nie musisz deklarować rozmiaru tablicy?

tablica[i]=symbols[modulo] polega na przypisaniu do tablicy znaków wymienionych wyżej w dynamicznej tablicy char'ów/ Modulo w kwadratach wstawia wynik działania ze zmiennej modulo przez co 16 pozycji w tablica[] jest z automatu uzupełniona.

Generalnie domyślam się jak to działa (jeżeli mój tok myślenia przedstawiony wyżej jest prawidłowy) i na tym etapie nie skonstruowałbym takiej formuły. Zbyt wczesnie;)
komentarz 3 maja 2022 przez Oscar Nałogowiec (29,290 p.)

Akurat tą tablice chyba lepiej jest zadeklarować tak:

static const char symbols[] = "0123456789ABCDEF";

 

komentarz 3 maja 2022 przez j23 Mędrzec (194,920 p.)

@Paweł110, 

const - jest bo jest ale nie wiem w jakim celu.

W celu takim, że przypisywany jest wskaźnikowi adres na literał tekstowy, który jest tylko do odczytu, więc musi być const.

char*symbols- rozumiem, że deklarujesz dynamiczną tablicę znaków

symbols nie jest tablicą, tylko wskaźnikiem. Jak wspomniałem, przypisywany jest mu adres literału, który można potraktować jak tablicę z napisem. W przypadku wskaźników także można używać operatora indeksowania [].

ablica[i]=symbols[modulo] polega na przypisaniu do tablicy znaków wymienionych wyżej w dynamicznej tablicy char'ów

Tak.


Akurat tą tablice chyba lepiej jest zadeklarować tak:

jw. to nie jest tablica ;)

komentarz 3 maja 2022 przez Paweł110 Nowicjusz (140 p.)
Dziękuję za wyjaśnienie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 817 wizyt
0 głosów
2 odpowiedzi 370 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez Piotrek1122 Nowicjusz (140 p.)
+1 głos
1 odpowiedź 468 wizyt

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...