浮点数进位制转换器
来源:互联网 发布:证件拍照软件下载 编辑:程序博客网 时间:2024/05/18 15:56
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void work(); //驱动函数
int Menu(); //菜单函数
void AnytoAny(); //任意进位制转换为任意进位制
void ConversionTable(); //任意进位制转换为常用进位制表
void DecimaltoAny(double m,int n); //十进制转换为任意进位制
double AnytoDecimal(char str[],int n); //任意进位制转换为十进制
double t3;
int n,m;
char str[100];
int main() {
printf("\n\n\n\n\n\n\n\n\n");
printf(" +----------------------+\n");
printf(" + 欢迎使用进位制转换器 +\n");
printf(" +----------------------+\n");
printf(" 请按任意键开始!");
getch();
system("cls");
work();
return 0;
}
void work() {
int Choice;
do {
Choice=Menu(); //从菜单中获得功能代码
switch(Choice) {
case '1':
AnytoAny();
break;
case '2':
ConversionTable();
case '0': {
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n");
printf(" 欢迎您再次使用! \n");
}
}
getch();
system("cls");
} while(Choice!='0');
}
int Menu() {
char c;
while(1) {
printf("\n\n\n\n\n\n\n");
printf(" +----------------------------+\n");
printf(" + 1任意进位置间的转换 +\n");
printf(" + 2常用进位置转换表 +\n");
printf(" + 0退出程序 +\n");
printf(" +----------------------------+\n");
printf("\n 请输入操作指令:");
c=getch();
if(c>='0'&&c<='2')
break;
else {
system("cls");
printf(" 请重新选择功能!\n\n");
}
}
return c;
}
void AnytoAny() {
system("cls"); //开始时清屏
printf("请输入待转换数的进制:\n");
scanf("%d",&n);
printf("请输入待转换的数:\n");
getchar(); //消除回车影响
gets(str);
printf("请输入将转换的进位制:\n");
scanf("%d",&m);
t3=AnytoDecimal(str,n); //将输入字符串转换为十进制
printf("转换为%d进制数为:\n",m);
DecimaltoAny(t3,m); //循环将转换后的十进制转换为m进制
getch();
}
void ConversionTable() {
int i;
system("cls"); //开始时清屏
printf("请输入待转换数的进制:\n");
scanf("%d",&n);
printf("请输入待转换的数:\n");
getchar(); //消除回车影响
gets(str);
t3=AnytoDecimal(str,n); //将输入字符串转换为十进制
for(i=2; i<17; i+=2) { //循环将转换后的十进制转换为2,4,6,8,10,12,14,16进制
printf("%d进置:\n",i);
DecimaltoAny(t3,i);
printf("\n");
}
printf("32进置:\n");
DecimaltoAny(t3,32);
printf("\n64进置:\n");
DecimaltoAny(t3,64);
getch();
}
void DecimaltoAny(double m,int n) {
int i=0,j,a,num[99999];
double b=0;
char ch[99999]= {'\0'};
a=(int)m;
do { //用除n取余法获得小数点前的n进制的每一位
num[i]=a%n;
if(num[i]>=10)
ch[i]='A'+num[i]-10;
a=a/n;
i++;
} while(a!=0);
for(j=i-1; j>=0; j--) { //输出整数部分n进制的每一位
if(ch[j]=='\0')
printf("%d",num[j]);
else
printf("%c",ch[j]);
}
printf("."); //小数点单独输出
int sh[99999]= {0};
b=m-(int)m;
i=0;
do { //用乘n取整法获取小数点后n进制的每一位
num[i]=(int)(b*n);
if(num[i]>=10)
sh[i]=65+num[i]-10;
b=b*n-num[i];
i++;
} while(b!=0);
for(j=0; j<i; j++) { //输出小数部分n进制的每一位
if(sh[j]==0)
printf("%d",num[j]);
else
printf("%c",sh[j]);
}
}
double AnytoDecimal(char str[],int n) {
long t1;
int i,t,len;
int j = 0,k=0; /* 声明几个整形变量,下面要用到 */
char lis[1000][1000],a[1000]= {0},b[1000]= {0}; /* 这个是用于存储分离后的各个字符串,二维数组,最多分离出100个字符串,每个字符串的元素最多100个 */
memset(lis,0,sizeof(lis)); /* 使用memset函数,对list中的所有元素赋值为0,sizeof(list)是用于获取list的总占用空间 */
int l=strlen(str);
for(i=0; i<l; ++i) { /* for循环,从0开始,每次循环后,i自增,循环条件是i必须小于str的长度,否则退出循环 */
if(str[i] == '.') { /* 如果str中的第i个字符为逗号 */
lis[j][k] = 0; /* 分离出的第j个字符串中的第k个字符为0,也就是字符串的结束符 */
++j; /* j自增,这就是表示下一个被分离出的字符串的序号 */
k = 0; /* 因为要将字符写到下个被分离出的字符串中,所以要从0开始 */
} else { /* 否则,不是逗号 */
lis[j][k] = str[i]; /* 二维数组list中的第j个字符串的第k个字符是符串str中的第i个字符 */
++k; /* 切换到下一个字符 */
}
}
l=strlen(lis[0]);
int w=strlen(lis[1]);
for(i=0; i<l; i++) //将小数点之前部分用字符数组a保存
a[i]=lis[0][i];
for(i=0; i<w; i++) //将小数点之后部分用字符数组b保存
b[i]=lis[1][i];
strupr(a); //将数组中的小写字母转化为大写字母
len = strlen(a); //求出数组的长度
t1 = 0;
for(i=0; i<len ; i++) {
if((a[i] - '0' >= n && a[i] < 'A') || a[i] - 'A' + 10 >n ) { //判断输入的数据和进制数是否符合
printf("data error!!\n"); //错误
exit (0);
}
if(a[i] >='0' && a[i] <= '9') //判断是否为数字
t = a[i] - '0'; //求出该数字赋值给t
else if (n >=11 && (a[i] >= 'A' && a[i] <= 'A' +n -10)) //判断是否为字母
t = a[i] - 'A' +10; //求出该字母所代表的十进制数
t1 = t1 *n +t; //求出最终转换成的10进制数
}
t=0;
strupr(b);
len=strlen(b);
double t2=0,t3=0;
for(i=len-1; i>=0; i--) {
if((b[i] - '0' >= n && b[i] < 'A') || b[i] - 'A' + 10 >n ) { //判断输入的数据和进制数是否符合
printf("data error!!\n"); //错误
exit (0);
}
if(b[i] >='0' && b[i] <= '9') //判断是否为数字
t = b[i] - '0'; //求出该数字赋值给t
else if (n >=11 && (b[i] >= 'A' && b[i] <= 'A' +n -10)) //判断是否为字母
t = b[i] - 'A' +10;
t2=t2/n+(double)t/n;
}
t3=t1+t2;
return t3;
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void work(); //驱动函数
int Menu(); //菜单函数
void AnytoAny(); //任意进位制转换为任意进位制
void ConversionTable(); //任意进位制转换为常用进位制表
void DecimaltoAny(double m,int n); //十进制转换为任意进位制
double AnytoDecimal(char str[],int n); //任意进位制转换为十进制
double t3;
int n,m;
char str[100];
int main() {
printf("\n\n\n\n\n\n\n\n\n");
printf(" +----------------------+\n");
printf(" + 欢迎使用进位制转换器 +\n");
printf(" +----------------------+\n");
printf(" 请按任意键开始!");
getch();
system("cls");
work();
return 0;
}
void work() {
int Choice;
do {
Choice=Menu(); //从菜单中获得功能代码
switch(Choice) {
case '1':
AnytoAny();
break;
case '2':
ConversionTable();
case '0': {
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n");
printf(" 欢迎您再次使用! \n");
}
}
getch();
system("cls");
} while(Choice!='0');
}
int Menu() {
char c;
while(1) {
printf("\n\n\n\n\n\n\n");
printf(" +----------------------------+\n");
printf(" + 1任意进位置间的转换 +\n");
printf(" + 2常用进位置转换表 +\n");
printf(" + 0退出程序 +\n");
printf(" +----------------------------+\n");
printf("\n 请输入操作指令:");
c=getch();
if(c>='0'&&c<='2')
break;
else {
system("cls");
printf(" 请重新选择功能!\n\n");
}
}
return c;
}
void AnytoAny() {
system("cls"); //开始时清屏
printf("请输入待转换数的进制:\n");
scanf("%d",&n);
printf("请输入待转换的数:\n");
getchar(); //消除回车影响
gets(str);
printf("请输入将转换的进位制:\n");
scanf("%d",&m);
t3=AnytoDecimal(str,n); //将输入字符串转换为十进制
printf("转换为%d进制数为:\n",m);
DecimaltoAny(t3,m); //循环将转换后的十进制转换为m进制
getch();
}
void ConversionTable() {
int i;
system("cls"); //开始时清屏
printf("请输入待转换数的进制:\n");
scanf("%d",&n);
printf("请输入待转换的数:\n");
getchar(); //消除回车影响
gets(str);
t3=AnytoDecimal(str,n); //将输入字符串转换为十进制
for(i=2; i<17; i+=2) { //循环将转换后的十进制转换为2,4,6,8,10,12,14,16进制
printf("%d进置:\n",i);
DecimaltoAny(t3,i);
printf("\n");
}
printf("32进置:\n");
DecimaltoAny(t3,32);
printf("\n64进置:\n");
DecimaltoAny(t3,64);
getch();
}
void DecimaltoAny(double m,int n) {
int i=0,j,a,num[99999];
double b=0;
char ch[99999]= {'\0'};
a=(int)m;
do { //用除n取余法获得小数点前的n进制的每一位
num[i]=a%n;
if(num[i]>=10)
ch[i]='A'+num[i]-10;
a=a/n;
i++;
} while(a!=0);
for(j=i-1; j>=0; j--) { //输出整数部分n进制的每一位
if(ch[j]=='\0')
printf("%d",num[j]);
else
printf("%c",ch[j]);
}
printf("."); //小数点单独输出
int sh[99999]= {0};
b=m-(int)m;
i=0;
do { //用乘n取整法获取小数点后n进制的每一位
num[i]=(int)(b*n);
if(num[i]>=10)
sh[i]=65+num[i]-10;
b=b*n-num[i];
i++;
} while(b!=0);
for(j=0; j<i; j++) { //输出小数部分n进制的每一位
if(sh[j]==0)
printf("%d",num[j]);
else
printf("%c",sh[j]);
}
}
double AnytoDecimal(char str[],int n) {
long t1;
int i,t,len;
int j = 0,k=0; /* 声明几个整形变量,下面要用到 */
char lis[1000][1000],a[1000]= {0},b[1000]= {0}; /* 这个是用于存储分离后的各个字符串,二维数组,最多分离出100个字符串,每个字符串的元素最多100个 */
memset(lis,0,sizeof(lis)); /* 使用memset函数,对list中的所有元素赋值为0,sizeof(list)是用于获取list的总占用空间 */
int l=strlen(str);
for(i=0; i<l; ++i) { /* for循环,从0开始,每次循环后,i自增,循环条件是i必须小于str的长度,否则退出循环 */
if(str[i] == '.') { /* 如果str中的第i个字符为逗号 */
lis[j][k] = 0; /* 分离出的第j个字符串中的第k个字符为0,也就是字符串的结束符 */
++j; /* j自增,这就是表示下一个被分离出的字符串的序号 */
k = 0; /* 因为要将字符写到下个被分离出的字符串中,所以要从0开始 */
} else { /* 否则,不是逗号 */
lis[j][k] = str[i]; /* 二维数组list中的第j个字符串的第k个字符是符串str中的第i个字符 */
++k; /* 切换到下一个字符 */
}
}
l=strlen(lis[0]);
int w=strlen(lis[1]);
for(i=0; i<l; i++) //将小数点之前部分用字符数组a保存
a[i]=lis[0][i];
for(i=0; i<w; i++) //将小数点之后部分用字符数组b保存
b[i]=lis[1][i];
strupr(a); //将数组中的小写字母转化为大写字母
len = strlen(a); //求出数组的长度
t1 = 0;
for(i=0; i<len ; i++) {
if((a[i] - '0' >= n && a[i] < 'A') || a[i] - 'A' + 10 >n ) { //判断输入的数据和进制数是否符合
printf("data error!!\n"); //错误
exit (0);
}
if(a[i] >='0' && a[i] <= '9') //判断是否为数字
t = a[i] - '0'; //求出该数字赋值给t
else if (n >=11 && (a[i] >= 'A' && a[i] <= 'A' +n -10)) //判断是否为字母
t = a[i] - 'A' +10; //求出该字母所代表的十进制数
t1 = t1 *n +t; //求出最终转换成的10进制数
}
t=0;
strupr(b);
len=strlen(b);
double t2=0,t3=0;
for(i=len-1; i>=0; i--) {
if((b[i] - '0' >= n && b[i] < 'A') || b[i] - 'A' + 10 >n ) { //判断输入的数据和进制数是否符合
printf("data error!!\n"); //错误
exit (0);
}
if(b[i] >='0' && b[i] <= '9') //判断是否为数字
t = b[i] - '0'; //求出该数字赋值给t
else if (n >=11 && (b[i] >= 'A' && b[i] <= 'A' +n -10)) //判断是否为字母
t = b[i] - 'A' +10;
t2=t2/n+(double)t/n;
}
t3=t1+t2;
return t3;
}
阅读全文
0 0
- 浮点数进位制转换器
- 递增进位制和递减进位制数
- 全排列-递增进位制数法
- 递减进位制数法—全排列
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 使用hibernate拦截sql语句并输出获取sql语句
- HDU 1001Sum Problem (java)
- C语言运算符
- 理解Java对象序列化
- JPA
- 浮点数进位制转换器
- UUID的使用
- Eclipse创建Web项目
- C语言算术运算符
- 上小班研讨课的感受
- 剑指offer—二叉搜索树的后序遍历序列
- 如何部署高可用的Redis集群架构
- 番外篇:生产要素最适投入分析(Optimum input of factors)
- Calcite-[3]-Adapters