函数+进制转换器v1.0beta

一:运行截图

1.二进制转其他进制,及错误示范

2.八进制转其他进制,及错误示范

3.十进制转其他进制,及错误示范

4.十六进制转其他进制,及错误示范

二:所有函数及其功能

1.char num_to_char(int n)函数

char num_to_char(int n)
{
	if (n >= 0 && n <= 9){
		return (char)('0' + n - 0);
		}
	else{
		return (char)('A' + n - 10);
		}
}//该函数用于将数字转成相应的字符

功能:注释在代码内

2.int char_to_num(char a)函数

int char_to_num(char a)
{
	if (a >= '0' && a <= '9'){
		return a - '0';
		}
	else{
		return a - 'A' + 10;
		}
}//该函数用于将字符转成相应的数字

功能:注释在代码内

3.int decimal(char n[], int before)函数

int decimal(char n[], int before)
{
	int Decimal = 0;
	int len,i;
	for (i = 0; n[i] != '\0'; i++);
	len = i;
	for (i = 0; i <= len - 1; i++){
		Decimal = (Decimal * before) + char_to_num(n[i]);
		}
	return Decimal;
}//该函数用于将其他进制数统一转换成十进制数

功能:注释在代码内

4.int Toafter(char n[], int Decimal, int after)函数

int Toafter(char n[], int Decimal, int after)
{
	int i = 0;
	while (Decimal)
	{
		n[i] = num_to_char(Decimal % after);
		Decimal /= after;
		i++;
	}
	n[i] = '\0';
	return i;
}//该函数用于将转化后的十进制数转化换成所需要的进制数

功能:注释在代码内

5.void reprint(char n[], int len)函数

void reprint(char n[], int len)
{
	int i;
	for (i = len - 1; i >= 0; i--){
		printf("%c", n[i]);
		}
	printf("\n");
}//该函数用于逆序输出所需要的进制数

功能:注释在代码内

6.int istrue(char x[], int before) 函数

/*该函数用于判断输入的进制数是否正确*/
int istrue(char x[], int before) {
	int flag = 1;
	int length = strlen(x);
	int i = 0;
	if (before == 2) {
		do {
			if (x[i] != 49 && x[i] != 48) {
				printf("Error!\n");
				flag = 0;
				break;
			}
			i++;
		} while (i < length);
	}//判断输入对二进制数是否正确
	else if (before == 8) {
		do {
			if (!(x[i] >= 48 && x[i] <= 55)) {
				printf("Error!\n");
				flag = 0;
				break;
			}
			i++;
		} while (i < length);
	}//判断输入的八进制数是否正确
	else if (before == 10) {
		do {
			if (!(x[i] >= 48 && x[i] <= 57)) {
				printf("Error!\n");
				flag = 0;
				break;
			}
			i++;
		} while (i < length);
	}//判断输入的十进制数是否正确
	else {
		do {
			if (!(x[i] >= 48 && x[i] <= 57) && !(x[i] >= 65 && x[i] <= 70) && !(x[i] >= 97 && x[i] <= 102)) {
				printf("Error!\n");
				flag = 0;
				break;
			}
			i++;
		} while (i < length);
	}//判断输入的十六进制数是否正确
	return flag;
}

功能:注释在代码内

三:宏定义

#define MAX 200 

四:展示main函数

int main()
{
	int before, after, length, Decimal, flag;
	int roll = 1;
	char n[MAX], x[MAX];

	while (roll == 1) {
		printf("**请输入阿拉伯数字或者英文字符**\n");
		printf("请输入转换前的数:");
		scanf("%s", &n);
		printf("请输入转换前的进制:");
		scanf("%d", &before);
        //if语句为判断输入是否正确,如果正确则进行转换
		if (istrue(n, before) == 1) {
			printf("请输入转换后的进制:");
			scanf("%d", &after);
			printf("转换后的数是:");
			Decimal = decimal(n, before);
			length = Toafter(n, Decimal, after);
			reprint(n, length);
		}
		printf("输入0结束,输入1继续\n");
		scanf("%d", &roll);
	}
	return 0;
}

五:思维导图

六:遇到的问题及解决方案

1.问题:

int istrue()函数刚开始写的时候使整个程序都乱了

解决方案:

这个问题的产生是由于我对字符串的知识很陌生,然后通过临时学习了一下字符串的一些知识,询问了其他人,部分代码是由其他人教我写下来了。

2.问题:

对于main函数的内容和子函数的定义

解决方案:

这个问题主要在于自己纠结是要把转换一个一个分开写还是将转换合在一起写,起初本来想要用switch-case分支结构来写;后来由于一直无法执行,就放弃了这个方法。后来就决定把其他的进制一律转化成十进制后再转化为所需要的进制,中间通过百度、看其他同学的博客,然后询问同学才完成这一段程序。

3.问题:

竟然忘记了给for和if-else语句后边加上大括号,虽然没有造成什么错误,但是我认为,身为一个新手,把大括号写上是一个非常优秀的习惯,并且不容易出错。

解决方案:

后来仔细审查了一遍把缺少括号的地方都给补了上去。

七:代码互评

int main()
{
	printf("\n****欢迎使用进制转换器****\n");
        //...此处为我删减的她的变量定义部分
	while (flag) {
	    begin:printf("\n请输入您需要转换的数:");
		scanf("%s", op);
		printf("\n该数的原进制为: ");
		scanf("%d", &origin);
		if (inspect(op, origin) == 0)
		{
			error:printf("\n您输入的数据有误\n\n重新输入请按 1 ,结束请按 0 \n");
			int sign;
			scanf("%d", &sign);
			if (sign) 
			{ 
				goto begin;
			}
			else 
			{ 
				goto last; 
			}
		}
		else if (inspect(op, origin))
		{
			
			printf("\n转换的目标进制为: ");
			scanf("%d", &objective);
			if (origin == 16) 
			{
				integer = hexadecimal_to_decimalism(op);
			}
			else 
			{
				integer = wantonly_to_decimalism(atoi(op), origin);	
			}
			switch (objective) 
			{
			case 2:
				result = decimalism_to_binary(integer);
				printf("\n该数的%d进制数为:%d", objective, result);
				break;
	                //...此处为我的删减部分
			default:goto error; break;
			}
		}
		printf("\n继续请按 1 ,退出按 0 .\n");
		scanf("%d", &flag);
		if (flag == 0) { goto last; }
		system("cls");
	}
	last:printf("****谢谢使用本进制转换器****\n");
	return 0;
}

我评价的是 网络1914 黄家雯 的代码(我把她的定义部分删掉了,部分case:语句删减了)这是她的main函数,里面有begin和last让程序看起来更加美观,使用了我一直想用的,却无法成功使用的switch-case语句,值得好好参考,学习了解自己为何使用switch-case语句会出错。进一步来说她还使用了system("cls"),使得代码运行更加干净。同时她还使用了goto语句,能够轻松使程序去往begin和last地方,值得学习。

八:总结

收获:

通过这次博客园作业的进制转换器的程序代码,深刻的认识到在自己还没有熟悉一个知识点时,千万不要随意使用,因为后果可能是程序全部混乱,真的会让人崩溃。但是必要的话,可以事先了解,询问其他人得到解答是一个很不错的选择,不要害怕询问问题吧,因为不懂的话,问问题总归会有很大的收获,了解到自己之前对那个知识点的误解,以及学到新的未曾了解到的知识点,收获颇多。

函数概念的理解:

对于函数的总体观点来看,函数是一颗可以循环使用的代码。通过这次转换器的程序编写,我深刻了解到,库函数和自定义函数的使用可以在确保内容正确的基础上大大减少main函数的篇幅长度,使得程序美观。并且使用了函数可以减少修改重复的错误,在没有使用函数的情况下,如果使用复制粘贴,那么被复制的内容有错误,就会需要我们修改很多次,但是如果我们使用的是函数,那么我们只需要修改一次便可以了。

posted @ 2019-11-10 20:34  羊腿桂鱼yu  阅读(207)  评论(0编辑  收藏  举报