进制转换器

进制转化器!

一.程序的运行截图

二进制转八进制,判断输入的二进制是否正确

八进制转二进制

八进制转16进制

十六进制转八进制

判断序号输入是否正确,二进制转16进制

二.额外功能

判断输入的数错误后提示输入正确的数,而不是退出程序。

三.运用到的函数

1.用来将16进制数转化为10进制数

long fun(char* s)//16进制转10进制
{
	int i, t;             //t记录临时加的数 
	long sum = 0;
	t = 0;
	for (i = 0;s[i];i++)
	{
		if (s[i] >= '0' && s[i] <= '9')
			t = s[i] - '0';       //当字符是0~9时保持原数不变
		if (s[i] >= 'a' && s[i] <= 'z')
			t = s[i] - 'a' + 10;
		if (s[i] >= 'A' && s[i] <= 'Z')
			t = s[i] - 'A' + 10;
		sum = sum * 16 + t;
	}
	return sum;
}

2.用于将2,8,10进制转化为10进制

int  ten1(int a, int b) // 2,8,10进制转10进制
{
	int t = 0, product = 1;
	while (a != 0) {
		t = t + (a % 10) * product;
		a = a / 10;
		product = product * b;
	}
	return t;
}

3.用于判断2,8,10进制数是否正确

int judge(int m, int n)//m为输入的数,n为数制,用来判断2,8,10进制是否正确
{
	int i, t;
	t = 0;
	int flag;
	flag = 1;
do {
	t = m % 10;
	m /= 10;
	if (t < 0 || t >= n)flag = 0;
} while (m != 0);
	return flag;
}

4.用于判读十六进制数是否正确

int judge16(char a[]) //用来判断16进制数是否正确
{
	int len, i;
	int w = 1;
	len = strlen(a);
	for (i = 0; i < len; i++)
	{
		if (a[i] < '0' || a[i]>'9' || a[i] < 'A' || a[i]>'F') {
			w = 0;
		}
	}
	return w;
}

四.main函数

int main()
{
	int ynumber, ten;
	int choose1, choose2;
	int i, x, y, item;
	item = 0;
	char b[100];
	x = y = 0;
	//输入目标函数
	printf("--------------------------------------------\n");
	printf("请输入你的数制形式\n");
	printf("[1] 二进制\n");
	printf("[2] 八进制\n");
	printf("[3] 十进制\n");
	printf("[4] 十六进制\n");
	printf("--------------------------------------------\n");
begin1:scanf("%d", &choose1);
	//将已知数制转化为数字
	switch (choose1) {
	case 1:x = 2;break;
	case 2:x = 8;break;
	case 3:x = 10;break;
	case 4:x = 16;break;
	default:printf("请选择正确的序号");goto begin1;break;
	}
	printf("请输入你的数:");
	if (choose1 != 4)begin2:scanf("%d", &ynumber);
	else begin3:scanf ("%s", &b[100]);
	//判断输入的数字是否正确
	if (x != 16) {
		if (judge(ynumber, x)==0 ){
			printf("请输入正确的数");
		    goto begin2;
		}
	}
	else {
		if (judge16(b) == 0){
			printf("请输入正确的数");
		    goto begin3;
		}
	}
	//将其转化为10进制数字
	if (x != 16)
	{
		ten = ten1(ynumber, x);
	}
	else {
		int m;
		char s[N];
		ten = fun(s);
	}
	printf("--------------------------------------------\n");
	printf("目标数制形式");
	printf("[1] 二进制\n");
	printf("[2] 八进制\n");
	printf("[3] 十进制\n");
	printf("[4] 十六进制\n");
	printf("--------------------------------------------\n");
began:scanf("%d", &choose2);
	//选择目标的进制
	switch (choose2) {
	case 1:y = 2;break;
	case 2:y = 8;break;
	case 3:y = 10;break;
	case 4:y = 16;break;
	default:printf("请选择正确的序号");goto began;break;
	}
	//转化为目标进制
	if (choose2 == 4) {
		int a[100];
		int q;
		q = 0;
		int yushu;
		int m = 0;
		char hex[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
		while (ten > 0)
		{
			yushu = ten % 16;
			a[q++] = yushu;
			ten = ten / 16;
		}
		printf("转化为十六进制的数为:0x");
		for (q = q - 1;q >= 0;q--)//倒序输出 
		{
			m = a[q];
			printf("%c", hex[m]);
		} printf("\n");
	}
	else {
		int c[100];
		int count = 0;
		do {
			c[count++] = ten % y;
			ten = ten / y;
		} while (ten != 0);

		for (int i1 = count - 1;i1 >= 0;i1--) {
			printf("%d", c[i1]);
		}
	}
	return 0;
}

五.思维导图

六.遇到的问题

1.十六进制转化为10进制,及10进制转化为16进制无从下手

解决:查资料,用字符串来解决相关转化

2.运行函数超时,无法继续进行

解决:设置断点,发现while函数进行条件错误

2.负数问题

解决:目前还没有解决。。。。

4.判断数字是否合法一个函数解决不了

解决:分开变成两个函数。。。。

七.代码互评

张旭

void putmenu(void) {
    puts("^-^欢迎进入进制转换器初始界面!!!\n");
    puts("请选择您要输入的进制类型为:(输入前置代号即可)");
    puts("[1]——二进制数!");
    puts("[2]——八进制数!");
    puts("[3]——十进制数!");
    printf("[4]——十六进制数!\n您的选择是: ");
}
void getmenu(void) {
    puts("\n^-^请选择您要输出的进制类型!!!(输入前置代号即可)");
    puts("[1]——二进制数!");
    puts("[2]——八进制数!");
    puts("[3]——十进制数!");
    printf("[4]——十六进制数!\n您的选择是: ");
}
void hint(int intype) {
    switch (intype) {
    case 1:printf("\n请输入您的二进制数:"); break;
    case 2:printf("\n请输入您的八进制数:"); break;
    case 3:printf("\n请输入您的十进制数:"); break;
    case 4:printf("\n请输入您的十六进制数:"); break;
    default:puts("选择无法识别!!!请重新输入!\n"); break;
    }
}

用函数写菜单,让main函数变得很简洁

int judge(char number[], int intype) {
    if (intype == 1) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] != 48 && number[i] != 49) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 2) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || number[i]>56) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 3) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || number[i]>57) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 4) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || (number[i] > 57 && number[i] < 65) || number[i]>70) {
                return 0;
            }
        }
        return 1;
    }
}

将输入都存入数组中就可以用一个函数判断了,很方便。解决了我的问题

八.总结

收获

1.对数组有了新的理解,发现其很有用。

2.要做一个程序要考虑很多东西,不像PTA那样有针对性,要考虑到可能发生的事。

3.做程序要思路清晰,这样才能让代码不乱。最好再做一下必要的注释,找东西方便。

4.可以通过设置断点来找程序出错的地方。

对函数的理解

函数可以让你的程序变得十分简洁,不会混乱,合理的运用函数,让你的代码更容易理解,同时也更容易对程序进行修改。

posted @ 2019-11-10 20:01  宋林涛  阅读(443)  评论(0编辑  收藏  举报