用C语言解决数制转换问题
《用C语言解决数制转换问题》 第,页 共17页
用C语言解决数制转换问题
摘 要 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。本课程设计主要使用不同的数据结构解决数制转换的问题。在课程设计中,系统开发平台为Windows7,程序设计设计语言采用C语言,程序运行平台为Windows 98/2000/XP/7。
关键词 程序设计;数制转换;C;课程设计;数据结构
1 引 言
1. 课程设计目的
高速发展的现代社会,计算机浩浩荡荡地成为了人们生活中不可缺少的一部分,帮助人们解决通信,联络,互动等各方面的问题。计算机在处理数字是和人是不同的,计算机使用的是二进制,人们在日常生活中使用十进制,但是在一些特定场合使用其他进制的表示,所以需要进行不同进制之间的转换。本课程设计主要解决不同的进制之间的转换问题,并且采用不同的数据结构进行存储和转换,实现普通的进制之间的转换。
在程序设计中,可以用使用很多种方法解决该问题。例如:数组、栈、递归。不同的方法实现转换的原理基本相同,只是代码的细节不同。 在我的程序中不同的方法所需的函数在一个单独的头文件里面,便以管理和修改。
《用C语言解决数制转换问题》 第,页 共17页 2. 数据结构设计
(1)数组的结构
由于处理简单的情况,最大的数字将不大于整形的范围,在VS2008整形为4个字节,因此开辟的数组为33个元素。
(2)栈的结构
首先定义了一个结构体,结构体中包含栈元素的首地址、栈顶位置、栈顶位置、栈的最大范围。栈元素的存储空间在程序中再动态开辟。和上面一样,栈的最大为33。
(3)递归的结构
递归不需要自己定义存储空间。
3. 算法说明
(1)数组的算法
M进制转十进制:从该M进制数的最后一位开始算,依次列为第0、1、2...n位并分别乘以M的0、1、2...n次方,将得到的次方相加便得到对应的十进制数。由于输入的M进制的数可能出现字符,所以使用了字符数组进行存储。并在输入后将字符全部转换为数字,并存储到全局变量s数组里面,每个数组元素存储一位。
result = 0; i = 0
i小于M进制的字符长度
Y
N
取出数组元素s[i]与M的i次
方相乘,相乘结果加入result
中,i自加1。
函数结束
图3-1 M进制转十进制处理
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图
《用C语言解决数制转换问题》 第,页 共17页
十进制转换为其他进制:首先取x对需要转换的进制n取余,然后再对其取整,将取到的余数存入数组中,然后重复上面的步骤,将得到的余数依次存入数组中,知道x变成0。然后将数组反向输出。输出的数可能大于10,所以进行了必要的判断。
初始化数组元素位置i=0;
x>0?
Y
x除以n,余数存入数组,N
数组下标i后移,商赋值给
x
函数结束
(2)栈的算法
算法思路和上面基本相同,只是将取到的余数依次入栈,输出时只要依次出栈就行。
(3)递归的算法
递归过程中不需要另外的存储取到的余数,只需要在递归返回时输出相应的结果就行。
4. 主要变量
#define MAX 0x7fffffff 定义了整形数的最大值,防止数字溢出。
int m; 用于表示输入的数据是哪个进制的数。
char s[33]; 输入时用于存储输入的十进制数x的m进制表示。
处理过程中用于存储m进制表示的每一位所代表的的数字。
int n; 要将输入的m进制数转换成的进制。
int len; 输入的字符数据有多长。
注:其他变量在程序中均有说明。
5. 主要函数功能
《用C语言解决数制转换问题》 第,页 共17页
表5-1 程序中的函数 函数 功能
int Turn10( int l ); 将m进制的数转换成十进制数 void Turnx( int x ); 将十进制的数转换成n进制数 int CalcRecursion( int k, int c ); 将m进制转换成10进制 void Recursion( int x ); 将十进制数x转换成n进制数 void InitStack( PSTACK s ); 初始化栈
void Push( PSTACK s, int x ); 将一个元素压入栈中 int Pop( PSTACK s ); 取出栈顶元素
void UseStack( int x ); 将十进制数x转换成n进制数 void Convert( char *s ); 将输入的数据转换成数字
6. 调试说明
程序开始运行时提示用户按照规定的输入格式输入数据
图6-1 提示用户按照格式输入需要的数据 对于用户输入的数据,程序中具有检查数据的功能,程序规定原数据的进制不能和需要转
换的进制相同
《用C语言解决数制转换问题》 第,页 共17页
数据的进制不能超过36,因为36后不好表达。
数据中也不能出现除a..z,A..Z,0..9之外的字符
《用C语言解决数制转换问题》 第,页 共17页
m进制数中的每一位不可能大于等于m,否则数据应该是错的。
当数据输入正确时将给出不同进制之间的转换结果
《用C语言解决数制转换问题》 第,页 共17页
输出完成后,程序将正常结束。
6 心得体会
数据结构是一门纯属于设计的科目,它需用把理论变为上机调试。在学习科目的第一节课起,老师就为我们阐述了它的重要性。它对我们来说具有一定的难度。它是其它编程语言的一门基本学科。
刚开始学的时候确实有很多地方我很不理解,每次上课时老师都会给我们出不同的设计题目,对于我们一个初学者来说,无疑是一个具大的挑战,撞了几次壁之后,我决定静下心来,仔细去写程序。老师会给我们需要编程的内容一些讲解,顺着老师的思路,来完成自己的设计,我们可以开始运行自己的程序,可是好多处的错误让人看的可怕,还看不出到底是哪里出现了错误,但是程序还是得继续下去,我多次请教了老师和同学,逐渐能自己找出错误,并加以改正。Visual studio 2008里检查错误有时候真是让你难以找到为什么错。经过了这次课程设计,现在已经可以了解很多错误的原因,这对我来说是一个突破性的进步,眼看着一个个错误通过自己的努力在我眼前消失,觉得很是开心。在这一段努力学习的过程中,我的编程设计有了明显的提高。
虽然程序中不是很完美,但是对于我来说已经不错了,今后还需继续努力。
《用C语言解决数制转换问题》 第,页 共17页
参考文献
[1] 谭浩强. C语言程序设计教程. 北京:清华大学出版社,2008 [2] 严蔚敏,吴伟民. 数据结构(C语言版). 清华大学出版社,2010 [3] 王晓东.计算机算法设计与
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
.电子工业出版社,2007
《用C语言解决数制转换问题》 第,页 共17页
附录1:源程序清单
//程序名称:课程设计.c
//程序功能:分别采用数组、栈、递归实现进制间的转换 //程序作者:黄超
//最后修改日期:2010-6-24
#include
#include
#include
#include "public.h" //公用的函数头文件 #include "array.h" //数组实现转换的头文件 #include "Recursion.h" //递归实现转换的头文件 #include "stack.h" //堆栈实现转换的头文件
int main()
{
int x, i;
while ( 1 )
{
system( "pause" );
system( "cls" );
//提示用户按照正确的格式输入数据
printf( "请输入要转换的数据, 格式:原数据进制 数据 要转换的进制(<=36):\n" );
//读入数据
scanf( "%d%s%d", &m, s, &n );
if ( m == n )
{
printf( "原数据进制应该要转换的进制不同!\n" );
}
else
if ( m>36 || n>36 )
{
《用C语言解决数制转换问题》 第,,页 共17页
printf( "输入的进制超出了可以表达的范围!\n" );
}
else
{
//计算数字用m进制表示时的位数
len = strlen( s ); //数据的位数
for ( i=0; i=58 && s[i]<=64 ) ||
( s[i]>=91 && s[i] <= 96 ) || s[i]>122 )
break;
if ( i != len )
{
printf( "输入的数据中出现不符合要求的字符~\n" );
continue;
}
Convert( s ); //将字符数据转换为数字,并存入数组中
for ( i=0; i m )
break;
if ( i != len )
{
printf( "输入的数据有错误~\n" );
continue;
}
break;
}
}
//计算出x的十进制表示,便以后面的使用
x = Turn10( len );
//输出使用数组计算出的结果
printf( "用数组算出x为:%d\n", x );
《用C语言解决数制转换问题》 第,,页 共17页
//输出使用递归计算出的结果
printf( "用递归算出x为:%d\n", CalcRecursion( len-1, 1 ) );
//转换为其他进制
//x的n进制表示,用数组实现
printf( "%d的%d进制表示(数组计算): ", x, n );
Turnx( x );
//x的n进制表示,用递归实现
printf( "%d的%d进制表示(递归计算): ", x, n );
Recursion( x );
//x的n进制表示,用堆栈实现
printf( "\n%d的%d进制表示(堆栈计算): ", x, n );
UseStack( x );
return 0;
}
//头文件名称:array.h
/****************************************\
*功能:将m进制的数转换成十进制数
*参数:l: s数组元素的个数
\****************************************/
int Turn10( int l )
{
int a[32]={1}, i=0, result;
//数组a存储m的k次幂, result为转换后的十进制数
//当a[i]*m不会超出整形范围
while ( a[i] <= MAX/m )
{
a[i+1] = a[i] * m; //m^(i+1) = m^i * m
++i;
}
i = result = 0; //初始化result
《用C语言解决数制转换问题》 第,,页 共17页
for ( --l; l>=0; --l, ++i ) //当s的下标减少时,a的下标应该增加
{
result += s[l]*a[i]; //将得到的次方乘以x中一位相乘后相加
}
return result; //返回得到的十进制数
}
/****************************************\
*功能:将十进制的数转换成n进制数
*参数:x: 十进制数值
\****************************************/
void Turnx( int x )
{
int i=0, t;
char result[32]; //n进制表示的每一位
while ( x ) //当x不为0时
{
t = x%n; //用t保存x对n的余数,便以下面判断
if ( t > 9 )
result[i++] = t-10+'A'; //大于9的数用字母A..F表示
else
result[i++] = t+'0'; //小于9的数用字符0..9表示
x /= n;
}
for ( --i; i>=0; --i ) //逆向输出每一位
printf( "%c", result[i] );
printf( "\n" );
}
//头文件名称:public.h
#define MAX 0x7fffffff
《用C语言解决数制转换问题》 第,,页 共17页 int m; //输入的数据为哪个进制
int n; //要转换成哪个进制
int len; //输入的字符串的长度
char s[33]; //m进制数
/****************************************\
*功能:将输入的数据转换成数字
*参数:s:输入的x的m进制的字符串指针
\****************************************/ void Convert( char *s )
{
int i = 0; //从字符串的0地址开始
while ( s[i] ) //当s[i]~=0的
{
//字符转换成对应的数字
if ( s[i]>='a' && s[i]<='z' )
s[i] = s[i]-'a'+10;
else
if ( s[i]>='A' && s[i]<='Z' )
s[i] = s[i]-'A'+10;
else
s[i] -= '0';
++i;
}
}
//头文件名称:Recursion.h
/****************************************\
*功能:将m进制转换成10进制
*参数:k:初始化时为s数组元素的个数,递归时为数组的下标
c:m的k-1次方
\****************************************/
《用C语言解决数制转换问题》 第,,页 共17页
int CalcRecursion( int k, int c ) {
if ( k >= 0 ) //下标>=0时
{
//返回k对应的元素乘以对应的次方
return s[k]*c + CalcRecursion( k-1, c*m );
}
else
return 0;
}
/****************************************\
*功能:将十进制数x转换成n进制数
*参数:x:十进制数x
\****************************************/
void Recursion( int x )
{
int t;
if ( x > 0 )
{
Recursion( x/n );
t = x%n;
if ( t > 10 )
printf( "%c", t-10+'A' );
else
printf( "%d", t );
}
}
//头文件名称:stack.h
#include
#define MAXSTACK 33 //堆栈的最大位置
《用C语言解决数制转换问题》 第,,页 共17页
//定义栈数据结构
typedef struct _stack
{
int *addr; //栈的存储地址
int length; //栈的最大长度
int top; //栈顶
int bottom; //栈底
}STACK, *PSTACK;
/****************************************\
*功能:初始化栈
*参数:s:栈的地址
\****************************************/
void InitStack( PSTACK s ) {
s->addr = malloc( MAXSTACK*sizeof( int ) ); //申请空间
s->length = MAXSTACK; //设定栈的最大长度
s->top = -1; s->bottom = 0; //初始化栈指针
}
/****************************************\
*功能:将一个元素压入栈中
*参数:s:栈的地址
x:要压入的元素
\****************************************/
void Push( PSTACK s, int x ) //压入栈
{
++s->top; //栈顶上移
s->addr[s->top] = x; //数据进栈
}
《用C语言解决数制转换问题》 第,,页 共17页
/****************************************\
*功能:取出栈顶元素
*参数:s:栈的地址
\****************************************/
int Pop( PSTACK s ) //弹出数据
{
int t;
t = s->addr[s->top]; //取出栈顶元素
--( s->top ); //栈顶下移
return t; //返回栈顶元素
}
/****************************************\
*功能:将十进制数x转换成n进制数
*参数:x:要转换的十进制数
\****************************************/
void UseStack( int x )
{
STACK s; //定义栈变量
int t;
InitStack( &s ); //初始化堆栈
//当x不为0,将x除n的余数进栈
while ( x )
{
Push( &s, x%n );
x /= n;
}
while ( s.top >= s.bottom ) //未到栈底
{
《用C语言解决数制转换问题》 第,,页 共17页
t = Pop( &s ); //取出栈顶元素
if ( t > 10 ) //判断元素是否大于10
printf( "%c", t-10+'A' ); //输出字符
else
printf( "%d", t ); //输出数字
}
printf( "\n" );
}