Kalkulator (rzymski) - problem z 0

Odpowiedz Nowy wątek
2016-12-27 19:35
0

Mam napisany program na kalkulator liczb rzymskich, wszystko ładnie hula, tylko jest problem, ponieważ wiadomo, że przez 0 nie dzielimy i w związku z tym przy zamianie z arabskich na rzymskie jest if (b != 0)... i przez to w dodawaniu, odejmowaniu, mnożeniu i dzieleniu, gdy b, czyli ta druga liczba jest równa 0 w ogóle nie wyświetla mi się wynik rzymski, czyli, gdy wpiszę np. 6+0 to wyświetli mi się działanie tylko w arabskich. Czy ktoś może pomóc i powiedzieć co gdzie dopisać, żeby wszystko ładnie chodziło?

edytowany 1x, ostatnio: konrad00, 2017-01-16 17:07
strasznie przekombinowana ta funkcja konwersja. - Azarien 2016-12-27 21:04

Pozostało 580 znaków

2016-12-27 20:30
0

W konwersja zmień pierwszego ifa, tak żeby nie zwracał nulla gdy liczba == 0 i zrób tak, żeby w takim przypadku (liczba == 0) zwracało Ci co tam chcesz. Dodatkowo w main zmień if(b != 0) na if(!(b == 0 && znak == '/')). Wtedy powinno działać.

Pozostało 580 znaków

2016-12-27 22:02
0

Poprawiłem i bez zmian :(



#include <stdio.h>
#include <stdlib.h>

char *konwersja (char *result,int liczba);

int main()
{
    int a, b, wynik;
    char znak;
    char rzymskie[50];

    printf("------  KALKULATOR LICZB RZYSMKICH  ------\n\n");
    printf("Podaj rownanie: ");
    scanf("%d %c %d", &a, &znak, &b);
    printf("\n");
    printf("W zapisie arabskim: \n");
    if(znak == '+')
    {
        wynik = a + b;
        printf("%d + %d = %d", a, b, wynik);
    }
    if(znak == '-')
    {
        wynik = a - b;
        printf("%d - %d = %d", a, b, wynik);
    }
    if(znak == '*')
    {
        wynik = a * b;
        printf("%d * %d = %d", a, b, wynik);
    }
    if(znak == '/')
    {
        if(b == 0 || a%b != 0)
        {
            printf("Nie mozna wykonac dzialania !");

        }
        else
        {
            wynik = a / b;
            printf("%d / %d = %d", a, b, wynik);
        }
    }
    printf("\n\n");

    if(!(b == 0 && znak == '/'))
    {
        printf("W zapisie rzymskim: \n");
        printf("%s ", konwersja(rzymskie, a));
        printf("%c ", znak);
        printf("%s ", konwersja(rzymskie, b));
        printf("= ");
        printf("%s", konwersja(rzymskie, wynik));

        printf("\n\n");
    }

    getch();
    return 0;
}

char *konwersja (char *cyfra, int liczba)
{
    #define  N 7
    int i = 0, j = 0;
    unsigned int arabskie[N] = {1000, 500, 100, 50, 10, 5, 1};
    char rzymskie[N] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};

    if((liczba > 3999) || (liczba < 0)) return NULL;
    if (liczba == 0) return wynik;

    while((liczba) && (i < N))
        {
              if(liczba >= arabskie[i])
              {
                  liczba -= arabskie[i];
                  cyfra[j++] = rzymskie[i];
              }
              else if ((i%2 == 0) && (i < N-2) && (liczba >= arabskie[i] - arabskie[i+2])
                       && (arabskie[i+2] != arabskie[i] - arabskie[i+2]))
              {
                  liczba -= arabskie[i] - arabskie[i+2];
                  cyfra[j++] = rzymskie[i+2];
                  cyfra[j++] = rzymskie[i];
                  i++;
              }
              else if ((i%2 == 1) && (i < N-1) && (liczba >= arabskie[i] - arabskie[i+1])
                       && (arabskie[i+1] != arabskie[i] - arabskie[i+1]))
              {
                  liczba -= arabskie[i] - arabskie[i+1];
                  cyfra[j++] = rzymskie[i+1];
                  cyfra[j++] = rzymskie[i];
                  i++;
              }
              else
              {
                  i++;
              }
        }

        cyfra[j++] = 0;
        return cyfra;
}
Przecież teraz się nawet nie kompiluje. Co Ci przyszło do głowy zwracać wynik który jest intem skoro musisz zwrócić char *? - szweszwe 2016-12-27 22:20

Pozostało 580 znaków

2016-12-27 22:40
0

Kurczę, prawie wszystko gra, tylko teraz jest tak, że jak np. piszę: 10 + 0, to w rzymskich jest: X + X = X. Tak blisko :)



#include <stdio.h>
#include <stdlib.h>

char *konwersja (char *result,int liczba);

int main()
{
    int a, b, wynik;
    char znak;
    char rzymskie[50];

    printf("------  KALKULATOR LICZB RZYSMKICH  ------\n\n");
    printf("Podaj rownanie: ");
    scanf("%d %c %d", &a, &znak, &b);
    printf("\n");
    printf("W zapisie arabskim: \n");
    if(znak == '+')
    {
        wynik = a + b;
        printf("%d + %d = %d", a, b, wynik);
    }
    if(znak == '-')
    {
        wynik = a - b;
        printf("%d - %d = %d", a, b, wynik);
    }
    if(znak == '*')
    {
        wynik = a * b;
        printf("%d * %d = %d", a, b, wynik);
    }
    if(znak == '/')
    {
        if(b == 0 || a%b != 0)
        {
            printf("Nie mozna wykonac dzialania !");

        }
        else
        {
            wynik = a / b;
            printf("%d / %d = %d", a, b, wynik);
        }
    }
    printf("\n\n");

    if(!(b != 0 && znak == '/'))
    {
        printf("W zapisie rzymskim: \n");
        printf("%s ", konwersja(rzymskie, a));
        printf("%c ", znak);
        printf("%s ", konwersja(rzymskie, b));
        printf("= ");
        printf("%s", konwersja(rzymskie, wynik));

        printf("\n\n");
    }

    getch();
    return 0;
}

char *konwersja (char *cyfra, int liczba)
{
    #define  N 7
    int i = 0, j = 0;
    unsigned int arabskie[N] = {1000, 500, 100, 50, 10, 5, 1};
    char rzymskie[N] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};

    if((liczba > 3999) || (liczba < 0)) return NULL;
    if (liczba == 0) return cyfra;

    while((liczba) && (i < N))
        {
              if(liczba >= arabskie[i])
              {
                  liczba -= arabskie[i];
                  cyfra[j++] = rzymskie[i];
              }
              else if ((i%2 == 0) && (i < N-2) && (liczba >= arabskie[i] - arabskie[i+2])
                       && (arabskie[i+2] != arabskie[i] - arabskie[i+2]))
              {
                  liczba -= arabskie[i] - arabskie[i+2];
                  cyfra[j++] = rzymskie[i+2];
                  cyfra[j++] = rzymskie[i];
                  i++;
              }
              else if ((i%2 == 1) && (i < N-1) && (liczba >= arabskie[i] - arabskie[i+1])
                       && (arabskie[i+1] != arabskie[i] - arabskie[i+1]))
              {
                  liczba -= arabskie[i] - arabskie[i+1];
                  cyfra[j++] = rzymskie[i+1];
                  cyfra[j++] = rzymskie[i];
                  i++;
              }
              else
              {
                  i++;
              }
        }

        cyfra[j++] = 0;
        return cyfra;
}
To albo dodaj nowy znak dla zera, chociaż rzymianie nie mieli zera, albo wpisz że działanie nie jest poprawne etc jeśli ktoś te zero poda. - czaffik 2016-12-28 22:11

Pozostało 580 znaków

2016-12-27 23:05
0

To weź tam zamiast cyfra zwróć 0 (znak).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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