2014-11-13 4 views
0

Я просто задавался вопросом, есть ли способ прочитать массив, а затем на основе введенных букв сделать что-то?Как читать массив и анализировать ввод

Как например: если римская цифра; MM был введен, есть ли способ увидеть, что 2 M были введены и отображать значение для M?

мощность будет: 1000 + 1000.

Не могли бы вы просто указать мне имя функции, потому что для назначения я не хочу, чтобы кто-то это делал для меня, я просто не знаю, с чего начать.

пример: char romanNumerals[2] = {"MMMCMXCVIII"};

ответ

0
char romanNumerals[2] = {"MMMCMXCVIII"}; 

не прав, как это может иметь место только 1 элемент (+1 для \0). Измените его на

char romanNumerals[] = "MMMCMXCVIII"; 

Компилятор выберет правильный размер массива при выполнении вышеуказанной инициализации.

Затем вам понадобится переменная, чтобы добавить сумму каждого римского номера. Итак, создайте

int sum=0; 

И вам нужно закоротить длину массива, как вы хотите проверить каждую букву.

int i,len=strlen(romanNumerals); 
for(i = 0;i < len;i++) 
{ 
//body of for loop 
} 

string.h должен быть включен для того, чтобы использовать strlen функции, которая возвращает длину строки.

Теперь, проверьте каждую букву внутри тела цикла for с использованием

if(romanNumerals[i]=='M') 
    sum=sum+1000; 
else if(romanNumerals[i]=='C') 
    sum=sum+/*the corresponding value*/; 
else if(...) 
    sum=sum+/*value*/; 
//etc etc 

И затем наконец, печать sum.

+0

Никогда не вызывайте strlen изнутри условия цикла, особенно не при обучении новичков. – Lundin

+0

Я отредактировал это. Все, что делает это, снижает эффективность программы? –

+0

yah Я работал над этим в классе, и я понял это, поэтому мне пришлось создать отдельную функцию, в значительной степени то, что вы просто объясняете. тело функции: для (а = 0; s [а] = '\ 0', А ++) { \t \t если (s [а] == 'M') { \t \t \t результат + = 1000; \t \t} и я просто делаю это для каждой римской цифры. –

0

Лучше всего использовать функцию scanf из stdio.h.

char str[3]; 
scanf("%s", str); 

будет хранить до двух символов из стандартного ввода и нулевой терминатор (\0) в char массив, на который указывает str.

+0

Nope. Вам нужно место для '\ 0' в конце. –

+0

Совершенно верно, ошибка новобранец! – Oli

0

Все остальные ответы верны, но имейте в виду, что если вы просто суммируете входные буквы с поиском (M = 1000, C = 100, X = 10, V = 5, I = 1), имея «MMMCMXCVIII «будет означать 3000 + 100 + 1000 + 10 + 100 + 5 + 3 = 4218, и это не то, что означает« MMMCMXCVIII »в римских цифрах (это на самом деле означает 3998).

0

По причинам, указанным в ссылке, предоставленной NSimon (см. 1-й комментарий) scanf() не самый лучший вариант, когда длина строки ввода неизвестна.

Другие варианты: fgets() и getline(). Следует помнить, что правильно сформированная строка заканчивается нулевым символом - обычно записывается «\ 0». Следовательно, если все остальное терпит неудачу, вы всегда можете прочитать char для char, используя функцию fgetc(), в каком-то цикле и остановитесь, когда ваш буфер заполнен или найден «\ 0».

Так много для чтения массива. Когда дело доходит до оценки римских цифр, наилучшим подходом является начало на спине. Римские цифры имеют (niot совсем так просто) упорядоченность:

I < V < X < L < C < D < M

Чтение назад вы должны следовать некоторые прямые правила вперед:

  • Наименее значимый пакет всегда является последним (т. Е. IXL ошибочен, он должен быть LIX = 59)
  • Если X или V предшествует I, тогда отстраните 1, иначе добавьте значение.
  • Если L или C предшествует X, то вычтите 10, иначе добавьте значение.
  • Если D или M предшествует C, то вычтите 100, иначе добавьте значение.

Обратите внимание, что М & D может быть только когда-либо предшествует C или M. L & C может быть предваряется только X или X C. & V может быть предваряется только I или X. Все остальное указывает на неправильный формат номер.

Таким образом, работая со спины, должно быть достаточно легко получить правильное значение.

Смежные вопросы