数制转换(数据结构课程设计C语言版)

时间:2025-03-13 21:18:58
#define _CRT_SECURE_NO_WARNINGS #include <> #include <> #include <iostream> #include <> #include<> 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("\n"); system("pause"); } //10进制转化为n2进制主要思想:本质上就是采用进栈出栈的顺序不同 int main() { char arr[10]; int n1; int n2; printf("*************************数制转换****************************\n"); printf("**********输入**********\n"); printf("请输入一个数:"); scanf("%s",&arr); printf("请输入原本的进制数(最高为16进制):"); scanf("%d",&n1); printf("请输入想转换的进制(最高为16进制: "); scanf("%d",&n2); int sz = strlen(arr); //这里是需要额外注意的,如果用的是sizeof,那么sz的大小就是恒定的10,这样就达不到目的了,应该用strlen()这样就可以遇到‘\0’后停止。让sz = 输出的字符长度。 //另外这里在编程时,还遇到了一个问题,即使使用sizeof()可以,sizeof()函数也要在Number_system_conversion_1()之外使用,因为在函数内使用,那么的sizeof(arr)所表示的是数组首地址的大小而非数组大小。 int num_2 = Number_system_conversion_1(arr,sz,n1); printf("**********输出**********\n"); Number_system_conversion_2(num_2,n2); return 0; }