数制转换(数据结构课程设计C语言版)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <iostream> #include <math.h> #include<string.h> using namespace std; typedef struct SNode/定义一个栈,采用无头结点的单链表结构 { int data;//定义栈的数据域 struct SNode *next;//定义栈的指针域 }SNode,*LinkStack; bool Is_Empty(LinkStack S)//判空 { if(!S) return true; else return false; } void InitStack(LinkStack &S)//初始化 { S = NULL; } bool Push(LinkStack &S,int e)//压栈 { SNode* p = (SNode*)malloc(sizeof(SNode)) ;//开辟一个栈单元 if(!p ) { return false;//内存单元不够,栈溢出 } p->data = e; p->next = S; S=p; return true; } bool Pop(LinkStack &S,char &e)//出栈 { SNode* p ; if(!S)//栈空 { return false; } else { p = S; e = p->data; S = p->next; free(p); return true; } } //数制转化 int Number_system_conversion_1(char arr[],int sz,float n1)//n1进制转化为10进制 { int i; int j; int n = 0; int sum = 0; for(i = 0;i<sz;i++) { char tmp = arr[sz-1-i]; switch(tmp) { case 1: j = 1; break; case 2: j = 2; break; case 3: j = 3; break; case 4: j = 4; break; case 5: j = 5; break; case 6: j = 6; break; case 7: j = 7; break; case 8: j = 8; break; case 9: j = 9; break; case A: j = 10; break; case B: j = 11; break; case C: j = 12; break; case D: j = 13; break; case E: j = 14; break; case F: j = 15; break; } int c =j * pow(n1,n); n++; sum = sum+c; } return sum; } //主要思想:假设输入的两个参数分别为num_1,n1,本质上就是将num_1这个字符数组从数组的最后一个元素开始取,取出第一个转化为对应的int型数(1对应1,A对于10等),然后乘以1,取出第二个然后乘以10,这样累加就得到了n1进制数转化为10进制的数。 void Number_system_conversion_2(int num_2,int n2)//10进制转化为n2进制 { LinkStack S; InitStack(S); char d; while(num_2) { switch (num_2%n2) { case 0: Push(S,0); break; case 1: Push(S,1); break; case 2: Push(S,2); break; case 3: Push(S,3); break; case 4: Push(S,4); break; case 5: Push(S,5); break; case 6: Push(S,6); break; case 7: Push(S,7); break; case 8: Push(S,8); break; case 9: Push(S,9); break; case 10: Push(S,A); break; case 11: Push(S,B); break; case 12: Push(S,C); break; case 13: Push(S,D); break; case 14: Push(S,E); break; case 15: Push(S,F); break; } num_2 = num_2/n2; } printf("转化后的数字为: "); while(!(Is_Empty(S))) { Pop(S,d); printf("%c",d); } printf(" "); system("pause"); } //10进制转化为n2进制主要思想:本质上就是采用进栈出栈的顺序不同 int main() { char arr[10]; int n1; int n2; printf("*************************数制转换**************************** "); printf("**********输入********** "); printf("请输入一个数:"); scanf("%s",&arr); printf("请输入原本的进制数(最高为16进制):"); scanf("%d",&n1); printf("请输入想转换的进制(最高为16进制: "); scanf("%d",&n2); int sz = strlen(arr); //这里是需要额外注意的,如果用的是sizeof,那么sz的大小就是恒定的10,这样就达不到目的了,应该用strlen()这样就可以遇到‘ ’后停止。让sz = 输出的字符长度。 //另外这里在编程时,还遇到了一个问题,即使使用sizeof()可以,sizeof()函数也要在Number_system_conversion_1()之外使用,因为在函数内使用,那么的sizeof(arr)所表示的是数组首地址的大小而非数组大小。 int num_2 = Number_system_conversion_1(arr,sz,n1); printf("**********输出********** "); Number_system_conversion_2(num_2,n2); return 0; }
下一篇:
数据结构——链栈(GIF图解)