还剩6页未读,继续阅读
文本内容:
第章项目式案例8【例
8.1]编程序实现将十进制整数转化为十六进制整数编程思路I根据进制转化的原理,采用除以16取余数的方法进行整数部分的转化2若余数大于9,则需用a到f之间的字母表示,故应使用字符数组存放转化结果3依次将所得余数转化为对应的字符,并存入到字符数组d中4将得到的全部余数前后倒置,然后输出,即得转化结果源程序♦include stdio.h intmainvoid{unsigned long x;unsigned r;char d
[32],t
[32];int i,j;请输入一个十进制正整数printf”;%,scanf lu”x;i=0;whilex0/*整除取余数*/{r=x%16;16ifr10/*若余数小于则转化为对应的数字字符*/d[i]=f0!+r;10,else/★若余数介于到之间,则转化,哇卜伊之间的字母*//*整除d[i]=,al+r-10;1015a x=x/16;取商*/16;i++forj=0;j=i-l;j++/*将得到的全部余数前后倒置*/t[j]=,\Ol;转化为十六进制之后的结果,printf=%s\n”t;return0;【例
8.2]编程序实现将十进制小数转化为十六进制小数编程思路1根据进制转化的原理,采用乘以16取整数的方法进行小数部分的转化2若得到的整数大于9,则需用a到f之间的字母表示,故应使用字符数组存放转化结果3依次将所得整数转化为对应的字符,并存入到字符数组d中4最后输出字符数组d的内容,即得转化结果源程序#include stdio.h intmainvoid{double x;char d
[32];int r,i;”请输入一个十进制纯小数”;printfscanf%lfn,x;i=0;whilex0{x=x*16;/*取整数部分*/r=intx;if r10/*乘以16*//*若整数部分小于则转化为对应的数字字符///*若整d[i]=-0^r;10,d[i]=,a,+r-10;数部分介于到之间,则转化,1到,廿之间的字母*/1015a/*减去整数部分,保留小数部分*/=x-r;/*若转化位数达到位,则中止转化夫/32break;i++;d[i]=,\0,;转化为十六进制之后的结果.招,printf=0s\n”d;return0;1【例
8.3]编程序实现如下功能输入一个小写金额值如
1002307.90;将它的每一位分离出来并存入到一个一维数组中,每个数组元素保存一位数;将它转化为大写金额值并输出如壹佰万贰仟叁佰零柒元玖角整卜首先实现将一个正整数的每一位分离出来,并存入到一个一维数组中源程序♦include stdio.h#include stdio.h intmainvoid{unsigned longx;unsigned d
[32];int i;请输入一个十进制正整数:;printfscanfx;i=0;while x0/*除以取余数存入数组中★/{d[i]=x%10;10d/*除以取商*/x=x/10;10;i++/*臧去多加的i--;1*/分离出来的每一位:;printf/*逆序输出数组中的余数*/“仙;while i=0d{printf一;i return0;若考虑角和分,则小写金额是一个最多包含两位小数的实数,不过可以通过乘以100转化为一个整数单位为分b由此得到调整之后的程序如下♦include stdio.h♦include stdio.h intmainvoid{double xO;unsigned longx;unsigned d
[32];int i;”请输入一个小写金额printf”;%,scanf lf”x0;/*将输入的金额扩大倍”/x=unsigned longx0*100;100i=0;whilex0//除以取余数存入数组中*/{d[i]=x%10;10d/*除以取商*/x=x/10;10;i++/大减去多加的i—;1*/分离出来的每一位;printf/*逆序输出数组中的余数*/while i=0d{printfn%u,n,d[i];一;i return0;该程序运行时,有时候会发现分离出来的末位数比原来的数小1例如,输入
123456.78时,分离出来的末位数是7其原因是将十进制实数转化为二进制形式时,会造成有效数字丢失可以通过输入一个实数之后,加上一个
0.005来进行修正/*将输入的金额扩大倍*/x=unsigned longx0*100+
0.5;100然后实现将分离出来的每一位数字,转化为对应的汉字大写数字#include stdio.hint mainvoid{double xO;unsigned longx;unsigned d
[32];int⑶={”零“「壹“贰“,“叁”肆”,”伍”陆“,”柒”捌”,“玖“};/*因每个汉字视为两char up
[10]个字符,故不能用作字符常量*/{“分角“,”元“,”拾佰“,”仟”,”万拾”,”佰“,”仟亿”,“拾”};char wt
[12]
[3]=printf”请输入一个小写金额;scanf%lf,x0;/*将输入的金额扩大倍*/x=unsigned longx0*100+
0.5;100i=0;whilex0/*除以取余数存入数组中*/{d[i]=x%10;10d/*除以取商//x=x/10;10;/*减去多加的i++i--;1*/”转化为大写金额的结果:;printf“whilei=0/*取出数组的第位数字*/{n=d[i];d i/*输出相应的大写数字*/printf n%s,\up[n];/*根据数字的位置,输出相应的单位*/;printf n%s,\wt[i];i-return0;如何在输出的大写数字之后添加合适的单位呢?可以根据原数字的位置添加相应的单位比如,个位之后是“元”,十位之后是“拾”,依此类推因此,可以预先将各种单位按顺序存入一个二维字符数组中,然后根据原数字的位置,选取相应的单位#include stdio.h intmainvoid{double xO;unsigned longx;unsigned d
[32];int⑶={“零”壹”,“贰“,“叁”肆”,”伍“,”陆”柒”,”捌”,“玖“};/*因每个汉字char up
[10]视为两个字符,故不能用作字符常量*/{“分”角“,”元“,”拾”佰“,”仟”万“,”拾”,”佰”仟”,”亿”,“拾char wt
[12]
[3]=“};”请输入一个小写金额:”;printf%,scanf lf”x0;/*将输入的金额扩大倍//x=unsigned longx0*100+
0.5;100i=0;while x0/*除以取余数存入数组中*/{d[i]=x%10;10d/★除以取商*/x=x/10;10;i++/*减去多加的i--;1*/转化为大写金额的结果;printf”whilei=0/大取出数组的第位数字*/{n=d[i];d i/*输出相应的大写数字*/printf n%sn up[n];z/*根据数字的位置,输出相应的单位*/一;printf n%s\wt[i];i return0;}该程序运行时,若输入
1002307.90,则输出结果为壹佰零拾零万贰仟叁佰零拾柒元玖角零分其中对“零”的处理显然不符合大写金额的规范简单零处理程序不显示所有零,最大只能取到千万#include stdio.h intmainvoid{double xO;unsigned longx;unsigned d
[32];int in;z{“零”壹”,”贰“叁“,”肆”,”伍”陆“,”柒”,”捌“玖;char up
[10]
[3]=/*因每个汉字视为两个字符,故不能用作字符常量*/{“分角“,”元拾”,”佰“,”仟万“,”拾”,”佰仟”,”亿”,“拾“};char wt
[12]
[3]=”请输入一个小写金额:”;printf scanfn%lf x0;z/*将输入的金额扩大倍*/x=unsigned longx0*100+
0.5;100i=0;while x0/*除以取余数存入数组中*/{d[i]=x%10;10d/*除以取商★/x=x/10;10;i++/*减去多加的i--;1*/“转化为大写金额的结果;printf”whilei=0/★取出数组的第位数字*/{n=d[i];d iifn==0{ifi-2%4==0/*根据数字的位置,输出相应的单位*/printf n%s%wt[i];else/*输出相应的大写数字*/{printf*%sn up[n];z/*根据数字的位置,输出相应的单位*/printf n%s\wt[i];一;ireturn0;}完整零处理程序#include stdio.h intmainvoid{double xO;unsigned longx;unsigned d
[32];int i,j,n,fO,fl,z;{“零壹”,“贰“,“叁”肆”,”伍“,”陆”柒”,”捌”,“玖/*因每个汉字视为char up
[10]
[3]=两个字符,故不能用作字符常量*/{“元”拾”,”佰”仟”,”万”拾”,”佰”仟”,”亿”,“拾;”请输char wt
[12]
[3]=printf入一个小写金额;scanf%lf*x0;z/*取出整数部分*/x=unsigned longxO;i=0;while x0/*除以取余数存入数组中★/{d[i]=x%10;10d/★除以取商*/x=x/10;10;i++}/*减去多加的i—;1*/”转化为大写金额的结果”;printfwhilei=0/*取出数组的第位数字*/{n=d[i];d iifn==0/★一组数字中连续零的个数文/{z=0;/*统计一组数字中连续零的个数*/forj=i;;j-{ifd[j]==O z++;else/*最后一个零的位置*/{i=j+l;break;if j%4==0/*最后一个零的位置*/{i=j;break;}switchz{case4:if i%8==0printfH%sn wt[i];break;case3:case2:case1:Aifi%4==0%,printf”s”wt[i];else(零)printf”;}else/*输出相应的大写数字*/{printf,,%s,\up[n];/*根据数字的位置,输出相应的单位*/printf n%s,\wt[i];一;i}return0;为了扩大金额的取值范围,将存储整数部分的变量x的类型改为long longinto最后得到如下完整的包含角和分的程序#include stdio.h intmainvoid{double xOO;unsigned longlongx;int xO;unsigned d
[20]dO
[2];zint{“零”壹“贰“,“叁“,”肆”伍“,”陆”柒”,”捌”,“玖”};char up
[10]
[3]=/*因每个汉字视为两个字符,故不能用作字符常量表/⑶={“元”拾”,”佰“,”仟”万“,”拾“佰“,“仟“,“亿”拾”,”佰”仟”,”万“,char wt
[21]“拾佰“,”仟兆”,”拾”,”佰仟”,“万“};”请输入一个小写金额”;printfscanfn%lfx00;/*取出整数部分*/x=unsigned longlong xOO;x0=intxOO-x*100+
0.5;i=0;whilex0/★整除取余数存入数组中*/{d[i]=x%10;10d/★整除取商*/x=x/10;10;i++/*减去多加的i—;1*/”转化为大写金额的结果;printf”whilei=0/*取出数组的第位数字*/{n=d[i];d iifn==0/★一组数字中连续零的个数*/{z=0;/*统计一组数字中连续零的个数*/forj=i;;j-{if d[j]==O z++;else/*最后一个零的位置*/{i=j+l;break;if j%4==0;/*最后一个零的位置//{i=jbreak;switchz{case4:if i%8==0printf[i];break;case3:case2:case1:ifi%4==0printfn%sn,wt[i];elseprintf nWn;}else%,/*输出相应的大写数字*/{printf”s”up[n];/*根据数字的位置,输出相应的单位*/printf n%sn wt[i];z一;id0[l]=x0/10;d0
[0]=x0%10;ifdO[l]==O{ifdO[O]==O整”;printf else分”,printf H^%s up[dO
[0]];else{printf%s up[dO
[1]];ifd0
[0]==0“整”;printfelse分”,printfn%s up[dO
[0]];return0;。
个人认证
优秀文档
获得点赞 0