进制转化器!
一.程序的运行截图
二进制转八进制,判断输入的二进制是否正确
八进制转二进制
八进制转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.可以通过设置断点来找程序出错的地方。
对函数的理解
函数可以让你的程序变得十分简洁,不会混乱,合理的运用函数,让你的代码更容易理解,同时也更容易对程序进行修改。