Случайное добавление в переводчике римских цифр

Мне нужно преобразовать римские цифры в целые значения, порядок не имеет значения. (9=VIIII)

В настоящее время я начинаю получать коэффициент выдумки из своего кода, он начинается с 20 к тому времени, когда я реализовал X, и достигает 530 к тому времени, когда я достигаю М. Я не могу просто разложить его на части, пока я = 531 и V=535, MDCLXVI = 1560. Это и затмение иногда говорят, что он не может работать, а в других случаях он может.

Вот код

C int romanToInt(char *s) {
  int n, k=0;
  while(k<[MAX_LINE]) {
    if(s[k]==’I’) {
      n=n++
    }
    if(s[k]==’v’) {
      n=n+5
    }
    if(s[k]==’X’) {
      n=n+10
    }
    if(s[k]==’L’) {
      n=n+50
    }
    if(s[k]==’C’) {
      n=n+100
    }
    if(s[k]==’D’) {
      n=n+500
    }
    if(s[k]==’M’) {
      n=n+1000
    }
    return n;
  }

Спасибо за любую помощь.

2 ответа

Вы инициализируете свой счетчик циклов k, но не свой аккумулятор n. Инициализировать n=0; C предполагает, что вы знаете, что делаете, поэтому он не инициализирует ints автоматически, как это делают некоторые языки ООП. Итак, вы можете начать с мусора, который отбрасывает все ваши расчеты. второе: почему n=n++? либо пользователь n+=1 или n ++

Кроме того, цикл for, вероятно, будет лучше, чем цикл while, потому что он заставляет вас инициализировать переменную-счетчик (если вы этого еще не сделали) и установить ограничение на число итераций, так что вряд ли есть вероятность бесконечного цикла.

наконец, вместо всех этих ifs рассмотрим if/else if или select/case.

о, и я уверен, что это, вероятно, опечатка, но ваше возвращение должно быть после окончания цикла. Вы либо забыли добавить лишнюю скобку перед оператором return, либо я ошибся.

Здесь происходит несколько вещей.

int n, k=0;

Вы должны инициализировать обе переменные до 0. На данный момент вы только инициализируете k, n может содержать мусор.

while(k<[MAX_LINE]) ...

Этот синтаксис не должен компилироваться. Но даже если это так, это не то, что вы хотите. Я предполагаю что MAX_LINE максимальная длина буфера, которую вы используете в fgets или аналогичная функция. Но фактический ввод обычно меньше и содержит строку C, то есть символы, оканчивающиеся нулевым символом, '\0', Все после этого будет мусором. Your termination condition should therefore be while (s[k] != '´\0') ..., Because the value of the null character '\0' is zero, you can write this as while (s[k]) ...,

if(s[k]==’I’) {
  n=n++
}

This syntax for incrementing is not legal in C. (It is a common pitfall, because it will compile.) If you want to inctement n, use plain n++, Кроме того, вы можете использовать n = n + 1 или же n += 1,

if(s[k]==’v’) {
  n=n+5
}

Here, you have used the lower-case 'v', which is different from upper-case 'V',

return n;

You return unconditionally from within the loop, ie after the first iteration. Это не то, что вы хотите. Return the accumulated value after the loop.

Except that in your case, you'd have an infinite loop: Your position marker k никогда не меняется Вы должны увеличить k as last thing inside the loop. You could also rewrite your while как for and incrementb in the update section.

Итак, складывая все вместе:

int romanToInt(const char *s)
{
    int n = 0;
    int k = 0;

    while (s[k]) {
        if (s[k] == 'I') n++;
        if (s[k] == 'V') n = n + 5;
        if (s[k] == 'X') n = n + 10;
        if (s[k] == 'L') n = n + 50;
        if (s[k] == 'C') n = n + 100;
        if (s[k] == 'D') n = n + 500;
        if (s[k] == 'M') n = n + 1000;
        k++;
    }
    return n;
}

This will accumulate the roman numbers represented by upper-case letters (without doing the subtraction thing as in IV) and ignore everything else.

Другие вопросы по тегам