进制转换问题(C语言)数据结构(课设)

进制转换问题

前言:上学期的数据结构课设写的,拿了优秀(代价就是爆肝完拉了两天肚子),代码如下,功能十分齐全。其实只要明白进制转换的过程就能写出来,下面代码分别实现了

1.十进制数转换成任意进制数
2.任意进制数转换成十进制数。
3.任意进制数转换成任意进制数。

注意!!!这些数可以是整数也可以是小数,进制最高能转换到63进制(10对应A,11对应B,依次按照ascll码表往后对照知道结束
注释的也比较齐全,主要用顺序栈写的。看不懂的地方可以评论留言或者私信。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define Stack_Size 100
#define Max_Size 100
#define ok 1
#define no 0
int CTI(char a);
typedef int StackElementType;
/********************************************************
********************创建所需求栈函数********************
********************************************************/
typedef struct
{
    StackElementType elem[Stack_Size];
    int top;
    int base;
}SeqStack;

void InitStack(SeqStack *S)//初始化栈
{
    S->top=0;
    S->base=0;
}

int Push(SeqStack *S,StackElementType x)//进栈,其中x代表的是进栈元素
{
    if(S->top==Stack_Size-1)
        return no;
    S->top++;
    S->base=1;
    S->elem[S->top]=x;
    return ok;
}


int Pop(SeqStack *S/*,StackElementType *x*/)//出栈,x传地址取出值
{
    if(S->top==0)
        return no;
    else
    {
        S->top--;
        return S->elem[S->top];
    }
}

int GetTop(SeqStack *S,StackElementType *x)//得到栈顶元素,与出栈操作区别的只取不去
{
    if(S->top==-1)
        return no;
    else {
        *x=S->elem[S->top];
        return ok;
    }
}
/****************************************************************
*******************分两部分转换进制的功能函数*******************
*****************************************************************/
void FTX(double bi,int x)
{
    printf(".");
    int i,ch,n=0;
    //printf("bi::%lf  %d  ",bi,x);
    while(bi!=0&&n<8)
    {
        bi=x*bi;
        i=(int)bi;
        //printf("   i:%d    ",i);
        bi-=i;
        if(i>9)
        {
            ch='A'+i-10;
            printf("%c",ch);
        }
        else
            printf("%d",i);
        n++;
    }
}
void ITX(int ai,int x)
{
    int z=0,i=0;
    //printf("--%d     %d--",ai,x);
    int zi[Max_Size];
    while(ai)
    {
        z=ai%x;
        ai/=x;
        zi[i++]=z;
    }
    i--;
    for(;i>=0;i--)
    {
        if(zi[i]>9)
            printf("%c",zi[i]+'A'-10);
        else printf("%d",zi[i]);
    }
}
/****************************************************************
**************十进制数转换成任意进制数功能函数******************
*****************************************************************/
void TTA(int test)//十进制数转换成任意进制数功能函数
{
    int ex;
    int count=0,i,j,ai=0;
    double bi=0;
    char a[Max_Size];
    SeqStack S;
    InitStack(&S);
    printf("请输入一个数:");
    scanf("%s",a);
    for(ex=0;ex<strlen(a);ex++)
    {
        if(a[ex]=='.')//防止用小数点进行比较
            continue;
        else if(a[ex]>=(9+'0'))
        {
            printf("输入有误,强制退出程序\n");
            exit(0);
        }
    }
    printf("请输入要转换的进制数:");
    scanf("%d",&i);
    printf("转换之后的数:");
    for(j=0;j<strlen(a);j++)//101.1
    {

        if(a[j]=='.')
        {
            count=j;
            continue;
        }
        Push(&S,a[j]);
    }
    if(count==0)//假如没有输入小数,防止卡死,令count等于j,直接跳过第一个取小数部分的while
        count=j;
    while(S.top!=count)//得到bi
    {
        bi=bi*0.1+(S.elem[S.top]-'0')*0.1;
        Pop(&S);
    }
    while(S.base!=count+1)//得到ai
    {
        ai=ai*10+(S.elem[S.base]-'0');
        S.base++;
    }
    //printf("ai::%d   ",ai);
    ITX(ai,i);
    if(ai==0)
        printf("%c",'0');
    if(bi!=0)
        FTX(bi,i);
    printf("\n");
}
/****************************************************************
*******************任意进制数转换为十进制数*********************
*****************************************************************/
void NTT(test)
{
    int ex;
    int i,j;
    char a[Max_Size];
    double z=0;
    int count = 0;
    SeqStack S;
    InitStack(&S);
    printf("请输入要转换的数字:");
    scanf("%s",a);
    printf("请输入该数字的进制数:");
    scanf("%d",&i);
    for(ex=0;ex<strlen(a);ex++)
    {
        if(a[ex]=='.')//防止用小数点进行比较
            continue;
        else if(a[ex]>(i+'0'))
        {
            printf("输入有误,强制退出程序\n");
            exit(0);
        }
    }
    for(j=0;j<strlen(a);j++){//101.101
        if(a[j]=='.')
        {
            count = -1*(strlen(a) - j - 1);

            continue;
        }
        Push(&S,a[j]);
    }
    while(S.top!=0)
    {
        z+=pow(i,count++)*CTI(S.elem[S.top--]);
        //printf("%d   %lf    %d\n",count,z,S.top);

    }
    printf("转换之后的数:%f\n",z);
    printf("\n");
}
int CTI(char a)
{
    if(a>='A'&&a<='Z')
        {
            a=a-'A'+1+9;
        }
        else
        {
            a=a-'0';
        }
        return a;
}
/********************************************************
******************任意进制转任意进制********************
*********************************************************/
//先将任意进制数转换为十进制
//再将十进制数转换为所需进制数
double XTT(int x)//x是初始进制值
{
    int ex;
    int j;
    char a[Max_Size];
    double z=0;
    int count = 0;
    SeqStack S;
    InitStack(&S);
    printf("请输入要转换的数字:");
    scanf("%s",a);
    for(ex=0;ex<strlen(a);ex++)
    {
        if(a[ex]=='.')//防止用小数点进行比较
            continue;
        else if(a[ex]>(x+'0'))
        {
            printf("输入有误,强制退出程序\n");
            exit(0);
        }
    }
    for(j=0;j<strlen(a);j++){//101.101
        if(a[j]=='.')
        {
            count = -1*(strlen(a) - j - 1);

            continue;
        }
        Push(&S,a[j]);
    }
    while(S.top!=0)
    {
        z+=pow(x,count++)*CTI(S.elem[S.top--]);
    }
    return z;
}

void TTX(double x,int n)//x==a,n==i
{
    int ai=0;
    double bi=0;
    printf("最终转换之后的数:");
    ai=(int)x;
    bi=x-ai;
    ITX(ai,n);
    if(ai==0)
        printf("%c",'0');
    if(bi!=0)
        FTX(bi,n);
    printf("\n");
}


/********************************************************
***********************主函数部分************************
*********************************************************/

int main()
{
    int menu,test=1;
    //int n=1;
    while(1)
    {
        printf("**********************《欢迎使用进制转换系统》********************\n");
        printf("*                                                                *\n");
        printf("*             <请参照目录输入您想实现的功能函数的编号>           *\n");
        printf("*  *-*     *-*     1.十进制数转换为任意进制数     *-*   *-*      *\n");
        printf("*  *-*     *-*     2.任意进制数转换为十进制数     *-*   *-*      *\n");
        printf("*  *-*     *-*     3.任意进制数转换为任意进制数   *-*   *-*      *\n");
        printf("*  *-*     *-*     4.清理界面                     *-*   *-*      *\n");
        printf("*  *-*     *-*     5.退出系统                     *-*   *-*      *\n");
        printf("******************************************************************\n");
        printf("------->");
        scanf("%d",&menu);
        printf("\n");
        switch(menu)
        {
        case 1:
            {
                printf("~~~~~~~~~~~~~~~~现在是十进制数转换为任意进制数模式~~~~~~~~~~~~~~\n");
                TTA(test);
                break;
            }
        case 2:
            {
                printf("~~~~~~~~~~~~~~~现在是任意进制数转换为十进制数模式~~~~~~~~~~~~~~\n\n");
                NTT(test);
                break;
            }
        case 3:
            {
                printf("~~~~~~~~~~~~~~~现在是任意进制数转换为任意进制数数模式~~~~~~~~~~~~~\n");
                int m,n;//m代表初始进制,n代表最终进制,x代表中间值
                double x;
                printf("请输入初始进制值:");
                scanf("%d",&m);

                x=XTT(m);

                printf("请输入最终进制值:");
                scanf("%d",&n);
                TTX(x,n);
                break;//任意进制转任意进制
            }
        case 4:
            {
                system("cls");
                break;
            }
        case 5:exit(0);break;
        default:printf("!!!警告:输入编号有误,请检查后重新输入 !!!\n\n");
        }
    }
    return 0;
}



以上就是全部的代码啦,贴过去就能运行,祝每天过的开心。

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值