#课程设计#十进制转换为二进制
题目:数制转换问题
实现任意数制的数的进制转换
二、课设目的
1、利用c语言中的知识实现进制的转换。
2、掌握数组的使用。
3、掌握栈的使用。
三、设计分析
【需求分析】
题目要求:
实现任意数制的数的进制转换
要求实现以下功能:
1、输入一个随意进制的数并实现进制转换。
2、用数组实现该操作。
3、用栈实现该操作。
【总体设计】
四、设计方案
1、使用了C语言编程中的结构定义和算法。
2、创建了两个主要函数ConversionSZ()、ConversionS()函数用来实现数组和栈的进制转换,ConversionSZ()包括Ten_MoreThanTen()、MoreThanTen_Ten()、Ten_LessThanTen()、LessThanTen_Ten()这四个函数来具体实现不同类型的转换。
ConversionS()包括getStack()、addStack()、scanfStack()来实现进栈,popStack()实现出栈,toNumX()实现数制转换。
3、用main()函数调用上述内容。
五、课设详细代码:
int LessThanTen_Ten(int before, int num){//10以内转换10,参数brfore为初始进制,num为初始数值
double result = 0.0; //转换成10进制后的结果
int i = 0;
for(i = 0; num != 0; i++){ //利用for循环实现按权展开相加
result += pow(before, i) * (num % 10);
num /= 10;
}
return (int)result; //返回值为转换后的结果
}
该函数实现10以内进制数向10进制的转换。
int Ten_LessThanTen(int after, int num){//10转换10以内,参数after为转换后的进制
double result = 0.0; //double类型因为pow函数的返回值为double类型
int i = 0;
for(i = 0; num != 0; i++) //利用for循环实现连续取余
{
result += (num % after) * pow(10, i);
num /= after;
}
return (int)result;
}
该函数实现10进制的数向10以内进制的转换。
int MoreThanTen_Ten(int before, char num[]){//10以上转换10
int i = 0;
double result = 0.0;
int length = strlen(num);
for(i = length - 1; i >= 0; i--)
{
//利用ASCALL码将所有元素转换成对应的整型
if('A' <= num[i] && num[i] <= 'Z')
result += pow(before, length - i - 1) * (num[i] - 55);
else if('a' <= num[i] && num[i] <= 'z')
result += pow(before, length - i - 1) * (num[i] - 87);
else if('0' <= num[i] && num[i] <= '9')
result += pow(before, length - i - 1) * (num[i] - 48);
}
return (int)result;
}
该函数实现10以上进制数向10进制的转换。
char * Ten_MoreThanTen(int after, int num){//10转换10以上
int i = 0;
int j = 0;
int tmp = 0; //存储每次余数的中间变量
char tmp_array[N] = "\0"; //转换后未倒置的数组
for(i = 0; num > 0; i++)
{
tmp = num % after;
if(tmp < 10) //对大于等于10的余数进行字母转换
tmp_array[i] = tmp + '0';
else
tmp_array[i] = tmp + 'A' - 10;
num /= after;
}
for(j = 0; i > 0; i--, j++) //倒置
{
array[j] = tmp_array[i - 1];
array[j + 1] = '\0';
}
return array; //输出转换后存储数据的字符串地址
}
该函数实现10进制数向10以上进制的转换。
int ConversionSZ(){
int before = 0; //转换前的进制数
int after = 0; //转换后的进制数
int num1 = 0; //要转换的十进制以内的数
char array_num1[N] = "\0"; //要转换的十进制以上的数
int num2 = 0; //转换之后的数
char *str_num2; //转换之后的数的地址
int tmp_num1 = 0; //判断输入是否合法时代替num1的中间变量
int i = 0;
int m = 0; //计数器
while(1) //整个while语句用于录入以及判断输入是否合法
{
printf("初始进制:");
scanf("%d", &before);
printf("目标进制:");
scanf("%d", &after);
printf("初始数值:");
if(before > 10) //通过对初始进制判断,决定
scanf("%s", array_num1);
else
scanf("%d", &num1);
for(i = 0, tmp_num1 = num1; tmp_num1 != 0; i++)
{
if((tmp_num1 % 10) <= before && tmp_num1 % 10 >= 0 && tmp_num1 % 10 <= 9)
m++;
tmp_num1 /= 10;
}
if(m == i) //判断输入的数据每一位是否都小于等于进制数
break;
else
{
m = 0; //对计数器m重新初始化
fflush(stdin); //清空缓存区
printf("输入有误!请重新输入:\n");
}
}
//将进制转换的四种情况分别表示
if(before <= 10 && after <= 10)
{
num2 = Ten_LessThanTen(after, LessThanTen_Ten(before, num1));
printf("\n%d进制的%d对应的%d进制数为:%d\n", before, num1, after, num2);
}//利用LessThanTen_Ten()函数将10以内进制数转换为10进制,在用Ten_LessThanTen()将该数转换为10以内其他进制。
else if(before > 10 && after <= 10)
{
num2 = Ten_LessThanTen(after, MoreThanTen_Ten(before, array_num1));
printf("\n%d进制的%s对应的%d进制数为:%d\n", before, array_num1, after, num2);
}//利用MoreThanTen_Ten()函数将10以上进制数转换为10进制,在用Ten_LessThanTen()将该数转换为10以内进制数。
else if(before <= 10 && after > 10)
{
str_num2 = Ten_MoreThanTen(after, LessThanTen_Ten(before, num1));
printf("\n%d进制的%d对应的%d进制数为:%s\n", before, num1, after, str_num2);
}//利用LessThanTen_Ten()函数将10以内进制数转换为10进制,在用Ten_MoreThanTen ()将该数转换为10以上其他进制数。
else if(before > 10 && after > 10)
{
str_num2 = Ten_MoreThanTen(after, MoreThanTen_Ten(before, array_num1));
printf("\n%d进制的%s对应的%d进制数为:%s\n", before, array_num1, after, str_num2);
}//利用MoreThanTen_Ten()函数将10以上进制数转换为10进制数,在用Ten_MoreThanTen ()将该数转换为其他10以上进制。
return 1;
}
以上函数内容实现了数组的进制转换。
Stack getStack(int X = 10) {
Stack s = new SN;
s->head = new LN;
s->X = X;
s->length = 0;
s->head->next = NULL;
return s;
}
void addStack(Stack stack,int data) {
L NewNode = new LN;
NewNode->data = data;
NewNode->next = stack->head->next;
stack->head->next = NewNode;
stack->length++;
}
Stack scanfStack(int X = 10) {
Stack stack = getStack();
stack->X = X;
char ch;
while ((ch = getchar()) != '\n') {
if (ch <= '9' && ch >= '0')
addStack(stack, ch - '0');
else if (ch <= 'z' && ch >= 'a') //10以上数的进栈
addStack(stack, ch - 'a' + 10);
else //10以上数的进栈
addStack(stack, ch - 'A' + 10);
}
return stack;
}
以上函数将元素进栈。
void showValue(Stack stack) {
if (stack) {
L hptr = stack->head;
while (hptr && hptr->next) {
if (hptr->next->data >= 0 && hptr->next->data < 10)
printf("%d", hptr->next->data);
else
printf("%c", 'a' + hptr->next->data - 10);//10以上数的出栈
hptr = hptr->next;
}
printf("\n");
}
}
输出转换后的数。
Stack toNumX(Stack stack,int X) {
if (stack && stack->head && stack->head->next) {
int value = 0;
Stack newStack=getStack();
L hptr = stack->head;
int number = 0;
while (hptr && hptr->next) {
number++;
value += hptr->next->data*(int)(pow(stack->X,number-1));
hptr = hptr->next;
}
while (value != 0) {
addStack(newStack, value % X);
value /= X;
}
return newStack;
}
}
进行数制转换。
void ConversionS(){
int x;
printf("要输入数的进制:");
scanf("%d", &x);
printf("输入数:");
getchar();
Stack s = scanfStack(x);
printf("希望转换为什么进制:");
scanf("%d", &x);
Stack s1 = toNumX(s, x);
printf("输出:");
showValue(s1);
六、使用说明
先选择使用数组进行数制转换还是使用栈进行数制转换。先输入要进行转换数的进制,在输入数,最后进行转换数制。接着判断是否要继续进行其他数的进制转换。