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?

- Rejestracja:ponad 11 lat
- Ostatnio:około godziny
- Lokalizacja:Kraków
- Postów:1694
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ć.
- Rejestracja:ponad 8 lat
- Ostatnio:około 8 lat
- Postów:9
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 int
em skoro musisz zwrócić char *
?
- Rejestracja:ponad 8 lat
- Ostatnio:około 8 lat
- Postów:9
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.
konwersja
.