一.截图部分





二.代码部分:

char2num()

作用:将字符转化成对应的数字

       e.g.   '9'->9    'A'->10

int char2num(char ch) {
if (ch >= '0' && ch <= '9') {
return ch - '0';
}
else {
return ch - 'A' + 10;
}
}
char

num2char()

作用:将数字转化成对应的字符

       e.g.   9->'9'    10->'A'

char num2char(int num) {
if (num >= 0 && num <= 9) {
return (char)('0' + num);
}
else {
return (char)('A' + num - 10);
}
}

is_false()

作用:判断输入是否正确,对返回0,错返回1

int is_flase(char ch[], int n) {
int i, len, flag = 0;
len = strlen(ch);
for (i = 0; i < len; i++) {
if (char2num(ch[i]) < 0 || char2num(ch[i]) >= n)
flag = 1;
}
return flag;
}

any2ten()

作用:将任意进制转化为十进制

int any2ten(char str[],int key) {
int cnt, len, i, sum = 0, item = 1;
len = strlen(str);
for (i = 1; i < len; i++) {
item *= key;
}
for (i = 0; i < len; i++) {
cnt = char2num(str[i]);
sum += cnt * item;
item /= key;
}
return sum;
}

ten2any()

作用:将十进制转化为任意进制

void ten2any(int n,int key) {
int i, len = 0;
char a[10000];
while (n) {
a[len] = num2char(n % key);
n /= key;
len++;
}
switch (key) {
case 2:printf(" -->二进制是:"); break;
case 8:printf(" -->八进制是:"); break;
case 16:printf(" -->十六进制是:"); break;
}
for (i = len - 1; i >= 0; i--) {
printf("%c", a[i]);
}
printf("\n");
}

main()

int main() {
int n, result, flag = 1, now, k;
char a[10000];
printf("--------------------------------------------------\n");
while (flag) {
printf("--------------------------------------------------\n");
printf(" 请输入当前进制:");
scanf("%d", &now);
printf(" 请输入你要转换的数:");
switch (now) {
case 2:
getchar();
gets_s(a);
if (is_flase(a, now)) {
printf(" 输入错误!请重试!\n");
goto lab;
}
ten2any(any2ten(a, now), 8);
printf(" -->十进制是:%d\n", any2ten(a, now));
ten2any(any2ten(a, now), 16);
break;
case 8:
getchar();
gets_s(a);
if (is_flase(a, now)) {
printf(" 输入错误!请重试!\n");
goto lab;
}
ten2any(any2ten(a, now), 2);
printf(" -->十进制是:%d\n", any2ten(a, now));
ten2any(any2ten(a, now), 16);
break;
case 10:
getchar();
gets_s(a);
if (is_flase(a, now)) {
printf(" 输入错误!请重试!\n");
goto lab;
}
ten2any(any2ten(a, now), 2);
ten2any(any2ten(a, now), 8);
ten2any(any2ten(a, now), 16);
break;
case 16:
getchar();
gets_s(a);
if (is_flase(a, now)) {
printf(" 输入错误!请重试!\n");
goto lab;
}
ten2any(any2ten(a, now), 2);
ten2any(any2ten(a, now), 8);
printf(" -->十进制是:%d\n", any2ten(a, now));
break;
}
lab:
printf(" 继续请按1,退出请按0:");
scanf("%d", &k);
printf("--------------------------------------------------\n");
if (k == 0) {
printf("--------------------------------------------------\n");
break;
}
}
return 0;
}

三.思维导图

四.问题解决过程

1.刚开始写了很多函数,都是分开的,后来我发现我写的太冗长了,好几个函数其实都是合并在一个的,于是我又重新写了ten2any()和any2ten()这两个函数,来解决这个代码过长的问题。
2.开始写十六进制的时候,确实是被ABCDEF卡了一下,后面想想,要将字符转换成数字,于是联想到了ASCII码,将字符强制转换类型一下,再经过加减就可以实现数字转字符和字符转数字,而且还有几次调用,那我就直接写成了两个函数。
3.最后看到还要报错的要求,想想也对,那我就直接按照字符转数字的思路,n进制下,字符转化为数字的值要是超过了n-1,就直接报错,但是报错是在主函数实现的。
4.还有关于界面和美观的问题,刚开始是想写一堆数字,让用户去选择具体是几进制转到几进制,后来写出来自己用了一下,都快吐了,所以我就直接否决掉了。然后我就想到了输入一个进制,不管有没有用,反正就把其他的都输出出来,给用户使用,比较方便,不用转好几次。然后我又觉得每次转一次就没了,又要重新开一遍程序,很烦,所以我就在最外面直接套了一个while循环,要不要退出让用户自己选择。关于界面乱的问题..就直接在开头结尾加了一个分割线..本来就加一个..后面觉得不够明显,又加了一层,不加的话界面就会很乱,用户哪次转哪个都会乱掉。

五.代码互评

#include <stdio.h>
#include <math.h>
#include <string.h> void transform_2_8(int n);
int transform_2_10(int n);
void transform_2_16(int n); void transform_8_2(int n);
int transform_8_10(int n);
void transform_8_16(int n); void transform_10_2(int n);
void transform_10_8(int n);
void transform_10_16(int n); void transform_16_2(char *s);
void transform_16_8(char *s);
int transform_16_10(char *s);

这位同学把以上代码分别写成以下头文件

#include "Header.h"
#include "tr2.c"
#include "tr8.c"
#include "tr10.c"
#include "tr16.c"

这样使得调用那些函数比较方便,但我觉得可以把那些函数再浓缩一下,所以也没有必要去写那么多行。

六.总结

1.函数是个好东西!
2.函数是真的棒!!
3.棒得不得了!!!
1.函数方便编程、方便调试、方便升级,而且当一个过程需要重复在你的程序时,这时候函数就可以发挥很大的作用。
2.当我们在写一个需要用户去跟程序交互的东西时,需要考虑到程序美观性,还有对用户来说的简单操作。
3.再吹一遍函数~

最新文章

  1. email 正则
  2. mysql通过data文件恢复数据库的方式
  3. python中raw_input() 与 input()
  4. python计算机视觉——黑板客老师课程学习
  5. EXT--columnWidth
  6. PHP连续签到
  7. 【吐血整理】SVN命令行,Subversion的正确使用姿势,让版本控制更简单~
  8. AddIn 中当前完整文件名的获取
  9. bootstrapValidator操作
  10. eclipse下载教程
  11. 基于GTK+3 开发远程控制管理软件(C语言实现)系列二 Centos7下开发环境搭建
  12. Java – How to get current date time
  13. _cs, _ci, or _bin,
  14. Linux服务器---使用mysql
  15. EFCore 2.0引用标量函数
  16. Apache入门篇(三)之apache2.4.33的新特性解析与虚拟主机实战
  17. 基于TCP协议的聊天室控制台版
  18. CF1117D Magic Gems
  19. public interface Sampler extends Serializable, TestElement
  20. 并发包CallableAndFuture

热门文章

  1. tensorflow处理mnist(一)
  2. springboot中的pom文件是如何管理依赖的
  3. 查看yum已安装的包
  4. CSS预处理器之less和sass
  5. mysql #1062 - Duplicate entry &#39;2147483647&#39; for key &#39;*&#39;
  6. c++--语言本身
  7. Android动态添加碎片
  8. 深度学习优质学习项目大放送!-AI Studio精选开源项目合集推荐
  9. Linux下MySQL或MariaDB忘记root密码的解决方法
  10. Django的Form验证(2)