数制转换 C 数据结构课程设计Word格式文档下载.docx
- 文档编号:17866432
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:131.92KB
数制转换 C 数据结构课程设计Word格式文档下载.docx
《数制转换 C 数据结构课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数制转换 C 数据结构课程设计Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
4.1需求分析
1)输入的形式和输入值的范围
•先输入未转换前数的进制:
取值范围只能是2、8、10、16,输入其他数据则提示出错重输。
•再输入该进制的数:
取值范围可以是原进制的整数或小数,根据提供的原数据的数制,通过ASCII码判断每次输入的各个字符是否正确,如:
2进制只能输入1,0和小数点;
8进制只能输入0到7的数和小数点;
10进制只能输入0到9的数和小数点;
16进制只能输入输入0到9的数,A到F的字母和小数点;
输入其他字符则提示出错重输。
2)输出的形式
•分三行分别输出该数其他进制的表示。
3)程序所能达到的功能
•通过键盘输入、文本读取数据,检测输入的数与原进制是否有误;
•将输入的数(可以是整数或小数),转换成除本身的进制数外其他3种进制的数并输出;
•可以在数据转换后,选择是否退出或继续输入数据进行转换。
4)测试数据:
正确的输入及其输出,示例整数:
正确的输入及其输出,示例小数:
含错误的输入及其输出:
4.2概要设计
1)抽象数据类型的定义
typedefstruct{int*b,*top;
intsize;
}Stack;
StackS;
//定义栈
intInitS(Stack&
S)//构造空栈
intClearS(Stack&
S)//释放栈S
intIsEmpty(StackS)//判断栈是否为空,若空返回1,否则返回0
intPush(Stack&
S,inte)//插入元素e为新的栈顶元素
intPop(Stack&
S,int&
e)//删除S的栈顶元素,用e返回其值
charc[1000];
//c[]存入未转换的数
inte,m,n,r,i,j;
//定义全局变量
//e为栈顶元素临时变量,m为要转的进制数,n为转换前数的个数
//r是十进制转M进制的余数,i为自增变量,j存小数点后有几位小数用
floatx,y,z;
//定义全局变量
//x为要转换的十进制,y是转后的10进制数,z是十进制的小数部分
2)主控程序的流程
•首先接收未转换前数的进制m及数据,判断是否非法做出提示;
•用c[]数组接收数据,有小数得记下小数位数j。
当接收的数据为十进制则用float(atof(c))转成小数给全局变量x;
若接收的数据为其他进制数则逐个读取Push(S,c[i])入栈。
•根据全局变量m判断要调用的函数:
DtoM(floata,intb)十进制转换成其他进制的函数,
MtoD()其他进制转换为十进制的函数。
•在DtoM(float,int)函数中,接收形参为要转换的十进制数和要转成的数制。
先判断数据是否有小数,有小数则先转换小数部分的存入zz[]。
输出时先输出转换的整数部分,有小数再读取zz[]逐个输出小数部分。
•在MtoD()函数中,由j判断数据是否有小数,若有小数先转换小数部分。
输出时将转后的小数部分(若有)累加上整数部分输出。
•转换完成后,清除栈,由用户选择是否继续输入数据转换或退出。
3)各程序模块之间的层次关系
voidDtoM(floata,intb)//十进制转换成其他进制的函数
voidMtoD()//其他进制转换为十进制的函数
voidmain()//根据输入数据调用MtoD()和DtoM()函数对数据转换
注:
其他非十进制的数转换时,都先调用MtoD()转成十进制,得到float类型数存入全局变量y,再调用DtoM(y,m)转成需要的进制。
4.3详细设计
•流程图:
•伪代码:
//十进制转换成其他进制的函数DtoM()//
voidDtoM(floata,intb)
{
z=a-(int)a;
//取小数部分
intzz[20];
//存转后的小数部分
i=0;
if(z)//有小数
{
while(z)
{zz[i]=int(z*b);
i++;
z=z*b-int(z*b);
}
n=i;
}
while((int)a)
r=(int)a%b;
if(r>
9)
r=r+55;
Push(S,r);
//压入栈
a=a/b;
//转换成b进制
printf("
\t该数<
%d>
进制的结果是:
"
b);
while(!
IsEmpty(S))
Pop(S,e);
//弹出栈
if(e>
=65)
printf("
%c"
e);
else
%d"
if(i)//有小数
{printf("
."
);
//小数点
for(i=0;
i<
n;
i++)
{printf("
%X"
zz[i]);
}
\n"
return;
//其他进制转换为十进制的函数MtoD()//
voidMtoD()
i=0;
y=0;
if(j)//有小数
while(j)
{
Pop(S,e);
if(e>
e=e-55;
//转字母
else
e=e-48;
//转数字
y+=1/((float)pow(m,j))*e;
//1除(e乘(m的j次方))
j--;
Pop(S,e);
//小数点抛出
e=e-55;
else
e=e-48;
y+=(int)pow(m,i)*e;
//e乘(m的i次方)
i++;
10>
if((int)y==y)
printf("
%.0f\n"
y);
else
%f\n"
//有小数
return;
//-------主函数main()-----//
voidmain()
freopen("
DS1.in"
"
r"
stdin);
DS1.out"
w"
stdout);
//界面功能说明
printf("
\t▉▊▊▋▍▎▏=数制转换器=▏▎▍▋▊▊▉\n"
-[实现2\\8\\10\\16进制数据之间的转换]-\n"
\t|◆先输入未转换前数的数制类型|\n"
\t|◆再输入未转换的数|\n"
\t|<
该数可以是整数或小数>
|\n"
\t|●程序将输出该数的其他进制形式|\n"
\t||\n"
-----------========"
========------------\n"
First:
intf=1;
//判断标识
InitS(S);
//构造一个空栈
\t请输入未转换前数的进制:
while(f)
{if(scanf("
&
m)==EOF||m!
=2&
&
m!
=8&
=10&
=16)
\t▲输入有误,请重新输入<
2or8or10or16>
:
f=0;
\t请输入该数:
Second:
scanf("
%s"
c);
n=strlen(c);
f=0;
//判断标识
for(i=0;
i++)//检查输入格式
switch(m)
{case2:
{if(c[i]>
49||c[i]<
46||c[i]==47)f=1;
break;
case8:
55||c[i]<
case10:
{if(c[i]>
57||c[i]<
case16:
70||(c[i]>
57&
c[i]<
65)||c[i]<
46||c[i]==47)
f=1;
default:
}//有错f=1;
if(f)//检查输入格式是否有误
{
\t▲输入有误,请重新输入:
gotoSecond;
if(m!
=10)//其他进制转换成十进制
{j=0;
{Push(S,c[i]);
if(c[i]=='
.'
)
j=n-1-i;
//存小数位数
else//十进制转换成其他进制
{x=float(atof(c));
//字符串转小数
switch(m)//数制相互转换
case10:
{DtoM(x,2);
DtoM(x,8);
DtoM(x,16);
case2:
{MtoD();
DtoM(y,8);
DtoM(y,16);
case8:
DtoM(y,2);
case16:
default:
ClearS(S);
//释放栈S
\t是否继续?
继续【1】or退出【0】:
f);
if(f)
gotoFirst;
4.4调试分析
⏹难点:
检查输入格式是否有误
⏹解决:
通过ASCII码判断每次输入的各个字符是否正确,如:
16进制只能输入0到9的数,A到F的字母和小数点;
用f判断标识,输入其他字符则将f=1提示出错重输。
⏹代码示例:
main()
{……
i++)//检查输入格式是否有误
case2:
{if(c[i]>
case8:
case10:
case16:
f=1;
}//有错f=1;
……
取未转换十进制的小数部分,并输出转换后的相应的进制格式
使用强制转换,转义符号%X、%.0f
//用强制转换取小数部分
intzz[10];
//用%X逐个输出即为输出相应进制转换后的数
……}
if((int)y==y)
//小数部分没有有效数字,用%.0f去除小数点后的0
求输入数据小数点后有几位
用scanf("
c)将输入数存入数组中,
用n=strlen(c)得到长度,
用j存小数位数:
for(i=0;
i++){if(c[i]=='
)j=n-1-i;
4.5测试结果
●键盘输入输出结果:
•整数转换测试
•小数转换测试
•输入出错测试
●文本输入输出结果:
•//DS1.in整数转换测试
DS1.in
DS1.out
2
1101
1
8
765
10
11
16
4A3
▉▊▊▋▍▎▏=数制转换器=▏▎▍▋▊▊▉
-[实现2\8\10\16进制数据之间的转换]-
||
|◆先输入未转换前数的数制类型|
|◆再输入未转换的数|
|<
|
|●程序将输出该数的其他进制形式|
-----------================------------
请输入未转换前数的进制:
请输入该数:
该数<
13
8>
15
16>
D
是否继续?
501
2>
111110101
1F5
1011
13
B
1187
10010100011
2243
•//DS2.in小数转换测试
DS2.in
DS2.out
1101.1011
765.2
11.125
4A3.2
13.687500
15.54
D.B
501.250000
111110101.01
1F5.4
1011.001
13.1
B.2
1187.125000
10010100011.001
2243.1
•//DS3.in输入出错测试
DS3.in
DS3.out
9
b
12
110
z.2
67
11.a
wd
90.25
89G
A6.5
▲输入有误,请重新输入<
▲输入有误,请重新输入:
6
6
55
110111
37
1011010.01
132.2
5A.4
166.312500
10100110.0101
246.24
4.6用户使用说明
•第一次输入:
未转换前数的进制
(只能输入2或8或10或16,输入其他数据则提示出错重输)
•第二次输入:
该进制的数
(取值范围应当是原进制的整数或小数。
如:
)
•程序将自动分三行分别输出该数其他进制的表示。
【注】:
小数转换的算法不是互逆的。
输入非十进制(2、8、16进制)的小数可以成功转成其他进制的小数;
但不是任意的十进制的小数能完全转成非十进制(2、8、16进制)的小数。
程序目前仍然有Bug,对输入十进制的小数的判断还未完成。
5.总结
通过本次课程设计,我认识到熟练掌握基础算法的重要性,对栈的含义及其基本算法有了更好的理解和应用。
栈“先进后出”的算法加上Push()和Pop()方便了对要转换的数进行读取,和对转换后数倒置的输出。
在编写过程中常遇到的不少问题,例如:
变量类型的转换和ASCII码转义字符的应用,变量的定义和范围,算法循环语句的退出条件等,我通过不断调试,翻阅课本和网上搜索材料得到了解决,也认识到这些细节上的处理更当注意。
在调试时,学会了在有问题的地方注释并能经常使用printf()函数测试输出结果。
在测试时,对测试数据的选取更当考虑全面,能检测错误输入并进行提示。
通过这次实验,我学会运用课本和老师平时讲授知识进行切身实践,通过网络搜索学到了新的库函数,提高了我实际编写程序的能力。
参考文献
[1]宁正元,王秀丽.算法与数据结构[M].北京:
清华大学出版社,2006.01.
[2]宁正元,王秀丽,林大辉.算法与数据结构习题精解和实验指导[M].北京,2007.05.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数制转换 数据结构课程设计 数制 转换 数据结构 课程设计