Форум программистов, компьютерный форум CyberForum.ru

Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...) - C++

Восстановить пароль Регистрация
 
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
22.10.2013, 09:31     Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...) #1
Здравствуйте. Тренируюсь в с++, пишу программу. Должна переводить слова в цифры(причём a-1, b-2, z-26, aa-27...) и обратно. В одну сторону работает отлично, а в другую багует на любом сочетании цифр, при переводе которых в буквы присутствует буква z. В чём ошибка и как её можно исправить?
Заранее спасибо! =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
    
 
    /* Numerically Speaking */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct Big{
            int len;
            int num[50];
    };
     
    Big number;
    Big letter;
     
    Big sumn(Big *a, int n, int base)
    {
              Big res = *a;
              int pos=0;
              int i=0;
              res.num[pos]+=n;
              for(i=0; i<=res.len; i++)
              {
                     if(res.num[i]>base)
                      {                    
                            res.num[i+1]+=res.num[i]/base;
                            res.num[i]%=base;
                      }
              }      
              if (res.num[res.len]>0) res.len++;
              return res;
    }
     
    Big multi(Big *a, int b, int base)
    {
      Big res=*a;
      int r = 0, i;
      for (i=0;i<res.len || r != 0;i++)
      {
        res.num[i] = res.num[i] * b + r;
        r = res.num[i]/base;
            res.num[i]%=base;
      }
         if (i > res.len)
        res.len = i;
      return res;
    }
     
    void let2num()
    {
            for(int i=letter.len-1; i>=0; i--)
            {
                    number=multi(&number, 26, 10);
                    number=sumn(&number, letter.num[i],10);
                    number=multi(&number, 1, 10);
            }
    }
     
    void num2let()
    {
            for(int i=number.len-1; i>=0; i--)
            {
                    letter=multi(&letter, 10, 26);
                    letter=sumn(&letter, number.num[i], 26);
            }
    }
     
     
    int main()
    {
            char buf[1024];
            int x;
     
            while(scanf("%s", buf)==1)
            {
                    if (!strcmp(buf, "*")) break;
                    if (buf[0]>='0' && buf[0]<='9')
                    {
                            number.len = strlen(buf);
                            for(int i=0; i<number.len; i++)
                            {
                                    number.num[i] = buf[number.len-i-1]-'0';
                            }
                            num2let();
                    }
                    else
                    {
                            letter.len = strlen(buf);
                            for(int i=0; i<letter.len; i++)
                            {
                                    letter.num[i] = buf[letter.len-i-1]-'a'+1;
                            }
                            number.len = 1;
                            let2num();
                    }
           
     
                    for(int i=letter.len-1; i>=0; i--)
                                    {
                                            printf("%c", ('a'+letter.num[i])-1);
                                    }
                    printf("\t");
                    for(int i=number.len-1; i>=0; i--)
                            {
                                    printf("%c", '0'+number.num[i]);
                                    if (i && (i%3==0))
                                    {
                                            printf(",");
                                    }
                            }
                    printf("\n");
                    memset(&number, 0, sizeof(Big));
                    memset(&letter, 0, sizeof(Big));
     
     
            }
    }
Код: http://pastebin.com/xi342gST
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 09:31     Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...)
Посмотрите здесь:

Перевод числа в цифры! C++
Подсчет слов и перевод строки C++
C++ Перевод римские цифры в арабские и обратно
Определить число слов содержащих цифры. C++
C++ Строки: Выбрать из слов те, которые могут быть получены из образца по правилу
C++ Использование библиотеки STL , контейнер string. Дан массив слов.Надо удалить все цифры из слов
Посторонние цифры при выводе в поток (перевод температур) C++
C++ Перевод слов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Светла
3 / 3 / 0
Регистрация: 22.03.2012
Сообщений: 15
23.10.2013, 12:10     Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...) #2
Доброго времени! Думаю, что, в случае, когда на входе у вас цифра, то и рассматривать ее нужно как цифру. У вас идет привязка к длине, что ни есть хорошо и, вероятнее всего, там и багует.

Давайте посмотрим на задачу по-другому. На входе слово (у которого, верно, есть длина - len), вы его переводите в "цифру" функциями суммирования и умножения. Можно было бы обойтись одной функцией, работающей по приблизительной формуле:
цифра = сумма(i = 0,... i < len-1)= (basei)*numj,i+1.
Что под этим имею ввиду:
основание(base) всегда 26, в случае, когда len = 1, base по формуле вырождается в единицу.
numj,i+1 - это ваша буква, от самой первой, которая дает порядок числа, до самой последней, которая уже показывает единицы.

Пример: dax = 2754 = 26*26*4(d=4) + 26*1(a=1) + 1(26 в нулевой степени)*24.

Далее, о цифре. Несмотря на то, что поступает целое число, я буду рассматривать его как дробное, ибо так удобнее( массив char в double функцией double atof ( const char * str ), имея все то же неизменное основание 26, начинаем экспериментировать:
2754 / 26 = 105,9230....
105,9230..../26 = 4, 07396...

Мысля начинает шевелиться:"Что бы это значило?".
Цифра 4 похожа на d, а остаток от деления, наверное - остальные буквы? Если дробную часть от первого деления помножить на 26, то получим живое число - 24. Улыбаемся и машем - это х. А вот если такой трюк провернуть со вторым остатком от деления, получится ерунда. Пробуем просто 105 на 26 разделить, дробную часть снова множим - вуаля - 1(а).
Таким образом, вспоминая, что есть функция double modf ( double x, double * intpart );, которая разделяет целые и дробные части, решаем проблему, запихивая функцию в цикл.
Удачи!
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
23.10.2013, 18:04  [ТС]     Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...) #3
Здравствуйте. К сожалению, функцию возведения в степень сделать сложнее, чем сложение и умножение в длинной арифметике(как видите я использую именно её, так числа там до 40 знаков).
Я понимаю как работает перевод числе в другие системы исчисления, но проблема не в этом. Проблема в переносе разряда при кодировании z-26, так как разряд переносится при выполнении условия res.num[i]>base(в данном случае 26). Как решить эту ошибка в данной реализации задачи я не понимаю. Спасибо за объяснение, но мне нужна доработка именно этой версии, а не переделка алгоритма задачи.
Yandex
Объявления
23.10.2013, 18:04     Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...)
Ответ Создать тему
Опции темы

Текущее время: 12:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru