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

C++ - problem z podstawianiem liczb rzymskich

VPS Starter Arubacloud
0 głosów
1,914 wizyt
pytanie zadane 6 września 2016 w C i C++ przez Gambr Dyskutant (7,530 p.)
Cześć. Uczę sie C++ i jako jedno z ćwiczeń wymyśliłem sobie aplikację która działa jak kalkulator - mnoży, dzieli, dodaje, odejmuje, wyciąga określony pierwiastek i podnosi do danej potęgi. Następnie przedstawiony wynik ma zapisać w postaci liczb rzymskich. W tym ostatnim zadaniu tkwi problem. Powiedzmy ze wynik danego działania nazwiemy " z". Czy do kazdej liczby od 1 do 1000 (bo tyle ich jest w systemie rzymskim) musze budować ifa If(z==1) Cout
komentarz 6 września 2016 przez MichałGNU Gaduła (4,330 p.)
"Na odległość" ciężko pomóc. Możesz pokazać source code?
2
komentarz 6 września 2016 przez QizmoPL Stary wyjadacz (11,440 p.)
Czytelność kodu na najwyższym poziomie

2 odpowiedzi

0 głosów
odpowiedź 6 września 2016 przez niezalogowany
Możesz w ifach umieścić odpowiednie instrukcje i wtedy ograniczysz budowę ifów do najważniejszych przypadków np I,V, X, L i przy dodać IX czy IV czy XL (bo w rzymskim zapisie nigdy nie wystąpią cztery takie same znaki np XXXX). Będziesz miał wtedy coś koło 10 ifów jeżeli mamy do czynienia z liczbami do 1000.
0 głosów
odpowiedź 6 września 2016 przez Benek Szeryf (90,690 p.)
edycja 6 września 2016 przez Benek

Czy do kazdej liczby od 1 do 1000 (bo tyle ich jest w systemie rzymskim) musze budować ifa If(z==1) Cout

Nie, nie musisz. Najprościej sobie rozpisać algorytm konwersji liczb z systemu dziesiętnego na rzymski. To wbrew pozorom nie jest takie trudne, ponieważ tworzenie liczb w systemie rzymskim podlega prostym regułom. Weźmy na przykład liczby od 1 do 10. Będą to odpowiednio: I, II, III, IV, V, VI, VII, VIII, IX, X. Teraz pomyśl o dwóch tablicach

int dec[5] = {1,4,5,9,10};
string rom[5] = {"I","IV","V","IX","X"};

oraz dodawaniu i konkatenacji, by zbudować dowolną liczbę od 1 do 10.

P.S.

Kiedyś napisałem w Pythonie program zmieniający zapis dziesiętny liczby na notację rzymską. Można spróbować zaimplementować ten algorytm w C++:

rzym = {1000:"M", 900:"CM", 500:"D", 400:"CD", 100:"C", 90:"XC", 50:"L", 40:"XL", 10:"X", 9:"IX", 5:"V", 4:"IV", 1:"I"}
x = input("Podaj liczbe calkowita: ")
print "Liczba",`x`,"w notacji rzymskiej to:",
r = rzym.keys()
r.sort()
r.reverse()
lr = ""
for i in r:
	while i <= x:
		lr += rzym[i]
		x -= i
print lr

W takim przypadku zamiast słownika można skorzystać z indeksu do tablic. Na przykład dla powyższych tablic indeks 2 odnosi się do 5 oraz V, które są tożsame.

komentarz 6 września 2016 przez Gambr Dyskutant (7,530 p.)
Hm z tych tablic to muszę sie dokształcić. Czy jakbym wkleił kod źródłowy to pokażesz mniej więcej co jak i gdzie umieścić ? PS. implementacja tego algorytmu nie przynosi oczekiwanych efektów.
komentarz 6 września 2016 przez Gambr Dyskutant (7,530 p.)
#include #include #include #include using namespace std; double podst,wyk; float x,y; int wybor; int main() { cout << "Witaj uzytkowniku!" <<endl; cout <<"1.Mnozenie" <<endl; cout <<"2.Dzielenie"<<endl; cout <<"3.Odejmowanie"<<endl; cout <<"4.Dodawanie"<<endl; cout <<"5.Potegowanie"<<endl; cout <<"================"<<endl; cout << "Wybierz rodzaj dzialania:"; cin >>wybor; switch(wybor) { case 1: { system("cls"); cout <<"Podaj liczbe : "; cin >>x; cout << "Podaj druga liczbe:"; cin >>y; cout<<"Iloczyn = " <<x*y; } break; case 2: { system("cls"); if (y==0) cout <<"Nie dzielimy przez 0 xddd"; else cout<<"Iloraz = " <<x/y; } break; case 3: { system("cls"); cout <<"Podaj liczbe : "; cin >>x; cout << "Podaj druga liczbe:"; cin >>y; cout<<"Roznica = " <<x-y; } break; case 4: { system("cls"); cout <<"Podaj liczbe : "; cin >>x; cout << "Podaj druga liczbe:"; cin >>y; cout <<"Suma = " <<x+y; } break; case 5: { system("cls"); cout <<"Podaj podstawe"; cin >>podst; cout <<"Podaj wykladnik"; cin>>wyk; x=pow(podst,wyk); cout << setprecision(20); cout <<"Potega = "; cout<<x; } break; system("cls"); default:"Nie ma takiej opcji w menu!"; } return 0; } Kod wygląda tak, oczywiście nie jest taki "ściśnięty" jak po wklejeniu do komentarza
komentarz 6 września 2016 przez Benek Szeryf (90,690 p.)

Twój kod jest dla mnie nieczytelny, kody umieszcza się w specjalnie do tego przeznaczonych znacznikach. Natomiast przepisałem ten program z Pythona na C++ i działa. Zastosowałem dokładnie ten algorytm, który przedstawiłem powyżej, tylko słownik zastąpiłem dwiema tablicami. Spróbuj to przepisać zamieniając słownik na dwie tablice:

const int N = 13;
string rom[N] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int dec[N] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};

Tutaj akurat zastosowałem obiekty klasy string, by łatwiej było je łączyć za pomocą przeciążonego operatora +. W C++ również znajdziesz pętle for () oraz while (). Chętnie dałbym Ci mój kod, ale większą satysfakcję będziesz miał z samodzielnego rozwiązania tego problemu.

komentarz 6 września 2016 przez Gambr Dyskutant (7,530 p.)
Poddaje się, nie wiem jak to zrobić
komentarz 6 września 2016 przez Benek Szeryf (90,690 p.)

Masz tutaj autonomiczny kod, który wykonuje konwersję:

#include <iostream>
#include <string.h>

using namespace std;
const int N = 13;

int main()
{
        string rom[N] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        int dec[N] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
        int x;
        string lr = "";

        cout << "Podaj dowolna liczbe: " << endl;
        cin >> x;

        for (int i = 0; i < N; i++)
                while (dec[i] <= x)
                {
                        lr += rom[i];
                        x -= dec[i];
                }

        cout << "W notacji rzymskiej to: " << lr << endl;
 return 0;
}

Chociaż go sobie przeanalizuj na spokojnie, by zrozumieć co się tam dzieje.

Podobne pytania

0 głosów
0 odpowiedzi 606 wizyt
pytanie zadane 6 maja 2021 w C i C++ przez Holdapia Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 506 wizyt
+1 głos
1 odpowiedź 161 wizyt
pytanie zadane 10 stycznia 2021 w C i C++ przez rolniczy Nowicjusz (210 p.)

92,452 zapytań

141,262 odpowiedzi

319,078 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...