一.运行截图
二.拓展功能
检测进制数是否错误,若输错后无需返回菜单重新进行选择进制转换选项,可直接重新输入所需要转换的进制数
三.函数&功能
1.menu函数
void menu() //菜单
{
printf(" \\ 我是菜单 / \n");
printf(" (。ì _ í。) \n");
printf(" ——————十进制转换二进制 [1]—————— \n");
printf(" \\ 十进制转换八进制 [2] / \n");
printf(" \\ 十进制转换十六进制[3] / \n");
printf(" \\ 二进制转换十进制 [4]/ \n");
printf(" /八进制转换十进制 [5]\\ \n");
printf(" 十六进制转换十进制[6] \n");
printf(" 退 出 [0] \n");
printf(" | | \n");
printf(" | | \n");
printf(" _| |_ \n");
printf("\n");
printf("\n");
}
2.zio函数(十进制转二进制)
void zio() //10->2
{
int n,m, c = 1, i = 0;
int a[100];
printf("您的选择是十进制转二进制\n");
printf("输入一个整数:");
scanf("%d", &n);
while(n > 0){
m = n;
a[i] = (m % 2);// 求模放进数组
n = n / 2; //用2辗转相除直至结果为1
i++;
c = 1;
}
while(n < 0){
m = -n;
a[i] = (m % 2);// 求模放进数组
n = n / 2; //用2辗转相除直至结果为1
i++;
c = 0;
}
printf("它的二进制数为 ");
if(c == 1){
for (i = i-1; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
}
if(c == 0){
printf("-");
for (i = i-1; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
}
if(m == 0)
printf("0");
printf("\n");
}
3.zeroone函数(十进制转八进制)
void zeroone() //10->8
{
int n,m, c = 1, i = 0;
int a[100];
printf("您的选择是十进制转八进制\n");
printf("输入一个整数:");
scanf("%d", &n);
while(n > 0){
m = n;
a[i] = (m % 8);// 求模放进数组
n = n / 8; //用8辗转相除直至结果为1
i++;
c = 1;
}
while(n < 0){
m = -n;
a[i] = (m % 8);// 求模放进数组
n = n / 8; //用8辗转相除直至结果为1
i++;
c = 0;
}
printf("它的八进制数为 ");
if(c == 1){
for (i = i-1; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
}
if(c == 0){
printf("-");
for (i = i-1; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
}
if(m == 0)
printf("0");
printf("\n");
}
4.build函数(十进制转十六进制)
void build() //10->16
{
char arr[] = "0123456789ABCDEF";
char hex[16];
int i = 0;
int j = 0;
int n = 0,a = 0,b;
printf("您的选择是十进制转十六进制\n");
printf("请输入一个整数:");
scanf("%d", &n);
b = n;
if(n < 0)
n = -n;
a = n;
while (n)
{
hex[i++] = arr[n % 16]; //将模放进hex数组中
n = n / 16;
}
printf("它的十六进制数为:");
if(b == 0)
printf("0");
if(b<0)
printf("-");
for (j = i - 1; j >= 0; --j)
printf("%c", hex[j]);
printf("\n");
}
5.geiz函数(二进制转十进制)
void geiz() //2->10
{
int n,a;
int sum = 0, i = 0, m;
printf("您的选择是二进制转十进制\n");
printf("请输入一个二进制数: ");
scanf("%d", &n);
if(n%10 >= 2){ //判断输入的是否为二进制数
printf("请检查输入的二进制数=(\n");
return geiz(); //返回该函数进行重新输入
}
a = n;
while (n != 0)
{
m = n % 10;
n /= 10;
sum += m*pow(2, i);
++i;
}
printf("该二进制的十进制为 %d\n",sum);
}
6.woz函数(八进制转十进制)
void woz() //8->10
{
int n, a;
int sum = 0, i = 0, m;
printf("您的选择是八进制转十进制\n");
printf("请输入一个八进制数: ");
scanf("%d", &n);
if(n%10 >= 8){
printf("请检查输入的八进制数=(\n");
return woz();
}
a = n;
while (n != 0)
{
m = n % 10;
n /= 10;
sum += m*pow(8, i);
++i;
}
printf("该八进制数转换为十进制为 %d\n",sum);
}
7.decade函数(十六进制转十进制)
void decade() //16—>10
{
char s[50];
char a[50];
printf("您的选择是十六进制转十进制\n");
printf("请输入一个十六进制数:");
scanf("%s", s);
int t, i, count = 0, j = 0;
long sum = 0;
if (s[0] == '-') {
for (i = 0;s[i];i++) {
a[i] = s[i + 1];
}
for (i = 0;s[i];i++) {
s[i] = a[i];
}
j = 1;
}
for (i = 0;s[i];i++) {
if (s[i] > 'F')
count++;
}
if (count == 0) {
for (i = 0;s[i];i++) {
if (s[i] <= '9')
t = s[i] - '0';
else
t = s[i] - 'A' + 10;
sum = sum * 16 + t;
}
printf("该十六进制数转换为十进制为:");
if (j == 1) {
printf("-");
}
printf("%ld\n",sum);
}
else {
printf("请检查输入的十六进制数=(");
return decade();
}
printf("\n");
}
四.main函数
int main()
{
int x = 0;
while(1)
{
menu();
printf(" ————————————————————————————————————\n");
printf(" 请选择 [1] [2] [3] [4] [5] [6] [0]\n");
printf(" ————————————————————————————————————\n");
scanf("%d", &x);
switch(x)
{
case 1:zio(); //10—>2
break;
case 2:zeroone();//10->8
break;
case 3:build();//10->16
break;
case 4:geiz();//2->10
break;
case 5:woz();//8—>10
break;
case 6:decade();//16->10
break;
case 0:
printf("正在退出...\n");
return 0;
break;
default:
printf("请检查你的选项:(\n");
break;
}
}
return 0;
}
五.函数关系
六.问题解决
1.10->2数组倒序输出问题,需从i-1输出才能得到正确答案
2.10->2正负数判断问题,引入一个标记数更容易在后面的输出判断正负数
3.main程序中做到输出结果后不会立即退出程序,用while(1)循环控制程序进行可保证不会立即退出
4.字符串应为%s而不是%d输入
七.代码互评
//1913杨涛
void Numchange(int m, int b)//将10进制数转化为任意进制数
{
int n = m;
int count = 0;
if (m == 0) printf("0");
while (n != 0)
{
n = n / b;
count++;
}
int number;
for (int i = count; i >= 1; i--)
{
number = m / (int)pow(b, i - 1);
if (number < 10) {
printf("%d", number);
}
else {
printf("%c", number + 55);
}
m = m % (int)pow(b, i - 1);
}
}
利用pow函数配合循环完美输出特定进制的数,不必再继续写多个转换函数。简洁明了,值得学习!
八.总结
加深对函数的理解与循环语句的应用。
善用数组来满足需求。
分离的函数部分使主程序不会过于繁杂,更容易确定问题所在。
相关文章
暂无评论...