function IntToRoman(num: Cardinal): String; {returns num in capital roman digits}
const
Nvals = 13; // константа
{константные массивы}
vals: array [1..Nvals] of word = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
roms: array [1..Nvals] of string[2] = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
Var
b: 1..Nvals; // раннжированая переменая
begin
Result:=''; // результат пустой
b := Nvals; // установим максимальный размер переменой b
While num > 0 do // пока num больше 0 продолжаем в цикле
begin
while vals > num do dec(b); //пока элементы массива больше num уменьшаем b
dec (num, vals); // уменьшим num на елемент массива vals c индексом b
result := result + roms; // допишем строку результата
end;
end;
Перевод арабских цифр в римские /C++/
Задание такое: Написать программу, переводящую число, записанное арабскими цифрами в число, записанное римскими цифрами. В соответствии со следующим: I это 1, V – 5, X – 10, L – 50, M – 1000.
Заранее благодарен!
Есть готовое решение, но на паскале. Дать?
спасибо уже имеется, тока оно мне похоже не пригодится, сначала думал какнить переведу в С++, а глянул и понял - увы...
а реально вообще с одного языка в другой код перевести?
Цитата:
а реально вообще с одного языка в другой код перевести?
С Delphi на С++ реально, а вот наоборот - всё зависит от сложности исходного текста программы С++...
Алгоритм на Delphi:
Код:
И алгоритм на С:
Код:
// written by Ste Cork, free for any and all use.
//
const char *Number_AsRomanString) int iNumber :
|
struct RomanDigit_t
|
char *m_psString;
int m_iValue;
";
static const RomanDigit_t RomanDigits[(=
|
|"M", 1000",
|"CM", 900",
|"D", 500",
|"CD", 400",
|"C", 100",
|"XC", 90",
|"L", 50",
|"XL", 40",
|"X", 10",
|"IX", 9",
|"V", 5",
|"IV", 4",
|"I", 1",
";
// Strictly speaking, Roman digits can't display something
// such as 4999 without using overlaid bars and so forth,
// but for now this is a quick-and-dirty piece of code that'll
// just keep using M's...
//
static char sRomanString[20(;
sRomanString[0( = '\0';
for )int i=0; iNumber && i<sizeof)RomanDigits:/
sizeof)RomanDigits[0(:; i++:
|
while ) RomanDigits[i(.m_iValue <= iNumber :
|
strcat) sRomanString, RomanDigits[i(.m_psString :;
iNumber -= RomanDigits[i(.m_iValue;
"
"
return sRomanString;
"
//
const char *Number_AsRomanString) int iNumber :
|
struct RomanDigit_t
|
char *m_psString;
int m_iValue;
";
static const RomanDigit_t RomanDigits[(=
|
|"M", 1000",
|"CM", 900",
|"D", 500",
|"CD", 400",
|"C", 100",
|"XC", 90",
|"L", 50",
|"XL", 40",
|"X", 10",
|"IX", 9",
|"V", 5",
|"IV", 4",
|"I", 1",
";
// Strictly speaking, Roman digits can't display something
// such as 4999 without using overlaid bars and so forth,
// but for now this is a quick-and-dirty piece of code that'll
// just keep using M's...
//
static char sRomanString[20(;
sRomanString[0( = '\0';
for )int i=0; iNumber && i<sizeof)RomanDigits:/
sizeof)RomanDigits[0(:; i++:
|
while ) RomanDigits[i(.m_iValue <= iNumber :
|
strcat) sRomanString, RomanDigits[i(.m_psString :;
iNumber -= RomanDigits[i(.m_iValue;
"
"
return sRomanString;
"
Обидно...
Вот он оказываеца какой текст нужной мне проги! Внёс небольшие поправки в цвет текста и немного помелочи! Мож кому тоже понадобится! Пользуйтесь!!!
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *a2roman (int value, char *c1, char *c2, char *c3);
int main (void)
{
int arabicalNumeral = 1;
int result;
char roman[15] = "";
do
{
clrscr();
textcolor(GREEN);
cprintf("..::Programma dlya preobrazovaniyz arabskih chisel v rimskie::..");
cprintf("\n\r================================================================");
textcolor(RED);
cprintf("\n\n\rVvedite chislo ot 1 do 3000: ");
scanf ("%d", &arabicalNumeral);
}
while ((arabicalNumeral < 1) || (arabicalNumeral > 3000));
if ((arabicalNumeral <= 3000) && (arabicalNumeral >= 1000))
{
result = arabicalNumeral / 1000;
strcat (roman, a2roman(result, "M", " ", " "));
arabicalNumeral -= (result * 1000);
}
if ((arabicalNumeral < 1000) && (arabicalNumeral >= 100))
{
result = arabicalNumeral / 100;
strcat (roman, a2roman(result, "C", "D", "M"));
arabicalNumeral -= (result * 100);
}
if ((arabicalNumeral < 100) && (arabicalNumeral >= 10))
{
result = arabicalNumeral / 10;
strcat (roman, a2roman(result, "X", "L", "C"));
arabicalNumeral -= (result * 10);
}
if ((arabicalNumeral < 10) && (arabicalNumeral >= 1))
{
strcat (roman, a2roman(arabicalNumeral, "I", "V", "X"));
}
textcolor(LIGHTBLUE);
cprintf("Eto chiclo v rimskom napisanii: %s\n\n", roman);
textcolor(YELLOW);
cprintf("\n\r ...Press any key to exit... ");
getch();
return 0;
}
#include <conio.h>
#include <string.h>
char *a2roman (int value, char *c1, char *c2, char *c3);
int main (void)
{
int arabicalNumeral = 1;
int result;
char roman[15] = "";
do
{
clrscr();
textcolor(GREEN);
cprintf("..::Programma dlya preobrazovaniyz arabskih chisel v rimskie::..");
cprintf("\n\r================================================================");
textcolor(RED);
cprintf("\n\n\rVvedite chislo ot 1 do 3000: ");
scanf ("%d", &arabicalNumeral);
}
while ((arabicalNumeral < 1) || (arabicalNumeral > 3000));
if ((arabicalNumeral <= 3000) && (arabicalNumeral >= 1000))
{
result = arabicalNumeral / 1000;
strcat (roman, a2roman(result, "M", " ", " "));
arabicalNumeral -= (result * 1000);
}
if ((arabicalNumeral < 1000) && (arabicalNumeral >= 100))
{
result = arabicalNumeral / 100;
strcat (roman, a2roman(result, "C", "D", "M"));
arabicalNumeral -= (result * 100);
}
if ((arabicalNumeral < 100) && (arabicalNumeral >= 10))
{
result = arabicalNumeral / 10;
strcat (roman, a2roman(result, "X", "L", "C"));
arabicalNumeral -= (result * 10);
}
if ((arabicalNumeral < 10) && (arabicalNumeral >= 1))
{
strcat (roman, a2roman(arabicalNumeral, "I", "V", "X"));
}
textcolor(LIGHTBLUE);
cprintf("Eto chiclo v rimskom napisanii: %s\n\n", roman);
textcolor(YELLOW);
cprintf("\n\r ...Press any key to exit... ");
getch();
return 0;
}
Тестил в досовском Borland C++ v3.2. Компилируется, линкуется, короче работает!
Пользуйтесь на здоровье!
есть острая необходимость решения этой же задачи только в visual basic (n <= 3999).
заранее благодарю. ооочень надо:)
Цитата: Ks0RkSs
Мож кому тоже понадобится! Пользуйтесь!!!
Спасибо, барин. Уважил. До 7-ой строки в Google не добрался?
Код:
#include <stdio.h>
#include <stdlib.h>
#define NUMS 13
[COLOR="Blue"]char* to_roman( unsigned int num, char* buff )
{
int p = NUMS;
unsigned int a_num[NUMS] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
char* r_str[NUMS] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
*buff = '\0';
while (p--)
while (num >= a_num)
{
num -= a_num;
strcat( buff, r_str );
}
return buff;
}[/COLOR]
int main( void )
{
char* roman;
unsigned int arabian = 3451;
roman = (char*)malloc(256);
printf( "%i: %s\n", arabian, to_roman( arabian, roman ));
free( roman );
return 0;
}
#include <stdlib.h>
#define NUMS 13
[COLOR="Blue"]char* to_roman( unsigned int num, char* buff )
{
int p = NUMS;
unsigned int a_num[NUMS] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
char* r_str[NUMS] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
*buff = '\0';
while (p--)
while (num >= a_num)
{
num -= a_num;
strcat( buff, r_str );
}
return buff;
}[/COLOR]
int main( void )
{
char* roman;
unsigned int arabian = 3451;
roman = (char*)malloc(256);
printf( "%i: %s\n", arabian, to_roman( arabian, roman ));
free( roman );
return 0;
}
char *a2roman (int value, char *c1, char *c2, char *c3);-что делать не подскажите?:confused::confused::confused:
Цитата: Twitty
Люди-у мненя эта прога на борланде 3.1 не идет-выдает ошибку в строке
char *a2roman (int value, char *c1, char *c2, char *c3);-что делать не подскажите?:confused::confused::confused:
char *a2roman (int value, char *c1, char *c2, char *c3);-что делать не подскажите?:confused::confused::confused:
А где ты, в том идиотском примере, видишь реализацию функции [FONT="Courier New"][SIZE="2"]a2roman[/SIZE][/FONT]?
Цитата: sherry
Ks0RkSs
Есть готовое решение, но на паскале. Дать?
Есть готовое решение, но на паскале. Дать?
а можете,пожалуйста дать,если конечно не сложно