问题求解要抽象化为数据处理,前提是要有合适的问题模拟与数据表示或事务的数字化,也就是构造合适的数据结构。与此同时,也可以将数据区分为动态的事务性数据和静态的基础数据(常用静态数组或常量数组表示),是否能够构造合适的基础数据,对于问题求解也至关重要。1任意进制数的转换 求n整除d的余数,就能得到n的d进制数的最低位数字,重复上述步骤,直至n为0,依次得到n的d进制数表示的最低位至最高位数字。由各位数字取出相应字符,就能得到n的d进制的字符串。includestdio。h函数trans将无符号整数n翻译成d(2d16)进制表示的字符串sdefineMsizeof(unsignedint)8inttrans(unsignedn,intd,chars〔〕){staticchardigits〔〕0123456789ABCDEF;十六进制数字的字符charbuf〔M1〕;intj,iM;if(d2d16){s〔0〕;不合理的进制,置s为空字符串return0;不合理的进制,函数返回0}buf〔i〕;do{buf〔i〕digits〔nd〕;译出最低位,对应字符存入对应工作数组中nd;}while(n);将译出在工作数组中的字符串复制到sfor(j0;(s〔j〕buf〔i〕)!;j,i);其中控制条件可简写成s〔j〕buf〔i〕returnj;}主函数用于测试函数trans()main(){unsignedintnum253;intscale〔〕{2,3,10,16,1};charstr〔33〕;inti;clrscr();for(i0;isizeof(scale)sizeof(scale〔0〕);i){if(trans(num,scale〔i〕,str))printf(5ds(d),num,str,scale〔i〕);elseprintf(5d(d)Error!,num,scale〔i〕);}printf(Pressanykeytoquit。。。);getch();}2阿拉伯数字转换为罗马数字 将整数n(1n9999)转化成罗马数字。 整数n(1n9999)与罗马数字表示有以下对应关系:1000用一个字符m来表示,有几个1000就用几个m来表示; 900用两个字符cm来表示; 500用一个字符d来表示; 400用两个字符cd来表示; 100用一个字符c来表示;有几个100就用几个c来表示; 90用两个字符xc来表示; 50用一个字符l来表示; 40用两个字符xl来表示; 10用一个字符x来表示;有几个10就用几个x来表示; 9用两个字符iv来表示; 5用一个字符v来表示; 4用两个字符iv来表示; 1用一个字符i来表示;有几个1就用几个i来表示。 为了便于程序处理,将阿拉伯数字与对应的罗马数字表示分存在两个数组中。转换时,从尽可能大的数开始考察,要转换的罗马字符能被当前考察的数相减后仅大于等于0的次数,就是该考察数所对应的罗马数字可连续出现的次数。例如数23,能连续减10两次仅大于等于0,能连续减1三次仅大于等于0,所以其罗马数字有两个字符x和3个字符i,即xxiii。 code:includestdio。hincludestdlib。hincludestring。hdefineROWS4defineCOLS4constintnums〔ROWS〕〔COLS〕{{1000,1000,1000,1000},{900,500,400,100},{90,50,40,10},{9,5,4,1}};constcharroms〔ROWS〕〔COLS〕{{m,m,m,m},{cm,d,cd,c},{xc,l,xl,x},{ix,v,iv,i}};voidD2roman(intdecimal,charroman〔〕);voidchecknum(intval);intmain(){intlow,high;charroman〔25〕;printf(请输入需要转换的范围(十进制数字):);scanf(dd,low,high);if(lowhigh){inttlow;lowhigh;hight;}for(;lowhigh;low){D2roman(low,roman);printf(ds,low,roman);}getchar();getchar();return0;}voidchecknum(intval)检查参数合理性{if(val1val9999){printf(Thenumbermustbeinrange19999);exit(0);}}voidD2roman(intdecimal,charroman〔〕)将整数转换成罗马数字表示{intpower,index;roman〔0〕;for(power0;powerROWS;power)for(index0;indexCOLS;index)while(decimalnums〔power〕〔index〕){strcat(roman,roms〔power〕〔index〕);decimalnums〔power〕〔index〕;}}3从键盘读入实数 将从键盘读入的实数字符列转换成实数:defineERR5defineOK6includestdio。h设实数字符列有以下几种可能形式:数符整数部分数符整数部分。数符整数部分。小数部分数符。小数部分其中数符或为空,或为字符‘’,或为字符‘。’,分别表示不带符号、带正号和带负号。整数部分和小数部分至少要有一个数字符组成。上述实数形式说明,在实数转换过程中,同一字符在不同情况下会有不同的意义。为标记当前实数转换的不同情况,程序引入状态变量,由状态变量的不同值表示当前实数转换过程中的不同情况。共有以下多种不同情况:状态变量为0表示正准备开始转换,还未遇到任何与实数有关的字符;状态变量为1表示已遇数的数符(符号字符);状态变量为2表示正在转换实数的整数部分;状态变量为3表示在未遇数字字符之前先遇小数点,必须要有小数部分;状态变量为4表示在转换整数部分之后遇小数点,这种情况可以没有小数部分;状态变量为5(ERR)表示转换发现错误;状态变量为6(OK)表示转换正常结束。程序将输入字符分成数的符号字符、数字符、小数点、其他字符等几类,各状态遇各类字符后,应变成的新状态,如下所示。数符数字符小数点其他字符状态0123ERR状态1ERR23ERR状态2OK24OK状态3ERR4ERRERR状态4OK4OKOKintstatus;doubleresult,sig,scale;intsign(intc)处理数的符号函数{if(c)若为负号,置负数标记sigsig;}intinteger(intc)转换整数部分,转换一位整数位{resultresult10。0c0;}intdecimal(intc)转换小数部分,转换一位小数位{result(c0)scale;scale10。0;}状态表col:ckind0符号,1数字,2小数点,3其它row:status,constintstatbl〔〕〔4〕{{1,2,3,ERR},status0{ERR,2,3,ERR},status1{OK,2,4,OK},status2{ERR,4,ERR,ERR},status3{OK,4,OK,OK}};status4转换函数表:状态0,1,2遇到数字调用integer;状态3,4遇到数字调用decimalconstint(funtbl〔〕〔4〕)(){{sign,integer,NULL,NULL},状态0遇到符号调用sign{NULL,integer,NULL,NULL},{NULL,integer,NULL,NULL},{NULL,decimal,NULL,NULL},{NULL,decimal,NULL,NULL}};intreadreal(doubledp){intc,ckind;sig1。0;result0。0;scale0。1;while((cgetchar())cc);跳过前导空白符status0;置初始状态for(;;){分类当前字符if(cc)ckind0;数的符号字符elseif(c0c9)ckind1;数字符elseif(c。)ckind2;小数点elseckind3;其它字符if(funtbl〔status〕〔ckind〕)如有转换函数(funtbl〔status〕〔ckind〕)(c);执行相应的函数statusstatbl〔status〕〔ckind〕;设置新的状态if(statusERRstatusOK)break;结束:出错或成功cgetchar();}ungetc(c,stdin);归还数的结束符if(statusOK){dpresultsig;读入数按指针参数赋给相应变量return1;}return1;出错返回}main(){doublex;printf(Pleaseinputrealnumbers(usenonrealchartoendinput):);while(readreal(x)1)printf(Therealnumberyouinputis:f,x);printf(Youhaveinputtednonrealchar。Pressanykeytoquit。。。);getch();} end