進位制轉換器(棧的方式)
阿新 • • 發佈:2020-12-26
進位制轉換器(棧的方式)
轉換器例項
例如,使用者提供了一個十進位制數:10,要求將此資料以二進位制形式轉換,則通過進位制轉換器轉換的最終結果應該:1010。
提示:此進位制轉換器可以在 2-36 進位制之間對資料進行任意轉換。各進制中對應的數字如下表:
ASCII碼錶中:48-57對應0-9, 65-90對應A-Z
#include <stdio.h>
#include <string.h>
#include <math.h>
int top=-1;//top變數時刻表示棧頂元素所在位置
void push(char * a,char elem){
a[++top]=elem;
}
void pop(char * a){
if (top==-1) {
return ;
}
//輸出時要按照正確的格式顯示給使用者
if (a[top]>=10) {
printf("%c",a[top]+55); //因為是10到35所以,要加55變成A-Z對應的ASCII碼值,65-90
}else{
printf("%d",a[top]);
}
top--;
}
//將各進位制數轉換成十進位制數
int scaleFun(char * data,int system){
int k=(int)strlen(data)-1;
int system_10_data=0;
int i;
for (i=k; i>=0; i--) {
int temp;
if (data[i]>=48 && data[i]<=57) { //0-9
temp=data[i]-48;
}else{
temp=data[i]-55; //A-Z的ASCII碼值65-90,所以減55變成10-35
}
system_10_data+=temp*pow(system, k-i); // double pow(double x, double y) 返回 x 的 y 次冪,即 xy。
}
return system_10_data;
}
int main() {
char data[100];
int system;
int newSystem;
int system_10_data;
printf("進位制轉換器,請輸入原資料的進位制(2-36):");
scanf("%d",&system);
getchar();
printf("請輸入要轉換的資料:");
scanf("%s",data);
getchar();
system_10_data=scaleFun(data, system);
printf("請輸入轉換後的資料的進位制:");
scanf("%d",&newSystem);
getchar();
while (system_10_data/newSystem) { //十進位制轉其它進位制,除其它進位制,倒取餘,用商繼續除.
push(data,system_10_data%newSystem );//倒取餘,所以用棧
system_10_data/=newSystem;
}
push(data,system_10_data%newSystem);
printf("轉換後的結果為:\n");
while (top!=-1) {
pop(data);
}
}