Консультация № 181939
19.01.2011, 14:06
64.42 руб.
19.01.2011, 14:11
0 18 2
Здравствуйте! У меня возникли сложности с таким вопросом:
Написать программу на C, перевода из любой системы счисления в любую

Обсуждение

давно
Старший Модератор
31795
6196
19.01.2011, 14:12
общий

На портале есть специально обученая рассылка.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.01.2011, 14:36
общий
Система счисления - очень широкое понятие, необходимо конкретизировать задание.
Возможно имелась ввиду позиционная система счисления с любым целым положительным основанием?
Неизвестный
19.01.2011, 16:47
общий
да, системы счисления в которых цифры не превышают основание.
давно
Профессор
230118
3054
19.01.2011, 20:17
общий
это ответ
Здравствуйте, Наталия!

Здесь предлагается возможность перевода из любой системы счисления в любую от двоичной до 128-ричной. В последней после цифр используются буквы: сначала строчные латинские, затем заглавные латинские, а потом то же с кириллицей. Всего получается 128 символов. Переводить можно числа с любым количеством знаков. Но здесь мы ограничимся 128-разрядными числами.
[code h=200]// 181939.cpp : Defines the entry point for the console application.
//
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include <locale.h>

const char *NumSet=
"0123456789"\
"abcdef"\
"ghijklmnopqrstuvwxyz"\
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; //128


int convert(int base_in, int base_out, char* num)
{
return 0;
}

int main(int argc, char* argv[])
{
int base1, base2;
char number[32];
char number1[32];
int n=0;

setlocale(LC_CTYPE, "Russian");
printf("\nВведите основания:");
scanf("%d %d",&base1,&base2);

printf("\nВведите число в основании %d:");
scanf("%s", number);
int l=strlen(number)-1;
for(int i=l;i>=0;i--)
{
int pos;
pos=strchr(NumSet,number[i])-NumSet;
n*=base1;
n+=pos;
}
itoa(n,number1,base2);
printf(number1);
return 0;
}


[/code]
Неизвестный
19.01.2011, 22:29
общий
20.01.2011, 14:21
это ответ
Здравствуйте, Наталия!
Решение я взял из архива собственных задач (когда-то делал это сам):

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

int d,s,s1,s2,n,n1[10];

void main(void)
{
printf("\nВведите число:");
scanf("%d",&n);
printf("\nИз какой ситемы в какую:");
scanf("%d %d",&s1,&s2);
s=0; d=1;
while (n) {s=s+d*(n%10); n=n/10; d=d*s1;}
d=0;
while (s) {n1[d]=s%s2; s=s/s2; d=d+1;}
for(s=d-1;s!=-1;s--) printf("%d",n1[s]);
getch();
}
давно
Профессор
230118
3054
20.01.2011, 10:24
общий
И что мы получаем в результате цикла?
while (n) {s=s+d*(n%10); n=n/10; d=d*s1;}
Что находится в s
Неизвестный
27.01.2011, 10:11
общий
А Вы бы не могли написать для это программы проверку того, что число которое мы вводим подходит для под основание?
Неизвестный
27.01.2011, 17:02
общий
и программа не читает шестнадцатеричные цифры A-F
давно
Старший Модератор
31795
6196
27.01.2011, 17:15
общий
Вас интересует код эксперта denura?

Если да, то 16-е числа считыватся не будут, т.к. он использует спецификатор %d - который заставляет scanf считать, что будут вводится только десятичные числа со знаком.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
27.01.2011, 20:15
общий
Наталия, можно в виде switch - case сделать - всего-то 2, 8 и 10 на проверку поставить в случае без поддержки hex
Неизвестный
27.01.2011, 20:23
общий
Проверить, принадлежит ли любое число любой системе счисления вообще не проблема - разбить на цифры и сравнить каждое с основанием, зачем тут ограничиваться switch-ем?
Неизвестный
27.01.2011, 20:42
общий
Киселёва Алёна aka Verena:
Зачем из набора вводимых символов вычленять цифры, если нужны только конкретные значения? Чем меньше пользователь может сделать, тем больше шансов, что программа будет работать верно
Неизвестный
27.01.2011, 20:56
общий
Я Вас не поняла. При чём тут вообще пользователь? Речь идёт как раз таки о проверке ввода, то бишь проверке пользователя. Например, можно так
Код:
char buf [15];
printf("\nВведите число:");
scanf("%s",&buf);
printf("\nИз какой ситемы в какую:");
scanf("%d %d",&s1,&s2);
//
for (int i=0; i<strlen(buf); i++)
if (buf[i]-48>=s1) {
printf ("Error");
return;
}
n = atoi (buf);
Неизвестный
28.01.2011, 15:40
общий
а разве нельзя сделать так чтобы цифры больше 10 шли латинскими буквами???
Неизвестный
28.01.2011, 15:44
общий

Это как? Я вопроса не понял
Неизвестный
28.01.2011, 15:55
общий
Она имеет в виду поддержку чисел систем с основанием больше 10, например, 16-ной, в которых a=10, b=11 и т.д.
Неизвестный
28.01.2011, 16:24
общий
По моему мнению, это должно делаться так:
если получили в результате перевода число больше 9, но меньше 15, то ставим ему в соответствие букву A,B,C,D,E,F

В С++ можно так:

CString CCpios_1Dlg::perevod_x16(int x16)
{
char buffer[20];
_itoa(x16,buffer,16);
return buffer;
}
Неизвестный
02.02.2011, 13:36
общий
а в обычном С это возможно??
Форма ответа