C任意进制转换程序.docx
- 文档编号:6555955
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:14
- 大小:16.83KB
C任意进制转换程序.docx
《C任意进制转换程序.docx》由会员分享,可在线阅读,更多相关《C任意进制转换程序.docx(14页珍藏版)》请在冰豆网上搜索。
C任意进制转换程序
C任意进制转换程序
C语言写的一个任意进制转换的程序,不使用库提供的转换函数./scale.cpp:
定义控制台应用程序的入口点。
//#include"stdafx.h"
#include
#include
#include
#include
#include#defineWIDTH10
#defineDATAWIDTH50
#defineMAX4294967295
#defineCONST_22
#defineCONST_33
#defineCONST_88
#defineCONST_99
#defineCONST_1010
#defineCONST_1616
#defineCHAR_0'0'
#defineCHAR_9'9'
#defineCHAR_A'A'
#defineCHAR_a'a'
#defineCHAR_Z'Z'
#defineCHAR_SPACE''
#defineSTRING_0"0"
#defineSTRING_Z"Z"boolScale();
boolGetSourceScale(int*scale_in);
boolGetObjectScale(int*scale_out);
doubleOtherToDeci(intscale_in,charinputdata[]);
voidDeciToOther(unsignedlongdeci,intscale_out,charoutputdata[]);
boolGetData(chardata[],intCONCOUNT,intflg);
boolGetScale(chartemp[]);
boolGetSource(intin_scale,charinputdata[]);
voidScaleChange(intscale_in,charinputdata[],intscale_out,charoutputdata[]);
voidCleanScreen();int_tmain(intargc,_TCHAR*argv[])
{intflg=0;
charcs[WIDTH];memset(cs,0x00,sizeof(cs));while
(1)
{
printf("-----------------------------------------------------------------\n");
printf("DataTransformBetweenTwoScales\n");
printf("----------------------------------------\n");/*进制转换主函数*/
if(!
Scale())
{
break;
}printf("-----------------------------------------------------------------\n");
printf("inputanykeyandpress'Enter'keytocontinue,'Z'forexit:
");
if(!
GetData(cs,WIDTH,flg))/*判断是否继续执行下一次转换*/
{
break;
}
system("cls");/*清屏*/
}return0;
}boolScale()
{
intscale_in,scale_out;
charinputdata[DATAWIDTH];
charoutputdata[DATAWIDTH];/*输入源数据进制*/
if(!
GetSourceScale(&scale_in))
{
returnfalse;
}/*输入源数据*/
if(!
GetSource(scale_in,inputdata))
{
returnfalse;
}/*输入目标数据进制*/
if(!
GetObjectScale(&scale_out))
{
returnfalse;
}/*进行进制转换*/
ScaleChange(scale_in,inputdata,scale_out,outputdata);returntrue;
}boolGetSourceScale(int*scale_in)/*输入源数据进制*/
{
chartemparray[WIDTH];memset(temparray,0x00,sizeof(temparray));printf("Inputsourcedatascaleandpress'Enter'key(oneof2,8,10,16.'Z'forexit):
\n");
if(!
GetScale(temparray))
{
returnfalse;
}
*scale_in=atoi(temparray);returntrue;
}boolGetObjectScale(int*scale_out)/*输入目标数据进制*/
{
chartemparray[WIDTH];memset(temparray,0x00,sizeof(temparray));printf("Inputobjectdatascaleandpress'Enter'key(oneof2,8,10,16.'Z'forexit):
\n");
if(!
GetScale(temparray))
{
returnfalse;
}
*scale_out=atoi(temparray);returntrue;
}boolGetData(chardata[],intCONCOUNT,intflg)/*输入数据*/
{
inti,icount;
charc;
char*p;
boolspaceFlag;i=0;
icount=0;
spaceFlag=true;
while((c=getchar())!
=0x0a)
{
if(spaceFlag&&c==CHAR_SPACE)/*去掉前空格*/
{
continue;
}if(!
spaceFlag&&c==CHAR_SPACE)/*去掉后空格*/
{
icount++;
continue;
}
elseif(icount>0)
{
if(flg)
{
CleanScreen();
printf("ERROR!
Pleaseinputagain('Z'forexit):
\n");/*输入进制或者源数据时,中间有空格,则重新输入*/
i=0;
icount=0;
spaceFlag=true;
fflush(stdin);
continue;
}
else
{
break;
}
}if(i==CONCOUNT-1)/*判断是否输入数据过长*/
{
if(flg)
{
CleanScreen();
printf("ERROR!
Toomanycharacters.Pleaseinputagain('Z'forexit):
\n");
memset(data,0x00,sizeof(data));
fflush(stdin);
i=0;
continue;
}
else
{
break;
}
}if(c==CHAR_0&&!
strcmp(data,STRING_0))
{
continue;
}data[i]=c;
i++;
spaceFlag=false;
}data[i]='\0';p=data;
if(*p==CHAR_0&&strlen(p)>1)
{
p++;
}
strcpy(data,p);if(strlen(data)&&!
strcmp(data,STRING_Z))
{
returnfalse;
}
returntrue;
}/*输入数据进制*/
boolGetScale(chartemp[])
{
inti,num,kbn_flg;
charscalewidth[WIDTH];
char*s;
boolflag;kbn_flg=1;
flag=false;while(!
flag)
{
memset(scalewidth,0x00,sizeof(scalewidth));
memset(temp,0x00,sizeof(temp));if(!
GetData(scalewidth,WIDTH,kbn_flg))/*输入数据*/
{
returnfalse;
}
s=scalewidth;if(!
strlen(s))/*判断是否输入数据*/
{
CleanScreen();
printf("ERROR!
Pleaseinputthescale(oneof2,8,10,16.'Z'forexit):
\n");
continue;
}i=0;
while(*s)
{
if(*s>=CHAR_0&&*s<=CHAR_9)/*判断是否输入整数*/
{
temp[i]=*s;
i++;
s++;
flag=true;
}
else
{
CleanScreen();
printf("ERROR!
Pleaseinputthescale(oneof2,8,10,16.'Z'forexit):
\n");
flag=false;
break;
}
}
temp[i]='\0';num=0;
if(flag)
{
num=atoi(temp);
if(!
(num==CONST_2||num==CONST_8||num==CONST_10||num==CONST_16))/*判断是否输入合法整数*/
{
CleanScreen();
printf("ERROR!
Pleaseinputthescale(oneof2,8,10,16.'Z'forexit):
\n");
flag=false;
}
}
}
returntrue;
}/*输入源数据*/
boolGetSource(intin_scale,charinputdata[])
{
inti,kbn_flg;
char*s;
charsourcedata[DATAWIDTH];
boolflag;kbn_flg=1;
flag=false;printf("Pleaseinputone%dscaledata('Z'forexit):
\n",in_scale);
while(!
flag)
{
memset(sourcedata,0x00,sizeof(sourcedata));
memset(inputdata,0x00,sizeof(inputdata));if(!
GetData(sourcedata,DATAWIDTH,kbn_flg))/*输入数据*/
{
returnfalse;
}
fflush(stdin);s=sourcedata;if(!
strlen(s))/*判断是否输入数据*/
{
CleanScreen();
printf("ERROR!
Theinputisnotavailable!
Pleaseinputagain('Z'forexit):
\n");
continue;
}i=0;
while(*s)/*判断是否输入合法数据*/
{
if((in_scale>=CONST_2&&in_scale<=CONST_10)&&(CHAR_0<=*s&&*s { inputdata[i]=*s; i++; s++; flag=true; } elseif((in_scale==CONST_16) &&((CHAR_0<=*s&&*s<=CHAR_9) ||(CHAR_A<=*s&&*s<=in_scale+CHAR_A-CONST_10-1) ||(CHAR_a<=*s&&*s<=in_scale+CHAR_a-CONST_10-1))) { inputdata[i]=*s; i++; s++; flag=true; } else { CleanScreen(); printf("ERROR! Theinputisnotavailable! Pleaseinputagain('Z'forexit): \n"); flag=false; break; } } inputdata[i]='\0';if(OtherToDeci(in_scale,inputdata)>(double)MAX) { CleanScreen(); printf("ERROR! Theinputisnotavailable! Pleaseinputagain(lessthan"); switch(in_scale) { caseCONST_2: printf("32bits1."); break; caseCONST_8: printf("37777777777."); break; caseCONST_10: printf("4294967295."); break; caseCONST_16: printf("8bitsForf."); break; } printf("'Z'forexit): \n"); flag=false; continue; } } returntrue; }/*其他进制转换为十进制*/ doubleOtherToDeci(intscale_in,charinputdata[]) { inti,len,midint; doublemiddbl,temp;len=strlen(inputdata); temp=0.00;for(i=0;i { midint=inputdata[i];if(CHAR_0<=midint&&midint<=CHAR_9) { midint=midint-CHAR_0;/*0-9*/ } elseif(CHAR_A<=midint&&midint<=CHAR_Z) { midint=midint-CHAR_A+CONST_10;/*A-Z*/ } else { midint=midint-CHAR_a+CONST_10;/*a-z*/ }middbl=midint*pow(scale_in,len-i-1); temp=temp+middbl; } returntemp; }/*十进制转换为其他进制*/ voidDeciToOther(unsignedlongdeci,intscale_out,charoutputdata[]) { intm,n;m=0; n=0;while(deci) { m=deci%scale_out; if(m>CONST_9) { outputdata[n]=m+CHAR_A-CONST_10; } else { outputdata[n]=m+CHAR_0; } deci=deci/scale_out; n++; }for(m=0;m<=n/2-1;m++)/*反序得到目标数据*/ { chart; t=outputdata[m]; outputdata[m]=outputdata[n-1-m]; outputdata[n-1-m]=t; } outputdata[n]='\0'; }voidPutSource(charinputdata[])/*输出源数据*/ { intk; if(! strcmp(inputdata,STRING_0))/*源数据为0*/ { printf("(Thesourcedatais: 0)\n"); } else { printf("(Thesourcedatais: "); for(k=0;k { printf("%c",inputdata[k]); } printf(")\n"); } }voidScaleChange(intscale_in,charinputdata[],intscale_out,charoutputdata[])/*进制转换*/ { intk; unsignedlongdeci;deci=0;if(scale_in==scale_out)/*原数据进制和目标数据进制相同,不用转换*/ { if(! strcmp(inputdata,STRING_0)) { printf("Theobjectdatais: \n0\n"); } else { printf("Theobjectdatais: \n"); for(k=0;k { printf("%c",inputdata[k]); } printf("\n"); } PutSource(inputdata); } else { if(scale_in==CONST_10) { deci=atol(inputdata);/*源数据是十进制,直接转换为十进制数*/ } else { deci=(unsignedlong)OtherToDeci(scale_in,inputdata);/*其他进制转换为十进制*/ }if(scale_out==CONST_10)/*如果目标进制是十进制,直接输出十进制数*/ { printf("Theobjectdatais: \n%u\n",deci); } else { if(! deci)/*源数据为0*/ { printf("Theobjectdatais: \n0\n"); } else { DeciToOther(deci,scale_out,outputdata);/*十进制转换为其他进制*/printf("Theobjectdatais: \n");/*输出转换后结果*/ for(k=0;k { printf("%c",outputdata[k]); } printf("\n"); } } PutSource(inputdata); } }voidCleanScreen()/*清屏*/ { staticinterrcount=0; errcount++; if(! (errcount%CONST_3)) { errcount=0; system("cls"); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任意 转换 程序