#include <stdio.h>
#include <stdlib.h>
//定义栈接点
typedef struct Snode
{
int data;
struct Snode *next,*pre;
}LinkStack;
//链队类型定义
typedef struct
{
LinkStack *front;
LinkStack *rear;
}LinkQueue;
//数据进栈
LinkStack *push(LinkStack *ls,int x)
{
LinkStack *top,*p;
top=ls;
p=(LinkStack *)malloc(sizeof(LinkStack));
if(!p) return NULL;
p->data=x;
p->next=NULL;
p->pre=top;
top->next=p;
top=p;
return top;
}
//数制转换
LinkStack *Transferd(int oldNum,int shuzhi)
{
LinkStack *top;
int sz,oldnum,temp;
top=(LinkStack *)malloc(sizeof(LinkStack));
top->next=top->pre=NULL;
oldnum=oldNum;sz=shuzhi;
while(oldnum)
{
temp=oldnum%sz;
oldnum=oldnum/sz;
top=push(top,temp);
}
return top;
}
//数据进入队列
LinkQueue *enQueue(LinkQueue *lqu,int x)
{
LinkStack *p;
LinkQueue *lq;
lq=lqu;
p=(LinkStack *)malloc(sizeof(LinkStack));
p->data=x;
p->next=NULL;
if(lq->rear==NULL)//进来第一个接点
{
lq->front=lq->rear=p;
return lq;
}
else
{
lq->rear->next=p;
lq->rear=p;
return lq;
}
}
//数据出栈,进入队列
LinkQueue *StackToQueue(LinkStack *ls)
{
LinkStack *top;
LinkQueue *lq;
lq=(LinkQueue *)malloc(sizeof(LinkQueue));
lq->front=lq->rear=NULL;
int temp;
top=ls;
while(top)
{
temp=top->data;
top=top->pre;
lq=enQueue(lq,temp);
}
return lq;
}
//输出结果
void print(LinkQueue *lqu,int sz)
{
LinkQueue *p;
p=lqu;
if(p->front==p->rear)
{
printf("队列为空!");
}
else
{
printf("(");
while(p->front!=p->rear)
{
switch(p->front->data)
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default :printf("%d",p->front->data);
}
p->front=p->front->next;
}
printf(")%d",sz);
}
printf("\n");
}
//主函数
void main()
{
LinkStack *ls;
LinkQueue *lq;
int x,y;
printf("请输入要转换的数x和进制y,如果想退出程序请输入0,0:\n");
scanf("%d,%d",&x,&y);
while(x!=0&&y!=0)
{
while(y!=2&&y!=8&&y!=16)
{
printf("\n您输入的进制不符合要求。请重新输入:");
scanf("%d",&y);
}
ls=Transferd(x,y);
lq=StackToQueue(ls);
printf("\n%d转换为%d进制的结果:\n",x,y);
printf("%d=",x);
print(lq,y);
printf("\n请输入要转换的数x和进制y,如果想退出程序请输入0,0:\n");
scanf("%d,%d",&x,&y);
}
}
数制转换(c)
需积分: 0 158 浏览量
更新于2008-05-29
收藏 165KB RAR 举报
在编程领域,尤其是使用C语言时,数制转换是一项基础且重要的技能。数制转换涉及将数字从一种进制表示转换为另一种进制表示。在本项目中,我们看到一个用C语言编写的程序,它实现了不同数制之间的转换,这对于理解和处理二进制、八进制、十进制和十六进制等数据格式非常有用。
让我们了解一下数制的概念。数制是一种计数系统,由一组符号和一套规则组成,用于表示数值。常见的数制包括:
1. **二进制(Binary)**:基于2的计数系统,只有两个符号0和1。在计算机科学中,所有数据和指令最终都会被转换为二进制形式。
2. **八进制(Octal)**:基于8的计数系统,使用0到7这八个数字。在早期的计算机系统中,八进制被广泛使用,因为它可以方便地映射到二进制的三位组合。
3. **十进制(Decimal)**:我们日常生活中最常用的数制,基于10,有十个符号0到9。
4. **十六进制(Hexadecimal)**:基于16的计数系统,使用0到9以及A到F(代表10到15)这十六个符号。在编程中,十六进制常用于表示内存地址和颜色代码,因为每个十六进制数字可以表示四位二进制数,更便于人类阅读。
在C语言中,进行数制转换通常涉及到以下函数:
- `printf` 和 `scanf`:这两个函数是输入/输出的标准库函数,可以用于格式化输出和输入不同数制的数字。
- `%d` 用于输出或输入十进制整数。
- `%o` 用于输出八进制整数。
- `%x` 或 `%X` 用于输出十六进制整数(小写或大写字母)。
- `%i` 或 `%d` 也可以用于输入十进制、八进制或十六进制整数,根据输入的前缀(如0或0x)自动识别。
- `itoa` 和 `strtol`:这些是字符串与整数之间的转换函数。`itoa`(非标准,但常见于某些实现)将整数转换为字符串,`strtol`则将字符串转换为整数,同时支持多种数制。
数制转换的基本算法:
1. **二进制、八进制、十六进制转十进制**:从右向左遍历每一位,按权重累加,权重由基数决定。例如,二进制的1011(从右向左权重为2^0, 2^1, 2^2, 2^3)转换为十进制是1+2+4+8=15。
2. **十进制转其他进制**:除基取余法。用十进制数除以目标进制,得到的余数是新数制的最低位,然后继续用商除以目标进制,直到商为0。所有余数从下往上组成新数制的数字。
在实际编写程序时,我们还需要考虑以下细节:
- 检查输入的有效性,确保符合所选数制的规则。
- 处理负数,负号在转换前后应保持一致。
- 对于大整数,需要考虑溢出问题,可能需要使用长整型或其他大数表示方法。
- 为了提高代码可读性和重用性,可以将转换功能封装为独立的函数。
通过这个“数制转换”项目,我们可以深入理解数字在计算机内部的表示方式,以及如何用C语言实现这些转换。这对于编程初学者来说是一个很好的练习,有助于提高编程能力和对计算机基础的理解。
chuhx
- 粉丝: 15
- 资源: 19
最新资源
- MATLAB代码:考虑V2G的光储充一体化微网多目标优化调度策略 关键词:光储充微网 电电汽车V2G 多目标优化 蓄电池优化 调度 参考文档:光伏微网下考虑V2G补偿蓄电池容量的双目标优化调度策略
- 逆变器仿真 在simulink中搭建了逆变器仿真模型,采用电压电流双闭环前馈解耦控制,采用LC滤波器,输出电压完美的跟随给定,且THD仅1% 整个仿真全部离散化,采用离散解析器,离散PI,控制与采
- 单相逆变器重复控制 采用重复控制与准比例谐振控制相结合的符合控制策略,spwm调制环节采用载波移相控制,进一步降低谐波 仿真中开关频率20k,通过FFT分析,谐波主要分布在40k附近,并没有分布在
- 纯电动汽车Simulink模型;混合动力汽车Simulink模型;染料电池电动汽车Simulink模型 纯电动汽车模型: 制动优先;充电禁止车辆驱动;驱动控制;再生能量回收;紧急停机功能;
- 三菱FX系列FX2N-4AD-PT模拟量控制程序 三菱FX系列FX2N-4AD-PT模拟量控制程序 三菱温度模块,采用FX2N-4AD-PT模拟量模块,由TO FROM应用指令来完成 FX
- 三菱步进电机驱动器控制的定位案例,带有触摸屏程序,plc程序 程序功能实现正反转控制,原点回归,急停报警等 触摸屏有报警显示,故障历史这些常用的画面设置,对控制多轴运动很有帮助,值得去学习一下
- 时间排序启动电机(阀门)功能块 博图程序 多电机均匀 SCL功能块,博图16编写,时间排序启动功能块,scl语言,可用于各种泵站,水处理工况,通过比较运行时间,选择启动最短时间的几台泵,启动泵的台数可
- 西门子plc动态加密计时催款程序 西门子plc编程、面对设备调试完成后迟迟不肯付款的和找各种理由拒绝搪塞验收的客户,必须的采取非常的手段,其中给设备加密定时锁机是一种优选的方案 一来可以提醒
- 卡尔曼滤波四元数姿态角仿真程序,EKF,UKF算法对比,附带C语言压缩包 新增完整的单片机UKF实验项目代码 基于stm32h750+mpu9250+w25q64实现串口输出姿态角度和保存校准参数
- 无感Foc控制 滑模观测器smo 永磁同步电机正弦波控制方案 直流无刷电机 提供stm32 和 dsp源码 提供keil完整工程,不是st电机库 对电机参数不敏感,50%误差依然控制稳定
- 永磁同步电机无感foc 磁链观测器 位置估算源码 正弦波控制方案 直流无刷电机无感foc源码,无感foc算法源码 1 速度估算位置估算的代码所使用变量全部用实际值单位,能非常直观的了解无感控制电机模
- javaShop JAVA版多用户B2B2C商城源码(PC+H5+小程序+APP) 友情提示:此源码需要有java基础的开发人员 JAVA版多用户B2B2C商城源码(PC+H5+小程序+APP) 商
- LabVIEW编写的键盘模块,可移植,源码转出,Ni LabVIEW触摸键盘
- 成熟可量产变频器方案,变频器生产方案, 变频器源码, 变频器方案, 伺服方案, 伺服源码, 伺服代码, 运动控制器源码, 伺服驱动器方案,变频器电路图 由于内容较多,请耐心读完,说不定有你喜欢的
- 小波强制滤波分析的一个demo;对信号进行sym2的两层小波分解,分解后获取信号的低频高频系数,将高频置为0得到重构信号 将重构信号与原始信号求差值,进行正态检验,如果符合正态分布,可以求取差值信号
- 三菱FX自由口通讯程序 三菱FX系列自由口通讯程序 利用FX3U-232BD与上位机自由口通讯, 有PLC程序和触摸屏程序,通过连接三根线即可通讯 具有很好的学习意义和借鉴价值