1.运行程序截图
这是我的运行程序截图,首先我先让使用者选择是哪两种进制进行转换,选择相应路径后,输入想转换的的,最后给你相应进制的答案。
2.建立和使用函数
这是所有进制转换的函数,可以进行四种进制,任意两种相互转换。
3.函数关系思维导图
这是进制转换函数与main函数和其他辅助函数的关系图。
4.各个函数内容和介绍
main函数
#include <stdio.h>
#include <math.h>
int abc (int n);
void erba (char m[10000]);
void ershiliu (char m[10000]);
void ershi (char m[10000]);
void baer (char m[10000]);
void bashiliu (char m[10000]);
void bashi (char m[10000]);
void shiliuer (char m[10000]);
void shiliuba (char m[10000]);
void shiliushi (char m[10000]);
void shier (int n);
void shiba (int n);
void shishiliu (int n);
int a(int n);
int b(int n);
int c(int n);
int main()
{
printf("二进制转换为八进制,请输入1\n二进制转换为十六进制,请输入2\n二进制转换为十进制,请输入3\n");
printf("八进制转换为二进制,请输入4\n八进制转换为十六进制,请输入5\n八进制转换为十进制,请输入6\n");
printf("十六进制转换为二进制,请输入7\n十六进制转换为八进制,请输入8\n十六进制转换为十进制,请输入9\n");
printf("十进制转换为二进制,请输入10\n十进制转换为八进制,请输入11\n十进制转换为十六进制,请输入12\n");
int n,p;
scanf("%d",&n);
char m[10000];
int i,j=0;
if(n==1||n==2||n==3){
scanf("%s",&m);
for(i=0;m[i]!='\0';i++){
if(m[i]<'0'||m[i]>'1'){
j++;
}
}
if(j==0&&n==1){
erba(m);
}else {
if(j==0&&n==2){
ershiliu(m);
}else {
if(j==0&&n==3){
ershi(m);
}else {
printf("ERROR,不是二进制数");
return 0;
}
}
}
}
if(n==4||n==5||n==6){
scanf("%s",&m);
for(i=0;m[i]!='\0';i++){
if(m[i]<'0'||m[i]>'7'){
j++;
}
}
if(j==0&&n==4){
baer(m);
}else {
if(j==0&&n==5){
bashiliu(m);
}else {
if(j==0&&n==6){
bashi(m);
}else {
printf("ERROR,不是八进制数");
return 0;
}
}
}
}
if(n==7||n==8||n==9){
scanf("%s",&m);
for(i=0;m[i]!='\0';i++){
if(m[i]<'0'||m[i]>'9'||m[i]<'A'||m[i]>'F'){
j++;
}
}
if(j==0&&n==7){
shiliuer(m);
}else {
if(j==0&&n==8){
shiliuba(m);
}else {
if(j==0&&n==9){
shiliushi(m);
}else {
printf("ERROR,不是十六进制数");
return 0;
}
}
}
}
if(n==10||n==11||n==12){
scanf("%d",&p);
if(p<0){
j++;
}
if(j==0&&n==10){
shier(p);
}else {
if(j==0&&n==11){
shiba(p);
}else {
if(j==0&&n==12){
shishiliu(p);
}else {
printf("ERROR");
return 0;
}
}
}
}
return 0;
}
这是我的main函数里面的内容,讲4种进制两两转换写到一个函数里面,进行计算,通过使用者选择哪种转换,进入相应的函数做进制转换,并且在进入前先进行判断,你输入的进制格式是否符合相应的进制要求,不符合退出,并给你提示。
二进制转换八进制函数
void erba(char m[10000])
{
int i,j,l=0,a=0,k=0;
int sum=0;
printf("二进制转换为八进制\n");
printf("答案是:");
for(j=0;m[j]!='\0';j++){
a++;
}
if(a<=6){
l=6%a;
}else {
l=3-a%6;
}
m[a+l]='\0';
for(i=a-1;i>=0;i--){
m[i+l]=m[i];
}
for(i=0;i<l;i++){
m[i]='0';
}
//到这进行二进制数三位三位对应八进制数。
for(i=0;m[i]!='\0';i++){
sum+=(m[i]-'0')*pow(2,(2-k));
k++;
if(k%3==0){
printf("%d",sum);
k=0;
sum=0;
}
}
}
这个如函数定义一样,是二进制转换成八进制。应为二进制转换成八进制是,二进制三位为八进制以为,我想进行判断,输入的二进制是否是3的倍数,不是,高位填0;然后再三位三位进行转换。
二进制转换十六进制函数
void ershiliu (char m[10000])
{
int i,j,l=0,a=0,k=0;
int sum=0;
printf("二进制转换为十六进制\n");
printf("答案是:");
for(j=0;m[j]!='\0';j++){
a++;
}
if(a<=8){
l=8%a;
}else {
l=4-a%8;
}
m[a+l]='\0';
for(i=a-1;i>=0;i--){
m[i+l]=m[i];
}
for(i=0;i<l;i++){
m[i]='0';
}
//到这将二进制数转换成四位四位二进制数,对应十六进制转换。
for(i=0;m[i]!='\0';i++){
sum+=(m[i]-'0')*pow(2,(3-k));
k++;
if(k%4==0){
if(sum>9){
printf("%c",'A'+sum-10);
}else {
printf("%d",sum);
}
k=0;
sum=0;
}
}
}
二进制转换位八进制,与上一个函数有着相似的内容,一个意思。
二进制转换十进制函数
void ershi (char m[10000])
{
int i,j,k=0;
int sum=0;
printf("二进制转换为十进制\n");
printf("答案是:");
for(k=0;m[k]!='\0';k++){
}
k-=1;
for(i=0;m[i]!='\0';i++){
j=abc(k);
sum+=(m[i]-'0')*j;
k--;
}
printf("%d\n",sum);
}
二进制转换为十进制,从高位算起,对应二进制数乘以相应的乘数,相加得出。在这里运用到另一个函数,一个算2的几次方的函数。
2的次方函数
int abc (int n)
{
int sum=1;
for(int i=1;i<=n;i++){
sum*=2;
}
return sum;
}
这是个算2的几次方的函数,头文件自带函数运行太慢,自己写一个,便于二进制转换为十进制。
八进制转换二进制函数
void baer (char m[10000])
{
int i,j,k,l;
printf("八进制转换为二进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
k=m[i]-'0';
if(k==1){
printf("00");
} else { //中间这个if语句是使输出二进制数为三的倍数,更加好看。
if(k>1&&k<4){
printf("0");
}
}
l=a(k);
}
}
这个是八进制转换为二进制,同样也用到另一个函数,a(k)是将每一位八进制数,转换为相应的三位二进制数。
八进制转换十六进制函数
void bashiliu (char m[10000])
{
int i,j,l=0,a=0,k=0;
int p=1,q;
int n[10000];
printf("八进制转换为十六进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
k=m[i]-'0';
q=p*3-1;
for(j=i*3;j<i*3+3;j++){
n[q]=k%2;
k/=2;
q--;
}
p++;
}
//到这八进制转换为二进制数。
if(j<=8){
l=8%j;
}else {
l=4-j%6;
}
for(i=j-1;i>=0;i--){
n[i+l]=n[i];
}
for(i=0;i<l;i++){
n[i]=0;
}
//到这进行二进制数转换成四的倍数,四位二进制对应一个十六进制。
int sum=0;
for(i=0;i<j+l;i++){
sum+=n[i]*pow(2,(3-k));
k++;
if(k%4==0){
if(sum>9){
printf("%c",'A'+sum-10);
}else {
printf("%d",sum);
}
k=0;
sum=0;
}
}
//得出十六进制数。
}
这是八进制转换为十六进制的函数,先将八进制转换为二进制,在将二进制转换为十六进制。
八进制转换十进制函数
void bashi (char m[10000])
{
int i,j,l,k,p=1,a;
int n[10000];
printf("八进制转换为十进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
k=m[i]-'0';
l=p*3-1;
for(j=i*3;j<i*3+3;j++){
n[l]=k%2;
k/=2;
l--;
}
p++;
}
int sum=0;
int b=j-1;
for(i=0;i<j;i++){
a=abc(b);
sum+=n[i]*a;
b--;
}
printf("%d",sum);
}
八进制转换为十进制,先转二进制再转十进制。
递归算二进制函数
int a(int n)
{
if(n==1||n==0){
printf("%d",n);
}else {
a(n/2);
printf("%d",n%2);
}
return 0;
}
这个就是讲以为一位八进制数转换成三位二进制数的函数,输出二进制。
十六进制转换二进制函数
void shiliuer (char m[10000])
{
int i,j,l,k;
printf("十六进制转换为二进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
if(m[i]>='0'&&m[i]<='9'){
k=m[i]-'0';
}
if(m[i]>='A'&&m[i]<='F'){
k=m[i]-'7';
}
if(k==1){
printf("000");
}else {
if(k<4){
printf("00");
}else {
if(k<8){
printf("0");
}
}
}
l=a(k);
}
}
十六进制转换为二进制,一位十六进制对应四位二进制,我先判断一位十六进制的大小,先输出高位的0,再去填入二进制数,构成四位二进制数,这里调用了一个a(k)的函数,来算二进制数。
十六进制转换八进制函数
void shiliuba (char m[10000])
{
int i,j,l=0,k=0;
int n[10000];
int a,b=1,c;
printf("十六进制转换为八进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
if(m[i]>='0'&&m[i]<='9'){
k=m[i]-'0';
}
if(m[i]>='A'&&m[i]<='F'){
k=m[i]-'7';
}
a=b*4-1;
for(j=i*4;j<i*4+4;j++){
n[a]=k%2;
k/=2;
a--;
}
b++;
}
if(j<=6){
l=6%j;
}else {
l=3-j%6;
}
for(i=j-1;i>=0;i--){
n[i+l]=n[i];
}
for(i=0;i<l;i++){
n[i]=0;
}
int sum=0;
for(i=0;i<j+l;i++){
sum+=n[i]*pow(2,(2-k));
k++;
if(k%3==0){
printf("%d",sum);
k=0;
sum=0;
}
}
}
十六进制转换为八进制,函数内容意思与前面相似。
十六进制转换十进制函数
void shiliushi (char m[10000])
{
int i,j,k;
int n[10000];
int a,b=1;
printf("十六进制转换为十进制\n");
printf("答案是:");
for(i=0;m[i]!='\0';i++){
if(m[i]>='0'&&m[i]<='9'){
k=m[i]-'0';
}
if(m[i]>='A'&&m[i]<='F'){
k=m[i]-'7';
}
a=b*4-1;
for(j=i*4;j<i*4+4;j++){
n[a]=k%2;
k/=2;
a--;
}
b++;
}
int sum=0;
int c=j-1,l;
for(i=0;i<j;i++){
l=abc(c);
sum+=n[i]*l;
c--;
}
printf("%d",sum);
}
十六进制转换为十进制函数。
十进制转换二进制函数
void shier (int n)
{
printf("十进制转换为二进制\n");
printf("答案是:");
a(n);
}
int a(int n)
{
if(n==1||n==0){
printf("%d",n);
}else {
a(n/2);
printf("%d",n%2);
}
return 0;
}
在十进制转换二进制的函数中,用到另一个函数来计算答案,运用递归函数写法,得出二进制数。
十进制转换八进制函数
void shiba (int n)
{
printf("十进制转换为八进制\n");
printf("答案是:");
b(n);
}
int b(int n)
{
if(n<8){
printf("%d",n);
}else {
b(n/8);
printf("%d",n%8);
}
return 0;
}
十进制转换为八进制的函数,相似的算法规律,也是运用一个递归函数来得出答案。
十进制转换十六进制函数
void shishiliu (int n)
{
printf("十进制转换为十六进制\n");
printf("答案是:");
c(n);
}
int c(int n)
{
int k;
if(n<16){
if(n<10){
printf("%d",n);
}else {
printf("%c",'A'+n-10);
}
}else {
c(n/16);
k=n%16;
if(k<10){
printf("%d",k);
}else {
printf("%c",'A'+k-10);
}
}
return 0;
}
十进制转换为十六进制函数,较为麻烦,应为十六进制有用到字母,需要进行相应的转换,需要改动一些。
5.回想代码
在写这个进制转换时,我遇到一下几个问题:
1. 如何判断输入数是否符合,四种进制的要求。我通过查询书本了解四种进制的规则。
2. 如何把读到的数组传到我想去的函数当中。我百度学习知识,了解如何传入。
3. 如何写递归函数。结合学到的知识和不断常试,明白如何写。
4. 进制之间的转换如何用代码写出来。运用函数的知识,在结合进制之间的转换规则,去写代码。
5. 如何使使用者使用起来会舒服点。查询显示代码,美化代码。
6.代码互评(评价他人代码,学习好的地方)网络1913李永福
在与我的八进制转换成十进制的函数中,他比我好的地方是,他有运用到string头文件内的计算字符串长度的函数,使得可以更加简便,但和我的思路不一样,但是这样确实好。在八进制转换成十六进制,与我的想法不同,我是转换成二进制然后再转换成十六进制,而他是转换成十进制,再转换成十六进制,我感觉到好像是他的方法比较好,确实转换成十进制会比转换成十六进制来的简单,这是我要学习的地方。还有运用到初始化数组,这也是我没想到的地方,我还是要多向同学学习学习。
7.总结
从这次博客作业,我从中学习到:
1. 加深了我对进制之间的转换规则,也明白如何用代码表示进制转换。
2. 加深我对其他辅助函数的书写和理解。
3. 让我可以充分使用我学习的知识去有目的的写出一个程序,收获很多。
8.对于函数的理解:
1. 运用函数可以是代码看起来更加的简洁明了,是的代码条理清晰。
2. 函数可以更好的有目的的完成你目的的一部分,几个函数就可以很好的组成你最终的目的。
3. 运用函数的代码,可以让别人看你的代码时,更好的明白,什么是干什么的,让别人更好的看懂你的代码。