注释:批注于图片内。
int char_to_num(char a)
{
if (a >= '0' && a <= '9')
return a - '0';
else
return a - 'A' + 10;
}//该函数用于将字符转换成相应的数字
功能:注释在代码内
char num_to_char(int num)
{
if (num >= 0 && num <= 9)
return (char)('0' + num - 0);
else
return (char)('A' + num - 10);
}//该函数用于将数字转成相应的字符
功能:注释在代码内
int decimal(char n[], int before)
{
int Decimal = 0;
int length;
int i;
for (i = 0; n[i] != '\0'; i++);
length = i;
for (i = 0; i <= length - 1; i++)
Decimal = (Decimal * before) + char_to_num(n[i]);
return Decimal;
}//该函数用于将其他进制数统一转换成十进制数
功能:注释在代码内
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;
}//该函数用于将转化后的十进制数转化换成所需要的进制数
功能:注释在代码内
void reprint(char n[], int length)
{
int i;
for (i = length - 1; i >= 0; i--)
printf("%c", n[i]);
printf("\n");
}//该函数用于逆序输出所需要的进制数
功能:注释在代码内
/*该函数用于判断输入的进制数是否正确*/
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
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;
}
int istrue()函数刚开始写的时候使整个程序都乱了
这个问题的产生是由于我对字符串的知识很陌生,然后通过临时学习了一下字符串的一些知识,询问了其他人,部分代码是由其他人教我写下来了。
对于main函数的内容和子函数的定义
这个问题主要在于自己纠结是要把转换一个一个分开写还是将转换合在一起写,起初本来想要用switch-case分支结构来写;后来由于一直无法执行,就放弃了这个方法。后来就决定把其他的进制一律转化成十进制后再转化为所需要的进制,中间通过百度、看其他同学的博客,然后询问同学才完成这一段程序。
int main()
{
printf("\n****欢迎使用进制转换器****\n");
int flag = 1;
char op[100];
int origin;
int objective;
int integer;/*用来存储字符串转为整型的数据*/
int result;
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;
case 8:
result = decimalism_to_octal(integer);
printf("\n该数的%d进制数为:%d", objective, result);
break;
case 10:
result = integer;
printf("\n该数的%d进制数为:%d", objective, result);
break;
case 16:
printf("\n该数的%d进制数为:",objective);
decimalism_to_hexadecimal(integer);
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;
}
我评价的是黄家雯的代码,这是她的main函数里面有begin和last让程序看起来更加美观,使用了我一直想用的,却无法成功使用的switch-case语句,值得好好参考,学习了解自己为何使用switch-case语句会出错。进一步来说她还使用了system("cls"),使得代码运行更加干净。同时她还使用了goto语句,能够轻松使程序去往begin和last地方,值得学习。
通过这次博客园作业的进制转换器的程序代码,深刻的认识到在自己还没有熟悉一个知识点时,千万不要随意使用,因为后果可能是程序全部混乱,真的会让人崩溃。但是必要的话,可以事先了解,询问其他人得到解答是一个很不错的选择,不要害怕询问问题吧,因为不懂的话,问问题总归会有很大的收获,了解到自己之前对那个知识点的误解,以及学到新的未曾了解到的知识点,收获颇多。
对于函数的总体观点来看,函数是一颗可以循环使用的代码。通过这次转换器的程序编写,我深刻了解到,库函数和自定义函数的使用可以在确保内容正确的基础上大大减少main函数的篇幅长度,使得程序美观。并且使用了函数可以减少修改重复的错误,在没有使用函数的情况下,如果使用复制粘贴,那么被复制的内容有错误,就会需要我们修改很多次,但是如果我们使用的是函数,那么我们只需要修改一次便可以了。
原文:https://www.cnblogs.com/hcy420/p/11830140.html