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

Системы счисления и вывод результата - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
heforma
0 / 0 / 0
Регистрация: 03.09.2011
Сообщений: 14
03.09.2011, 18:00     Системы счисления и вывод результата #1
Здравствуйте, я получил задание создать программу которая принимает значение в 10-тичной системе и выводит на экран значение в любой выбранной системе от 2 до 36.
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
#include<iostream>
using namespace std;
void st(int dig,int sys);
void main()
{
    int dig,sys=0;
    cout<<"Enter a digit:\t";
    cin>>dig;
    cout<<"Enter a system(2-36):\t";
    cin>>sys;
    st(dig,sys);
    system("pause");
}
void st(int dig,int sys)
{
    int a;
    for(;dig>0;dig/=sys){
    a=(dig%sys);
    switch(a)
    {
        case 10:
            cout<<'A';
            break;
        case 11:
            cout<<'B';
            break;
        case 12:
            cout<<'C';
            break;
        case 13:
            cout<<'D';
            break;
        case 14:
            cout<<'E';
            break;
        case 15:
            cout<<'F';
            break;
        case 16:
            cout<<'G';
            break;
        case 17:
            cout<<'H';
            break;
        case 18:
            cout<<'I';
            break;
        case 19:
            cout<<'J';
            break;
        case 20:
            cout<<'K';
            break;
        case 21:
            cout<<'L';
            break;
        case 22:
            cout<<'M';
            break;
        case 23:
            cout<<'N';
            break;
        case 24:
            cout<<'O';
            break;
        case 25:
            cout<<'P';
            break;
        case 26:
            cout<<'Q';
            break;
        case 27:
            cout<<'R';
            break;
        case 28:
            cout<<'S';
            break;
        case 29:
            cout<<'T';
            break;
        case 30:
            cout<<'U';
            break;
        case 31:
            cout<<'V';
            break;
        case 32:
            cout<<'W';
            break;
        case 33:
            cout<<'X';
            break;
        case 34:
            cout<<'Y';
            break;
        case 35:
            cout<<'Z';
            break;
        default:
            cout<<a;
        }
    }
    cout<<endl;
}
Вот мои старания, в результате работы программа выводит на экран значение в нужной сис. счисления но наоборот, динамические массивы изучены не были=(
Подскажите что сделать пожалуйста.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.09.2011, 19:06     Системы счисления и вывод результата #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <stdio.h>
#include <string.h>
 
char * reverse(char * str){
    char * head = str;
    char * tail = str + strlen(str) - 1;
    
    while ( head < tail ){
        char t = *head;
        *head = *tail;
        *tail = t;
        ++head;
        --tail;
    }
    
    return str;
}
 
char * num2system(int num, int sys){
    const static char symbols[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static char buf[64];
    char * ptr = buf;
    int sign = ( num < 0 );
    
    if ( sys < 2 || sys > 36 )
        return NULL;
    if ( sign )
        num *= -1;
    do { *ptr++ = symbols[num % sys]; } while ( num /= sys );
    if ( sign )
        *ptr++ = '-';
    *ptr = '\0';
    
    return reverse(buf);
}
 
int main(void){
    int num, sys;
    
    while ( printf("Number: ") && scanf("%d", &num) == 1 && printf("System: ") && scanf("%d", &sys) == 1 && sys > 1 && sys < 37 )
        printf("Result: %s\n", num2system(num, sys));
    
    return 0;
}
tig1818c
2 / 2 / 0
Регистрация: 31.07.2010
Сообщений: 17
17.10.2011, 21:59     Системы счисления и вывод результата #3
То, что отображение результата в данном примере будет "зеркальным", это совершенно очевидно. Ибо данный алгоритм получает результат поразрядно (в новой СС) СПРАВА НАЛЕВО, т.е. начиная с младших разрядов. А вывод на отображение осуществляется СЛЕВА НАПРАВО, начиная с тех же младших разрядов. Как вариант предлагаю не выплевывать результат сразу на консоль, а загнать его в промежуточный массив начиная со старших индексов в сторону их уменьшения, затем подсчитать сколько символов получилось и выплюнуть их на отображение.
Примерно так:
USHORT BuffLen = 17; % 16 символов результата и нуль-терминатор
USHORT Index = BuffLen - 2;
UCHAR BuffOut[BuffLen];
BuffOut[BuffLen - 1] = '\0'; % нуль - терминатор, необходим для printf
далее в теле Вашего цикла
....
case 10:
BuffOut[Index--] = 'A';
break;
... по аналогии для всех case.

И за циклом
printf(BuffOut + Index +1)

Успехов!
anonimious
13 / 13 / 2
Регистрация: 17.10.2011
Сообщений: 54
17.10.2011, 22:35     Системы счисления и вывод результата #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
void rev(int a,int b){
    int k;
    for(int i=a;i>0;i=a)
        {k=a%b;a/=b;cout<<k<<' ';}}
void main(){
    setlocale(LC_ALL,"rus");
    int a,b; 
    cout<<"Введите число "; cin>>a; 
    cout<<"Введите систему счисления  "; cin>>b; 
    rev(a,b); cout<<'\n';}
А как здесь перевернуть порядок цифр?
tig1818c
2 / 2 / 0
Регистрация: 31.07.2010
Сообщений: 17
17.10.2011, 23:05     Системы счисления и вывод результата #5
При таком использовании cout никак.
Могу предложить альтернативу по аналогии с вышеописанным примером:
C++
1
2
3
4
5
6
7
8
9
10
void rev(int a,int b){
        int k;
        int m[16];  макс=16  ( для примера ); может быть любым в зависимости от потребностей
        int Index = 0;
        for(int i=a;i>0;i=a)
//                {k=a%b;a/=b;cout<<k<<' ';}   старый цикл
                  { k = a % b; a /= b; m[Index++] = k; }         //  новый цикл 1
        for(Index--;Index>=0;Index--) cout<<m[Index]<<' ';  //  новый цикл 2
 
        }
anonimious
13 / 13 / 2
Регистрация: 17.10.2011
Сообщений: 54
17.10.2011, 23:37     Системы счисления и вывод результата #6
Спасибо
Yandex
Объявления
17.10.2011, 23:37     Системы счисления и вывод результата
Ответ Создать тему
Опции темы

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