📄 x.c
字号:
//进制转换程序FOR 赵振江
//程序编写:扣子
#include "math.h"
#include "conio.h"
#include "hec.h"
#define back textbackground
#define winer 5,8,80,9 /*后面要用到的2、8、10、16进制数窗口的数据*/
#define winba 5,11,48,11
#define winshi 5,13,42,13
#define winshiliu 5,15,38,15
void csh()
{window(1,1,80,25); /*先把屏幕清除,再把光标定位到2列、8行*/
back(0);
clrscr();
gotoxy(2,8);
printf("2:"); /*输出2、8、10、16等数字*/
gotoxy(2,11);
printf("8:");
gotoxy(2,13);
printf("10:");
gotoxy(2,15);
printf("16:");
window(winba); /*8,42bit 先输出8进制数的输入框,再是10、16,最后再是2进制的输入框,这样最后光标就定位到2进制框里*/
back(9);
textcolor(15);
clrscr();
window(winshi); /*10,35bit*/
back(9);
textcolor(15);
clrscr();
window(winshiliu); /*16,32bit*/
back(9);
textcolor(15);
clrscr();
window(winer); /*2,128bit*/
back(9);
textcolor(15);
clrscr();
}
void outresult(char s[],int count,char d)
{int i,b=0;
switch(d)
{case 'e': window(winer); break;
case 'b': window(winba); break;
case 's': window(winshi); break;
case 'l': window(winshiliu); break;}
clrscr();
if (count==-2) /*2、8、16数转为10进制数时,如果超过相应的位数,就返回-2,这里当count是-2时就输出数太大了。*/
printf("The number is too big!");
else
{if (d=='e') /*如果是2进制就话,一串很长,不容易看,所以输出6位数就空一格*/
for (i=0;i<=count;i++)
{if ((i+b)==75) /*如果输出的数和空格有75位了就跳到第2行*/
gotoxy(1,2);
if (i%6==0 && i!=0) /*i!=0是第一次时就不输出空格了*/
{printf("%c",32); b++;}
printf("%c",s[i]);}
else
printf("%s",s); } /*如果不是2进制数就直接输出字符串*/
}
void dinwei(int d)
{switch(d)
{case 1: window(winer); break; /*只要用window函数用一次就可以把光标定在相应的位置*/
case 2: window(winba); break;
case 3: window(winshi); break;
case 4: window(winshiliu); break;}
}
void er(char c)
{char a[130],s[43],s2[10],s3[33]; /*a是存储2进制数据的字符串,s是8进制的,s2是10进制的,s3是16进制的*/
int count=0,sc,s2c,s3c; /*这里sc,s2c,s3c表示的是调用转换函数后8、10、16进制数的位数*/
window(winer); /*重新定位清屏*/
clrscr();
printf("%c",c); /*输出形参c的值,存储到a里去,并使count+1*/
a[count++]=c;
if (count>0) /*这一行本来是原来检查数值是否合要求时所用的一句,把检查放到getkey函数后,这本来是要删的,但想想删的话要影响到下面多行排版问题,且有2、8、10、16四个函数,所以干脆不删了,也不多多少事*/
{while(1)
{c=getch();
if (c==0) {c=getch(); continue;} /*如果按的是功能键的话,就再把功能键的第二字节接收后再撤消这次循环*/
if (c==27) /*是ESC的话就退出循环返到getkey函数*/
{clrscr();
break;}
if (c==13) /*如果输入完成后输入回车就把a的最后一个字节加上'\0'并使到'\0'的字节数减一个,再调用转换函数*/
{a[count--]='\0';
sc=er_ba(a,count,s); /*调用2进制转8进制函数,count告诉他2进制的位数,s存储8进制数的字符串,由er_ba函数返回的值是8进制数的位数*/
outresult(s,sc,'b'); /*得到8进制字符串和位数后再调用outresult(输出)函数,'b'表示要输出的是8进制数,以下类似*/
s2c=er_shi(a,count,s2);
outresult(s2,s2c,'s');
s3c=er_shiliu(a,count,s3);
outresult(s3,s3c,'l');
window(winer); /*调用完后,光标定位到16进制数的位置,我就再定到er进制数的位置*/
break;}
else
{if ((c==48 || c==49) && count<129) /*如果是0或1,和输入的位数小于129位,就显示并存储,实际上你除了第一位数要是0外,后面还可以输出128位数。如果到了第75位数,就跳到第1列、2行我不使用cprintf函数,是因为好象到了第二行用退格键不太行*/
{if (count==75) gotoxy(1,2);
printf("%c",c);
a[count++]=c;}
else
if (c==8) /*如果是退格就删除前一个字节,如果到了75位就跳到1行的最后一列*/
{if (count==75) gotoxy(76,1);
printf("\b \b");
if (count>1)
count--;
else
break;} }
}
}
}
void ba(char c)
{char b[43],s[130],s2[10],s3[33]; /*2进制讲了,其他的就差不多了,格式都一样*/
int count=0,sc,s2c,s3c;
window(winba);
clrscr();
printf("%c",c);
b[count++]=c;
if (count>0)
{while(1)
{c=getch();
if (c==0) {c=getch(); continue;}
if (c==27)
{clrscr();
break;}
if (c==13)
{b[count--]='\0';
sc=ba_er(b,count,s);
outresult(s,sc,'e');
s2c=ba_shi(b,count,s2);
outresult(s2,s2c,'s');
s3c=ba_shiliu(b,count,s3);
outresult(s3,s3c,'l');
window(winba);
break;}
else
{if (c>=48 && c<=55 && count<42)
{printf("%c",c);
b[count++]=c;}
else
if (c==8)
{printf("\b \b");
if (count>1)
count--;
else
break;} } }
}
}
void shi(char c)
{char x[11],s[130],s2[43],s3[33]; /*由于10进制数要先由字符串转成数才能进行转换,所以就只能是十位的长整型了,要是谁能向8进制转为2进制一样直接由字符串转字符串,告诉我一声,谢了*/
int count=0,sc,s2c,s3c;
window(winshi);
clrscr();
x[count++]=c;
printf("%c",c);
if (count>0)
{while(1)
{c=getch();
if (c==0) {c=getch(); continue;}
if (c==27)
{clrscr();
break;}
if (c==13)
{x[count--]='\0';
sc=shi_er(x,count,s);
outresult(s,sc,'e');
s2c=shi_ba(x,count,s2);
outresult(s2,s2c,'b');
s3c=shi_shiliu(x,count,s3);
outresult(s3,s3c,'l');
window(winshi);
break;}
else
{if (c>=48 && c<=57 && count<10)
{printf("%c",c);
x[count++]=c;}
else
if (c==8)
{printf("\b \b");
if (count>1)
count--;
else
break;} } }
}
}
void shiliu(char c)
{int count=0,sc,s2c,s3c;
char n[33],s[130],s2[43],s3[10];
window(winshiliu);
clrscr();
n[count++]=c;
printf("%c",c);
if (count>0)
{while(1)
{c=getch();
if (c==0) {c=getch(); continue;}
if (c==27)
{clrscr();
break;}
if (c==13)
{n[count--]='\0';
sc=shiliu_er(n,count,s);
outresult(s,sc,'e');
s2c=shiliu_ba(n,count,s2);
outresult(s2,s2c,'b');
s3c=shiliu_shi(n,count,s3);
outresult(s3,s3c,'s');
window(winshiliu);
break;}
else
{if ((c>=48 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') && count<32)
{n[count++]=c;
printf("%c",c);}
else
if (c==8)
{printf("\b \b");
if (count>1)
count--;
else
break;} } }
}
}
void getkey()
{int danqiang=1; /*让程序知道当前是在哪个位置,1就是2进制的位置,2是8进制的位置等等*/
int c; /*接收键盘的输入*/
while(1)
{c=getch();
if (c==27) break; /*在循环里一直等待着输入,是ESC(27)时就退出*/
if (c==0) /*如果是上下键就调用dinwei函数*/
{c=getch();
if (danqiang>1 && c==72) /*如果是上,且当前的位置不是2进制,就调用dinwei函数,并danqiang减1*/
dinwei(--danqiang);
if (danqiang<4 && c==80) /*如果是下,且当前的位置不是16进制,就调用dinwei函数,并danqiang加1*/
dinwei(++danqiang);}
else
{if (c>=48 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') /*如果是0-9或a-f,A-F,就按当前的位置调用相应的函数*/
switch(danqiang)
{case 1: if (c==48) er(c); break; /*因为我不可以进行负数之间的转换,所以2进制第一位数必须是0,本来if (c==48)我是放到er函数里去的,可我突然想起,当光标在2进制的位置时,你按其他键时,不管是不是0,getkey函数都会调用er函数,不是0就又返回去,这样当然不好,所以我就把这种检查放到getkey函数里,下面类似*/
case 2: if (c>=49 && c<=55) ba(c); break;
case 3: if (c>=49 && c<=57) shi(c); break;
case 4: if (c>=49 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') shiliu(c); break;} }
}
}
void main()
{csh(); /*调用初始化函数*/
getkey(); /*调用接收键盘函数*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -