С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
#1

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

22.10.2013, 09:31. Просмотров 791. Ответов 2
Метки нет (Все метки)

Здравствуйте. Тренируюсь в с++, пишу программу. Должна переводить слова в цифры(причём 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 09:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод слов в цифры (по правилу a-1, b-2, z-26, aa-27...) (C++):

Использование библиотеки STL , контейнер string. Дан массив слов.Надо удалить все цифры из слов - C++
#include &quot;StdAfx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; int main() { string str...

Перевод слов в цифры - Delphi
1 2 3 4 5 6 7 8 9 а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я По схеме приведённой выше надо перевести...

В заданном числе заменить все цифры по правилу - PascalABC.NET
В заданном числе заменить все цифры 0 на 9, все 1 на 8, к полученному числу прибавить 999.

В символьной матрице определить количество цифр и все цифры заменить латинскими буквами по заданному правилу - Delphi
в символьной матрице размером 5х5 определить количество цифр и все цифры заменить латинскими буквами по правилу: 1-a;2-b;3-c...0-j(не...

Перевод числа в цифры! - C++
Допустим есть числа 4 8256 345346 342345 432004523 Как получить сумму цифр, этих чисел? и закинуть их в массив.

Перевод цифры в слово - Visual Basic
Ребят помогите написать код для программы пожалуйста,что бы в нем было:Одна форма в нем два ТекстБокса,и одна кнопка,в один текст пишеться...

2
Светла
3 / 3 / 0
Регистрация: 22.03.2012
Сообщений: 15
23.10.2013, 12:10 #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 );, которая разделяет целые и дробные части, решаем проблему, запихивая функцию в цикл.
Удачи!
1
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
23.10.2013, 18:04  [ТС] #3
Здравствуйте. К сожалению, функцию возведения в степень сделать сложнее, чем сложение и умножение в длинной арифметике(как видите я использую именно её, так числа там до 40 знаков).
Я понимаю как работает перевод числе в другие системы исчисления, но проблема не в этом. Проблема в переносе разряда при кодировании z-26, так как разряд переносится при выполнении условия res.num[i]>base(в данном случае 26). Как решить эту ошибка в данной реализации задачи я не понимаю. Спасибо за объяснение, но мне нужна доработка именно этой версии, а не переделка алгоритма задачи.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 18:04
Привет! Вот еще темы с ответами:

Перевод цифры в число - Visual Basic
как сделать чтобы програма не складывала цифры а складывала числа!!! Добавлено через 6 минут Private Sub Command1_Click() i =...

Перевод строки в цифры - Delphi
вообщем есть поле edit1 допустим. В нем есть текст, состоящий только из цифр 1 и 0.но насколько я понимаю это символы string,надо чтобы...

Строки: Выбрать из слов те, которые могут быть получены из образца по правилу - C++
Помогите пожалуйста решить задачу по теме &quot;Строки&quot;: Приняв первое слово за образец, выбрать из остальных слов те, которые могут быть...

Перевод прописи в цифры, числа - Java SE
Здравствуйте, как реализовать данный алгоритм ? Программа читает из файла текст, если находит в нем числа прописью (например: сто...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.