Важная информация
Показано с 1 по 8 из 8

Тема: Перевод чисел

  1. #1 Перевод чисел 
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Перевод чисел из римских в десятичную систему

    Есть код на delphi как сделать в qbasic?


    Код :
    var
    a:array[1..13]of string;
    b:array[1..13]of integer;
    i,k,n:integer;
    st,chislo:string;
    begin
    st:='MCMDCDCXCLXLXIXVIVI';
    for i:=1 to 13 do
    begin
    if i mod 2<>0 then k:=1 else k:=2;
    a[i]:=copy(st,1,k);
    delete(st,1,k);
    case i of
     1:b[i]:=1000;
     2:b[i]:=900;
     3:b[i]:=500;
     4:b[i]:=400;
     5:b[i]:=100;
     6:b[i]:=90;
     7:b[i]:=50;
     8:b[i]:=40;
     9:b[i]:=10;
     10:b[i]:=9;
     11:b[i]:=5;
     12:b[i]:=4;
     13:b[i]:=1;
    end;
    end;
    writeln('Arabskoe chislo=');
    readln(n);
    i:=0;
    repeat
    inc(i);
    while(n>=b[i]) do
    begin
    n:=n-b[i];
    chislo:=chislo+a[i];
    end;
    until n=0;
    writeln('Rimskoe chislo=',chislo);
    end.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,531
    Сказал(а) спасибо
    126
    Поблагодарили 428 раз(а) в 291 сообщениях
    Записей в блоге
    6
    Тот код - из арабской в риискую. Вот из римской в арабскую.
    Код qbasic:
    CLS
    INPUT "Введите римское число", a$
    d = 0
    FOR i = 1 TO LEN(a$)
    e$ = MID$(a$, i, 1)
    IF e$ = "I" THEN d = d + 1
    IF e$ = "V" THEN d = d + 5
    IF e$ = "X" THEN d = d + 10
    IF e$ = "L" THEN d = d + 50
    IF e$ = "С" THEN d = d + 100
    IF e$ = "M" THEN d = d + 500
    IF e$ = "D" THEN d = d + 1000
    NEXT i
    PRINT "Арабское число"; d
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  3. #3  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Перевод римских чисел в арабские не совсем верен, так например число IV и VI, в этой программе, переводится как 6, на самом деле, в римских цифрах, если меньшее число стоит перед большим то оно вычитается а не прибавляется (порядок следования цифр у римлян слева направо)
    Ответить с цитированием  
     

  4. #4  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Алгоритм понял, незнаю как организовать.
    1.Надо записать все переведенные числа из римских в арабские в одномерный массив по порядку.
    2 Потом методом сравнения каждого последущего числа вычитать или прибавлять значение к нулевой переменной

    Например
    a=0
    Ввели VCI
    Массив 5 ,100 ,1
    Получается 5< 100 then a=a-5
    100>1 then a=a+100
    1>0 then a=a+1
    арабское число 96

    Извините за мои кракозябры
    Ответить с цитированием  
     

  5. #5  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Код :
    CLS
    DIM d(15)
    DO WHILE F =0
    F=1
    INPUT "Введите римское число", a$
    CLS
    FOR i = 1 TO LEN(a$)
    e$ = MID$(a$, i, 1)
    IF e$ <> "D" AND e$ <> "M" AND e$ <> "C" AND e$ <> "L" AND e$ <> "X" AND e$ <> "V" AND e$ <> "I" THEN  F=0
    IF e$ = "I" THEN d(i) = 1
    IF e$ = "V" THEN d(i) = 5
    IF e$ = "X" THEN d(i) = 10
    IF e$ = "L" THEN d(i) = 50
    IF e$ = "C" THEN d(i) = 100
    IF e$ = "D" THEN d(i) = 500
    IF e$ = "M" THEN d(i) = 1000
    NEXT i
    LOOP 
    FOR i = 1 TO LEN(a$)
    IF d(i) >=d(i + 1) THEN
    ar = ar + d(i)
    ELSE
    ar = ar - d(i)
    END IF
     
    NEXT i
    PRINT "Арабское число"; ar
    Ответить с цитированием  
     

  6. #6  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Все великолепно! Видно человека серьезно подходящего к вопросу. В принципе ничего можно не менять, программа нормально работает. Однако разберем несколько шероховатостей: 1. Вы правильно приняли решение о массиве, однако при его определении задаете 15 элементов, а если римское число более длинное? Вполне может быть, поэтому надо сначала выполнить ввод числа, а затем определить массив по длине строки.
    Код :
    INPUT "Введите римское число", a$
    DIM d(LEN(a$))
    Тем более, что в цикле FOR Вы используете выход по LEN(a$). 2. Для чего используется внешний цикл "DO LOOP" непонятно, ведь он не работает. 3. И последнее думаю не надо стирать строку ввода, пусть будет "введите римское число XXI", и ниже "арабское число NNN". В целом программа может выглядеть так:
    Код :
    CLS
    INPUT "Введите римское число", a$
    DIM d(LEN(a$) + 1)
    FOR i = 1 TO LEN(a$)
        e$ = MID$(a$, i, 1)
        IF e$ <> "D" AND e$ <> "M" AND e$ <> "C" AND e$ <> "L" AND e$ <> "X" AND e$ <> "V" AND e$ <> "I" THEN d(i) = 0
        IF e$ = "I" THEN d(i) = 1
        IF e$ = "V" THEN d(i) = 5
        IF e$ = "X" THEN d(i) = 10
        IF e$ = "L" THEN d(i) = 50
        IF e$ = "C" THEN d(i) = 100
        IF e$ = "D" THEN d(i) = 500
        IF e$ = "M" THEN d(i) = 1000
    NEXT i
    FOR i = 1 TO LEN(a$)
        IF d(i) >= d(i + 1) THEN
            ar = ar + d(i)
        ELSE
            ar = ar - d(i)
        END IF
    NEXT i
    PRINT "Арабское число"; ar
    Последний раз редактировалось Dimon012; 25.05.2011 в 04:47.
    Ответить с цитированием  
     

  7. #7  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Код :
    CLS
    DO WHILE F = 0
    F = 1
    PRINT TAB(15); "Перевод чисел из римской системы счисления в арабскую"
    PRINT
    INPUT "Введите римское число: ", a$
    DIM d(LEN(a$) + 1)
    FOR i = 1 TO LEN(a$)
    e$ = MID$(a$, i, 1)
    IF e$ <> "D" AND e$ <> "M" AND e$ <> "C" AND e$ <> "L" AND e$ <> "X" AND e$ <> "V" AND e$ <> "I" THEN F = 0
    IF e$ = "I" THEN d(i) = 1
    IF e$ = "V" THEN d(i) = 5
    IF e$ = "X" THEN d(i) = 10
    IF e$ = "L" THEN d(i) = 50
    IF e$ = "C" THEN d(i) = 100
    IF e$ = "D" THEN d(i) = 500
    IF e$ = "M" THEN d(i) = 1000
    NEXT i
    LOOP
    FOR i = 1 TO LEN(a$)
    IF d(i) >= d(i + 1) THEN
    ar = ar + d(i)
    ELSE
    ar = ar - d(i)
    END IF
    NEXT i
    PRINT "Арабское число:"; ar
    Ответить с цитированием  
     

  8. #8  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Все верно, только почему вы так и не убрали цикл "DO LOOP", он же не работает? Или объясните для чего он нужен, возможно я чего то не понимаю. В принципе если окончание цикла "LOOP" перенести в последнюю строку программы и сделать дополнительный ввод, то можно зациклить программу и с одного запуска получать несколько преобразований. А-а-а-а! понял он для отслеживания неправильного ввода, но тогда это надо отображать например:
    Код :
    IF F=0 THEN PRINT "Неправильный ввод числа!"
    Последний раз редактировалось Dimon012; 25.05.2011 в 09:34.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 16
    Последнее сообщение: 25.10.2013, 11:15
  2. Ответов: 4
    Последнее сообщение: 01.04.2011, 00:58
  3. Ответов: 5
    Последнее сообщение: 17.01.2011, 15:54
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •