最新C任意进制转换程序

合集下载

c语言进制转换算法

c语言进制转换算法

c语言进制转换算法在C语言中,可以使用以下算法进行进制转换:1. 将十进制数转换为任意进制数```c#include <stdio.h>void decimalToBase(int n, int base) {char result[32] = {'\0'}; // 用于存储结果的字符数组int i = 0;while (n > 0) {int remainder = n % base;result[i++] = remainder < 10 ? remainder + '0' : remainder - 10 + 'A'; // 将余数转换为对应的字符存储到结果数组中n = n / base;}for (int j = i - 1; j >= 0; j--) {printf("%c", result[j]); // 从后往前输出结果数组中的字符}}int main() {int n = 102; // 十进制数int base = 16; // 目标进制数printf("Base %d: %s\n", base, decimalToBase(n, base)); // 调用函数进行转换并输出结果return 0;}```这个算法的基本思路是不断地将原数除以目标进制的基数,将余数转换为对应的字符存储到结果数组中,直到原数为0为止。

最后从后往前输出结果数组中的字符即可得到转换后的结果。

2. 将任意进制数转换为十进制数这个算法可以使用类似于上面的算法的逆过程实现,即不断地将原数乘以目标进制的基数,取出整数部分作为新的余数,直到原数为0为止。

最后将所有的余数按照从低位到高位的顺序相加即可得到转换后的十进制数。

c语言各进制转换方法

c语言各进制转换方法

二进制,八进制,十进制,十六进制之间的转换算法一、十进制与二进制之间的转换(1)十进制转换为二进制,分为整数部分和小数部分①整数部分方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。

下面举例:例:将十进制的168转换为二进制得出结果将十进制的168转换为二进制,(10101000)2分析:第一步,将168除以2,商84,余数为0。

第二步,将商84除以2,商42余数为0。

第三步,将商42除以2,商21余数为0。

第四步,将商21除以2,商10余数为1。

第五步,将商10除以2,商5余数为0。

第六步,将商5除以2,商2余数为1。

第七步,将商2除以2,商1余数为0。

第八步,将商1除以2,商0余数为1。

第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000(2)小数部分方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分为零为止。

如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。

换句话说就是0舍1入。

读数要从前面的整数读到后面的整数,下面举例:例1:将0.125换算为二进制得出结果:将0.125换算为二进制(0.001)2分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25;第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5;第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0;第四步,读数,从第一位读起,读到最后一位,即为0.001。

例2,将0.45转换为二进制(保留到小数点第四位)大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。

C语言实现十进制转换为任意进制

C语言实现十进制转换为任意进制

C语言实现十进制转换为任意进制要实现十进制转换为任意进制,可以利用栈的数据结构来实现。

栈是一种先入后出的数据结构,可以方便地进行进制转换操作。

以下是C语言实现十进制转换为任意进制的完整代码:```c#include <stdio.h>#include <stdlib.h>typedef structint top;int capacity;int* array;} Stack;Stack* createStack(int capacity)Stack* stack = (Stack*) malloc(sizeof(Stack));stack->top = -1;stack->capacity = capacity;stack->array = (int*) malloc(stack->capacity * sizeof(int));return stack;int isFull(Stack* stack)return stack->top == stack->capacity - 1;int isEmpty(Stack* stack)return stack->top == -1;void push(Stack* stack, int item)if (isFull(stack))printf("Stack is full, cannot push element.\n");return;}stack->array[++(stack->top)] = item;int pop(Stack* stack)if (isEmpty(stack))printf("Stack is empty.\n");return -1;}return stack->array[(stack->top)--];// Function to convert decimal number to arbitrary basevoid decimalToArbitraryBase(int decimalNumber, int base) Stack* stack = createStack(100); // assuming maximum 100 digitswhile (decimalNumber != 0)int remainder = decimalNumber % base;push(stack, remainder);decimalNumber /= base;}printf("The base-%d representation of the decimal number is: ", base);while (!isEmpty(stack))int digit = pop(stack);if (digit < 10)printf("%d", digit);} elseprintf("%c", 'A' + digit - 10);}}printf("\n");free(stack->array);free(stack);int maiint decimalNumber;int base;printf("Enter decimal number: ");scanf("%d", &decimalNumber);printf("Enter base: ");scanf("%d", &base);decimalToArbitraryBase(decimalNumber, base);return 0;```该代码使用了一个自定义的`Stack`结构来实现栈的基本操作。

转换进制程序C语言,C语言各进制转换源代码

转换进制程序C语言,C语言各进制转换源代码

转换进制程序C语⾔,C语⾔各进制转换源代码#include#include#includevoid ten_two(int);void ten_eight(int);void ten_sixten(int);void two_ten(int);void two_eight(int);void two_sixten(int);void eight_two(int);void eight_ten(int);void eight_sixten(int);void sixten_two(char r[], int k);void sixten_ten(char r[], int k);void sixten_eight(char r[], int k);int main(void){int i, j, number = 0;int temp;char change[10];printf("=============================================================\n");printf(" 欢 迎 使 ⽤ 进 制 转 换 程 序 \n");printf(" 作 者:李 研 时 间:2009 年7 ⽉5 ⽇ \n");printf("=============================================================\n");do{temp = 0;//fflush(stdin);printf("\n请选择转换前的进制:\n2⼆进制\n8⼋进制\n10⼗进\n16⼗六进制\n0退出\n");printf("转换前的进制是:");scanf("%d", &i);case 2:printf("\n请选择转换后的进制:\n2⼆进制\n8⼋进制\n10⼗进\n16⼗六进制\n0退出\n"); printf("转换后的进制是:");scanf("%d", &j);switch(j){case 2:printf("\n同进制之间不⽤转化!\n");temp = 1;break;case 8:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);two_eight(number);temp = 1;break;case 10:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);two_ten(number);temp = 1;break;case 16:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);two_sixten(number);temp = 1;break;case 0:printf("谢谢使⽤!!");}break;printf("转换后的进制是:");scanf("%d", &j);switch(j){case 8:printf("\n同进制之间不⽤转化!\n");temp = 1;break;case 2:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);eight_two(number);temp = 1;break;case 10:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);eight_ten(number);temp = 1;break;case 16:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);eight_sixten(number);temp = 1;break;case 0:printf("谢谢使⽤!!");}break;case 10:printf("\n请选择转换后的进制:\n2⼆进制\n8⼋进制\n10⼗进\n16⼗六进制\n0退出\n");{case 10:printf("\n同进制之间不⽤转化!\n");temp = 1;break;case 2:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);ten_two(number);temp = 1;break;case 8:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);ten_eight(number);temp = 1;break;case 16:printf("\n请输⼊您想要转化的数:");scanf("%d", &number);ten_sixten(number);temp = 1;break;case 0:printf("谢谢使⽤!!");}break;case 16:printf("\n请选择转换后的进制:\n2⼆进制\n8⼋进制\n10⼗进\n16⼗六进制\n0退出\n"); printf("转换后的进制是:");scanf("%d", &j);printf("\n同进制之间不⽤转化!\n"); temp = 1;break;case 2:printf("\n请输⼊您想要转化的数:"); fflush(stdin);gets(change);for(number = 0;; number++){if(change[number] == '\0') break;}sixten_two(change, number);temp = 1;break;case 8:printf("\n请输⼊您想要转化的数:"); fflush(stdin);gets(change);for(number = 0;; number++){if(change[number] == '\0') break;}sixten_eight(change, number); temp = 1;break;case 10:printf("\n请输⼊您想要转化的数:"); fflush(stdin);gets(change);if(change[number] == '\0')break;}sixten_ten(change, number);temp = 1;break;case 0:printf("谢谢使⽤!!");}break;case 0:printf("\n谢谢使⽤!\n");}}while(temp == 1);return 0;}/*以下为: ⼆进制转换为⼗进制,⼋进制,⼗六进制.*/ void two_ten(int a){int i, s = 0;int result = 0;for(i = 1; a != 0; i *= 2){if(a % 10 > 1){s = 1;break;}else{result += (a % 10) * i;}if(s == 1)printf("您的输⼊有误!请重新输⼊\n"); elseprintf("\n转换后的数为:%d\n", result); }void two_eight(int a){int i, j, k, s = 0;int p[30];int result = 0;for(i = 1; a != 0; i *= 2){if(a % 10 > 1){s = 1;break;}else{result += (a % 10) * i;a = a / 10;}}for(j = 0; result != 0; j++){p[j] = result % 8;result = result / 8;}if(s == 1)printf("It is wrong\n");elsefor(k = j - 1; k >= 0; k--) {printf("%d", p[k]);}printf("\n");}}void two_sixten(int a){int i, j, k, s = 0;char p[30];int result = 0;for(i = 1; a != 0; i *= 2){if(a % 10 > 1){s = 1;break;}else{result += (a % 10) * i;a = a / 10;}}for(j = 0; result != 0; j++) {p[j] = result % 16;result = result / 16;if (p[j] > 10){switch(p[j])p[j] = 'A';break;case 11:p[j] = 'B';break;case 12:p[j] = 'C';break;case 13:p[j] = 'D';break;case 14:p[j] = 'E';break;case 15:p[j] = 'F';break;}}else p[j] += 48;}if(s == 1)printf("It is wrong\n"); else{printf("\n转换后的数为:"); for(k = j - 1; k >= 0; k--) {printf("%c", p[k]);}printf("\n");}void eight_two(int a){int i, j, k, s = 0;int result = 0;int p[30];for(i = 1; a != 0; i *= 8){if(a % 10 > 7){s = 1;break;}else{result += (a % 10) * i;a = a / 10;}}for(j = 0; result != 0; j++) {p[j] = result % 2;result = result / 2;}if(s == 1)printf("It is wrong\n"); else{printf("\n转换后的数为:"); for(k = j - 1; k >= 0; k--) {printf("%d", p[k]);}}void eight_ten(int a){int i, s = 0;int result = 0;for(i = 1; a != 0; i *= 8){if(a % 10 > 7){s = 1;break;}else{result += (a % 10) * i;a = a / 10;}}if(s == 1)printf("It is wrong\n");else{printf("\n转换后的数为:%d\n", result); }}void eight_sixten(int a){int i, j, k, s = 0;char p[30];int result = 0;for(i = 1; a != 0; i *= 8){}else{result += (a % 10) * i;a = a / 10;}}for(j = 0; result != 0; j++) {p[j] = result % 16;result = result / 16;if(p[j]p[j] += 48;else{switch(p[j]){case 10:p[j] = 'A';break;case 11:p[j] = 'B';break;case 12:p[j] = 'C';break;case 13:p[j] = 'D';break;case 14:}}}if(s == 1)printf("It is wrong\n");else{printf("\n转换后的数为:");for(k = j - 1; k >= 0; k--){printf("%c", p[k]);}printf("\n");}}/*以下为: ⼗六进制转换为⼗进制,⼆进制,⼋进制.*/ void sixten_ten(char a[], int k){int i, j, s = 0;int result = 0;int b[50];for(i = 0; i{if(a[i] <= '9' && a[i] >= '1'){b[i] = a[i] - 48;}else{case 'B': b[i] = 11; break; case 'C': b[i] = 12; break; case 'D': b[i] = 13; break; case 'E': b[i] = 14; break; case 'F': b[i] = 15; break; case 'a': b[i] = 10; break; case 'b': b[i] = 11; break; case 'c': b[i] = 12; break; case 'd': b[i] = 13; break; case 'e': b[i] = 14;s = 1;}}}for(i = 1, j = k - 1; j >= 0; j--, i *= 16) {result += b[j] * i;}if(s == 1)printf("It is wrong\n");else{printf("\n转换后的数为:%d", result); }}void sixten_two(char a[], int k){int i, j, s = 0;int result = 0;int b[50];int p[30];for(i = 0; i{if(a[i] <= '9' && a[i] >= '1')b[i] = a[i] - 48;else{switch(a[i]){break; case 'C': b[i] = 12; break; case 'D': b[i] = 13; break; case 'E': b[i] = 14; break; case 'F': b[i] = 15; break; case 'a': b[i] = 10; break; case 'b': b[i] = 11; break; case 'c': b[i] = 12; break; case 'd': b[i] = 13; break; case 'e': b[i] = 14; break; case 'f':}}}for(j = k - 1, i = 1; j >= 0; j--, i *= 16) {result += b[j] * i;}for(j = 0; result != 0; j++){p[j] = result % 2;result = result / 2;}if(s == 1)printf("It is wrong\n");else{printf("\n转换后的数为:");for(k = j - 1; k >= 0; k--){printf("%d", p[k]);}printf("\n");}}void sixten_eight(char a[], int k){int i, j, s = 0;int result = 0;int b[30];int p[30];if(a[i] <= '9' && a[i] >= '1') b[i] = a[i] - 48;else{switch(a[i]){case 'A':b[i] = 10;break;case 'B':b[i] = 11;break;case 'C':b[i] = 12;break;case 'D':b[i] = 13;break;case 'E':b[i] = 14;break;case 'F':b[i] = 15;break;case 'a':b[i] = 10;break;case 'b':b[i] = 11;break;case 'c':b[i] = 12;b[i] = 13;break;case 'e':b[i] = 14;break;case 'f':b[i] = 15;break;default:s = 1;}}}for(j = k - 1, i = 1; j >= 0; j--, i *= 16) {result += b[j] * i;}for(j = 0; result != 0; j++){p[j] = result % 8;result = result / 8;}if(s == 1)printf("It is wrong\n");else{printf("\n转换后的数为:");for(k = j - 1; k >= 0; k--){printf("%d", p[k]);}printf("\n");/*以下为: ⼗进制转换为⼆进制,⼋进制,⼗六进制.*/ void ten_two(int a){int j, k;int p[30];for(j = 0; a != 0; j++){p[j] = a % 2;a = a / 2;}printf("\n转换后的数为:");for(k = j - 1; k >= 0; k--){printf("%d", p[k]);}printf("\n");}void ten_eight(int a){int j, k;int p[30];for(j = 0; a != 0; j++){p[j] = a % 8;a = a / 8;}printf("\n转换后的数为:");for(k = j - 1; k >= 0; k--){printf("%d", p[k]);}printf("\n");{int j, k;int p[30];for(j = 0; a != 0; j++) {p[j] = a % 16;a = a / 16;if(p[j]p[j] += 48;else{switch(p[j]){case 10:p[j] = 'A';break;case 11:p[j] = 'B';break;case 12:p[j] = 'C';break;case 13:p[j] = 'D';break;case 14:p[j] = 'E';break;case 15:p[j] = 'F';break;}}}printf("\n转换后的数为:"); for(k = j - 1; k >= 0; k--) {printf("%c", p[k]);}printf("\n");}。

c语言进制转换算法代码

c语言进制转换算法代码

c语言进制转换算法代码c语言的进制转换是研究计算机原理时非常重要的知识,它能够帮助我们更有效更准确的记录信息和处理计算问题。

下面我们就来介绍c语言中进制转换的基本算法代码:一、进制转换的基本步骤1. 确定源进制和目标进制,比如从十进制转换为八进制、十六进制;2. 将源进制数据转换为相应的目标进制数据,比如8进制转换为10进制;3. 将转换后的目标进制数据输出到屏幕或者其他输出设备中。

二、c语言进制转换算法代码1. 八进制转换为十进制:long octalToDecimal(long n){long dec_value = 0; // 十进制数int i = 0;while(n != 0){dec_value += (n%10) * pow(8,i);n = n/10;i++;}return dec_value;}2. 十进制转换为八进制:long DecimalToOctal(long n) {int i=1;long octal_value=0;while (n!=0){octal_value+=(n%8)*i;n/=8;i*=10;}return octal_value;}3. 八进制转换为十六进制:long octalToHexadecimal(long n) {long dec_value = 0; // 十进制数int base = 1;while (n != 0){long temp = n % 10;dec_value += temp * base;n = n / 10;base = base * 8;}// 将十进制数转换为十六进制long rem;long hex_value = 0; // 十六进制数long i = 1;while (dec_value != 0){rem = dec_value % 16;hex_value = hex_value+ rem*i;dec_value = dec_value / 16;i = i * 10;}return hex_value;}4. 十进制转换为十六进制:long DecToHex(long n){long rem,hex=0, i=1;while(n!=0){rem = n % 16;hex = hex + rem * i;n /= 16;i *= 10;}return hex;}总结:以上就是c语言中进制转换的基本算法代码,深入理解这些程序的运行原理,能够帮助我们更深入了解编程的基本原理,也为我们后续c编程奠定更良好的基础。

c语言_各种进制转换

c语言_各种进制转换

c语言各种进制转换计算机中常用的数的进制主要有:二进制、八进制、十六进制。

2进制,用两个阿拉伯数字:0、1;8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯数字:0到9;16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。

字母不区分大小写。

以下简介各种进制之间的转换方法:一、二进制转换十进制例:二进制“1101100”1101100 ←二进制数6543210 ←排位方法例如二进制换算十进制的算法:1*26 + 1*25 + 0*24 + 1*23 + 1* 22 + 0*21 + 0*20↑ ↑说明:2代表进制,后面的数是次方(从右往左数,以0开始)=64+32+0+8+4+0+0=108二、二进制换算八进制例:二进制的“10110111011”换八进制时,从右到左,三位一组,不够补0,即成了:010 110 111 011然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如:010 = 2110 = 4+2 = 6111 = 4+2+1 = 7011 = 2+1 = 3结果为:2673三、二进制转换十六进制十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了,如分解为:0101 1011 1011运算为:0101 = 4+1 = 51011 = 8+2+1 = 11(由于10为A,所以11即B)1011 = 8+2+1 = 11(由于10为A,所以11即B)结果为:5BB四、二进制数转换为十进制数二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所以,设有一个二进制数:0110 0100,转换为10进制为:计算:0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100五、八进制数转换为十进制数八进制就是逢8进1。

c++进制转化代码

c++进制转化代码

c++进制转化代码下面是一个示例的 C++ 代码,用于进行不同进制之间的转换:```cpp#include <iostream>using namespace std;// 十进制转二进制string decimalToBinary(int decimal) {string binary = "";while (decimal > 0) {binary += to_string(decimal % 2);decimal /= 2;}return reverse(binary);}// 十进制转八进制string decimalToOctal(int decimal) {string octal = "";while (decimal > 0) {octal += to_string(decimal % 8);decimal /= 8;}return reverse(octal);}// 十进制转十六进制string decimalToHexadecimal(int decimal) {string hexadecimal = "";while (decimal > 0) {if (decimal % 16 < 10) {hexadecimal += to_string(decimal % 16);} else {hexadecimal += char('A' + decimal % 16 - 10);}decimal /= 16;}return reverse(hexadecimal);}// 二进制转十进制int binaryToDecimal(string binary) {int decimal = 0;for (int i = 0; i < binary.size(); i++) {decimal += (binary[i] - '0') * pow(2, binary.size() - 1 - i);}return decimal;}// 八进制转十进制int octalToDecimal(string octal) {int decimal = 0;for (int i = 0; i < octal.size(); i++) {decimal += (octal[i] - '0') * pow(8, octal.size() - 1 - i);}return decimal;}// 十六进制转十进制int hexadecimalToDecimal(string hexadecimal) {int decimal = 0;for (int i = 0; i < hexadecimal.size(); i++) {if (hexadecimal[i] >= '0' && hexadecimal[i] <= '9') {decimal += (hexadecimal[i] - '0') * pow(16, hexadecimal.size() -1 - i);} else if (hexadecimal[i] >= 'A' && hexadecimal[i] <= 'F') {decimal += (hexadecimal[i] - 'A' + 10) * pow(16, hexadecimal.size() - 1 - i);}}return decimal;}// 主函数int main() {int decimalNumber;cout << "请输入一个十进制数: ";cin >> decimalNumber;cout << "十进制数" << decimalNumber << " 转换为二进制为: " << decimalToBinary(decimalNumber) << endl;cout << "十进制数" << decimalNumber << " 转换为八进制为: " << decimalToOctal(decimalNumber) << endl;cout << "十进制数" << decimalNumber << " 转换为十六进制为: " << decimalToHexadecimal(decimalNumber) << endl;string binaryNumber, octalNumber, hexadecimalNumber;cout << "请输入一个二进制数: ";cin >> binaryNumber;cout << "二进制数" << binaryNumber << " 转换为十进制为: " << binaryToDecimal(binaryNumber) << endl;cout << "请输入一个八进制数: ";cin >> octalNumber;cout << "八进制数" << octalNumber << " 转换为十进制为: " << octalToDecimal(octalNumber) << endl;cout << "请输入一个十六进制数: ";cin >> hexadecimalNumber;cout << "十六进制数 " << hexadecimalNumber << " 转换为十进制为: " << hexadecimalToDecimal(hexadecimalNumber) << endl;return 0;}```在上述代码中,我们定义了三个函数 `decimalToBinary`、`decimalToOctal` 和`decimalToHexadecimal`,用于将十进制数转换为二进制、八进制和十六进制数。

C语言实现任意进制转换

C语言实现任意进制转换

C语言实现任意进制转换任意进制转换是指将一个数从一种进制表示转换为另一种进制表示。

在计算机科学中,常见的进制包括二进制、八进制、十进制和十六进制。

下面我们将以C语言为例,实现任意进制之间的转换。

一、十进制到其他进制的转换1.二进制转换对于一个十进制数,我们可以通过对其进行除2取余的操作,得到其二进制表示。

具体的实现如下:```c#include<stdio.h>void decimalToBinary(int num)int binary[32], i = 0;while (num > 0)binary[i] = num % 2;i++;num /= 2;}for (int j = i - 1; j >= 0; j--)printf("%d", binary[j]);}int mainint decimalNumber;printf("请输入一个十进制数:");scanf("%d", &decimalNumber);printf("转换为二进制数为:");decimalToBinary(decimalNumber);return 0;```2.八进制转换对于十进制数,可以通过对其进行除8取余的操作,得到其八进制表示。

具体的实现如下:```c#include<stdio.h>void decimalToOctal(int num)int octal[100], i = 0;while (num > 0)octal[i] = num % 8;i++;num /= 8;}for (int j = i - 1; j >= 0; j--)printf("%d", octal[j]);}int mainint decimalNumber;printf("请输入一个十进制数:");scanf("%d", &decimalNumber);printf("转换为八进制数为:");decimalToOctal(decimalNumber);return 0;```3.十六进制转换对于一个十进制数,可以通过对其进行除16取余的操作,得到其十六进制表示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C任意进制转换程序C语言写的一个任意进制转换的程序,不使用库提供的转换函数. / scale.cpp : 定义控制台应用程序的入口点。

// #include "stdafx.h"#include#include#include#include#include #define WIDTH 10#define DATAWIDTH 50#define MAX 4294967295#define CONST_2 2#define CONST_3 3#define CONST_8 8#define CONST_9 9#define CONST_10 10#define CONST_16 16#define CHAR_0 '0'#define CHAR_9 '9'#define CHAR_A 'A'#define CHAR_a 'a'#define CHAR_Z 'Z'#define CHAR_SPACE ' '#define STRING_0 "0"#define STRING_Z "Z" bool Scale();bool GetSourceScale(int * scale_in);bool GetObjectScale(int * scale_out);double OtherToDeci(int scale_in,char inputdata[]);void DeciToOther(unsigned long deci,int scale_out,char outputdata[]);bool GetData(char data[],int CONCOUNT,int flg);bool GetScale(char temp[]);bool GetSource(int in_scale,char inputdata[]);void ScaleChange(int scale_in,char inputdata[],intscale_out,char outputdata[]);void CleanScreen(); int _tmain(int argc, _TCHAR* argv[]) { int flg = 0;char cs[WIDTH]; memset(cs,0x00,sizeof(cs)); while(1){printf("-----------------------------------------------------------------\n" );printf(" Data Transform Between Two Scales \n");printf(" ----------------------------------------\n"); /*进制转换主函数*/if(!Scale()){break;}printf("-----------------------------------------------------------------\n" );printf("input any key and press 'Enter' key to continue, 'Z' for exit:");if(!GetData(cs,WIDTH,flg)) /*判断是否继续执行下一次转换*/{break;}system("cls"); /*清屏*/} return 0;} bool Scale(){int scale_in,scale_out;char inputdata[DATAWIDTH];char outputdata[DATAWIDTH]; /*输入源数据进制*/if(!GetSourceScale(&scale_in))return false;} /*输入源数据*/if(!GetSource(scale_in,inputdata)){return false;} /*输入目标数据进制*/if(!GetObjectScale(&scale_out)){return false;} /*进行进制转换*/ScaleChange(scale_in,inputdata,scale_out,outputdata); return true;} bool GetSourceScale(int * scale_in) /*输入源数据进制*/ {char temparray[WIDTH];memset(temparray,0x00,sizeof(temparray)); printf("Input source data scale and press 'Enter' key(one of 2,8,10,16. 'Z' for exit):\n");if(!GetScale(temparray)){return false;*scale_in = atoi(temparray); return true;} bool GetObjectScale(int * scale_out) /*输入目标数据进制*/ {char temparray[WIDTH];memset(temparray,0x00,sizeof(temparray)); printf("Input object data scale and press 'Enter' key(one of 2,8,10,16. 'Z' for exit): \n");if(!GetScale(temparray)){return false;}*scale_out = atoi(temparray); return true;} bool GetData(char data[],int CONCOUNT,int flg) /*输入数据*/{int i,icount;char c;char *p;bool spaceFlag; i = 0;icount = 0;spaceFlag = true;while ((c = getchar()) != 0x0a){if (spaceFlag && c == CHAR_SPACE) /*去掉前空格*/{continue;} if (!spaceFlag && c == CHAR_SPACE) /*去掉后空格*/ {icount++;continue;}else if (icount > 0){if (flg){CleanScreen();printf("ERROR! Please input again('Z' for exit): \n"); /*输入进制或者源数据时,中间有空格,则重新输入*/i = 0;icount = 0;spaceFlag = true;fflush(stdin);continue;else{break;}} if (i == CONCOUNT - 1) /*判断是否输入数据过长*/{if (flg){CleanScreen();printf("ERROR! Too many characters.Please input again('Z' for exit): \n");memset(data,0x00,sizeof(data));fflush(stdin);i = 0;continue;}else{break;}} if (c == CHAR_0 && !strcmp(data,STRING_0))continue;} data[i] = c;i++;spaceFlag = false;} data[i] = '\0'; p = data;if (*p == CHAR_0 && strlen(p) > 1){p++;}strcpy(data,p); if (strlen(data) && !strcmp(data,STRING_Z)) {return false;}return true;} /*输入数据进制*/bool GetScale(char temp[]){int i,num,kbn_flg;char scalewidth[WIDTH];char * s;bool flag; kbn_flg = 1;flag = false; while (!flag){memset(scalewidth,0x00,sizeof(scalewidth));memset(temp,0x00,sizeof(temp)); if(!GetData(scalewidth,WIDTH,kbn_flg)) /*输入数据*/{return false;}s = scalewidth; if (!strlen(s)) /*判断是否输入数据*/{CleanScreen();printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' for exit): \n");continue;} i = 0;while (*s){if (*s >= CHAR_0 && *s <= CHAR_9) /*判断是否输入整数*/{temp[i] = *s;i++;s++;flag = true;}else{CleanScreen();printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' for exit): \n");flag = false;break;}}temp[i] = '\0'; num = 0;if (flag){num = atoi(temp);if (!(num == CONST_2 || num == CONST_8 || num == CONST_10 || num == CONST_16)) /*判断是否输入合法整数*/{CleanScreen();printf("ERROR! Please input the scale(one of 2,8,10,16. 'Z' forexit): \n");flag = false;}}}return true;} /*输入源数据*/bool GetSource(int in_scale,char inputdata[]){int i,kbn_flg;char * s;char sourcedata[DATAWIDTH];bool flag; kbn_flg = 1;flag = false; printf("Please input one %d scale data('Z' for exit): \n",in_scale);while (!flag){memset(sourcedata,0x00,sizeof(sourcedata));memset(inputdata,0x00,sizeof(inputdata));if(!GetData(sourcedata,DATAWIDTH,kbn_flg)) /*输入数据*/ {return false;fflush(stdin); s = sourcedata; if (!strlen(s)) /*判断是否输入数据*/{CleanScreen();printf("ERROR! The input is not available!Please input again('Z' for exit): \n");continue;} i = 0;while(*s) /*判断是否输入合法数据*/{if ((in_scale >= CONST_2 && in_scale <= CONST_10) && ( CHAR_0 <= *s && *s < in_scale + CHAR_0)){inputdata[i] = *s;i++;s++;flag = true;}else if ((in_scale == CONST_16)&& ((CHAR_0 <= *s && *s <= CHAR_9)|| (CHAR_A <= *s && *s <= in_scale + CHAR_A - CONST_10|| (CHAR_a <= *s && *s <= in_scale + CHAR_a - CONST_10 - 1))){inputdata[i] = *s;i++;s++;flag = true;}else{CleanScreen();printf("ERROR! The input is not available!Please input again('Z' for exit):\n");flag = false;break;}}inputdata[i] = '\0'; if (OtherToDeci(in_scale,inputdata) > (double)MAX){CleanScreen();printf("ERROR! The input is not available!Please input again(less than ");switch (in_scale){case CONST_2: printf("32 bits 1.");break;case CONST_8: printf("37777777777.");break;case CONST_10:printf("4294967295.");break;case CONST_16:printf("8 bits F or f.");break;}printf(" 'Z' for exit): \n");flag = false;continue;}}return true;} /*其他进制转换为十进制*/double OtherToDeci(int scale_in,char inputdata[]) {int i,len,midint;double middbl,temp; len = strlen(inputdata);temp = 0.00; for(i = 0;i < len; i++){midint = inputdata[i]; if ( CHAR_0 <= midint && midint <= CHAR_9 ){midint = midint - CHAR_0; /*0-9*/}else if ( CHAR_A <= midint && midint <= CHAR_Z ) {midint = midint - CHAR_A + CONST_10; /*A-Z*/}else{midint = midint - CHAR_a + CONST_10; /*a-z*/} middbl = midint * pow(scale_in,len-i-1);temp = temp + middbl;}return temp;} /*十进制转换为其他进制*/void DeciToOther(unsigned long deci,int scale_out,charoutputdata[]){int m,n; m = 0;n = 0; while (deci){m = deci % scale_out;if (m > CONST_9){outputdata[n] = m + CHAR_A - CONST_10;}else{outputdata[n] = m + CHAR_0;}deci = deci / scale_out;n++;} for (m = 0; m <= n / 2 - 1; m++) /*反序得到目标数据*/ {char t;t = outputdata[m];outputdata[m] = outputdata[n - 1 - m];outputdata[n - 1 - m] = t;}outputdata[n] = '\0';} void PutSource(char inputdata[]) /*输出源数据*/ {int k;if (!strcmp(inputdata,STRING_0)) /*源数据为0*/ {printf("(The source data is: 0)\n");}else{printf("(The source data is: ");for( k = 0; k < strlen(inputdata); k++ ){printf("%c",inputdata[k]);}printf(")\n");}} void ScaleChange(int scale_in,char inputdata[],int scale_out,char outputdata[]) /*进制转换*/{int k;unsigned long deci; deci = 0; if (scale_in == scale_out) /*原数据进制和目标数据进制相同,不用转换*/{if (!strcmp(inputdata,STRING_0)){printf("The object data is: \n0\n");}else{printf("The object data is: \n");for( k = 0; k < strlen(inputdata); k++ ){printf("%c",inputdata[k]);}printf("\n");}PutSource(inputdata);}else{if (scale_in == CONST_10){deci = atol(inputdata); /*源数据是十进制,直接转换为十进制数*/}else{deci = (unsigned long)OtherToDeci(scale_in,inputdata); /*其他进制转换为十进制*/} if (scale_out == CONST_10) /*如果目标进制是十进制,直接输出十进制数*/{printf("The object data is: \n%u \n",deci);}else{if (!deci) /*源数据为0*/{printf("The object data is: \n0\n");}else{DeciToOther(deci,scale_out,outputdata); /*十进制转换为其他进制*/ printf("The object data is: \n"); /*输出转换后结果*/for( k = 0; k < strlen(outputdata); k++ ){printf("%c",outputdata[k]);}printf("\n");}}PutSource(inputdata);}} void CleanScreen() /*清屏*/{static int errcount = 0;errcount++;if(!(errcount % CONST_3)){errcount = 0;system("cls");}}印象剑桥花园别墅一期市政景观工程__________________________________________________ 迷你高尔夫及果园施工组织设计编制单位:上海园林建筑有限公司编制日期:2005年11月收集于网络,如有侵权请联系管理员删除。

相关文档
最新文档