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