Римские числа из строки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Программа компилируется но не работает
/*
Дан текст из заглавных латинских букв, за которым следует
пробел.Определить является ли этот текст правильной записью
римскими цифрами целого числа от 1 до 999, и если является
напечатать число арабскими цифрами.
*/
 
#include<stdio.h>
#include<string.h>
int main(){
 
char* romcnst[7] = {"I","V","X","L","C","D","M"};
unsigned int arabcnst[7] = {1,5,10,50,100,500,1000};
int p=7;
char* inputRoman[40];
int Arabian=0;
int i;
int b[40];
 
printf("Vvedite RIMSKOE 4islo:\t");
scanf("%s",&inputRoman);
 
/*Рассматривает каждый символ и ставим ему в соответствие число*/
i=0;
p=7;
while(inputRoman!=NULL){
 
    if (inputRoman[i]==romcnst[p]){
        b[i]=arabcnst[p];
        i++;
    }
    
    else 
        p--;
}
 
/*Следущее правило для таких чисел как IV=4 IX=9 XL=40 XC=90 CD=400 CM=900*/
i=0;
while(b[i]!=' '){
 
    if(b[i]<b[i++]){
        
        b[i++]-=b[i];
        i++;/*Чтобы не учит. предыдущ.*/
    }
    
    Arabian+=b[i];
 
    i++;
}
 
printf("\nVashe 4islo:\t%d",Arabian);
 
getch();
return 0;
}

Решение задачи: «Римские числа из строки»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
    char rimc[]={'M','D','C','L','X','V','I','\0'};
    int arab[]={1000,500,100,50,10,5,1};
    int i, j, ch=0, l, p=0, k=0, b[20];
    char *rim;
    rim=(char*)malloc(20*sizeof(char));
    printf ("\nvvedite rimskoe chislo:\n");
    gets(rim);
    strupr(rim);
    for (i=0; i<strlen(rim); i++) b[i]=0;
    for (i=0; (i<strlen(rim) && p!=1); i++)
    {
        for (j=0; (j<strlen(rimc) && k!=1); j++)
        {
            l=strcmp(rim[i],rimc[j]);
            if (l==0)
            {
                b[i]=arab[j];
                k=1;
            }
        }
        if (b[i]==0)
        {
            printf ("ne verniy simvol\n");
            p=1;
            break;
        }
        k=0;
    }
    for (i=1; (i<strlen(rim) && p!=1); i++)
    {
        if (b[i]<=b[i-1]) ch+=b[i-1];
        else
        {
            ch+=b[i]-b[i-1];
            ++i;
        }
    }
    if (p!=1) printf ("rezul'tat: %s=%d\n", rim, ch);
    getch();
}

Объяснение кода листинга программы

В этом коде происходит перевод из римских чисел в арабские. Вот список действий, которые происходят в коде:

  1. Объявление и инициализация массивов:
    • rimc - массив символов, представляющих римские числа (M, D, C, L, X, V, I).
    • arab - массив целых чисел, представляющих арабские числа (1000, 500, 100, 50, 10, 5, 1).
    • b - массив, используемый для хранения промежуточных значений во время перевода.
    • rim - строка, в которую считывается римское число.
    • rim - указатель на строку, в которую будет записано арабское число.
  2. Получение римского числа от пользователя:
    • Вывод приглашения для ввода римского числа.
    • Считывание римского числа с помощью функции gets.
    • Преобразование римского числа в нижний регистр с помощью функции strupr.
  3. Проверка введенного значения и перевод в арабское число:
    • Проверка каждого символа в введенном значении.
    • Сравнение каждого символа с символами римского числа в массиве rimc.
    • Если символ равен, то присваивание соответствующего арабского числа в массив b.
    • Если символ не равен, то вывод сообщения об ошибке и завершение программы.
  4. Проверка и корректировка полученного арабского числа:
    • Проверка каждого символа в полученном арабском числе.
    • Если текущий символ больше предыдущего, то корректировка числа с помощью арабских цифр.
    • Если текущий символ меньше предыдущего, то корректировка числа с помощью арабских цифр.
  5. Вывод результата:
    • Если программа успешно выполнена, то вывод полученного арабского числа и закрытие программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.8 из 5
Похожие ответы