Mnożenie liczb rzymskich

0

Witam, jestem początkującym programistą. Na zajęcia mam przygotować program, który będzie mnożył liczby rzymskie. Domyślam się że trzeba go "złożyć" z trzech funkcji: Zmiana rzymskiej na arabską, mnożenie i zmiana arabskiej na rzymską. O ile z dwiema ostatnimi funkcjami nie mam problemu, to ze zmianą liczby rzymskiej na arabską wychodzi mi do pewnego momentu. Dokładniej do czwartego miejsca w tablicy t[4] wychodzi mi puste pole i nie wiem dlaczego. Program do czterech znaków działa poprawnie, a gdy znaków jest więcej nie uwzględnia ich. Czy moglibyście mi powiedzieć, gdzie leży problem ?

#include <stdio.h>
#include <stdlib.h>
char t[];
int i,w,b,p;/*b-biezaca, p-poprzednia,w-wynik*/
int main()
{   scanf("%s",t);
    i=0;
    w=0;
    while((t[i])!='\0') /*zliczanie znaków w tablicy*/
    i+=1;
    printf("%d\n",i);
    while (i>=0) /* branie każdej litery od prawej i zamiana jej na składnik sumy*/
    {
    if(t[i]=='\0')
    p=1;
    else if(t[i]=='i')
    b=1;
    else if(t[i]=='v')
    b=5;
    else if(t[i]=='x')
    b=10;
    else if(t[i]=='l')
    b=50;
    else if(t[i]=='c')
    b=100;
    else if(t[i]=='d')
    b=500;  
    else if(t[i]=='m')
    b=1000;
    else 
    printf("Nieprawidlowy znak");
    if(b>=p)
    w=w+b;
    else
    w=w-b;
    p=b;
    i-=1;
    }
    printf("%d\n",w);

    return 0;
} 
1
  1. Twój błąd polega na tym że masz tabicę 0 elementową a wpisujesz tam coś. Nie możesz w C utworzyć tablicy na "dowolną ilość elementów" a tobie się chyba wydaje że jak zrobisz tablicę bez podawania rozmiaru to tak będzie. Nie, nie będzie tak. Tablica będzie miała 0 elementów a ty w tej chwili wychodzisz poza jej zakres. Czemu to czasem działa? Bo C/C++ takich rzeczy nie sprawdza bo zakłada że programista rozumie co robi...
  2.     while((t[i])!='\0') /*zliczanie znaków w tablicy*/
        i+=1;

    a strlen() to ci ukradli?

0

No dzięki :) Wszystko działa. Załączam poprawiony kod, może się komuś przyda.

#include <stdio.h>
#include <stdlib.h>
char t[30];
int i,w,b,p;/*b-biezaca, p-poprzednia,w-wynik*/
int main()
{   scanf("%s",t);
    i=0;
    w=0;
    i=strlen(t);/*zliczanie znaków w tablicy*/
    while (i>=0) /* branie każdej litery od prawej i zamiana jej na składnik sumy*/
    {
    if(t[i]=='\0')
    p=1;
    else if(t[i]=='i')
    b=1;
    else if(t[i]=='v')
    b=5;
    else if(t[i]=='x')
    b=10;
    else if(t[i]=='l')
    b=50;
    else if(t[i]=='c')
    b=100;
    else if(t[i]=='d')
    b=500;  
    else if(t[i]=='m')
    b=1000;
    else 
    printf("Nieprawidlowy znak");
    if(b>=p)
    w=w+b;
    else
    w=w-b;
    p=b;
    i-=1;
    }
    printf("%d\n",w);

    return 0;
} 

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